From fc060bca78632cac2f7ac8284736463bffac78b5 Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Thu, 13 Jun 2019 06:34:38 -0400 Subject: [PATCH] Bug 23116: AllowHoldPolicyOverride allows a librarian to almost place a hold on an item already on hold A library appears to be able to place a second item level hold on an item a patron already has on hold if A) AllowHoldPolicyOverride is enabled and B) the circ rule allow for multple item level holds. Once the patron submits the hold requests though, the hold does not get stored in the database. Because allowing two item level holds for the same item makes no sense, we should not allow this attempt to take place, even if AllowHoldPolicyOverride is enabled. Test Plan: 1) Enable AllowHoldPolicyOverride 2) Set up circ rules to allow for multiple item level holds on one record 3) Place an item level hold on a record 4) Note you can no longer place another item level hold for the same item you just placed an item-level hold on 5) Note you can still force holds that contravene the circ rules for any and all other reasons --- reserve/placerequest.pl | 9 ++++++++- reserve/request.pl | 7 +++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/reserve/placerequest.pl b/reserve/placerequest.pl index 35add4829a..13a212f006 100755 --- a/reserve/placerequest.pl +++ b/reserve/placerequest.pl @@ -88,16 +88,23 @@ if ( $type eq 'str8' && $borrower ) { } } + my $can_override = C4::Context->preference('AllowHoldPolicyOverride'); if ( defined $checkitem && $checkitem ne '' ) { + my $item = Koha::Items->find($checkitem); + if ( $item->biblionumber ne $biblionumber ) { $biblionumber = $item->biblionumber; } - if ( CanItemBeReserved($borrower->{'borrowernumber'}, $item->itemnumber, $branch)->{status} eq 'OK' ) { + + my $can_item_be_reserved = canItemBeReserved($borrower->{'borrowernumber'}, $item->itemnumber, $branch)->{status}; + + if ( $can_item_be_reserved ne 'itemAlreadyOnHold' ) { AddReserve( $branch, $borrower->{'borrowernumber'}, $biblionumber, \@realbi, $rank[0], $startdate, $expirationdate, $notes, $title, $checkitem, $found, $itemtype ); } + } elsif ($multi_hold) { my $bibinfo = $bibinfos{$biblionumber}; if ( CanBookBeReserved($borrower->{'borrowernumber'}, $biblionumber)->{status} eq 'OK' ) { diff --git a/reserve/request.pl b/reserve/request.pl index f559ed0929..c709cec7e5 100755 --- a/reserve/request.pl +++ b/reserve/request.pl @@ -508,8 +508,11 @@ foreach my $biblionumber (@biblionumbers) { } elsif ( C4::Context->preference('AllowHoldPolicyOverride') ) { # If AllowHoldPolicyOverride is set, it should override EVERY restriction, not just branch item rules - $item->{override} = 1; - $num_override++; + # with the exception of itemAlreadyOnHold because, you know, the item is already on hold + if ( $can_item_be_reserved ne 'itemAlreadyOnHold' ) { + $item->{override} = 1; + $num_override++; + } push( @available_itemtypes, $item->{itype} ); } -- 2.20.1 (Apple Git-117)