From c4344afa6d9337f2d99d40c5699bc40b0c310ceb Mon Sep 17 00:00:00 2001 From: Arthur Suzuki Date: Thu, 7 May 2020 12:33:46 +0200 Subject: [PATCH] Bug 25408: Add "opacitemholds" checks in CanBookBeReserved & CanItemBeReserved The rule "opacitemholds" seemed not to be controlled in some cases. This patch adds a control for this issuingrule in such a way it is checked across all interfaces (staff, opac, api) To test: 0 - Apply patches 1 - Set rule to "Don't allow" item specific holds on opac 2 - Attempt to place hold on staff side 3 - Hold is still allowed 4 - Attempt to place hold from opac or api 5 - Hold is not allowed 6 - Change rule to 'force' 7 - Hold can be placed in all interfaces Signed-off-by: Victor Grousset/tuxayo --- C4/Reserves.pm | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/C4/Reserves.pm b/C4/Reserves.pm index d971324f1b..e9f0db854b 100644 --- a/C4/Reserves.pm +++ b/C4/Reserves.pm @@ -317,6 +317,8 @@ See CanItemBeReserved() for possible return values. sub CanBookBeReserved{ my ($borrowernumber, $biblionumber, $pickup_branchcode, $params) = @_; + my $patron = Koha::Patrons->find( $borrowernumber ); + my $borrower = $patron->unblessed; my @itemnumbers = Koha::Items->search({ biblionumber => $biblionumber})->get_column("itemnumber"); #get items linked via host records @@ -326,8 +328,11 @@ sub CanBookBeReserved{ } my $canReserve = { status => '' }; + my ($rights,$item); + foreach my $itemnumber (@itemnumbers) { $canReserve = CanItemBeReserved( $borrowernumber, $itemnumber, $pickup_branchcode, $params ); + return { status => 'RecordHoldNotAllowed' } if $canReserve->{rights}->{opacitemholds} eq 'F'; return { status => 'OK' } if $canReserve->{status} eq 'OK'; } return $canReserve; @@ -364,6 +369,7 @@ sub CanItemBeReserved { my $allowedreserves = 0; # Total number of holds allowed across all records my $holds_per_record = 1; # Total number of holds allowed for this one given record my $holds_per_day; # Default to unlimited + my $opacitemholds = 'Y'; # Itemlevel holds default to allowed # we retrieve borrowers and items informations # # item->{itype} will come for biblioitems if necessery @@ -415,6 +421,7 @@ sub CanItemBeReserved { $allowedreserves = $rights->{reservesallowed} // $allowedreserves; $holds_per_record = $rights->{holds_per_record} // $holds_per_record; $holds_per_day = $rights->{holds_per_day}; + $opacitemholds = $rights->{opacitemholds}; } else { $ruleitemtype = undef; @@ -427,6 +434,20 @@ sub CanItemBeReserved { $search_params->{found} = undef if $params->{ignore_found_holds}; my $holds = Koha::Holds->search($search_params); + + if ( $opacitemholds eq "N" ) { + return { status => "notReservable" }; + } + + $item = Koha::Items->find( $itemnumber ); + + my $holds = Koha::Holds->search( + { + borrowernumber => $borrowernumber, + biblionumber => $item->biblionumber, + } + ); + if ( defined $holds_per_record && $holds_per_record ne '' && $holds->count() >= $holds_per_record ) { return { status => "tooManyHoldsForThisRecord", limit => $holds_per_record }; @@ -547,7 +568,7 @@ sub CanItemBeReserved { } } - return { status => 'OK' }; + return { status => 'OK', rights => $rights }; } =head2 CanReserveBeCanceledFromOpac @@ -2270,7 +2291,7 @@ sub GetHoldRule { itemtype => $itemtype, categorycode => $categorycode, branchcode => $branchcode, - rules => ['holds_per_record', 'holds_per_day'], + rules => ['holds_per_record', 'holds_per_day', 'opacitemholds'], order_by => { -desc => [ 'categorycode', 'itemtype', 'branchcode' ] } @@ -2278,6 +2299,7 @@ sub GetHoldRule { ); $rules->{holds_per_record} = $holds_per_x_rules->{holds_per_record}; $rules->{holds_per_day} = $holds_per_x_rules->{holds_per_day}; + $rules->{opacitemholds} = $holds_per_x_rules->{opacitemholds}; return $rules; } -- 2.11.0