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

(-)a/Koha/Item.pm (-5 / +1 lines)
Lines 1452-1462 sub _status { Link Here
1452
            push @statuses, "local_use";
1452
            push @statuses, "local_use";
1453
        }
1453
        }
1454
    } elsif ( my $transfer = $self->transfer ) {
1454
    } elsif ( my $transfer = $self->transfer ) {
1455
        if ( $transfer->datesent ) {
1455
        push @statuses, "in_transit";
1456
            push @statuses, "in_transit";
1457
        } else {
1458
            push @statuses, "transit_pending";
1459
        }
1460
    }
1456
    }
1461
    if ( $self->itemlost ) {
1457
    if ( $self->itemlost ) {
1462
        push @statuses, 'lost';
1458
        push @statuses, 'lost';
(-)a/Koha/Items.pm (+130 lines)
Lines 222-227 sub filter_by_bookable { Link Here
222
    );
222
    );
223
}
223
}
224
224
225
sub filter_by_checked_out {
226
    my ( $self, $params ) = @_;
227
228
    $params //= {};
229
    my $checkouts = Koha::Checkouts->search(
230
        { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], },
231
        {
232
            columns  => ['itemnumber'],
233
            distinct => 1
234
        }
235
    )->_resultset->as_query;
236
237
    return $self->search( { 'me.itemnumber' => { '-in' => $checkouts } } );
238
}
239
240
sub filter_by_in_transit {
241
    my ( $self, $params ) = @_;
242
243
    $params //= {};
244
    my $transfers = Koha::Item::Transfers->search(
245
        { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], },
246
        {
247
            columns  => ['itemnumber'],
248
            distinct => 1
249
        }
250
    )->_resultset->as_query;
251
252
    return $self->search( { 'me.itemnumber' => { '-in' => $transfers } } );
253
}
254
255
sub filter_by_for_loan {
256
257
}
258
259
sub filter_by_has_holds {
260
    my ( $self, $params ) = @_;
261
262
    $params //= {};
263
    my $holds = Koha::Holds->search(
264
        { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], },
265
        {
266
            columns  => ['itemnumber'],
267
            distinct => 1
268
        }
269
    )->_resultset->as_query;
270
271
    return $self->search( { 'me.itemnumber' => { '-in' => $holds } } );
272
}
273
274
sub filter_by_has_recalls {
275
    my ( $self, $params ) = @_;
276
277
    $params //= {};
278
    my $recalls = Koha::Recalls->search(
279
        { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], },
280
        {
281
            columns  => ['itemnumber'],
282
            distinct => 1
283
        }
284
    )->_resultset->as_query;
285
286
    return $self->search( { 'me.itemnumber' => { '-in' => $recalls } } );
287
}
288
289
sub filter_by_available {
290
    my ($self) = @_;
291
292
    my @all_itemnumbers       = $self->get_column('itemnumber');
293
    my @item_types_notforloan = Koha::ItemTypes->search( { notforloan => { '!=' => 0 } } )->get_column('itemtype');
294
    my @not_available_itemnumbers;
295
    push @not_available_itemnumbers, $self->filter_by_checked_out->get_column('itemnumber');
296
    push @not_available_itemnumbers, $self->filter_by_in_transit->get_column('itemnumber');
297
    push @not_available_itemnumbers, $self->search(
298
        {
299
            itemlost => 0, withdrawn => 0, damaged => 0, notforloan => 0,
300
            itype => { -not_in => \@item_types_notforloan }, restricted => 0,
301
        }
302
    )->get_column('itemnumber');
303
    push @not_available_itemnumbers, $self->filter_by_has_holds->get_column('itemnumber');
304
    push @not_available_itemnumbers, $self->filter_by_has_recalls->get_column('itemnumber');
305
306
    return Koha::Items->search( { 'me.itemnumber' => [ array_minus @all_itemnumbers, @not_available_itemnumbers ] } );
307
}
308
309
225
=head3 move_to_biblio
310
=head3 move_to_biblio
226
311
227
 $items->move_to_biblio($to_biblio);
312
 $items->move_to_biblio($to_biblio);
