View | Details | Raw Unified | Return to bug 8868
Collapse All | Expand All

(-)a/C4/ILSDI/Services.pm (-21 / +9 lines)
Lines 26-32 use C4::Circulation; Link Here
26
use C4::Branch;
26
use C4::Branch;
27
use C4::Accounts;
27
use C4::Accounts;
28
use C4::Biblio;
28
use C4::Biblio;
29
use C4::Reserves qw(AddReserve CancelReserve GetReservesFromBiblionumber GetReservesFromBorrowernumber CanBookBeReserved CanItemBeReserved);
29
use C4::Reserves qw(AddReserve GetReservesFromBiblionumber GetReservesFromBorrowernumber CanBookBeReserved CanItemBeReserved);
30
use C4::Context;
30
use C4::Context;
31
use C4::AuthoritiesMarc;
31
use C4::AuthoritiesMarc;
32
use XML::Simple;
32
use XML::Simple;
Lines 724-730 Parameters: Link Here
724
  - patron_id (Required)
724
  - patron_id (Required)
725
	a borrowernumber
725
	a borrowernumber
726
  - item_id (Required)
726
  - item_id (Required)
727
	an itemnumber 
727
	a reserve_id 
728
728
729
=cut
729
=cut
730
730
Lines 736-761 sub CancelHold { Link Here
736
    my $borrower = GetMemberDetails( $borrowernumber );
736
    my $borrower = GetMemberDetails( $borrowernumber );
737
    return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
737
    return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
738
738
739
    # Get the item or return an error code
739
    # Get the reserve or return an error code
740
    my $itemnumber = $cgi->param('item_id');
740
    my $reserve_id = $cgi->param('item_id');
741
    my $item = GetItem( $itemnumber );
741
    my $reserve = C4::Reserves::GetReserve($reserve_id);
742
    return { code => 'RecordNotFound' } unless $$item{itemnumber};
742
    return { code => 'RecordNotFound' } unless $reserve;
743
743
    return { code => 'RecordNotFound' } unless ($reserve->{borrowernumber} == $borrowernumber);
744
    # Get borrower's reserves
745
    my @reserves = GetReservesFromBorrowernumber( $borrowernumber, undef );
746
    my @reserveditems;
747
748
    # ...and loop over it to build an array of reserved itemnumbers
749
    foreach my $reserve (@reserves) {
750
        push @reserveditems, $reserve->{'itemnumber'};
751
    }
752
753
    # if the item was not reserved by the borrower, returns an error code
754
    return { code => 'NotCanceled' } unless any { $itemnumber eq $_ } @reserveditems;
755
756
    # Cancel the reserve
757
    CancelReserve({ itemnumber => $itemnumber, borrowernumber => $borrowernumber });
758
744
745
    C4::Reserves::CancelReserveFromId($reserve_id);
746
    
759
    return { code => 'Canceled' };
747
    return { code => 'Canceled' };
760
}
748
}
761
749
(-)a/C4/Reserves.pm (-1 / +56 lines)
Lines 119-124 BEGIN { Link Here
119
        &CanBookBeReserved
119
        &CanBookBeReserved
120
	&CanItemBeReserved
120
	&CanItemBeReserved
121
        &CancelReserve
121
        &CancelReserve
122
        &CancelReserveFromId
122
        &CancelExpiredReserves
123
        &CancelExpiredReserves
123
124
124
        &AutoUnsuspendReserves
125
        &AutoUnsuspendReserves
Lines 1059-1065 sub CancelReserve { Link Here
1059
    $sth->execute( $reserve_id );
1060
    $sth->execute( $reserve_id );
1060
1061
1061
    # now fix the priority on the others....
1062
    # now fix the priority on the others....
1062
    _FixPriority({ biblionumber => $reserve->{biblionumber} });
1063
    _FixPriority({ biblionumber => $reserve->{biblionumber} });    
1064
}
1065
1066
=head2 CancelReserveFromId
1067
1068
    C4::Reserves::CancelReserveFromId($reserve_id);
1069
1070
Cancel a reserve, given its reserve_id
1071
1072
=cut
1073
1074
sub CancelReserveFromId {
1075
    my ($reserve_id) = @_;
1076
1077
    my $reserve = GetReserve($reserve_id);
1078
    if ($reserve) {
1079
        my $dbh = C4::Context->dbh;
1080
1081
        # update the database, removing the record...
1082
        my $query = qq{
1083
            UPDATE reserves
1084
            SET cancellationdate = NOW(),
1085
                found = NULL,
1086
                priority = 0
1087
            WHERE reserve_id = ?
1088
        };
1089
        my $sth = $dbh->prepare($query);
1090
        $sth->execute($reserve_id);
1091
        $sth->finish;
1092
1093
        $query = qq{
1094
            INSERT INTO old_reserves
1095
            SELECT * FROM reserves
1096
            WHERE reserve_id = ?
1097
        };
1098
        $sth = $dbh->prepare($query);
1099
        my $rv = $sth->execute($reserve_id);
1100
1101
        if ($rv) {
1102
            $query = qq{
1103
                DELETE FROM reserves
1104
                WHERE reserve_id = ?
1105
            };
1106
            $sth = $dbh->prepare($query);
1107
            $sth->execute($reserve_id);
1108
        } else {
1109
            warn "ERROR: Failed to move reserve $reserve_id to table old_reserves.";
1110
            return;
1111
        }
1112
1113
        # now fix the priority on the others...
1114
        _FixPriority({ biblionumber => $reserve->{biblionumber} });
1115
    }
1116
1117
    return $reserve;
1063
}
1118
}
1064
1119
1065
=head2 ModReserve
1120
=head2 ModReserve
(-)a/t/db_dependent/Reserves.t (-2 / +20 lines)
Lines 2-8 Link Here
2
2
3
use Modern::Perl;
3
use Modern::Perl;
4
4
5
use Test::More tests => 31;
5
use Test::More tests => 39;
6
use MARC::Record;
6
use MARC::Record;
7
use DateTime::Duration;
7
use DateTime::Duration;
8
8
Lines 229-234 is( $messages->{ResFound}->{borrowernumber}, Link Here
229
    $requesters{'RPL'},
229
    $requesters{'RPL'},
230
    'for generous library, its items fill first hold request in line (bug 10272)');
