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

(-)a/Koha/Item.pm (-5 / +1 lines)
Lines 1431-1441 sub _status { Link Here
1431
            push @statuses, "local_use";
1431
            push @statuses, "local_use";
1432
        }
1432
        }
1433
    } elsif ( my $transfer = $self->transfer ) {
1433
    } elsif ( my $transfer = $self->transfer ) {
1434
        if ( $transfer->datesent ) {
1434
        push @statuses, "in_transit";
1435
            push @statuses, "in_transit";
1436
        } else {
1437
            push @statuses, "transit_pending";
1438
        }
1439
    }
1435
    }
1440
    if ( $self->itemlost ) {
1436
    if ( $self->itemlost ) {
1441
        push @statuses, 'lost';
1437
        push @statuses, 'lost';
(-)a/Koha/Items.pm (+130 lines)
Lines 196-201 sub filter_by_bookable { Link Here
196
    return $self->search($params);
196
    return $self->search($params);
197
}
197
}
198
198
199
sub filter_by_checked_out {
200
    my ( $self, $params ) = @_;
201
202
    $params //= {};
203
    my $checkouts = Koha::Checkouts->search(
204
        { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], },
205
        {
206
            columns  => ['itemnumber'],
207
            distinct => 1
208
        }
209
    )->_resultset->as_query;
210
211
    return $self->search( { 'me.itemnumber' => { '-in' => $checkouts } } );
212
}
213
214
sub filter_by_in_transit {
215
    my ( $self, $params ) = @_;
216
217
    $params //= {};
218
    my $transfers = Koha::Item::Transfers->search(
219
        { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], },
220
        {
221
            columns  => ['itemnumber'],
222
            distinct => 1
223
        }
224
    )->_resultset->as_query;
225
226
    return $self->search( { 'me.itemnumber' => { '-in' => $transfers } } );
227
}
228
229
sub filter_by_for_loan {
230
231
}
232
233
sub filter_by_has_holds {
234
    my ( $self, $params ) = @_;
235
236
    $params //= {};
237
    my $holds = Koha::Holds->search(
238
        { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], },
239
        {
240
            columns  => ['itemnumber'],
241
            distinct => 1
242
        }
243
    )->_resultset->as_query;
244
245
    return $self->search( { 'me.itemnumber' => { '-in' => $holds } } );
246
}
247
248
sub filter_by_has_recalls {
249
    my ( $self, $params ) = @_;
250
251
    $params //= {};
252
    my $recalls = Koha::Recalls->search(
253
        { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], },
254
        {
255
            columns  => ['itemnumber'],
256
            distinct => 1
257
        }
258
    )->_resultset->as_query;
259
260
    return $self->search( { 'me.itemnumber' => { '-in' => $recalls } } );
261
}
262
263
sub filter_by_available {
264
    my ($self) = @_;
265
266
    my @all_itemnumbers       = $self->get_column('itemnumber');
267
    my @item_types_notforloan = Koha::ItemTypes->search( { notforloan => { '!=' => 0 } } )->get_column('itemtype');
268
    my @not_available_itemnumbers;
269
    push @not_available_itemnumbers, $self->filter_by_checked_out->get_column('itemnumber');
270
    push @not_available_itemnumbers, $self->filter_by_in_transit->get_column('itemnumber');
271
    push @not_available_itemnumbers, $self->search(
272
        {
273
            itemlost => 0, withdrawn => 0, damaged => 0, notforloan => 0,
274
            itype => { -not_in => \@item_types_notforloan }, restricted => 0,
275
        }
276
    )->get_column('itemnumber');
277
    push @not_available_itemnumbers, $self->filter_by_has_holds->get_column('itemnumber');
278
    push @not_available_itemnumbers, $self->filter_by_has_recalls->get_column('itemnumber');
279
280
    return Koha::Items->search( { 'me.itemnumber' => [ array_minus @all_itemnumbers, @not_available_itemnumbers ] } );
281
}
282
283
199
=head3 move_to_biblio
284
=head3 move_to_biblio
200
285
201
 $items->move_to_biblio($to_biblio);
286
 $items->move_to_biblio($to_biblio);
Lines 459-464 sub apply_regex { Link Here
459
    return $value;
544
    return $value;
460
}
545
}
461
546
547
sub search {
548
    my ( $self, $params, $attributes ) = @_;
549
    my $status = ( $params && ref($params) eq 'HASH' ) ? delete $params->{_status} : undef;
550
    if ($status) {
551
        if ( $status eq 'checked_out' ) {
552
            $self = $self->filter_by_checked_out( { onsite_checkout => 0 } );
553
        }
554
        if ( $status eq 'local_use' ) {
555
            $self = $self->filter_by_checked_out( { onsite_checkout => 1 } );
556
        }
557
        if ( $status eq 'in_transit' ) {
558
            $self = $self->filter_by_in_transit;
559
        }
560
        if ( $status eq 'lost' ) {
561
            $self = $self->search( { itemlost => { '!=' => 0 } } );
562
        }
563
        if ( $status eq 'withdrawn' ) {
564
            $self = $self->search( { withdrawn => { '!=' => 0 } } );
565
        }
566
        if ( $status eq 'damaged' ) {
567
            $self = $self->search( { damaged => { '!=' => 0 } } );
568
        }
569
        if ( $status eq 'not_for_loan' ) {
570
            my @item_types_notforloan = Koha::ItemTypes->search( { notforloan => { '!=' => 0 } } )->column('itemtype');
571
            $self = $self->search( [ { notforloan => { '!=' => 0 } }, { itype => \@item_types_notforloan } ] );
572
        }
573
        if ( $status eq 'on_hold' ) {
574
            $self = $self->filter_by_has_holds;
575
        }
576
        if ( $status eq 'recalled' ) {
577
            $self = $self->filter_by_has_recalls;
578
        }
579
580
        if ( $status eq 'available' ) {
581
            $self = $self->filter_by_available;
582
        }
583
584
        if ( $status eq 'restricted' ) {
585
            $self = $self->search( { restricted => { '!=' => 0 } } );
586
        }
587
    }
588
589
    return $self->SUPER::search( $params, $attributes );
590
}
591
462
=head3 search_ordered
592
=head3 search_ordered
463
593
464
 $items->search_ordered;
