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

(-)a/Koha/Hold.pm (+71 lines)
Lines 178-183 sub delete { Link Here
178
    return $deleted;
178
    return $deleted;
179
}
179
}
180
180
181
=head3 move_hold
182
183
$hold->move_hold();
184
185
=cut
186
187
sub move_hold {
188
    my ( $self, $args ) = @_;
189
190
    my $original              = $self;
191
    my $original_biblionumber = $self->biblionumber;
192
193
    my $found = $original->found // '';
194
195
    if ( $found eq 'W' ) {
196
        return { success => 0, error => 'Cannot move a waiting hold' };
197
    }
198
199
    if ( $found eq 'T' ) {
200
        return { success => 0, error => 'Cannot move a hold in transit' };
201
    }
202
203
    my $patron = Koha::Patrons->find( { borrowernumber => $self->borrowernumber } );
204
    return { success => 0, error => 'Missing patron or target' } unless $patron;
205
206
    my ( $new_biblionumber, $new_itemnumber, $item, $canReserve );
207
208
    if ( $args->{new_itemnumber} ) {
209
        $item = Koha::Items->find( { itemnumber => $args->{new_itemnumber} } )
210
            or return { success => 0, error => 'Target item not found' };
211
212
        $new_itemnumber   = $item->itemnumber;
213
        $new_biblionumber = $item->biblionumber;
214
215
        $canReserve = C4::Reserves::CanItemBeReserved( $patron, $item, $self->branchcode, { ignore_hold_counts => 1 } );
216
    } elsif ( $args->{new_biblionumber} ) {
217
        $new_biblionumber = $args->{new_biblionumber};
218
219
        $canReserve = C4::Reserves::CanBookBeReserved(
220
            $patron->borrowernumber, $new_biblionumber, $self->branchcode,
221
            { ignore_hold_counts => 1 }
222
        );
223
    } else {
224
        return { success => 0, error => 'Missing itemnumber or biblionumber' };
225
    }
226
227
    return { success => 0, error => $canReserve->{status} }
228
        unless $canReserve->{status} eq 'OK';
229
230
    my $max = Koha::Holds->search(
231
        { biblionumber => $new_biblionumber },
232
        { order_by     => { -desc => 'priority' }, rows => 1 }
233
    )->next;
234
    my $base_priority = $max ? $max->priority : 0;
235
    my $priority      = $base_priority + 1;
236
    my $new_priority  = C4::Reserves::_ShiftPriority( $new_biblionumber, $priority );
237
238
    $self->update(
239
        {
240
            itemnumber   => $new_itemnumber,     # undef for biblio-level is fine
241
            biblionumber => $new_biblionumber,
242
            priority     => $new_priority,
243
        }
244
    );
245
246
    C4::Log::logaction( 'HOLDS', 'MODIFY', $self->reserve_id, $self, undef, $original )
247
        if C4::Context->preference('HoldsLog');
248
249
    return { success => 1, hold => $self };
250
}
251
181
=head3 set_transfer
252
=head3 set_transfer
182
253
183
=cut
254
=cut
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/holds_table.inc (-1 / +11 lines)
Lines 46-52 Link Here
46
            [%- END -%]
46
            [%- END -%]
47
            [% SET tr_class = hold.suspend ? 'suspend' : '' %]
47
            [% SET tr_class = hold.suspend ? 'suspend' : '' %]
48
            <tr class="[% tr_class | html %]">
48
            <tr class="[% tr_class | html %]">
49
                <td><input type="checkbox" class="select_hold" data-id="[% hold.reserve_id | html %]" /></td>
49
                <td
50
                    ><input
51
                        type="checkbox"
52
                        class="select_hold"
53
                        data-id="[% hold.reserve_id | html %]"
54
                        data-item_level_hold="[% hold.item_level_hold | html %]"
55
                        data-itemnumber="[% hold.itemnumber | html %]"
56
                        data-biblionumber="[% hold.biblionumber | html %]"
57
                        data-waiting="[% hold.atdestination | html %]"
58
                        data-intransit="[% hold.intransit | html %]"
59
                /></td>
50
                <td>
60
                <td>
51
                    <input type="hidden" name="reserve_id" value="[% hold.reserve_id | html %]" />
61
                    <input type="hidden" name="reserve_id" value="[% hold.reserve_id | html %]" />
52
                    <input type="hidden" name="borrowernumber" value="[% hold.borrowernumber | html %]" />
