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

(-)a/Koha/Item.pm (+50 lines)
Lines 1420-1425 sub columns_to_str { Link Here
1420
    return $values;
1420
    return $values;
1421
}
1421
}
1422
1422
1423
sub _status {
1424
    my ($self) = @_;
1425
1426
    my @statuses;
1427
    if ( my $checkout = $self->checkout ) {
1428
        unless ( $checkout->onsite_checkout ) {
1429
            push @statuses, "checked_out";
1430
        } else {
1431
            push @statuses, "local_use";
1432
        }
1433
    } elsif ( my $transfer = $self->transfer ) {
1434
        if ( $transfer->datesent ) {
1435
            push @statuses, "in_transit";
1436
        } else {
1437
            push @statuses, "transit_pending";
1438
        }
1439
    }
1440
    if ( $self->itemlost ) {
1441
        push @statuses, 'lost';
1442
    }
1443
    if ( $self->withdrawn ) {
1444
        push @statuses, 'withdrawn';
1445
    }
1446
    if ( $self->damaged ) {
1447
        push @statuses, 'damaged';
1448
    }
1449
    if ( $self->notforloan || $self->item_type->notforloan  ) {
1450
        # TODO on a big Koha::Items loop we are going to join with item_type too often, use a cache
1451
        push @statuses, 'not_for_loan';
1452
    }
1453
    if ( $self->first_hold ) {
1454
        push @statuses, 'on_hold';
1455
    }
1456
    if ( C4::Context->preference('UseRecalls') && $self->recall ) {
1457
        push @statuses, 'recalled';
1458
    }
1459
1460
    unless (@statuses ){
1461
        push @statuses, 'available';
1462
    }
1463
1464
    if ( $self->restricted ) {
1465
        push @statuses, 'restricted';
1466
    }
1467
1468
    # TODO in_bundle?
1469
1470
    return join ',', @statuses;
1471
}
1472
1423
=head3 additional_attributes
1473
=head3 additional_attributes
1424
1474
1425
    my $attributes = $item->additional_attributes;
1475
    my $attributes = $item->additional_attributes;
(-)a/api/v1/swagger/definitions/item.yaml (+5 lines)
Lines 309-312 properties: Link Here
309
      - object
309
      - object
310
      - "null"
310
      - "null"
311
    description: A return claims object if one exists that's unresolved
311
    description: A return claims object if one exists that's unresolved
312
  _status:
313
    type:
314
      - string
315
      - "null"
316
    description: The status of the item
312
additionalProperties: false
317
additionalProperties: false
(-)a/api/v1/swagger/paths/biblios.yaml (+1 lines)
Lines 455-460 Link Here
455
          type: string
455
          type: string
456
          enum:
456
          enum:
457
            - +strings
457
            - +strings
458
            - _status
458
            - home_library
459
            - home_library
459
            - holding_library
460
            - holding_library
460
            - biblio.title
461
            - biblio.title
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/html_helpers/tables/items/catalogue_detail.inc (-70 / +73 lines)
Lines 207-213 Link Here
207
    [%# In case or SeparateHoldings we may need to display the number of biblios in each tab %]
207
    [%# In case or SeparateHoldings we may need to display the number of biblios in each tab %]
208
    [%# Do we need separate/new endpoints or do we hack the somewhere client-side? %]
208
    [%# Do we need separate/new endpoints or do we hack the somewhere client-side? %]
209
    let item_table_url = "/api/v1/biblios/[% biblio.biblionumber | uri %]/items?";
209
    let item_table_url = "/api/v1/biblios/[% biblio.biblionumber | uri %]/items?";
210
    let embed = ["+strings,checkout,checkout.patron,transfer,transfer+strings,first_hold,first_hold+strings,first_hold.patron,first_hold.desk"];
210
    let embed = ["+strings,_status,checkout,checkout.patron,transfer,transfer+strings,first_hold,first_hold+strings,first_hold.patron,first_hold.desk"];
211
    [% IF Koha.Preference('LocalCoverImages') %]
211
    [% IF Koha.Preference('LocalCoverImages') %]
212
        embed.push('cover_image_ids');
212
        embed.push('cover_image_ids');
213
    [% END %]
213
    [% END %]
Lines 440-537 Link Here
440
                }
440
                }
441
            },
441
            },
