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

(-)a/C4/Circulation.pm (-2 / +5 lines)
Lines 26-32 use Encode; Link Here
26
use C4::Context;
26
use C4::Context;
27
use C4::Stats qw( UpdateStats );
27
use C4::Stats qw( UpdateStats );
28
use C4::Reserves
28
use C4::Reserves
29
    qw( CheckReserves CanItemBeReserved MoveReserve ModReserve ModReserveMinusPriority RevertWaitingStatus IsAvailableForItemLevelRequest );
29
    qw( CheckReserves CanItemBeReserved MoveReserve ModReserve ModReserveMinusPriority IsAvailableForItemLevelRequest );
30
use C4::Biblio qw( UpdateTotalIssues );
30
use C4::Biblio qw( UpdateTotalIssues );
31
use C4::Items  qw( ModItemTransfer ModDateLastSeen CartToShelf );
31
use C4::Items  qw( ModItemTransfer ModDateLastSeen CartToShelf );
32
use C4::Accounts;
32
use C4::Accounts;
Lines 2529-2537 sub AddReturn { Link Here
2529
    my $lookahead = C4::Context->preference('ConfirmFutureHolds');    #number of days to look for future holds
2529
    my $lookahead = C4::Context->preference('ConfirmFutureHolds');    #number of days to look for future holds
2530
    ( $resfound, $resrec, undef ) = C4::Reserves::CheckReserves( $item, $lookahead ) unless ( $item->withdrawn );
2530
    ( $resfound, $resrec, undef ) = C4::Reserves::CheckReserves( $item, $lookahead ) unless ( $item->withdrawn );
2531
2531
2532
    # FIXME: CheckReserves should return the Koha::Hold
2533
    my $hold = Koha::Holds->find( $resrec->{reserve_id} );
2534
2532
    # 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)
2535
    # 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)
2533
    if ( $resfound and $resfound eq "Waiting" and $branch ne $resrec->{branchcode} ) {
2536
    if ( $resfound and $resfound eq "Waiting" and $branch ne $resrec->{branchcode} ) {
2534
        my $hold = C4::Reserves::RevertWaitingStatus( { itemnumber => $item->itemnumber } );
2537
        $hold->revert_waiting();
2535
        $resfound = 'Reserved';
2538
        $resfound = 'Reserved';
2536
        $resrec   = $hold->unblessed;
2539
        $resrec   = $hold->unblessed;
2537
    }
2540
    }
(-)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 2084-2093 sub MoveReserve { Link Here
2084
            $hold->fill( { item_id => $item->id } );
2082
            $hold->fill( { item_id => $item->id } );
2085
        }
2083
        }
2086
2084
2087
        if ( $cancelreserve eq 'revert' ) {    ## Revert waiting reserve to priority 1
2085
        $hold = Koha::Holds->find( $res->{reserve_id} );
2088
            RevertWaitingStatus( { itemnumber => $item->id } );
2086
        if ( $cancelreserve eq 'revert' ) {
2087
            $hold->revert_waiting();
2089
        } elsif ( $cancelreserve eq 'cancel' || $cancelreserve ) {    # cancel reserves on this item
2088
        } elsif ( $cancelreserve eq 'cancel' || $cancelreserve ) {    # cancel reserves on this item
2090
            my $hold = Koha::Holds->find( $res->{reserve_id} );
2091
            $hold->cancel;
2089
            $hold->cancel;
2092
        }
2090
        }
2093
    }
2091
    }
Lines 2134-2198 sub MergeHolds { Link Here
2134
    }
2132
    }
2135
}
2133
}
2136
2134
2137
=head2 RevertWaitingStatus
2138
2139
  RevertWaitingStatus({ itemnumber => $itemnumber });
2140
2141
  Reverts a 'waiting' hold back to a regular hold with a priority of 1.
2142
2143
  Caveat: Any waiting hold fixed with RevertWaitingStatus will be an
2144
          item level hold, even if it was only a bibliolevel hold to
2145
          begin with. This is because we can no longer know if a hold
2146
          was item-level or bib-level after a hold has been set to
2147
          waiting status.
2148
2149
=cut
2150
2151
sub RevertWaitingStatus {
2152
    my ($params) = @_;
2153
    my $itemnumber = $params->{'itemnumber'};
2154
2155
    return unless ($itemnumber);
2156
2157
    my $dbh = C4::Context->dbh;
2158
2159
    ## Get the waiting reserve we want to revert
2160
    my $hold = Koha::Holds->search(
2161
        {
2162
            itemnumber => $itemnumber,
2163
            found      => { not => undef },
2164
        }
2165
    )->next;
2166
2167
    my $original = C4::Context->preference('HoldsLog') ? $hold->unblessed : undef;
2168
2169
    ## Increment the priority of all other non-waiting
2170
    ## reserves for this bib record
2171
    my $holds = Koha::Holds->search( { biblionumber => $hold->biblionumber, priority => { '>' => 0 } } )
2172
        ->update( { priority => \'priority + 1' }, { no_triggers => 1 } );
2173
2174
    ## Fix up the currently waiting reserve
2175
    $hold->set(
2176
        {
2177
            priority       => 1,
2178
            found          => undef,
2179
            waitingdate    => undef,
2180
            expirationdate => $hold->patron_expiration_date,
2181
            itemnumber     => $hold->item_level_hold ? $hold->itemnumber : undef,
2182
        }
2183
    )->store( { hold_reverted => 1 } );
2184
2185
    logaction( 'HOLDS', 'MODIFY', $hold->id, $hold, undef, $original )
2186
        if C4::Context->preference('HoldsLog');
2187
2188
    _FixPriority( { biblionumber => $hold->biblionumber } );
2189
2190
    Koha::BackgroundJob::BatchUpdateBiblioHoldsQueue->new->enqueue( { biblio_ids => [ $hold->biblionumber ] } )
2191
        if C4::Context->preference('RealTimeHoldsQueue');
2192
2193
    return $hold;
2194
}
2195
2196
=head2 ReserveSlip
2135
=head2 ReserveSlip
2197
2136
2198
ReserveSlip(
2137
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