@@ -, +, @@ Library B, Library C, and Library A in that order, for pickup at the patrons home library. Hold Policy = "From home library" and Return Policy = "Item returns home". Make sure the holds policies for the other libraries are set to Hold Policy = "From any library". should pop up, even though it's in violation of the circulation rules. Don't click the confirm button! now the hold listed should be for the last hold, the hold for the patron at Library A, which is correct. --- C4/Reserves.pm | 30 +++++++++++++++++++++++++++++- opac/opac-reserve.pl | 2 +- t/db_dependent/Reserves.t | 20 +++++++++++++++++++- 3 files changed, 49 insertions(+), 3 deletions(-) --- a/C4/Reserves.pm +++ a/C4/Reserves.pm @@ -131,6 +131,8 @@ BEGIN { &ReserveSlip &ToggleSuspend &SuspendAll + + &GetReservesControlBranch ); @EXPORT_OK = qw( MergeHolds ); } @@ -898,7 +900,7 @@ sub CheckReserves { if ( $res->{'priority'} && $res->{'priority'} < $priority ) { my $borrowerinfo=C4::Members::GetMember(borrowernumber => $res->{'borrowernumber'}); my $iteminfo=C4::Items::GetItem($itemnumber); - my $branch=C4::Circulation::_GetCircControlBranch($iteminfo,$borrowerinfo); + my $branch = GetReservesControlBranch( $iteminfo, $borrowerinfo ); my $branchitemrule = C4::Circulation::GetBranchItemRule($branch,$iteminfo->{'itype'}); next if ($branchitemrule->{'holdallowed'} == 0); next if (($branchitemrule->{'holdallowed'} == 1) && ($branch ne $borrowerinfo->{'branchcode'})); @@ -2183,6 +2185,32 @@ sub ReserveSlip { ); } +=head2 GetReservesControlBranch + + my $reserves_control_branch = GetReservesControlBranch($item, $borrower); + + Return the branchcode to be used to determine which reserves + policy applies to a transaction. + + C<$iteminfos> is a hashref for an item. Only 'homebranch' is used. + + C<$borrower> is a hashref to borrower. Only 'branchcode' is used. + +=cut + +sub GetReservesControlBranch { + my ( $item, $borrower ) = @_; + + my $reserves_control = C4::Context->preference('ReservesControlBranch'); + + my $branchcode = + ( $reserves_control eq 'ItemHomeLibrary' ) ? $item->{'homebranch'} + : ( $reserves_control eq 'PatronLibrary' ) ? $borrower->{'branchcode'} + : undef; + + return $branchcode; +} + =head1 AUTHOR Koha Development Team --- a/opac/opac-reserve.pl +++ a/opac/opac-reserve.pl @@ -490,7 +490,7 @@ foreach my $biblioNum (@biblionumbers) { # If there is no loan, return and transfer, we show a checkbox. $itemLoopIter->{notforloan} = $itemLoopIter->{notforloan} || 0; - my $branch = ( C4::Context->preference('ReservesControlBranch') eq 'ItemHomeLibrary' ) ? $itemInfo->{'homebranch'} : $borr->{'branchcode'}; + my $branch = GetReservesControlBranch( $itemInfo, $borr ); my $branchitemrule = GetBranchItemRule( $branch, $itemInfo->{'itype'} ); my $policy_holdallowed = 1; --- a/t/db_dependent/Reserves.t +++ a/t/db_dependent/Reserves.t @@ -2,7 +2,7 @@ use Modern::Perl; -use Test::More tests => 4; +use Test::More tests => 6; use MARC::Record; use C4::Branch; @@ -76,3 +76,21 @@ is($status, "Reserved", "CheckReserves Test 2"); ($status, $reserve, $all_reserves) = CheckReserves(undef, $barcode); is($status, "Reserved", "CheckReserves Test 3"); + +my $ReservesControlBranch = C4::Context->preference('ReservesControlBranch'); +C4::Context->set_preference( 'ReservesControlBranch', 'ItemHomeLibrary' ); +ok( + 'ItemHomeLib' eq GetReservesControlBranch( + { homebranch => 'ItemHomeLib' }, + { branchcode => 'PatronHomeLib' } + ), "GetReservesControlBranch returns item home branch when set to ItemHomeLibrary" +); +C4::Context->set_preference( 'ReservesControlBranch', 'PatronLibrary' ); +ok( + 'PatronHomeLib' eq GetReservesControlBranch( + { homebranch => 'ItemHomeLib' }, + { branchcode => 'PatronHomeLib' } + ), "GetReservesControlBranch returns patron home branch when set to PatronLibrary" +); +C4::Context->set_preference( 'ReservesControlBranch', $ReservesControlBranch ); + --