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

(-)a/C4/Circulation.pm (-2 / +5 lines)
Lines 27-33 use Try::Tiny; Link Here
27
use C4::Context;
27
use C4::Context;
28
use C4::Stats qw( UpdateStats );
28
use C4::Stats qw( UpdateStats );
29
use C4::Reserves
29
use C4::Reserves
30
    qw( CheckReserves CanItemBeReserved MoveReserve ModReserve ModReserveMinusPriority RevertWaitingStatus IsAvailableForItemLevelRequest );
30
    qw( CheckReserves CanItemBeReserved MoveReserve ModReserve ModReserveMinusPriority IsAvailableForItemLevelRequest );
31
use C4::Biblio qw( UpdateTotalIssues );
31
use C4::Biblio qw( UpdateTotalIssues );
32
use C4::Items  qw( ModItemTransfer ModDateLastSeen CartToShelf );
32
use C4::Items  qw( ModItemTransfer ModDateLastSeen CartToShelf );
33
use C4::Accounts;
33
use C4::Accounts;
Lines 2537-2545 sub AddReturn { Link Here
2537
    my $lookahead = C4::Context->preference('ConfirmFutureHolds');    #number of days to look for future holds
2537
    my $lookahead = C4::Context->preference('ConfirmFutureHolds');    #number of days to look for future holds
2538
    ( $resfound, $resrec, undef ) = C4::Reserves::CheckReserves( $item, $lookahead ) unless ( $item->withdrawn );
2538
    ( $resfound, $resrec, undef ) = C4::Reserves::CheckReserves( $item, $lookahead ) unless ( $item->withdrawn );
2539
2539
2540
    # FIXME: CheckReserves should return the Koha::Hold
2541
    my $hold = Koha::Holds->find( $resrec->{reserve_id} );
2542
2540
    # if a hold is found and is waiting at another branch, change the priority back to 1 and trigger the hold (this will trigger a transfer and update the hold status properly)
2543
    # if a hold is found and is waiting at another branch, change the priority back to 1 and trigger the hold (this will trigger a transfer and update the hold status properly)
2541
    if ( $resfound and $resfound eq "Waiting" and $branch ne $resrec->{branchcode} ) {
2544
    if ( $resfound and $resfound eq "Waiting" and $branch ne $resrec->{branchcode} ) {
2542
        my $hold = C4::Reserves::RevertWaitingStatus( { itemnumber => $item->itemnumber } );
2545
        $hold->revert_waiting();
2543
        $resfound = 'Reserved';
2546
        $resfound = 'Reserved';
2544
        $resrec   = $hold->unblessed;
2547
        $resrec   = $hold->unblessed;
2545
    }
2548
    }
(-)a/C4/Reserves.pm (-64 / +3 lines)
Lines 137-144 BEGIN { Link Here
137
        GetMaxPatronHoldsForRecord
137
        GetMaxPatronHoldsForRecord
138
138
139
        MergeHolds
139
        MergeHolds
140
141
        RevertWaitingStatus
142
    );
140
    );
143
}
141
}
144
142
Lines 2085-2094 sub MoveReserve { Link Here
2085
            $hold->fill( { item_id => $item->id } );
2083
            $hold->fill( { item_id => $item->id } );
2086
        }
2084
        }
2087
2085
2088
        if ( $cancelreserve eq 'revert' ) {    ## Revert waiting reserve to priority 1
2086
        $hold = Koha::Holds->find( $res->{reserve_id} );
2089
            RevertWaitingStatus( { itemnumber => $item->id } );
2087
        if ( $cancelreserve eq 'revert' ) {
2088
            $hold->revert_waiting();
2090
        } elsif ( $cancelreserve eq 'cancel' || $cancelreserve ) {    # cancel reserves on this item
2089
        } elsif ( $cancelreserve eq 'cancel' || $cancelreserve ) {    # cancel reserves on this item
2091
            my $hold = Koha::Holds->find( $res->{reserve_id} );
2092
            $hold->cancel;
2090
            $hold->cancel;
2093
        }
2091
        }
2094
    }
2092
    }
Lines 2135-2199 sub MergeHolds { Link Here
2135
    }
2133
    }
2136
}
2134
}
2137
2135
2138
=head2 RevertWaitingStatus
2139
2140
  RevertWaitingStatus({ itemnumber => $itemnumber });
2141
2142
  Reverts a 'waiting' hold back to a regular hold with a priority of 1.
