Bug 11338: prevent deletion of items that are captured for holds

In C4::Items::DelItemCheck, there are two SQL queries: one to check
if item is on loan, the other if item is reserved.

Those two queries use "SELECT * FROM table", fetch the data with
"$var = $sth->fetchrow", and use "$var" as a boolean condition.

This is not correct, SQL query should be "SELECT COUNT(*) FROM table".

As a consequence, it was possible to delete an item without warning to
the operator even if it was waiting on the hold shelf or in transit to
fill a hold.

This patch corrects the SQL queries and sets my ($var) to show that
fetchrow returns an array.

Test plan :
- Set an item A onloan
- Set an item B reserved and the reserve waiting
- Go to items cataloguing : cgi-bin/koha/cataloguing/additem.pl?biblionumber=XXX
- Try to delete item A
=> You get an alert and item is not deleted
- Try to delete item B
=> You get an alert and item is not deleted

Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>

Works, and has the added bonus of being a tiny bit faster.

Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de>
Passes t, xt and QA script tests.
Also tried deleting via batch delete - correct warnings are displayed.

Signed-off-by: Galen Charlton <gmc@esilibrary.com>
(cherry picked from commit d000a71635)
Signed-off-by: Fridolin SOMERS <fridolin.somers@biblibre.com>
This commit is contained in:
Fridolyn SOMERS 2013-12-04 17:05:32 +01:00 committed by Fridolin SOMERS
parent c65a5d73a7
commit 87cd69d351
1 changed files with 11 additions and 4 deletions

View File

@ -2226,11 +2226,14 @@ sub DelItemCheck {
# check that there is no issue on this item before deletion.
my $sth=$dbh->prepare("select * from issues i where i.itemnumber=?");
my $sth = $dbh->prepare(q{
SELECT COUNT(*) FROM issues
WHERE itemnumber = ?
});
$sth->execute($itemnumber);
my ($onloan) = $sth->fetchrow;
my $item = GetItem($itemnumber);
my $onloan=$sth->fetchrow;
if ($onloan){
$error = "book_on_loan"
@ -2243,9 +2246,13 @@ sub DelItemCheck {
}
else{
# check it doesnt have a waiting reserve
$sth=$dbh->prepare("SELECT * FROM reserves WHERE (found = 'W' or found = 'T') AND itemnumber = ?");
$sth = $dbh->prepare(q{
SELECT COUNT(*) FROM reserves
WHERE (found = 'W' OR found = 'T')
AND itemnumber = ?
});
$sth->execute($itemnumber);
my $reserve=$sth->fetchrow;
my ($reserve) = $sth->fetchrow;
if ($reserve){
$error = "book_reserved";
} elsif ($countanalytics > 0){