Lines 485-490 sub apply_regex { Link Here
485
    return $value;
570
    return $value;
486
}
571
}
487
572
573
sub search {
574
    my ( $self, $params, $attributes ) = @_;
575
    my $status = ( $params && ref($params) eq 'HASH' ) ? delete $params->{_status} : undef;
576
    if ($status) {
577
        if ( $status eq 'checked_out' ) {
578
            $self = $self->filter_by_checked_out( { onsite_checkout => 0 } );
579
        }
580
        if ( $status eq 'local_use' ) {
581
            $self = $self->filter_by_checked_out( { onsite_checkout => 1 } );
582
        }
583
        if ( $status eq 'in_transit' ) {
584
            $self = $self->filter_by_in_transit;
585
        }
586
        if ( $status eq 'lost' ) {
587
            $self = $self->search( { itemlost => { '!=' => 0 } } );
588
        }
589
        if ( $status eq 'withdrawn' ) {
590
            $self = $self->search( { withdrawn => { '!=' => 0 } } );
591
        }
592
        if ( $status eq 'damaged' ) {
593
            $self = $self->search( { damaged => { '!=' => 0 } } );
594
        }
595
        if ( $status eq 'not_for_loan' ) {
596
            my @item_types_notforloan = Koha::ItemTypes->search( { notforloan => { '!=' => 0 } } )->get_column('itemtype');
597
            $self = $self->search( [ { notforloan => { '!=' => 0 } }, { 'me.itype' => \@item_types_notforloan } ] );
598
        }
599
        if ( $status eq 'on_hold' ) {
600
            $self = $self->filter_by_has_holds;
601
        }
602
        if ( $status eq 'recalled' ) {
603
            $self = $self->filter_by_has_recalls;
604
        }
605
606
        if ( $status eq 'available' ) {
607
            $self = $self->filter_by_available;
608
        }
609
610
        if ( $status eq 'restricted' ) {
611
            $self = $self->search( { restricted => { '!=' => 0 } } );
612
        }
613
    }
614
615
    return $self->SUPER::search( $params, $attributes );
616
}
617
488
=head3 search_ordered
618
=head3 search_ordered
489
619
490
 $items->search_ordered;
620
 $items->search_ordered;
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/html_helpers/tables/items/catalogue_detail.inc (-8 / +15 lines)
Lines 206-211 Link Here
206
            });
206
            });
207
    const item_types_notforloan = new Map(all_item_types.map( it => [it.itemtype, it.notforloan] ));
207
    const item_types_notforloan = new Map(all_item_types.map( it => [it.itemtype, it.notforloan] ));
208
208
209
    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")};
210
    const all_statuses = Object.keys(statuses).map(k => {return {_id: k, _str: statuses[k]}});
211
209
    const can_edit_items_from = [% To.json(can_edit_items_from || []) | $raw %];
212
    const can_edit_items_from = [% To.json(can_edit_items_from || []) | $raw %];
210
    const item_type_image_locations = [% To.json(item_type_image_locations) | $raw %];
213
    const item_type_image_locations = [% To.json(item_type_image_locations) | $raw %];
211
    const av_loc = new Map([% To.json(AuthorisedValues.Get('LOC')) | $raw %].map( av => [av.authorised_value, av.lib]));
214
    const av_loc = new Map([% To.json(AuthorisedValues.Get('LOC')) | $raw %].map( av => [av.authorised_value, av.lib]));
Lines 295-306 Link Here
295
            items_selection[tab_id] = [];
298
            items_selection[tab_id] = [];
296
        }
299
        }
297
300
301
        default_filters._status = function(){
302
            return $("#" + tab_id + "_status select").val();
303
        };
304
298
        let offset = 2;
305
        let offset = 2;
299
        [% UNLESS Koha.Preference('LocalCoverImages') %]offset--;[% END %]
306
        [% UNLESS Koha.Preference('LocalCoverImages') %]offset--;[% END %]
300
        let filters_options = {
307
        let filters_options = {
301
            [offset]   : () => all_item_types,
308
            [offset]   : () => all_item_types,
302
            [offset+1] : () => all_libraries,
309
            [offset+1] : () => all_libraries,
303
            [offset+2] : () => all_libraries,
310
            [offset+2] : () => all_libraries,
311
            [offset+6] : () => all_statuses,
304
        };
312
        };
305
313
306
        var items_table = $("#" + tab_id + '_table').kohaTable({
314
        var items_table = $("#" + tab_id + '_table').kohaTable({
Lines 462-470 Link Here
462
                }
470
                }
463
            },
471
            },
464
            {
472
            {
465
                data: "me._status",
473
                data: "",
466
                className: "status",
474
                className: "status",
467
                searchable: false, // FIXME We are losing the ability to search on the status
475
                searchable: false,
468
                orderable: false,
476
                orderable: false,
469
                render: function (data, type, row, meta) {
477
                render: function (data, type, row, meta) {
470
                    let nodes = "";
478
                    let nodes = "";
Lines 488-498 Link Here
488
496
489
                        }
497
                        }
490
                        if ( status == 'in_transit' ) {
498
                        if ( status == 'in_transit' ) {
491
                            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)));
499
                            if ( row.transfer.datesent ) {
492
                        }
500
                                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)));
493
501
                            } else {
494
                        if ( status == 'transit_pending' ) {
502
                                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)));
495
                            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)));
503
                            }
496
                        }
504
                        }
497
505
498
                        if ( status == 'lost' ) {
506
                        if ( status == 'lost' ) {
499
- 

Return to bug 37334