@@ -, +, @@ /cgi-bin/koha/ilsdi.pl?service=HoldTitle&patron_id=BORROWERNUMBER&bib_id=BIBLIONUMBER&request_location=test Check the priority. /cgi-bin/koha/ilsdi.pl?service=HoldItem&patron_id=BORROWERNUMBER&bib_id=BIBLIONUMBER&item_id=ITEMNUMBER Check the priority again. Check in one of these items in another branch. Confirm transfer. Check in the other item in the original branch. Confirm hold. Now you have a waiting and a transit hold. Test HoldTitle and HoldItem service again a few times. Now test HoldTitle and HoldItem again and check if these holds are inserted before the future hold (lower priority). --- C4/ILSDI/Services.pm | 26 +++++++++++--------------- C4/Reserves.pm | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 15 deletions(-) --- a/C4/ILSDI/Services.pm +++ a/C4/ILSDI/Services.pm @@ -623,8 +623,11 @@ sub HoldTitle { } # Add the reserve - # $branch, $borrowernumber, $biblionumber, $constraint, $bibitems, $priority, $notes, $title, $checkitem, $found - AddReserve( $branch, $borrowernumber, $biblionumber, 'a', undef, 0, undef, $title, undef, undef ); + # $branch, $borrowernumber, $biblionumber, + # $constraint, $bibitems, $priority, $resdate, $expdate, $notes, + # $title, $checkitem, $found + my $priority= C4::Reserves::CalculatePriority( $biblionumber ); + AddReserve( $branch, $borrowernumber, $biblionumber, 'a', undef, $priority, undef, undef, undef, $title, undef, undef ); # Hashref building my $out; @@ -686,9 +689,8 @@ sub HoldItem { my $canbookbereserved = C4::Reserves::CanBookBeReserved( $borrowernumber, $biblionumber ); return { code => 'NotHoldable' } unless $canbookbereserved and $canitembereserved; - my $branch; - # Pickup branch management + my $branch; if ( $cgi->param('pickup_location') ) { $branch = $cgi->param('pickup_location'); my $branches = GetBranches(); @@ -697,18 +699,12 @@ sub HoldItem { $branch = $$borrower{branchcode}; } - my $rank; - my $found; - - # Get rank and found - $rank = '0' unless C4::Context->preference('ReservesNeedReturns'); - if ( $item->{'holdingbranch'} eq $branch ) { - $found = 'W' unless C4::Context->preference('ReservesNeedReturns'); - } - # Add the reserve - # $branch,$borrowernumber,$biblionumber,$constraint,$bibitems,$priority,$resdate,$expdate,$notes,$title,$checkitem,$found - AddReserve( $branch, $borrowernumber, $biblionumber, 'a', undef, $rank, '', '', '', $title, $itemnumber, $found ); + # $branch, $borrowernumber, $biblionumber, + # $constraint, $bibitems, $priority, $resdate, $expdate, $notes, + # $title, $checkitem, $found + my $priority= C4::Reserves::CalculatePriority( $biblionumber ); + AddReserve( $branch, $borrowernumber, $biblionumber, 'a', undef, $priority, undef, undef, undef, $title, $itemnumber, undef ); # Hashref building my $out; --- a/C4/Reserves.pm +++ a/C4/Reserves.pm @@ -2249,6 +2249,42 @@ sub GetReservesControlBranch { return $branchcode; } +=head2 CalculatePriority + + my $p = CalculatePriority($biblionumber, $resdate); + +Calculate priority for a new reserve on biblionumber. +The reserve date parameter is optional. Plays a role if the preference +AllowHoldDateInFuture is set. +After calculation of this priority, it is recommended to call +_ShiftPriorityByDateAndPriority. Note that this is currently done in +AddReserves. + +=cut + +sub CalculatePriority { + my ( $biblionumber, $resdate ) = @_; + + my $sql = qq{ + SELECT COUNT(*) FROM reserves + WHERE biblionumber=? AND priority>0 AND + (found IS NULL or found='') + }; + #skip found==W or found==T (waiting or transit holds) + if( $resdate ) { + $sql.= ' AND ( reservedate<=? )'; + } + else { + $sql.= ' AND ( reservedate < NOW() )'; + } + my $dbh = C4::Context->dbh(); + my @row= $dbh->selectrow_array( $sql, undef, $resdate? + ($biblionumber, $resdate): ($biblionumber) ); + + return @row? $row[0]+1: 1; + #if @row does not contain anything, something went wrong.. +} + =head1 AUTHOR Koha Development Team --