442
            {
442
            {
443
                data: "me.lost_status",
443
                data: "me._status",
444
                className: "status",
444
                className: "status",
445
                searchable: false, // FIXME We are losing the ability to search on the status
445
                searchable: false, // FIXME We are losing the ability to search on the status
446
                orderable: false,
446
                orderable: false,
447
                render: function (data, type, row, meta) {
447
                render: function (data, type, row, meta) {
448
                    let nodes = "";
448
                    let nodes = "";
449
                    if ( row.checkout ) {
449
                    row._status.split(",").forEach( status => {
450
                        [%# Hacky for patron_to_html in case we simply want to display the patron's library name %]
450
                        if ( status == 'checked_out' || status == 'local_use') {
451
                        row.checkout.patron.library = { name: libraries_names.get(row.checkout.patron.library_id) };
451
                            nodes += '<span>';
452
452
453
                        nodes += '<span>';
453
                            [%# Hacky for patron_to_html in case we simply want to display the patron's library name %]
454
                        if ( row.checkout.onsite_checkout ) {
454
                            row.checkout.patron.library = { name: libraries_names.get(row.checkout.patron.library_id) };
455
                            let patron_to_html = $patron_to_html(row.checkout.patron, { url: true, display_cardnumber: true, hide_patron_name });
455
                            let patron_to_html = $patron_to_html(row.checkout.patron, { url: true, display_cardnumber: true, hide_patron_name });
456
                            nodes += _("Currently in local use by %s").format(patron_to_html);
456
457
                        } else {
457
                            if ( status == 'local_use' ) {
458
                            nodes += '<span class="datedue">';
458
                                nodes += _("Currently in local use by %s").format(patron_to_html);
459
                            let patron_to_html = $patron_to_html(row.checkout.patron, { url: true, display_cardnumber: true, hide_patron_name });
459
                            } else {
460
                            nodes += _("Checked out to %s").format(patron_to_html);
460
                                nodes += '<span class="datedue">';
461
                                nodes += _("Checked out to %s").format(patron_to_html);
462
                            }
463
                            nodes += ': ';
464
                            nodes += _("due %s").format($date(row.checkout.due_date, { as_due_date: true }));
465
                            nodes += "</span>"
466
461
                        }
467
                        }
462
                        nodes += ': ';
468
                        if ( status == 'in_transit' ) {
463
                        nodes += _("due %s").format($date(row.checkout.due_date, { as_due_date: true }));
464
                        nodes += "</span>"
465
                    } else if ( row.transfer ) {
466
                        if ( row.transfer.datesent ) {
467
                            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)));
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)));
468
                        } else {
470
                        }
471
472
                        if ( status == 'transit_pending' ) {
469
                            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)));
470
                        }
474
                        }
471
                    }
472
475
473
                    if ( row.lost_status ) {
476
                        if ( status == 'lost' ) {
474
                        let lost_lib = av_lost.get(row.lost_status.toString()) || _("Unavailable (lost or missing");
477
                            let lost_lib = av_lost.get(row.lost_status.toString()) || _("Unavailable (lost or missing");
475
                        nodes += '<span class="lost">%s</span>'.format(escape_str(lost_lib));
478
                            nodes += '<span class="lost">%s</span>'.format(escape_str(lost_lib));
476
                    }
479
                        }
