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

(-)a/Koha/Hold.pm (-2 / +13 lines)
Lines 189-195 sub move_hold_item { Link Here
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
193
    my $original              = $self;
194
    my $original_biblionumber = $self->biblionumber;
193
195
194
    my $patron   = Koha::Patrons->find( { borrowernumber => $self->borrowernumber } );
196
    my $patron   = Koha::Patrons->find( { borrowernumber => $self->borrowernumber } );
195
    my $new_item = Koha::Items->find( { itemnumber => $new_itemnumber } );
197
    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 } );
203
            C4::Reserves::CanItemBeReserved( $patron, $new_item, $self->branchcode, { ignore_hold_counts => 1 } );
202
204
203
        if ( $canReserve->{status} eq 'OK' ) {
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
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     => $new_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 | html %]"
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 (-10 / +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 | html %]</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 | html %]</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
                        }
(-)a/reserve/request.pl (-7 / +17 lines)
Lines 120-129 if ( $op eq 'cud-move' ) { Link Here
120
    my @success_messages;
120
    my @success_messages;
121
    my @error_messages;
121
    my @error_messages;
122
122
123
    foreach my $hold_id (@hold_ids) {
123
    #Get a list of all the holds to move, ordered by current priority
124
        my $hold            = Koha::Holds->find($hold_id);
124
    my @moving_holds = Koha::Holds->search(
125
        { reserve_id => \@hold_ids },
126
        { order_by   => { -asc => 'priority' } }
127
    )->as_list;
128
129
    #need to get the biblionumber of the original hold
130
    my $original_biblionumber = $moving_holds[0]->biblionumber;
131
132
    my $offset = 0;
133
    foreach my $hold (@moving_holds) {
125
        my $original_biblio = Koha::Biblios->find( $hold->biblionumber );
134
        my $original_biblio = Koha::Biblios->find( $hold->biblionumber );
126
        my $result          = $hold->move_hold_item(
135
136
        my $result = $hold->move_hold_item(
127
            {
137
            {
128
                new_itemnumber   => $new_itemnumber,
138
                new_itemnumber   => $new_itemnumber,
129
                new_biblionumber => $new_biblionumber,
139
                new_biblionumber => $new_biblionumber,
Lines 133-146 if ( $op eq 'cud-move' ) { Link Here
133
        #push info about successes and errors to the template
143
        #push info about successes and errors to the template
134
        if ( $result->{success} ) {
144
        if ( $result->{success} ) {
135
            push @success_messages, {
145
            push @success_messages, {
136
                hold_id         => $hold_id,
146
                hold_id         => $hold->id,
137
                success         => 1,
147
                success         => 1,
138
                original_biblio => $original_biblio,
148
                original_biblio => $original_biblio,
139
                target_biblio   => $target_biblio,
149
                target_biblio   => $target_biblio,
140
            };
150
            };
141
        } else {
151
        } else {
142
            push @error_messages, {
152
            push @error_messages, {
143
                hold_id         => $hold_id,
153
                hold_id         => $hold->id,
144
                success         => 0,
154
                success         => 0,
145
                original_biblio => $original_biblio,
155
                original_biblio => $original_biblio,
146
                target_biblio   => $target_biblio,
156
                target_biblio   => $target_biblio,
Lines 149-155 if ( $op eq 'cud-move' ) { Link Here
149
        }
159
        }
150
    }
160
    }
151
161
152
    push @biblionumbers, $new_biblionumber;
162
    C4::Reserves::_FixPriority( { biblionumber => $original_biblionumber } );
163
    push @biblionumbers, $original_biblionumber;
153
164
154
    $template->param(
165
    $template->param(
155
        hold_move_successes => \@success_messages,
166
        hold_move_successes => \@success_messages,
156
- 

Return to bug 31698