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

(-)a/C4/Circulation.pm (-1 / +1 lines)
Lines 1707-1713 sub AddIssue { Link Here
1707
                );
1707
                );
1708
            }
1708
            }
1709
1709
1710
            C4::Reserves::MoveReserve( $item_object->itemnumber, $patron->borrowernumber, $cancelreserve );
1710
            C4::Reserves::MoveReserve( $item_object, $patron, $cancelreserve );
1711
1711
1712
            # Starting process for transfer job (checking transfer and validate it if we have one)
1712
            # Starting process for transfer job (checking transfer and validate it if we have one)
1713
            if ( my $transfer = $item_object->get_transfer ) {
1713
            if ( my $transfer = $item_object->get_transfer ) {
(-)a/C4/Reserves.pm (-13 / +23 lines)
Lines 2028-2052 sub _ShiftPriority { Link Here
2028
2028
2029
=head2 MoveReserve
2029
=head2 MoveReserve
2030
2030
2031
  MoveReserve( $itemnumber, $borrowernumber, $cancelreserve )
2031
  MoveReserve( $item, $patron, $cancelreserve )
2032
2032
2033
Use when checking out an item to handle reserves
2033
Use when checking out an item to handle reserves
2034
If $cancelreserve boolean is set to true, it will remove existing reserve
2034
If $cancelreserve boolean is set to true, it will remove existing reserve
2035
2035
2036
Parameters are:
2037
2038
=over 4
2039
2040
=item B<$item>: a I<Koha::Item> object
2041
2042
=item B<$patron>: a I<Koha::Patron> object
2043
2044
=item B<$cancelreserve>: a boolean telling if the existing hold should be removed
2045
2046
=back
2047
2036
=cut
2048
=cut
2037
2049
2038
sub MoveReserve {
2050
sub MoveReserve {
2039
    my ( $itemnumber, $borrowernumber, $cancelreserve ) = @_;
2051
    my ( $item, $patron, $cancelreserve ) = @_;
2040
2052
2041
    $cancelreserve //= 0;
2053
    $cancelreserve //= 0;
2042
2054
2043
    my $lookahead = C4::Context->preference('ConfirmFutureHolds');    #number of days to look for future holds
2055
    my $lookahead = C4::Context->preference('ConfirmFutureHolds');    #number of days to look for future holds
2044
    my $item      = Koha::Items->find($itemnumber);
2045
    my ( $restype, $res, undef ) = CheckReserves( $item, $lookahead );
2056
    my ( $restype, $res, undef ) = CheckReserves( $item, $lookahead );
2046
2057
2047
    if ( $res && $res->{borrowernumber} == $borrowernumber ) {
2058
    if ( $res && $res->{borrowernumber} == $patron->borrowernumber ) {
2048
        my $hold = Koha::Holds->find( $res->{reserve_id} );
2059
        my $hold = Koha::Holds->find( $res->{reserve_id} );
2049
        $hold->fill( { item_id => $itemnumber } );
2060
        $hold->fill( { item_id => $item->id } );
2050
    } else {
2061
    } else {
2051
2062
2052
        # The item is reserved by someone else.
2063
        # The item is reserved by someone else.
Lines 2058-2081 sub MoveReserve { Link Here
2058
                dateformat => 'iso', dateonly => 1
2069
                dateformat => 'iso', dateonly => 1
2059
            }
2070
            }
2060
        );
2071
        );
2061
        my $borr_res = Koha::Holds->search(
2072
        my $hold = $patron->holds->search(
2062
            {
2073
            {
2063
                borrowernumber => $borrowernumber,
2074
                biblionumber => $item->biblionumber,
2064
                biblionumber   => $item->biblionumber,
2075
                reservedate  => { '<=' => $lookahead_date },
2065
                reservedate    => { '<=' => $lookahead_date },
2076
                -or          => [ item_level_hold => 0, itemnumber => $item->id ],
2066
                -or            => [ item_level_hold => 0, itemnumber => $itemnumber ],
2067
            },
2077
            },
2068
            { order_by => 'priority' }
2078
            { order_by => 'priority' }
2069
        )->next();
2079
        )->next();
2070
2080
2071
        if ($borr_res) {
2081
        if ($hold) {
2072
2082
2073
            # The item is reserved by the current patron
2083
            # The item is reserved by the current patron
2074
            $borr_res->fill( { item_id => $itemnumber } );
2084
            $hold->fill( { item_id => $item->id } );
2075
        }
2085
        }
2076
2086
2077
        if ( $cancelreserve eq 'revert' ) {    ## Revert waiting reserve to priority 1
2087
        if ( $cancelreserve eq 'revert' ) {    ## Revert waiting reserve to priority 1
2078
            RevertWaitingStatus( { itemnumber => $itemnumber } );
2088
            RevertWaitingStatus( { itemnumber => $item->id } );
2079
        } elsif ( $cancelreserve eq 'cancel' || $cancelreserve ) {    # cancel reserves on this item
2089
        } elsif ( $cancelreserve eq 'cancel' || $cancelreserve ) {    # cancel reserves on this item
2080
            my $hold = Koha::Holds->find( $res->{reserve_id} );
2090
            my $hold = Koha::Holds->find( $res->{reserve_id} );
2081
            $hold->cancel;
2091
            $hold->cancel;
(-)a/t/db_dependent/Holds.t (-1 / +1 lines)
Lines 2077-2083 subtest 'EmailPatronWhenHoldIsPlaced tests' => sub { Link Here
2077
        $post_notices_count, $original_notices_count,
2077
        $post_notices_count, $original_notices_count,
2078
        "EmailPatronWhenHoldIsPlaced is disabled so no email is queued"
2078
        "EmailPatronWhenHoldIsPlaced is disabled so no email is queued"
2079
    );
2079
    );
2080
    MoveReserve( $item->itemnumber, $borrowernumber, 1 );
2080
    MoveReserve( $item, $patron, 1 );
2081
2081
2082
    $original_notices_count = Koha::Notice::Messages->search(
2082
    $original_notices_count = Koha::Notice::Messages->search(
2083
        {
2083
        {
(-)a/t/db_dependent/Reserves.t (-10 / +9 lines)
Lines 699-705 AddReserve( Link Here
699
        priority       => 1,
699
        priority       => 1,
700
    }
700
    }
701
);
701
);
702
MoveReserve( $item->itemnumber, $borrowernumber );
702
MoveReserve( $item, $patron );
703
($status) = CheckReserves($item);
703
($status) = CheckReserves($item);
704
is( $status, '', 'MoveReserve filled hold' );
704
is( $status, '', 'MoveReserve filled hold' );
705
705
Lines 715-721 AddReserve( Link Here
715
        itemnumber     => $other_item->id,
715
        itemnumber     => $other_item->id,
716
    }
716
    }
717
);
717
);
718
MoveReserve( $item->itemnumber, $borrowernumber );
718
MoveReserve( $item, $patron );
719
($status) = CheckReserves($item);
719
($status) = CheckReserves($item);
720
is( $status, '', 'MoveReserve filled waiting hold' );
720
is( $status, '', 'MoveReserve filled waiting hold' );
721
721
Lines 731-737 AddReserve( Link Here
731
        reservation_date => $resdate,
731
        reservation_date => $resdate,
732
    }
732
    }
733
);
733
);
734
MoveReserve( $item->itemnumber, $borrowernumber );
734
MoveReserve( $item, $patron );
735
($status) = CheckReserves( $item, 1 );
735
($status) = CheckReserves( $item, 1 );
736
is( $status, 'Reserved', 'MoveReserve did not fill future hold' );
736
is( $status, 'Reserved', 'MoveReserve did not fill future hold' );
737
$dbh->do( 'DELETE FROM reserves', undef, ($bibnum) );
737
$dbh->do( 'DELETE FROM reserves', undef, ($bibnum) );
Lines 747-753 AddReserve( Link Here
747
        reservation_date => $resdate,
747
        reservation_date => $resdate,
748
    }
