@@ -, +, @@ - Added subroutine C4::Reserves::GetReserve - C4::ILSDI::Services::GetRecords now returns the reserve_id - Fix the text in the ilsdi.pl?service=Describe&verb=CancelHold page - Unit tests for CancelReserved and GetReserve - Do not delete row in reserves table if insert in old_reserves fails --- C4/ILSDI/Services.pm | 30 +++------- C4/Reserves.pm | 80 ++++++++++++++++++-------- koha-tmpl/opac-tmpl/prog/en/modules/ilsdi.tt | 2 +- t/db_dependent/Reserves.t | 23 +++++++- 4 files changed, 87 insertions(+), 48 deletions(-) --- a/C4/ILSDI/Services.pm +++ a/C4/ILSDI/Services.pm @@ -26,7 +26,7 @@ use C4::Circulation; use C4::Branch; use C4::Accounts; use C4::Biblio; -use C4::Reserves qw(AddReserve CancelReserve GetReservesFromBiblionumber GetReservesFromBorrowernumber CanBookBeReserved CanItemBeReserved); +use C4::Reserves qw(AddReserve GetReservesFromBiblionumber GetReservesFromBorrowernumber CanBookBeReserved CanItemBeReserved); use C4::Context; use C4::AuthoritiesMarc; use XML::Simple; @@ -722,9 +722,9 @@ Cancels an active reserve request for the borrower. Parameters: - patron_id (Required) - a borrowernumber + a borrowernumber - item_id (Required) - an itemnumber + a reserve_id =cut @@ -736,25 +736,13 @@ sub CancelHold { my $borrower = GetMemberDetails( $borrowernumber ); return { code => 'PatronNotFound' } unless $$borrower{borrowernumber}; - # Get the item or return an error code - my $itemnumber = $cgi->param('item_id'); - my $item = GetItem( $itemnumber ); - return { code => 'RecordNotFound' } unless $$item{itemnumber}; - - # Get borrower's reserves - my @reserves = GetReservesFromBorrowernumber( $borrowernumber, undef ); - my @reserveditems; - - # ...and loop over it to build an array of reserved itemnumbers - foreach my $reserve (@reserves) { - push @reserveditems, $reserve->{'itemnumber'}; - } - - # if the item was not reserved by the borrower, returns an error code - return { code => 'NotCanceled' } unless any { $itemnumber eq $_ } @reserveditems; + # Get the reserve or return an error code + my $reserve_id = $cgi->param('item_id'); + my $reserve = C4::Reserves::GetReserve($reserve_id); + return { code => 'RecordNotFound' } unless $reserve; + return { code => 'RecordNotFound' } unless ($reserve->{borrowernumber} == $borrowernumber); - # Cancel the reserve - CancelReserve({ itemnumber => $itemnumber, borrowernumber => $borrowernumber }); + C4::Reserves::CancelReserve({reserve_id => $reserve_id}); return { code => 'Canceled' }; } --- a/C4/Reserves.pm +++ a/C4/Reserves.pm @@ -104,6 +104,7 @@ BEGIN { &GetReserveFee &GetReserveInfo &GetReserveStatus + &GetReserve &GetOtherReserves @@ -833,6 +834,34 @@ sub GetReserveStatus { return ''; # empty string here will remove need for checking undef, or less log lines } +=head2 GetReserve + + my $reserve = C4::Reserves::GetReserve($reserve_id); + +Take a reserve_id and returns a hashref containing reserve informations. +Return undef if reserve_id doesn't exist. + +=cut + +sub GetReserve { + my ($reserve_id) = @_; + + return unless $reserve_id; + + my $dbh = C4::Context->dbh; + my $query = qq{ + SELECT * + FROM reserves + WHERE reserve_id = ? + }; + my $sth = $dbh->prepare($query); + + $sth->execute($reserve_id); + my $reserve = $sth->fetchrow_hashref; + + return $reserve; +} + =head2 CheckReserves ($status, $reserve, $all_reserves) = &CheckReserves($itemnumber); @@ -1032,34 +1061,37 @@ sub CancelReserve { my $dbh = C4::Context->dbh; my $reserve = GetReserve( $reserve_id ); + if ($reserve) { + my $query = " + UPDATE reserves + SET cancellationdate = now(), + found = Null, + priority = 0 + WHERE reserve_id = ? + "; + my $sth = $dbh->prepare($query); + $sth->execute( $reserve_id ); - my $query = " - UPDATE reserves - SET cancellationdate = now(), - found = Null, - priority = 0 - WHERE reserve_id = ? - "; - my $sth = $dbh->prepare($query); - $sth->execute( $reserve_id ); + $query = " + INSERT INTO old_reserves + SELECT * FROM reserves + WHERE reserve_id = ? + "; + $sth = $dbh->prepare($query); + $sth->execute( $reserve_id ); - $query = " - INSERT INTO old_reserves - SELECT * FROM reserves - WHERE reserve_id = ? - "; - $sth = $dbh->prepare($query); - $sth->execute( $reserve_id ); + $query = " + DELETE FROM reserves + WHERE reserve_id = ? + "; + $sth = $dbh->prepare($query); + $sth->execute( $reserve_id ); - $query = " - DELETE FROM reserves - WHERE reserve_id = ? - "; - $sth = $dbh->prepare($query); - $sth->execute( $reserve_id ); + # now fix the priority on the others.... + _FixPriority({ biblionumber => $reserve->{biblionumber} }); + } - # now fix the priority on the others.... - _FixPriority({ biblionumber => $reserve->{biblionumber} }); + return $reserve; } =head2 ModReserve --- a/koha-tmpl/opac-tmpl/prog/en/modules/ilsdi.tt +++ a/koha-tmpl/opac-tmpl/prog/en/modules/ilsdi.tt @@ -672,7 +672,7 @@