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

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

Return to bug 37334