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

(-)a/Koha/Item.pm (-5 / +1 lines)
Lines 1454-1464 sub _status { Link Here
1454
            push @statuses, "local_use";
1454
            push @statuses, "local_use";
1455
        }
1455
        }
1456
    } elsif ( my $transfer = $self->transfer ) {
1456
    } elsif ( my $transfer = $self->transfer ) {
1457
        if ( $transfer->datesent ) {
1457
        push @statuses, "in_transit";
1458
            push @statuses, "in_transit";
1459
        } else {
1460
            push @statuses, "transit_pending";
1461
        }
1462
    }
1458
    }
1463
    if ( $self->itemlost ) {
1459
    if ( $self->itemlost ) {
1464
        push @statuses, 'lost';
1460
        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 216-221 Link Here
216
            });
216
            });
217
    const item_types_notforloan = new Map(all_item_types.map( it => [it.itemtype, it.notforloan] ));
217
    const item_types_notforloan = new Map(all_item_types.map( it => [it.itemtype, it.notforloan] ));
218
218
219
    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")};
220
    const all_statuses = Object.keys(statuses).map(k => {return {_id: k, _str: statuses[k]}});
221
219
    const can_edit_items_from = [% To.json(can_edit_items_from || []) | $raw %];
222
    const can_edit_items_from = [% To.json(can_edit_items_from || []) | $raw %];
220
    const item_type_image_locations = [% To.json(item_type_image_locations) | $raw %];
223
    const item_type_image_locations = [% To.json(item_type_image_locations) | $raw %];
221
    const av_loc = new Map([% To.json(AuthorisedValues.Get('LOC')) | $raw %].map( av => [av.authorised_value, av.lib]));
224
    const av_loc = new Map([% To.json(AuthorisedValues.Get('LOC')) | $raw %].map( av => [av.authorised_value, av.lib]));
Lines 307-318 Link Here
307
            items_selection[tab_id] = [];
310
            items_selection[tab_id] = [];
308
        }
311
        }
309
312
313
        default_filters._status = function(){
314
            return $("#" + tab_id + "_status select").val();
315
        };
316
310
        let offset = 2;
317
        let offset = 2;
311
        [% UNLESS Koha.Preference('LocalCoverImages') %]offset--;[% END %]
318
        [% UNLESS Koha.Preference('LocalCoverImages') %]offset--;[% END %]
312
        let filters_options = {
319
        let filters_options = {
313
            [offset]   : () => all_item_types,
320
            [offset]   : () => all_item_types,
314
            [offset+1] : () => all_libraries,
321
            [offset+1] : () => all_libraries,
315
            [offset+2] : () => all_libraries,
322
            [offset+2] : () => all_libraries,
323
            [offset+6] : () => all_statuses,
316
        };
324
        };
317
325
318
        var items_table = $("#" + tab_id + '_table').kohaTable({
326
        var items_table = $("#" + tab_id + '_table').kohaTable({
Lines 474-482 Link Here
474
                }
482
                }
475
            },
483
            },
476
            {
484
            {
477
                data: "me._status",
485
                data: "",
478
                className: "status",
486
                className: "status",
479
                searchable: false, // FIXME We are losing the ability to search on the status
487
                searchable: false,
480
                orderable: false,
488
                orderable: false,
481
                render: function (data, type, row, meta) {
489
                render: function (data, type, row, meta) {
482
                    let nodes = "";
490
                    let nodes = "";
Lines 500-510 Link Here
500
508
501
                        }
509
                        }
502
                        if ( status == 'in_transit' ) {
510
                        if ( status == 'in_transit' ) {
503
                            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)));
511
                            if ( row.transfer.datesent ) {
504
                        }
512
                                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)));
505
513
                            } else {
506
                        if ( status == 'transit_pending' ) {
514
                                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)));
507
                            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)));
515
                            }
508
                        }
516
                        }
509
517
510
                        if ( status == 'lost' ) {
518
                        if ( status == 'lost' ) {
511
- 

Return to bug 37334