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

(-)a/Koha/Hold.pm (-4 / +15 lines)
Lines 187-195 $hold->move_hold_item(); Link Here
187
sub move_hold_item {
187
sub move_hold_item {
188
    my ( $self, $args ) = @_;
188
    my ( $self, $args ) = @_;
189
189
190
    my $new_itemnumber   = $args->{new_itemnumber};
190
    my $new_itemnumber        = $args->{new_itemnumber};
191
    my $new_biblionumber = $args->{new_biblionumber};
191
    my $new_biblionumber      = $args->{new_biblionumber};
192
    my $original         = $self;
192
    my $original              = $self;
193
    my $original_biblionumber = $self->biblionumber;
193
194
194
    my $patron   = Koha::Patrons->find( { borrowernumber => $self->borrowernumber } );
195
    my $patron   = Koha::Patrons->find( { borrowernumber => $self->borrowernumber } );
195
    my $new_item = Koha::Items->find( { itemnumber => $new_itemnumber } );
196
    my $new_item = Koha::Items->find( { itemnumber => $new_itemnumber } );
Lines 201-210 sub move_hold_item { Link Here
201
            C4::Reserves::CanItemBeReserved( $patron, $new_item, $self->branchcode, { ignore_hold_counts => 1 } );
202
            C4::Reserves::CanItemBeReserved( $patron, $new_item, $self->branchcode, { ignore_hold_counts => 1 } );
202
203
203
        if ( $canReserve->{status} eq 'OK' ) {
204
        if ( $canReserve->{status} eq 'OK' ) {
205
206
            # Find the lowest priority among holds on the new item
207
            my $highest_new_priority = Koha::Holds->search(
208
                { biblionumber => $new_biblionumber },
209
                { order_by     => { -desc => 'priority' }, rows => 1 }
210
            )->next;
211
            my $next_available_priority =
212
                $highest_new_priority ? $highest_new_priority->priority + 1 : 1;    # Always start at 1 if empty
213
204
            $self->update(
214
            $self->update(
205
                {
215
                {
206
                    itemnumber   => $new_item->itemnumber,
216
                    itemnumber   => $new_item->itemnumber,
207
                    biblionumber => $new_item->biblionumber
217
                    biblionumber => $new_item->biblionumber,
218
                    priority     => $next_available_priority,
208
                }
219
                }
209
            );
220
            );
210
221
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/holds_table.inc (-1 / +9 lines)
Lines 49-55 Link Here
49
            [%- END -%]
49
            [%- END -%]
50
            [% SET tr_class = hold.suspend ? 'suspend' : '' %]
50
            [% SET tr_class = hold.suspend ? 'suspend' : '' %]
51
            <tr class="[% tr_class | html %]">
51
            <tr class="[% tr_class | html %]">
52
                <td><input type="checkbox" class="select_hold" data-id="[% hold.reserve_id | html %]" /></td>
52
                <td
53
                    ><input
54
                        type="checkbox"
55
                        class="select_hold"
56
                        data-id="[% hold.reserve_id | html %]"
57
                        data-item_level_hold="[% hold.item_level_hold | html %]"
58
                        data-itemnumber="[% hold.itemnumber | html %]"
59
                        data-biblionumber="[% hold.biblionumber %]"
60
                /></td>
53
                <td>
61
                <td>
54
                    <input type="hidden" name="reserve_id" value="[% hold.reserve_id | html %]" />
62
                    <input type="hidden" name="reserve_id" value="[% hold.reserve_id | html %]" />
55
                    <input type="hidden" name="borrowernumber" value="[% hold.borrowernumber | html %]" />
63
                    <input type="hidden" name="borrowernumber" value="[% hold.borrowernumber | html %]" />
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt (-11 / +75 lines)
Lines 174-179 Link Here
174
        </div>
174
        </div>
175
    [% END %]
175
    [% END %]
176
176
177
    [% IF ( hold_move_successes ) %]
178
        <div class="alert alert-success">
179
            <p>Moved the following holds:</p>
180
            <ul>
181
                [% FOREACH hold IN hold_move_successes %]
182
                    <li>
183
                        <label>Hold ID: </label>
184
                        <span>[% hold.hold_id %]</span>
185
                        <span> - Moved from [%- INCLUDE 'biblio-title.inc' biblio=hold.original_biblio link = 1 -%] to [%- INCLUDE 'biblio-title.inc' biblio=hold.target_biblio link = 1 -%]</span>
186
                    </li>
187
                [% END %]
188
            </ul>
189
        </div>
190
    [% END %]
191
    [% IF ( hold_move_failures ) %]
192
        <div class="alert alert-warning">
193
            <strong>One or more holds were not moved due to following errors:</strong>
194
            <ul>
195
                [% FOREACH fail IN hold_move_failures %]
196
                    <li>
197
                        <label>Hold ID: </label>
198
                        <span>[% fail.hold_id %]</span>
199
                        [% SWITCH fail.error %]
200
                        [% CASE 'cannotReserveFromOtherBranches' %]
201
                            <span>Target item cannot be reserved from other branches</span>
202
                        [% CASE 'ageRestricted' %]
203
                            <span>The target record and/or items are age restricted</span>
204
                        [% CASE 'alreadypossession' %]
205
                            <span>Target item is already checked out to patron</span>
206
                        [% CASE 'noReservesAllowed' %]
207
                            <span>No holds are allowed on the target item(s)</span>
208
                        [% CASE 'tooManyReservesToday' %]
209
                            <span>Target item has too many holds placed on it today</span>
210
                        [% CASE 'tooManyReserves' %]
211
                            <span>Target item has too many holds placed on it</span>
212
                        [% CASE 'notReservable' %]
213
                            <span>Target item is not reservable</span>
214
                        [% CASE 'cannotReserveFromOtherBranches' %]
215
                            <span>Target item cannot be placed on reserve for this branch</span>
216
                        [% CASE 'branchNotInHoldGroup' %]
217
                            <span>Tagret item is not in the local hold group</span>
218
                        [% CASE 'notforloan' %]
219
                            <span>Target item is not for loan</span>
220
                        [% CASE 'damaged' %]
221
                            <span>Target item is damaged</span>
222
                        [% CASE %]
223
                            <span>Error: [% fail.error | html %]</span>
224
                        [% END %]
225
                    </li>
226
                [% END %]
227
            </ul>
228
        </div>
229
    [% END %]
230
177
    [% IF ( failed_holds ) %]
231
    [% IF ( failed_holds ) %]
178
        <div class="alert alert-warning">
232
        <div class="alert alert-warning">
179
            <strong>One or more holds were not placed due to following errors:</strong>
233
            <strong>One or more holds were not placed due to following errors:</strong>
Lines 1437-1448 Link Here
1437
            </div>
1491
            </div>
1438
            <div class="modal-body">
1492
            <div class="modal-body">
1439
                <div id="move_hold_item_selection">
1493
                <div id="move_hold_item_selection">
1440
                    <h3>Selected holds to move</h3>
1494
                    <h3>1. Review holds to move</h3>
1441
                    <table>
1495
                    <table class="table table-striped">
1442
                        <thead>
1496
                        <thead>
1443
                            <tr>
1497
                            <tr>
1444
                                <th>Hold ID</th>
1498
                                <th>Hold ID</th>
1445
                                <th>Item barcode ( current hold )</th>
1499
                                <th>Original hold</th>
1500
                                <th>Problem</th>
1446
                            </tr>
1501
                            </tr>
1447
                        </thead>
1502
                        </thead>
1448
                        <tbody> </tbody>
1503
                        <tbody> </tbody>
Lines 1452-1470 Link Here
1452
                <div id="move_hold_item_search" class="alert alert-danger" style="display:none;"></div>
1507
                <div id="move_hold_item_search" class="alert alert-danger" style="display:none;"></div>
1453
                <form id="searchForm">
1508
                <form id="searchForm">
1454
                    <div id="move_hold_item_searchform">
1509
                    <div id="move_hold_item_searchform">
1510
                        <h3>2. Enter the item barcode of new hold target: </h3>
1455
                        <fieldset class="action">
1511
                        <fieldset class="action">
1456
                            <h3><label for="external_id">Enter the item barcode of new hold target: </label></h3>
1457
                            <input type="text" class="form-control" name="external_id" id="external_id" required />
1512
                            <input type="text" class="form-control" name="external_id" id="external_id" required />
1513
                            <button type="submit" class="btn btn-default mt-3">Search</button>
1458
                        </fieldset>
1514
                        </fieldset>
1459
                        <button type="submit" class="btn btn-success mt-3">Search</button>
1460
                    </div>
1515
                    </div>
1461
                </form>
1516
                </form>
1462
                <hr />
1463
                <form id="move_hold_item_form" method="post" action="request.pl">
1517
                <form id="move_hold_item_form" method="post" action="request.pl">
1464
                    [% INCLUDE 'csrf-token.inc' %]
1465
                    <input type="hidden" name="op" value="cud-move_hold_item" />
1466
                    <div id="resultMessage" class="mt-3"> </div>
1518
                    <div id="resultMessage" class="mt-3"> </div>
1467
                    <button type="submit" class="btn btn-primary mt-3">Move selected holds</button>
1519
                    <div id="move_hold_item_confirm" style="display:none;">
1520
                        <h3>3. Confirm moving of holds:</h3>
1521
                        [% INCLUDE 'csrf-token.inc' %]
1522
                        <input type="hidden" name="op" value="cud-move_hold_item" />
1523
                        <button type="submit" class="btn btn-primary mt-3">Move selected holds</button>
1524
                    </div>
1468
                </form>
1525
                </form>
1469
            </div>
1526
            </div>
1470
            <div class="modal-footer">
1527
            <div class="modal-footer">
Lines 1826-1831 Link Here
1826
1883
1827
            $(document).on("change", 'input[name="new_itemnumber"]', function() {
1884
            $(document).on("change", 'input[name="new_itemnumber"]', function() {
1828
                $('input[name="new_itemnumber"]').not(this).prop("checked", false);
1885
                $('input[name="new_itemnumber"]').not(this).prop("checked", false);
1886
                if ( $('input[name="new_itemnumber"]:checked').length ){
1887
                    $('#move_hold_item_confirm').show();
1888
                } else {
1889
                    $('#move_hold_item_confirm').hide();
1890
                }
1829
            });
1891
            });
1830
1892
1831
            $("#always_show_holds").change(function(){
1893
            $("#always_show_holds").change(function(){
Lines 1963-1971 Link Here
1963
                    $('#moveHoldItemModal').modal('show');
2025
                    $('#moveHoldItemModal').modal('show');
1964
                    $('.select_hold:checked').each( function() {
2026
                    $('.select_hold:checked').each( function() {
1965
                        let reserve_id = $(this).data('id');
2027
                        let reserve_id = $(this).data('id');
2028
                        let reserve_biblionumber = $(this).data('biblionumber');
2029
                        let reserve_itemnumber = $(this).data('itemnumber');
1966
                        let item_level_hold = $(this).data('item_level_hold');
2030
                        let item_level_hold = $(this).data('item_level_hold');
2031
                        let error_message = $(this).data('item_level_hold') ? "" : _("Cannot move a waiting or record level hold");
1967
                        let found_status = $(this).data('found');
2032
                        let found_status = $(this).data('found');
1968
                        $('#move_hold_item_selection table').append(`<tr><td>${reserve_id}</td><td></td></tr>`)
2033
                        $('#move_hold_item_selection table').append(`<tr><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>`)
1969
                        if ( item_level_hold ) {
2034
                        if ( item_level_hold ) {
1970
                            $('#move_hold_item_form').append(`<input type="hidden" name="hold_id" value="${reserve_id}">`);
2035
                            $('#move_hold_item_form').append(`<input type="hidden" name="hold_id" value="${reserve_id}">`);
1971
                        }
2036
                        }
1972
- 

Return to bug 31698