594
 $items->search_ordered;
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/html_helpers/tables/items/catalogue_detail.inc (-8 / +15 lines)
Lines 187-192 Link Here
187
            });
187
            });
188
    const item_types_notforloan = new Map(all_item_types.map( it => [it.itemtype, it.notforloan] ));
188
    const item_types_notforloan = new Map(all_item_types.map( it => [it.itemtype, it.notforloan] ));
189
189
190
    const statuses = {checked_out: _("Checked out"), local_use: _("On-site checkout"), in_transit: _("In transit"), lost: _("Lost"), withdrawn: _("Withdrawn"), damaged:_("Damaged"), not_for_loan: _("Not for loan"), on_hold: _("On hold"), recalled: _("Recalled"), available: _("Available"), restricted: _("Restricted")};
191
    const all_statuses = Object.keys(statuses).map(k => {return {_id: k, _str: statuses[k]}});
192
190
    const can_edit_items_from = [% To.json(can_edit_items_from || []) | $raw %];
193
    const can_edit_items_from = [% To.json(can_edit_items_from || []) | $raw %];
191
    const item_type_image_locations = [% To.json(item_type_image_locations) | $raw %];
194
    const item_type_image_locations = [% To.json(item_type_image_locations) | $raw %];
192
    const av_loc = new Map([% To.json(AuthorisedValues.Get('LOC')) | $raw %].map( av => [av.authorised_value, av.lib]));
195
    const av_loc = new Map([% To.json(AuthorisedValues.Get('LOC')) | $raw %].map( av => [av.authorised_value, av.lib]));
Lines 273-284 Link Here
273
            items_selection[tab_id] = [];
276
            items_selection[tab_id] = [];
274
        }
277
        }
275
278
279
        default_filters._status = function(){
280
            return $("#" + tab_id + "_status select").val();
281
        };
282
276
        let offset = 2;
283
        let offset = 2;
277
        [% UNLESS Koha.Preference('LocalCoverImages') %]offset--;[% END %]
284
        [% UNLESS Koha.Preference('LocalCoverImages') %]offset--;[% END %]
278
        let filters_options = {
285
        let filters_options = {
279
            [offset]   : () => all_item_types,
286
            [offset]   : () => all_item_types,
280
            [offset+1] : () => all_libraries,
287
            [offset+1] : () => all_libraries,
281
            [offset+2] : () => all_libraries,
288
            [offset+2] : () => all_libraries,
289
            [offset+6] : () => all_statuses,
282
        };
290
        };
283
291
284
        var items_table = $("#" + tab_id + '_table').kohaTable({
292
        var items_table = $("#" + tab_id + '_table').kohaTable({
Lines 440-448 Link Here
440
                }
448
                }
441
            },
449
            },
442
            {
450
            {
443
                data: "me._status",
451
                data: "",
444
                className: "status",
452
                className: "status",
445
                searchable: false, // FIXME We are losing the ability to search on the status
453
                searchable: false,
446
                orderable: false,
454
                orderable: false,
447
                render: function (data, type, row, meta) {
455
                render: function (data, type, row, meta) {
448
                    let nodes = "";
456
                    let nodes = "";
Lines 466-476 Link Here
466
474
467
                        }
475
                        }
468
                        if ( status == 'in_transit' ) {
476
                        if ( status == 'in_transit' ) {
469
                            nodes += '<span class="intransit">%s</span>'.format(_("In transit from %s to %s since %s").format(escape_str(row.transfer._strings.from_library.str), escape_str(row.transfer._strings.to_library.str), $date(row.transfer.datesent)));
477
                            if ( row.transfer.datesent ) {
470
                        }
478
                                nodes += '<span class="intransit">%s</span>'.format(_("In transit from %s to %s since %s").format(escape_str(row.transfer._strings.from_library.str), escape_str(row.transfer._strings.to_library.str), $date(row.transfer.datesent)));
471
479
                            } else {
472
                        if ( status == 'transit_pending' ) {
480
                                nodes += '<span class="transitrequested">%s</span>'.format(_("Transit pending from %s to %s since %s").format(escape_str(row.transfer._strings.from_library.str), escape_str(row.transfer._strings.to_library.str), $date(row.transfer.daterequested)));
473
                            nodes += '<span class="transitrequested">%s</span>'.format(_("Transit pending from %s to %s since %s").format(escape_str(row.transfer._strings.from_library.str), escape_str(row.transfer._strings.to_library.str), $date(row.transfer.daterequested)));
481
                            }
474
                        }
482
                        }
475
483
476
                        if ( status == 'lost' ) {
484
                        if ( status == 'lost' ) {
477
- 

Return to bug 37334