62
                    <input type="hidden" name="borrowernumber" value="[% hold.borrowernumber | html %]" />
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt (-4 / +9 lines)
Lines 2055-2063 Link Here
2055
                        let reserve_biblionumber = $(this).data('biblionumber');
2055
                        let reserve_biblionumber = $(this).data('biblionumber');
2056
                        let reserve_itemnumber = $(this).data('itemnumber');
2056
                        let reserve_itemnumber = $(this).data('itemnumber');
2057
                        let item_level_hold = $(this).data('item_level_hold');
2057
                        let item_level_hold = $(this).data('item_level_hold');
2058
                        let error_message = $(this).data('item_level_hold') ? "" : _("Cannot move a waiting or record level hold");
2058
                        let item_waiting = $(this).data('waiting');
2059
                        let item_intransit = $(this).data('intransit');
2060
                        let error_message = $(this).data('item_level_hold') ? "" : _("Cannot move a waiting, in transit, or record level hold");
2059
                        let found_status = $(this).data('found');
2061
                        let found_status = $(this).data('found');
2060
                        if ( item_level_hold ) {
2062
                        if ( item_level_hold &&  ( !item_waiting || !item_intransit ) ) {
2061
                            $('#move_hold_item_selection table').append(`<tr><td><input type="checkbox" name="move_hold_id" value="${reserve_id}" checked /></td><td>${reserve_id}</td><td>Biblionumber: <a target="_blank" href="/cgi-bin/koha/reserve/request.pl?biblionumber=${reserve_biblionumber}">${reserve_biblionumber}</a> Itemnumber: <a target="_blank" href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=${reserve_biblionumber}#item${reserve_itemnumber}">${reserve_itemnumber}</a></td><td>${error_message}</td></tr>`)
2063
                            $('#move_hold_item_selection table').append(`<tr><td><input type="checkbox" name="move_hold_id" value="${reserve_id}" checked /></td><td>${reserve_id}</td><td>Biblionumber: <a target="_blank" href="/cgi-bin/koha/reserve/request.pl?biblionumber=${reserve_biblionumber}">${reserve_biblionumber}</a> Itemnumber: <a target="_blank" href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=${reserve_biblionumber}#item${reserve_itemnumber}">${reserve_itemnumber}</a></td><td>${error_message}</td></tr>`)
2062
                        } else {
2064
                        } else {
2063
                            $('#move_hold_item_selection table').append(`<tr><td><input type="checkbox" name="move_hold_id" value="${reserve_id}" disabled /></td><td>${reserve_id}</td><td>Biblionumber: <a target="_blank" href="/cgi-bin/koha/reserve/request.pl?biblionumber=${reserve_biblionumber}">${reserve_biblionumber}</a> Itemnumber: <a target="_blank" href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=${reserve_biblionumber}#item${reserve_itemnumber}">${reserve_itemnumber}</a></td><td>${error_message}</td></tr>`)
2065
                            $('#move_hold_item_selection table').append(`<tr><td><input type="checkbox" name="move_hold_id" value="${reserve_id}" disabled /></td><td>${reserve_id}</td><td>Biblionumber: <a target="_blank" href="/cgi-bin/koha/reserve/request.pl?biblionumber=${reserve_biblionumber}">${reserve_biblionumber}</a> Itemnumber: <a target="_blank" href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=${reserve_biblionumber}#item${reserve_itemnumber}">${reserve_itemnumber}</a></td><td>${error_message}</td></tr>`)
Lines 2078-2086 Link Here
2078
                        let reserve_biblionumber = $(this).data('biblionumber');
2080
                        let reserve_biblionumber = $(this).data('biblionumber');
2079
                        let reserve_itemnumber = $(this).data('itemnumber');
2081
                        let reserve_itemnumber = $(this).data('itemnumber');
2080
                        let item_level_hold = $(this).data('item_level_hold');
2082
                        let item_level_hold = $(this).data('item_level_hold');
2081
                        let error_message = $(this).data('item_level_hold') ? _("Cannot move a waiting or item level hold") : "";
2083
                        let item_status = $(this).data('status');
2084
                        let item_waiting = $(this).data('waiting');
2085
                        let item_intransit = $(this).data('intransit');
2086
                        let error_message = $(this).data('item_level_hold') ? _("Cannot move a waiting, in transit, or item level hold") : "";
2082
                        let found_status = $(this).data('found');
2087
                        let found_status = $(this).data('found');
2083
                        if ( !item_level_hold ) {
2088
                        if ( !item_level_hold &&  ( !item_waiting || !item_intransit ) ) {
2084
                            $('#move_hold_biblio_selection table').append(`<tr><td><input type="checkbox" name="move_hold_id" value="${reserve_id}" checked /><td>${reserve_id}</td><td>Biblionumber: <a target="_blank" href="/cgi-bin/koha/reserve/request.pl?biblionumber=${reserve_biblionumber}">${reserve_biblionumber}</a></td><td>${error_message}</td></tr>`)
2089
                            $('#move_hold_biblio_selection table').append(`<tr><td><input type="checkbox" name="move_hold_id" value="${reserve_id}" checked /><td>${reserve_id}</td><td>Biblionumber: <a target="_blank" href="/cgi-bin/koha/reserve/request.pl?biblionumber=${reserve_biblionumber}">${reserve_biblionumber}</a></td><td>${error_message}</td></tr>`)
2085
                        } else {
2090
                        } else {
2086
                            $('#move_hold_biblio_selection table').append(`<tr><td><input type="checkbox" name="move_hold_id" value="${reserve_id}" disabled /><td>${reserve_id}</td><td>Biblionumber: <a target="_blank" href="/cgi-bin/koha/reserve/request.pl?biblionumber=${reserve_biblionumber}">${reserve_biblionumber}</a></td><td>${error_message}</td></tr>`)
2091
                            $('#move_hold_biblio_selection table').append(`<tr><td><input type="checkbox" name="move_hold_id" value="${reserve_id}" disabled /><td>${reserve_id}</td><td>Biblionumber: <a target="_blank" href="/cgi-bin/koha/reserve/request.pl?biblionumber=${reserve_biblionumber}">${reserve_biblionumber}</a></td><td>${error_message}</td></tr>`)
(-)a/t/db_dependent/Koha/Hold.t (-3 / +28 lines)
Lines 1495-1501 subtest 'revert_waiting() tests' => sub { Link Here
1495
    };
1495
    };
1496
};
1496
};
1497
subtest 'move_hold() tests' => sub {
1497
subtest 'move_hold() tests' => sub {
1498
    plan tests => 11;
1498
    plan tests => 13;
1499
    $schema->storage->txn_begin;
1499
    $schema->storage->txn_begin;
1500
1500
1501
    my $patron = Koha::Patron->new(
1501
    my $patron = Koha::Patron->new(
Lines 1638-1644 subtest 'move_hold() tests' => sub { Link Here
1638
    is( $logs_2->count, 1, 'Hold modification was logged' );
1638
    is( $logs_2->count, 1, 'Hold modification was logged' );
1639
1639
1640
    #disable HoldsLog
1640
    #disable HoldsLog
1641
    t::lib::Mocks::mock_preference( 'HoldsLog', 1 );
1641
    t::lib::Mocks::mock_preference( 'HoldsLog', 0 );
1642
1643
    my $hold_6 = Koha::Hold->new(
1644
        {
1645
            borrowernumber => $patron_4->borrowernumber,
1646
            biblionumber   => $biblio4->biblionumber,
1647
            itemnumber     => $item_4->itemnumber,
1648
            branchcode     => 'CPL',
1649
            found          => 'W',
1650
        }
1651
    )->store;
1652
1653
    my $result_4 = $hold_6->move_hold( { new_biblionumber => $biblio1->biblionumber } );
1654
    is( $result_4->{error}, 'Cannot move a waiting hold', 'Correct error for waiting hold' );
1655
1656
    my $hold_7 = Koha::Hold->new(
1657
        {
1658
            borrowernumber => $patron_4->borrowernumber,
1659
            biblionumber   => $biblio4->biblionumber,
1660
            itemnumber     => $item_4->itemnumber,
1661
            branchcode     => 'CPL',
1662
            found          => 'T',
1663
        }
1664
    )->store;
1665
1666
    my $result_5 = $hold_7->move_hold( { new_biblionumber => $biblio1->biblionumber } );
1667
    is( $result_5->{error}, 'Cannot move a hold in transit', 'Correct error for hold instransit' );
1642
1668
1643
    $schema->storage->txn_rollback;
1669
    $schema->storage->txn_rollback;
1644
};
1670
};
1645
- 

Return to bug 31698