748
    }
749
);
749
);
750
MoveReserve( $item->itemnumber, $borrowernumber );
750
MoveReserve( $item, $patron );
751
($status) = CheckReserves( $item, undef, 2 );
751
($status) = CheckReserves( $item, undef, 2 );
752
is( $status, '', 'MoveReserve filled future hold now' );
752
is( $status, '', 'MoveReserve filled future hold now' );
753
753
Lines 761-767 AddReserve( Link Here
761
        reservation_date => $resdate,
761
        reservation_date => $resdate,
762
    }
762
    }
763
);
763
);
764
MoveReserve( $item->itemnumber, $borrowernumber );
764
MoveReserve( $item, $patron );
765
($status) = CheckReserves( $item, undef, 2 );
765
($status) = CheckReserves( $item, undef, 2 );
766
is( $status, '', 'MoveReserve filled future waiting hold now' );
766
is( $status, '', 'MoveReserve filled future waiting hold now' );
767
767
Lines 777-783 AddReserve( Link Here
777
        reservation_date => $resdate,
777
        reservation_date => $resdate,
778
    }
778
    }
779
);
779
);
780
MoveReserve( $item->itemnumber, $borrowernumber );
780
MoveReserve( $item, $patron );
781
($status) = CheckReserves( $item, 3 );
781
($status) = CheckReserves( $item, 3 );
782
is( $status, 'Reserved', 'MoveReserve did not fill future hold of 3 days' );
782
is( $status, 'Reserved', 'MoveReserve did not fill future hold of 3 days' );
783
$dbh->do( 'DELETE FROM reserves', undef, ($bibnum) );
783
$dbh->do( 'DELETE FROM reserves', undef, ($bibnum) );
Lines 1176-1182 subtest 'MoveReserve additional test' => sub { Link Here
1176
    );