477
480
478
                    if ( row.withdrawn ) {
481
                        if ( status == 'withdrawn' ) {
479
                        let withdrawn_lib = av_withdrawn.get(row.withdrawn.toString()) || _("Withdrawn");
482
                            let withdrawn_lib = av_withdrawn.get(row.withdrawn.toString()) || _("Withdrawn");
480
                        nodes += '<span class="wdn">%s</span>'.format(escape_str(withdrawn_lib));
483
                            nodes += '<span class="wdn">%s</span>'.format(escape_str(withdrawn_lib));
481
                    }
484
                        }
482
485
483
                    if ( row.damaged_status ) {
486
                        if ( status == 'damaged' ) {
484
                        let damaged_lib = av_damaged.get(row.damaged_status.toString()) || _("Damaged");
487
                            let damaged_lib = av_damaged.get(row.damaged_status.toString()) || _("Damaged");
485
                        nodes += '<span class="dmg">%s</span>'.format(escape_str(damaged_lib));
488
                            nodes += '<span class="dmg">%s</span>'.format(escape_str(damaged_lib));
486
                    }
489
                        }
487
490
488
                    if ( row.not_for_loan_status || item_types_notforloan.get(row.item_type_id) ) {
491
                        if ( status == 'not_for_loan' ) {
489
                        let not_for_loan_lib = av_not_for_loan.get(row.not_for_loan_status.toString());
492
                            let not_for_loan_lib = av_not_for_loan.get(row.not_for_loan_status.toString());
490
                        nodes += '<span class="notforloan">%s'.format(_("Not for loan")) + ( not_for_loan_lib ? '<span class="reason"> (%s)</span>'.format(escape_str(not_for_loan_lib)) : '' ) + '</span>';
493
                            nodes += '<span class="notforloan">%s'.format(_("Not for loan")) + ( not_for_loan_lib ? '<span class="reason"> (%s)</span>'.format(escape_str(not_for_loan_lib)) : '' ) + '</span>';
491
                    }
494
                        }
