@@ -, +, @@ CanItemBeReserved --- C4/Reserves.pm | 24 ++++++++++++++++++++-- .../prog/en/modules/reserve/request.tt | 7 +++++-- reserve/placerequest.pl | 4 ++-- reserve/request.pl | 4 ++++ 4 files changed, 33 insertions(+), 6 deletions(-) --- a/C4/Reserves.pm +++ a/C4/Reserves.pm @@ -335,9 +335,14 @@ sub CanBookBeReserved{ } my $canReserve = { status => '' }; + my ($rights,$item); + foreach my $itemnumber (@itemnumbers) { $canReserve = CanItemBeReserved( $borrowernumber, $itemnumber, $pickup_branchcode, $params ); + my $opacitemholds = $canReserve->{rights}->{opacitemholds} // 'Y'; + return { status => 'recordHoldNotAllowed' } if $opacitemholds eq 'F'; return { status => 'OK' } if $canReserve->{status} eq 'OK'; + return { status => 'OK' } if $canReserve->{status} eq 'recordHoldsOnly'; } return $canReserve; } @@ -381,6 +386,7 @@ sub CanItemBeReserved { my $biblio = $item->biblio; my $patron = Koha::Patrons->find( $borrowernumber ); my $borrower = $patron->unblessed; + my $context = $params->{context} // ''; # If an item is damaged and we don't allow holds on damaged items, we can stop right here return { status =>'damaged' } @@ -445,10 +451,11 @@ sub CanItemBeReserved { categorycode => $borrower->{'categorycode'}, itemtype => $item->effective_itemtype, branchcode => $branchcode, - rules => ['holds_per_record','holds_per_day'] + rules => ['holds_per_record','holds_per_day','opacitemholds'] }); my $holds_per_record = $rights->{holds_per_record} // 1; my $holds_per_day = $rights->{holds_per_day}; + my $opacitemholds = $rights->{opacitemholds} // 'Y'; my $search_params = { borrowernumber => $borrowernumber, @@ -466,6 +473,15 @@ sub CanItemBeReserved { } } + $item = Koha::Items->find( $itemnumber ); + + $holds = Koha::Holds->search( + { + borrowernumber => $borrowernumber, + biblionumber => $item->biblionumber, + } + ); + my $today_holds = Koha::Holds->search({ borrowernumber => $borrowernumber, reservedate => dt_from_string->date @@ -585,7 +601,11 @@ sub CanItemBeReserved { } } - return { status => 'OK' }; + if ( $opacitemholds eq "N" && $context ne 'staff') { + return { status => "recordHoldsOnly", right => $rights }; + } + + return { status => 'OK', rights => $rights }; } =head2 CanReserveBeCanceledFromOpac --- a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt @@ -333,7 +333,7 @@ [% END %] - [% IF ( no_reserves_allowed || exceeded_maxreserves || exceeded_holds_per_record || alreadyreserved || none_available || alreadypossession || ageRestricted ) %] + [% IF ( no_reserves_allowed || exceeded_maxreserves || exceeded_holds_per_record || alreadyreserved || none_available || alreadypossession || ageRestricted || recordHoldNotAllowed ) %]