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

(-)a/Koha/Hold.pm (-81 / +38 lines)
Lines 178-285 sub delete { Link Here
178
    return $deleted;
178
    return $deleted;
179
}
179
}
180
180
181
=head3 move_hold_item
181
=head3 move_hold
182
182
183
$hold->move_hold_item();
183
$hold->move_hold();
184
184
185
=cut
185
=cut
186
186
187
sub move_hold_item {
187
sub move_hold {
188
    my ( $self, $args ) = @_;
188
    my ( $self, $args ) = @_;
189
189
190
    my $new_itemnumber   = $args->{new_itemnumber};
191
    my $new_biblionumber = $args->{new_biblionumber};
192
193
    my $original              = $self;
190
    my $original              = $self;
194
    my $original_biblionumber = $self->biblionumber;
191
    my $original_biblionumber = $self->biblionumber;
195
192
196
    my $patron   = Koha::Patrons->find( { borrowernumber => $self->borrowernumber } );
193
    my $patron = Koha::Patrons->find( { borrowernumber => $self->borrowernumber } );
197
    my $new_item = Koha::Items->find( { itemnumber => $new_itemnumber } );
194
    return { success => 0, error => 'Missing patron or target' } unless $patron;
198
199
    if ($new_itemnumber) {
200
201
        #check to see if moving this hold is allowed
202
        my $canReserve =
203
            C4::Reserves::CanItemBeReserved( $patron, $new_item, $self->branchcode, { ignore_hold_counts => 1 } );
204
205
        if ( $canReserve->{status} eq 'OK' ) {
206
            my $max = Koha::Holds->search(
207
                { biblionumber => $new_biblionumber },
208
                { order_by     => { -desc => 'priority' }, rows => 1 }
209
            )->next;
210
            my $base_priority = $max ? $max->priority : 0;
211
            my $priority      = $base_priority + 1;
212
            my $new_priority  = C4::Reserves::_ShiftPriority( $new_biblionumber, $priority );
213
214
            $self->update(
215
                {
216
                    itemnumber   => $new_item->itemnumber,
217
                    biblionumber => $new_item->biblionumber,
218
                    priority     => $new_priority,
219
                }
220
            );
221
222
            C4::Log::logaction( 'HOLDS', 'MODIFY', $self->reserve_id, $self, undef, $original )
223
                if C4::Context->preference('HoldsLog');
224
225
            return { success => 1, hold => $self };
226
        } else {
227
            return { success => 0, error => $canReserve->{status} };
228
        }
229
    }
230
    return $self;
231
}
232
233
=head3 move_hold_biblio
234
235
$hold->move_hold_biblio();
236
237
=cut
238
239
sub move_hold_biblio {
240
    my ( $self, $args ) = @_;
241
195
242
    my $new_biblionumber = $args->{new_biblionumber};
196
    my ( $new_biblionumber, $new_itemnumber, $item, $canReserve );
243
197
244
    my $original              = $self;
198
    if ( $args->{new_itemnumber} ) {
245
    my $original_biblionumber = $self->biblionumber;
199
        $item = Koha::Items->find( { itemnumber => $args->{new_itemnumber} } )
200
            or return { success => 0, error => 'Target item not found' };
246
201
247
    my $patron = Koha::Patrons->find( { borrowernumber => $self->borrowernumber } );
202
        $new_itemnumber   = $item->itemnumber;
203
        $new_biblionumber = $item->biblionumber;
248
204
249
    if ($new_biblionumber) {
205
        $canReserve = C4::Reserves::CanItemBeReserved( $patron, $item, $self->branchcode, { ignore_hold_counts => 1 } );
206
    } elsif ( $args->{new_biblionumber} ) {
207
        $new_biblionumber = $args->{new_biblionumber};
250
208
251
        #check to see if moving this hold is allowed
209
        $canReserve = C4::Reserves::CanBookBeReserved(
252
        my $canReserve = C4::Reserves::CanBookBeReserved(
253
            $patron->borrowernumber, $new_biblionumber, $self->branchcode,
210
            $patron->borrowernumber, $new_biblionumber, $self->branchcode,
254
            { ignore_hold_counts => 1 }
211
            { ignore_hold_counts => 1 }
255
        );
212
        );
213
    } else {
214
        return { success => 0, error => 'Missing itemnumber or biblionumber' };
215
    }
256
216
257
        if ( $canReserve->{status} eq 'OK' ) {
217
    return { success => 0, error => $canReserve->{status} }
258
            my $max = Koha::Holds->search(
218
        unless $canReserve->{status} eq 'OK';
259
                { biblionumber => $new_biblionumber },
260
                { order_by     => { -desc => 'priority' }, rows => 1 }
261
            )->next;
262
            my $base_priority = $max ? $max->priority : 0;
263
            my $priority      = $base_priority + 1;
264
            my $new_priority  = C4::Reserves::_ShiftPriority( $new_biblionumber, $priority );
265
266
            $self->update(
267
                {
268
                    itemnumber   => undef,
269
                    biblionumber => $new_biblionumber,
270
                    priority     => $new_priority,
271
                }
272
            );
273
219
274
            C4::Log::logaction( 'HOLDS', 'MODIFY', $self->reserve_id, $self, undef, $original )
220
    my $max = Koha::Holds->search(
275
                if C4::Context->preference('HoldsLog');
221
        { biblionumber => $new_biblionumber },
222
        { order_by     => { -desc => 'priority' }, rows => 1 }
223
    )->next;
224
    my $base_priority = $max ? $max->priority : 0;
225
    my $priority      = $base_priority + 1;
226
    my $new_priority  = C4::Reserves::_ShiftPriority( $new_biblionumber, $priority );
276
227
277
            return { success => 1, hold => $self };
228
    $self->update(
278
        } else {
229
        {
279
            return { success => 0, error => $canReserve->{status} };
230
            itemnumber   => $new_itemnumber,     # undef for biblio-level is fine
231
            biblionumber => $new_biblionumber,
232
            priority     => $new_priority,
280
        }
233
        }
281
    }
234
    );
282
    return $self;
235
236
    C4::Log::logaction( 'HOLDS', 'MODIFY', $self->reserve_id, $self, undef, $original )
237
        if C4::Context->preference('HoldsLog');
238
239
    return { success => 1, hold => $self };
283
}
240
}
284
241
285
=head3 set_transfer
242
=head3 set_transfer
(-)a/reserve/request.pl (-13 / +8 lines)
Lines 114-121 if ( $op eq 'cud-move' ) { Link Here
114
} elsif ( $op eq 'cud-move_hold_item' or $op eq 'cud-move_hold_biblio' ) {
114
} elsif ( $op eq 'cud-move_hold_item' or $op eq 'cud-move_hold_biblio' ) {
115
    my @hold_ids              = $input->multi_param('hold_id');
115
    my @hold_ids              = $input->multi_param('hold_id');
116
    my $original_biblionumber = $input->param('original_biblionumber');
116
    my $original_biblionumber = $input->param('original_biblionumber');
117
117
    my @moving_holds          = Koha::Holds->search(
118
    my @moving_holds = Koha::Holds->search(
119
        { reserve_id => \@hold_ids },
118
        { reserve_id => \@hold_ids },
120
        { order_by   => { -asc => 'priority' } }
119
        { order_by   => { -asc => 'priority' } }
121
    )->as_list;
120
    )->as_list;
Lines 123-138 if ( $op eq 'cud-move' ) { Link Here
123
    my $new_biblionumber = $input->param('new_biblionumber');
122
    my $new_biblionumber = $input->param('new_biblionumber');
124
    my $target_biblio    = Koha::Biblios->find($new_biblionumber);
123
    my $target_biblio    = Koha::Biblios->find($new_biblionumber);
125
124
126
    my $move_method;
125
    my %args = (
127
    my %args;
126
        new_biblionumber => $new_biblionumber,
127
    );
128
128
129
    # Only pass new_itemnumber if this is an item level move
129
    if ( $op eq 'cud-move_hold_item' ) {
130
    if ( $op eq 'cud-move_hold_item' ) {
130
        $args{new_itemnumber}   = $input->param('new_itemnumber');
131
        $args{new_itemnumber} = $input->param('new_itemnumber');
131
        $args{new_biblionumber} = $new_biblionumber;
132
        $move_method            = 'move_hold_item';
133
    } else {
134
        $args{new_biblionumber} = $new_biblionumber;
135
        $move_method = 'move_hold_biblio';
136
    }
132
    }
137
133
138
    my @success_messages;
134
    my @success_messages;
Lines 141-147 if ( $op eq 'cud-move' ) { Link Here
141
    foreach my $hold (@moving_holds) {
137
    foreach my $hold (@moving_holds) {
142
        my $original_biblio = Koha::Biblios->find( $hold->biblionumber );
138
        my $original_biblio = Koha::Biblios->find( $hold->biblionumber );
143
139
144
        my $result = $hold->$move_method( \%args );
140
        my $result = $hold->move_hold( \%args );
145
141
146
        if ( $result->{success} ) {
142
        if ( $result->{success} ) {
147
            push @success_messages, {
143
            push @success_messages, {
Lines 161-168 if ( $op eq 'cud-move' ) { Link Here
161
        }
157
        }
162
    }
158
    }
163
159
160
    #Fix the priority on the original record
164
    C4::Reserves::_FixPriority( { biblionumber => $original_biblionumber } );
161
    C4::Reserves::_FixPriority( { biblionumber => $original_biblionumber } );
165
    push @biblionumbers, $original_biblionumber;
166
162
167
    $template->param(
163
    $template->param(
168
        hold_move_successes => \@success_messages,
164
        hold_move_successes => \@success_messages,
169
- 

Return to bug 31698