2143
2144
  Caveat: Any waiting hold fixed with RevertWaitingStatus will be an
2145
          item level hold, even if it was only a bibliolevel hold to
2146
          begin with. This is because we can no longer know if a hold
2147
          was item-level or bib-level after a hold has been set to
2148
          waiting status.
2149
2150
=cut
2151
2152
sub RevertWaitingStatus {
2153
    my ($params) = @_;
2154
    my $itemnumber = $params->{'itemnumber'};
2155
2156
    return unless ($itemnumber);
2157
2158
    my $dbh = C4::Context->dbh;
2159
2160
    ## Get the waiting reserve we want to revert
2161
    my $hold = Koha::Holds->search(
2162
        {
2163
            itemnumber => $itemnumber,
2164
            found      => { not => undef },
2165
        }
2166
    )->next;
2167
2168
    my $original = C4::Context->preference('HoldsLog') ? $hold->unblessed : undef;
2169
2170
    ## Increment the priority of all other non-waiting
2171
    ## reserves for this bib record
2172
    my $holds = Koha::Holds->search( { biblionumber => $hold->biblionumber, priority => { '>' => 0 } } )
2173
        ->update( { priority => \'priority + 1' }, { no_triggers => 1 } );
2174
2175
    ## Fix up the currently waiting reserve
2176
    $hold->set(
2177
        {
2178
            priority       => 1,
2179
            found          => undef,
2180
            waitingdate    => undef,
2181
            expirationdate => $hold->patron_expiration_date,
2182
            itemnumber     => $hold->item_level_hold ? $hold->itemnumber : undef,
2183
        }
2184
    )->store( { hold_reverted => 1 } );
2185
2186
    logaction( 'HOLDS', 'MODIFY', $hold->id, $hold, undef, $original )
2187
        if C4::Context->preference('HoldsLog');
2188
2189
    _FixPriority( { biblionumber => $hold->biblionumber } );
2190
2191
    Koha::BackgroundJob::BatchUpdateBiblioHoldsQueue->new->enqueue( { biblio_ids => [ $hold->biblionumber ] } )
2192
        if C4::Context->preference('RealTimeHoldsQueue');
2193
2194
    return $hold;
2195
}
2196
2197
=head2 ReserveSlip
2136
=head2 ReserveSlip
2198
2137
2199
ReserveSlip(
2138
ReserveSlip(
(-)a/reserve/request.pl (-3 / +3 lines)
Lines 33-39 use Date::Calc qw( Date_to_Days ); Link Here
33
use C4::Output      qw( output_html_with_http_headers );
33
use C4::Output      qw( output_html_with_http_headers );
34
use C4::Auth        qw( get_template_and_user );
34
use C4::Auth        qw( get_template_and_user );
35
use C4::Reserves
35
use C4::Reserves
36
    qw( RevertWaitingStatus AlterPriority ToggleLowestPriority CanBookBeReserved GetMaxPatronHoldsForRecord CanItemBeReserved IsAvailableForItemLevelRequest );
36
    qw( AlterPriority ToggleLowestPriority CanBookBeReserved GetMaxPatronHoldsForRecord CanItemBeReserved IsAvailableForItemLevelRequest );
37
use C4::Items       qw( get_hostitemnumbers_of );
37
use C4::Items       qw( get_hostitemnumbers_of );
38
use C4::Koha        qw( getitemtypeimagelocation );
38
use C4::Koha        qw( getitemtypeimagelocation );
39
use C4::Serials     qw( CountSubscriptionFromBiblionumber );
39
use C4::Serials     qw( CountSubscriptionFromBiblionumber );
Lines 102-108 if ( $op eq 'cud-move' ) { Link Here
102
    my $last_priority   = $input->param('last_priority');
102
    my $last_priority   = $input->param('last_priority');
103
    my $hold_itemnumber = $input->param('itemnumber');
103
    my $hold_itemnumber = $input->param('itemnumber');
104
    if ( $prev_priority == 0 && $next_priority == 1 ) {
104
    if ( $prev_priority == 0 && $next_priority == 1 ) {
105
        C4::Reserves::RevertWaitingStatus( { itemnumber => $hold_itemnumber } );
105
        my $hold = Koha::Holds->find($reserve_id);
106
        $hold->revert_waiting();
106
    } else {
107
    } else {
107
        AlterPriority(
108
        AlterPriority(
108
            $where,         $reserve_id,     $prev_priority,
109
            $where,         $reserve_id,     $prev_priority,
109
- 

Return to bug 40058