From 0578b090956f606a5d978f1343b24600f8b1345e Mon Sep 17 00:00:00 2001 From: Fridolyn SOMERS Date: Fri, 1 Feb 2013 17:52:11 +0100 Subject: [PATCH] Bug 9532: fix reservability check when bib-level item types are in use When itemtype is defined on biblio (item-level_itypes syspref), the method C4::Reserves::CanItemBeReserved uses item->{itemtype}. But ithe item comes from C4::Items::GetItem and it does not have an 'itemtype' key; in this method the item type value is always in 'itype' key. This patch corrects it. Test plan: You should have itemtype on biblio and 'item-level_itypes' syspref set to biblio. This test plan is with ReservesControlBranch on ItemHomeLibrary. - Choose a branch, a borrower category and an item type, for example 'NYC', 'CHILD' and 'DVD' - Set an issuing rule for 'NYC', CHILD' and 'DVD' with 'Holds allowed' set to 10 - Set an issuing rule for 'NYC', CHILD' and all item types with 'Holds allowed' set to 0 - Choose an item of a biblio with itemtype 'DVD', that can be reserved, with 'NYC' as homebranch - Choose a borrower with category 'CHILD' - Try to request the item for the borrower => without the patch, you can => with the patch, you can't You may check reserve is allowed with 'Holds allowed' > 0 on issuing rule for 'DVD'. Signed-off-by: Liz Rea Great test plan - thanks! Confirmed the bug, and the fix. Looks good to me. Signed-off-by: Kyle M Hall Signed-off-by: Galen Charlton (cherry picked from commit 7acd7f43a703c3aa853ea6e58153584c24ca6d09) Signed-off-by: Fridolin Somers --- C4/Reserves.pm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/C4/Reserves.pm b/C4/Reserves.pm index 7a914e3b33..f81f0149d9 100644 --- a/C4/Reserves.pm +++ b/C4/Reserves.pm @@ -463,9 +463,11 @@ sub CanItemBeReserved{ my ($borrowernumber, $itemnumber) = @_; my $dbh = C4::Context->dbh; + my $ruleitemtype; # itemtype of the matching issuing rule my $allowedreserves = 0; # we retrieve borrowers and items informations # + # item->{itype} will come for biblioitems if necessery my $item = GetItem($itemnumber); # If an item is damaged and we don't allow holds on damaged items, we can stop right here @@ -474,7 +476,7 @@ sub CanItemBeReserved{ my $borrower = C4::Members::GetMember('borrowernumber'=>$borrowernumber); my $controlbranch = C4::Context->preference('ReservesControlBranch'); - my $itype = C4::Context->preference('item-level_itypes') ? "itype" : "itemtype"; + my $itemtypefield = C4::Context->preference('item-level_itypes') ? "itype" : "itemtype"; # we retrieve user rights on this itemtype and branchcode my $sth = $dbh->prepare("SELECT categorycode, itemtype, branchcode, reservesallowed @@ -498,8 +500,6 @@ sub CanItemBeReserved{ "; - my $itemtype = $item->{$itype}; - my $categorycode = $borrower->{categorycode}; my $branchcode = ""; my $branchfield = "reserves.branchcode"; @@ -512,25 +512,25 @@ sub CanItemBeReserved{ } # we retrieve rights - $sth->execute($categorycode, $itemtype, $branchcode); + $sth->execute($borrower->{'categorycode'}, $item->{'itype'}, $branchcode); if(my $rights = $sth->fetchrow_hashref()){ - $itemtype = $rights->{itemtype}; + $ruleitemtype = $rights->{itemtype}; $allowedreserves = $rights->{reservesallowed}; }else{ - $itemtype = '*'; + $ruleitemtype = '*'; } # we retrieve count $querycount .= "AND $branchfield = ?"; - $querycount .= " AND $itype = ?" if ($itemtype ne "*"); + $querycount .= " AND $itemtypefield = ?" if ($ruleitemtype ne "*"); my $sthcount = $dbh->prepare($querycount); - if($itemtype eq "*"){ + if($ruleitemtype eq "*"){ $sthcount->execute($borrowernumber, $branchcode); }else{ - $sthcount->execute($borrowernumber, $branchcode, $itemtype); + $sthcount->execute($borrowernumber, $branchcode, $ruleitemtype); } my $reservecount = "0"; -- 2.39.5