Bug 12876 - Reserve in waiting/transfer status may be cancelled by user

User may cancel his own reservation at waiting or in transit status
through calling opac-modrequest.pl. Cancel button is disabled in
interface but possibility to cancel should be checked also in
opac-moderequest.pl, before calling CancelReserve().
Similar situation is with opac-modrequest-suspend.pl

This patch provides new soubroutine to chceck if user can cancel given
reserve. It's possible only when he's owner of hold and hold isn't in
transfer or waiting status.

Additionaly there are new test for this function in Reserves.t

Signed-off-by: Jonathan Druart <jonathan.druart@biblibre.com>
Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de>
Passes all tests, QA script and new tests.
Works as described, tested with:
.../cgi-bin/koha/opac-modrequest.pl?reserve_id=XXX

Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
This commit is contained in:
Rafal Kopaczka 2014-09-05 14:50:15 +02:00 committed by Tomas Cohen Arazi
parent 6a98db50fc
commit e9eef04b95
4 changed files with 57 additions and 5 deletions

View File

@ -120,6 +120,7 @@ BEGIN {
&CheckReserves
&CanBookBeReserved
&CanItemBeReserved
&CanReserveBeCanceledFromOpac
&CancelReserve
&CancelExpiredReserves
@ -572,6 +573,29 @@ sub CanItemBeReserved{
return 1;
}
=head2 CanReserveBeCanceledFromOpac
$number = CanReserveBeCanceledFromOpac($reserve_id, $borrowernumber);
returns 1 if reserve can be cancelled by user from OPAC.
First check if reserve belongs to user, next checks if reserve is not in
transfer or waiting status
=cut
sub CanReserveBeCanceledFromOpac {
my ($reserve_id, $borrowernumber) = @_;
my $reserve = GetReserve($reserve_id);
return 0 unless $reserve->{borrowernumber} == $borrowernumber;
return 0 if ( $reserve->{found} eq 'W' ) or ( $reserve->{found} eq 'T' );
return 1;
}
#--------------------------------------------------------------------------------
=head2 GetReserveCount

View File

@ -39,7 +39,7 @@ my $suspend_until = $query->param('suspend_until') || undef;
my $reserve_id = $query->param('reserve_id');
if ($reserve_id) {
ToggleSuspend( $reserve_id, $suspend_until );
ToggleSuspend( $reserve_id, $suspend_until ) if CanReserveBeCanceledFromOpac($reserve_id, $borrowernumber);
}
else {
SuspendAll(

View File

@ -45,9 +45,7 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
my $reserve_id = $query->param('reserve_id');
if ($reserve_id && $borrowernumber) {
my $reserve = GetReserve($reserve_id);
CancelReserve({ reserve_id => $reserve_id }) if $borrowernumber == $reserve->{borrowernumber} ;
CancelReserve({ reserve_id => $reserve_id }) if CanReserveBeCanceledFromOpac($reserve_id, $borrowernumber);
}
print $query->redirect("/cgi-bin/koha/opac-user.pl#opac-user-holds");

View File

@ -2,7 +2,8 @@
use Modern::Perl;
use Test::More tests => 43;
use Test::More tests => 47;
use MARC::Record;
use DateTime::Duration;
@ -414,6 +415,35 @@ $p = C4::Reserves::CalculatePriority($bibnum, $resdate);
is($p, 3, 'CalculatePriority should now return priority 3');
# End of tests for bug 8918
# Tests for cancel reserves by users from OPAC.
$dbh->do('DELETE FROM reserves', undef, ($bibnum));
AddReserve('CPL', $requesters{'CPL'}, $item_bibnum,
$constraint, $bibitems, 1, undef, $expdate, $notes,
$title, $checkitem, '');
my (undef, $canres, undef) = CheckReserves($itemnumber);
my $cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'});
is($cancancel, 1, 'Can user cancel its own reserve');
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'FPL'});
is($cancancel, 0, 'Other user cant cancel reserve');
ModReserveAffect($itemnumber, $requesters{'CPL'}, 1);
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'});
is($cancancel, 0, 'Reserve in transfer status cant be canceled');
$dbh->do('DELETE FROM reserves', undef, ($bibnum));
AddReserve('CPL', $requesters{'CPL'}, $item_bibnum,
$constraint, $bibitems, 1, undef, $expdate, $notes,
$title, $checkitem, '');
(undef, $canres, undef) = CheckReserves($itemnumber);
ModReserveAffect($itemnumber, $requesters{'CPL'}, 0);
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'});
is($cancancel, 0, 'Reserve in waiting status cant be canceled');
# End of tests for bug 12876
$dbh->rollback;
sub count_hold_print_messages {