1176
    );
1177
1177
1178
    # The 2nd hold should be filled even if the item is preselected for the first hold
1178
    # The 2nd hold should be filled even if the item is preselected for the first hold
1179
    MoveReserve( $item_1->itemnumber, $patron_2->borrowernumber );
1179
    MoveReserve( $item_1, $patron_2 );
1180
    is( $patron_2->holds->count, 0, "The 2nd patrons no longer has a hold" );
1180
    is( $patron_2->holds->count, 0, "The 2nd patrons no longer has a hold" );
1181
    is(
1181
    is(
1182
        $patron_2->old_holds->next()->reserve_id, $reserve_2,
1182
        $patron_2->old_holds->next()->reserve_id, $reserve_2,
Lines 1194-1200 subtest 'MoveReserve additional test' => sub { Link Here
1194
    );
1194
    );
1195
1195
1196
    # The 3rd hold should not be filled as it is an item level hold on a different item
1196
    # The 3rd hold should not be filled as it is an item level hold on a different item
1197
    MoveReserve( $item_1->itemnumber, $patron_2->borrowernumber );
1197
    MoveReserve( $item_1, $patron_2 );
1198
    is( $patron_2->holds->count,     1, "The 2nd patron still has a hold" );
1198
    is( $patron_2->holds->count,     1, "The 2nd patron still has a hold" );
1199
    is( $patron_2->old_holds->count, 1, "The 2nd patron has only 1 old holds" );
1199
    is( $patron_2->old_holds->count, 1, "The 2nd patron has only 1 old holds" );
1200
1200
Lines 1202-1208 subtest 'MoveReserve additional test' => sub { Link Here
1202
    $hold_3->item_level_hold(0)->store();
1202
    $hold_3->item_level_hold(0)->store();
1203
1203
1204
    # The 3rd hold should now be filled as it is a title level hold, even though associated with a different item
1204
    # The 3rd hold should now be filled as it is a title level hold, even though associated with a different item
1205
    MoveReserve( $item_1->itemnumber, $patron_2->borrowernumber );
1205
    MoveReserve( $item_1, $patron_2 );
1206
    is( $patron_2->holds->count,       0, "The 2nd patron no longer has a hold" );
1206
    is( $patron_2->holds->count,       0, "The 2nd patron no longer has a hold" );
1207
    is( $patron_2->old_holds->count(), 2, "The 2nd patron's hold was filled and moved to old holds" );
1207
    is( $patron_2->old_holds->count(), 2, "The 2nd patron's hold was filled and moved to old holds" );
1208
1208
1209
- 

Return to bug 40055