492
495
493
                    if ( row.first_hold ) {
496
                        if ( status == 'on_hold') {
494
                        if ( row.first_hold.waiting_date ) {
497
                            if ( row.first_hold.waiting_date ) {
495
                            if ( row.first_hold.desk ) {
498
                                if ( row.first_hold.desk ) {
496
                                nodes += '<span class="waitingat">%s</span>'.format(_("Waiting at %s, %s since %s.".format(row.first_hold._strings.pickup_library_id.str, row.first_hold.desk.desk_name, $date(row.first_hold.waiting_date))));
499
                                    nodes += '<span class="waitingat">%s</span>'.format(_("Waiting at %s, %s since %s.".format(row.first_hold._strings.pickup_library_id.str, row.first_hold.desk.desk_name, $date(row.first_hold.waiting_date))));
500
                                } else {
501
                                    nodes += '<span class="waitingat">%s</span>'.format(_("Waiting at %s since %s.".format(row.first_hold._strings.pickup_library_id.str, $date(row.first_hold.waiting_date))));
502
                                }
503
                                [% IF Koha.Preference('canreservefromotherbranches') %]
504
                                    if ( row.first_hold.waiting_date || row.first_hold.priority == 1 ) {
505
                                        [%# Hacky for patron_to_html in case we simply want to display the patron's library name %]
506
                                        row.first_hold.patron.library = { name: libraries_names.get(row.first_hold.patron.library_id) };
507
508
                                        let patron_to_html = $patron_to_html(row.first_hold.patron, { url: true, display_cardnumber: true, hide_patron_name });
509
                                        nodes += ' <span class="heldfor">%s</span>'.format(_("Hold for: %s").format(patron_to_html));
510
                                    }
511
                                [% END %]
497
                            } else {
512
                            } else {
498
                                nodes += '<span class="waitingat">%s</span>'.format(_("Waiting at %s since %s.".format(row.first_hold._strings.pickup_library_id.str, $date(row.first_hold.waiting_date))));
513
                                nodes += ' <span class="holdonitem">%s</span>'.format(_("There is an item level hold on this item (priority = %s).").format(row.first_hold.priority));
499
                            }
514
                            }
500
                            [% IF Koha.Preference('canreservefromotherbranches') %]
501
                                if ( row.first_hold.waiting_date || row.first_hold.priority == 1 ) {
502
                                    [%# Hacky for patron_to_html in case we simply want to display the patron's library name %]
503
                                    row.first_hold.patron.library = { name: libraries_names.get(row.first_hold.patron.library_id) };
504
505
                                    let patron_to_html = $patron_to_html(row.first_hold.patron, { url: true, display_cardnumber: true, hide_patron_name });
506
                                    nodes += ' <span class="heldfor">%s</span>'.format(_("Hold for: %s").format(patron_to_html));
507
                                }
508
                            [% END %]
509
                        } else {
510
                            nodes += ' <span class="holdonitem">%s</span>'.format(_("There is an item level hold on this item (priority = %s).").format(row.first_hold.priority));
511
                        }
515
                        }
512
                    }
513
516
514
                    [% IF Koha.Preference('UseRecalls') %]
517
                        [% IF Koha.Preference('UseRecalls') %]
515
                        if ( row.recall ) {
518
                            if ( status == 'recalled' ) {
516
                            if ( row.recall.waiting_date ) {
519
                                if ( row.recall.waiting_date ) {
517
                                nodes += '<span>%s</span>'.format(_("Waiting at %s since %s").format(escape_str(row.recall.pickup_library_id.str), $date(row.recall.waiting_date)));
520
                                    nodes += '<span>%s</span>'.format(_("Waiting at %s since %s").format(escape_str(row.recall.pickup_library_id.str), $date(row.recall.waiting_date)));
518
                            } else {
521
                                } else {
519
                                [%# Hacky for patron_to_html in case we simply want to display the patron's library name %]
522
                                    [%# Hacky for patron_to_html in case we simply want to display the patron's library name %]
520
                                row.recall.patron.library = { name: libraries_names.get(row.recall.patron.library_id) };
523
                                    row.recall.patron.library = { name: libraries_names.get(row.recall.patron.library_id) };
521
524
522
                                let patron_to_html = $patron_to_html(row.recall.patron, {url: true, display_cardnumber: true, hide_patron_name });
525
                                    let patron_to_html = $patron_to_html(row.recall.patron, {url: true, display_cardnumber: true, hide_patron_name });
523
                                nodes += '<span>%s</span>'.format(_("recalled by %s on %s").format(patron_to_html, $date(row.recall.created_date)))
526
                                    nodes += '<span>%s</span>'.format(_("recalled by %s on %s").format(patron_to_html, $date(row.recall.created_date)))
527
                                }
524
                            }
528
                            }
525
                        }
529
                        [% END %]
526
                    [% END %]
527
530
528
                    if ( ! ( row.not_for_loan_status || item_types_notforloan.get(row.item_type_id) || row.checked_out_date || row.lost_status || row.withdrawn || row.damaged_status || row.transfer || row.first_hold || row.recall ) ) {
531
                        if ( status == 'available' ) {
529
                        nodes += ' <span>%s</span>'.format(_("Available"))
532
                            nodes += ' <span>%s</span>'.format(_("Available"))
530
                    }
533
                        }
531
534
532
                    if ( row.restricted_status ) {
535
                        if ( status == 'restricted') {
533
                        nodes += '<span class="restricted">(%s)</span>'.format(escape_str(av_restricted.get(row.restricted_status.toString())));
536
                            nodes += '<span class="restricted">(%s)</span>'.format(escape_str(av_restricted.get(row.restricted_status.toString())));
534
                    }
537
                        }
538
                    });
535
539
536
                    [% IF bundlesEnabled %]
540
                    [% IF bundlesEnabled %]
537
                        if ( row.in_bundle ) {
541
                        if ( row.in_bundle ) {
538
- 

Return to bug 37334