230
    'for generous library, its items fill first hold request in line (bug 10272)');
231
231
232
my $reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber});
233
isa_ok($reserves, 'ARRAY');
234
is(scalar @$reserves, 1, "Only one reserves for this biblio");
235
my $reserve_id = $reserves->[0]->{reserve_id};
236
237
$reserve = GetReserve($reserve_id);
238
isa_ok($reserve, 'HASH', "GetReserve return");
239
is($reserve->{biblionumber}, $biblionumber);
240
241
$reserve = CancelReserveFromId($reserve_id);
242
isa_ok($reserve, 'HASH', "CancelReserveFromId return");
243
is($reserve->{biblionumber}, $biblionumber);
244
245
$reserve = GetReserve($reserve_id);
246
is($reserve, undef, "GetReserve returns undef after deletion");
247
248
$reserve = CancelReserveFromId($reserve_id);
249
is($reserve, undef, "CancelReserveFromId return undef if reserve does not exist");
250
232
# Tests for bug 9761 (ConfirmFutureHolds): new CheckReserves lookahead parameter, and corresponding change in AddReturn
251
# Tests for bug 9761 (ConfirmFutureHolds): new CheckReserves lookahead parameter, and corresponding change in AddReturn
233
# Note that CheckReserve uses its lookahead parameter and does not check ConfirmFutureHolds pref (it should be passed if needed like AddReturn does)
252
# Note that CheckReserve uses its lookahead parameter and does not check ConfirmFutureHolds pref (it should be passed if needed like AddReturn does)
234
# Test 9761a: Add a reserve without date, CheckReserve should return it
253
# Test 9761a: Add a reserve without date, CheckReserve should return it
235
- 

Return to bug 8868