From 0b02f6afc1e05446124f4e03847b3bca8ab81ec6 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Wed, 8 Dec 2021 15:34:28 +0100 Subject: [PATCH] Bug 29660: Remove biblioitem loop from request.pl It seems that hiddencount didn't work prior to this patch (to confirm) --- .../prog/en/modules/reserve/request.tt | 404 +++++++++--------- reserve/request.pl | 376 +++++++--------- 2 files changed, 359 insertions(+), 421 deletions(-) diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt index aea1d3cc29d..3f77906cdc7 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt @@ -283,7 +283,7 @@   Title - [% UNLESS ( item_level_itypes ) %] + [% UNLESS Koha.Preference('item-level_itypes') %] Item type [% END %] Priority @@ -315,9 +315,9 @@ [% END %] - [% UNLESS ( item_level_itypes ) %] + [% UNLESS Koha.Preference('item-level_itypes') %] - [% biblioloo.itypename | html %] + [% biblioloo.itemtype.translated_description | html %] [% END %] [% biblioloo.rank | html %] @@ -571,222 +571,222 @@ [% END %] - [% FOREACH bibitemloo IN bibitemloop %] -
    - [% UNLESS ( item_level_itypes ) %] -
  1. - Item type: - [% bibitemloo.description | html %] -
  2. - [% END %] + [% biblio = biblioloop.0 %] - [% IF ( bibitemloo.publicationyear ) %] -
  3. - Publication year: - [% bibitemloo.publicationyear | html %] -
  4. - [% END %] -
+
    + [% UNLESS Koha.Preference('item-level_itypes') %] +
  1. + Item typeX: + [% biblio.itemtype.translated_description | html %] +
  2. + [% END %] -

    - Place a hold on a specific item - [% IF bibitemloo.force_hold_level == 'item' %] - (Required) - [% END %] -

    + [% IF ( biblio.biblioitem.publicationyear ) %] +
  3. + Publication year: + [% biblio.biblioitem.publicationyear | $KohaDates %] +
  4. + [% END %] +
- - - - - [% IF ( item_level_itypes ) %] - - [% END %] - - - - [% IF itemdata_ccode %] - - [% END %] - - - [% IF itemdata_enumchron %] - - [% END %] - - - - - - [% SET selected = 0 %] - [% FOREACH itemloo IN bibitemloo.itemloop %] - [% UNLESS ( itemloo.hide ) %] - - + + + [% END # / UNLESS itemloo.hide %] + [% END # /FOREACH itemloo %] + +
HoldItem typeBarcodeHome libraryLast locationCollectionCall numberCopy numberVol no.InformationAllowed pickup locations
- [% IF itemloo.force_hold_level == 'record' # Patron has placed a record level hold previously for this record %] - - - Hold must be record level - - [% ELSIF ( itemloo.available ) %] - - [% ELSIF ( itemloo.override ) %] - - - [% ELSE %] - - - [% IF itemloo.not_holdable %] - [% IF itemloo.not_holdable == 'damaged' %] - Item damaged - [% ELSIF itemloo.not_holdable == 'ageRestricted' %] - Age restricted - [% ELSIF itemloo.not_holdable == 'tooManyHoldsForThisRecord' %] - Exceeded max holds per record - [% ELSIF itemloo.not_holdable == 'tooManyReservesToday' %] - Daily hold limit reached for patron - [% ELSIF itemloo.not_holdable == 'tooManyReserves' %] - Too many holds - [% ELSIF itemloo.not_holdable == 'notReservable' %] - Not holdable - [% ELSIF itemloo.not_holdable == 'cannotReserveFromOtherBranches' %] - Patron is from different library - [% ELSIF itemloo.not_holdable == 'branchNotInHoldGroup' %] - Cannot place hold from patron's library - [% ELSIF itemloo.not_holdable == 'itemAlreadyOnHold' %] - Patron already has hold for this item - [% ELSIF itemloo.not_holdable == 'cannotBeTransferred' %] - Cannot be transferred to pickup library - [% ELSIF itemloo.not_holdable == 'pickupNotInHoldGroup' %] - Only pickup locations within the same hold group are allowed - [% ELSIF itemloo.not_holdable == 'noReservesAllowed' %] - No reserves are allowed on this item - [% ELSIF itemloo.not_holdable == 'libraryNotPickupLocation' %] - Library is not a pickup location - [% ELSIF itemloo.not_holdable == 'no_valid_pickup_location' %] - No valid pickup location - [% ELSE %] - [% itemloo.not_holdable | html %] - [% END %] +

+ Place a hold on a specific item + [% IF force_hold_level == 'item' %] + (Required) + [% END %] +

+ + + + + + [% IF Koha.Preference('item-level_itypes') %] + + [% END %] + + + + [% IF itemdata_ccode %] + + [% END %] + + + [% IF itemdata_enumchron %] + + [% END %] + + + + + + [% SET selected = 0 %] + [% FOREACH itemloo IN biblio.itemloop %] + [% UNLESS ( itemloo.hide ) %] + + - [% IF ( item_level_itypes ) %] - - [% END %] - + + [% END # /IF force_hold_level %] + + [% IF Koha.Preference('item-level_itypes') %] + [% END %] + + + + [% IF itemdata_ccode %] - [% IF itemdata_ccode %] - - [% END %] + [% END %] + + + [% IF itemdata_enumchron %] + [% END %] + [% IF ( itemloo.onloan ) %] + - [% IF itemdata_enumchron %] - - [% END %] - [% IF ( itemloo.onloan ) %] - - - - [% END # / UNLESS itemloo.hide %] - [% END # /FOREACH itemloo %] - -
HoldItem typeBarcodeHome libraryLast locationCollectionCall numberCopy numberVol no.InformationAllowed pickup locations
+ [% IF force_hold_level == 'record' # Patron has placed a record level hold previously for this record %] + + + Hold must be record level + + [% ELSIF ( itemloo.available ) %] + + [% ELSIF ( itemloo.override ) %] + + + [% ELSE %] + + + [% IF itemloo.not_holdable %] + [% IF itemloo.not_holdable == 'damaged' %] + Item damaged + [% ELSIF itemloo.not_holdable == 'ageRestricted' %] + Age restricted + [% ELSIF itemloo.not_holdable == 'tooManyHoldsForThisRecord' %] + Exceeded max holds per record + [% ELSIF itemloo.not_holdable == 'tooManyReservesToday' %] + Daily hold limit reached for patron + [% ELSIF itemloo.not_holdable == 'tooManyReserves' %] + Too many holds + [% ELSIF itemloo.not_holdable == 'notReservable' %] + Not holdable + [% ELSIF itemloo.not_holdable == 'cannotReserveFromOtherBranches' %] + Patron is from different library + [% ELSIF itemloo.not_holdable == 'branchNotInHoldGroup' %] + Cannot place hold from patron's library + [% ELSIF itemloo.not_holdable == 'itemAlreadyOnHold' %] + Patron already has hold for this item + [% ELSIF itemloo.not_holdable == 'cannotBeTransferred' %] + Cannot be transferred to pickup library + [% ELSIF itemloo.not_holdable == 'pickupNotInHoldGroup' %] + Only pickup locations within the same hold group are allowed + [% ELSIF itemloo.not_holdable == 'noReservesAllowed' %] + No reserves are allowed on this item + [% ELSIF itemloo.not_holdable == 'libraryNotPickupLocation' %] + Library is not a pickup location + [% ELSIF itemloo.not_holdable == 'no_valid_pickup_location' %] + No valid pickup location + [% ELSE %] + [% itemloo.not_holdable | html %] [% END %] - - [% END # /IF itemloo.force_hold_level %] - - [% UNLESS ( noItemTypeImages ) %] - [% IF ( itemloo.imageurl ) %]
[% END %] [% END %] - [% itemloo.itypename | html %] -
- [% itemloo.barcode | html %] - - [% Branches.GetName( itemloo.homebranch ) | html %] + [% UNLESS ( noItemTypeImages ) %] + [% IF ( itemloo.itemtype.image_location) %]
[% END %] + [% END %] + [% itemloo.itemtype.translated_description | html %]
+ [% itemloo.barcode | html %] + + [% Branches.GetName( itemloo.homebranch ) | html %] + + [% Branches.GetName( itemloo.holdingbranch ) | html %] + - [% Branches.GetName( itemloo.holdingbranch ) | html %] + [% IF ( itemloo.ccode ) %][% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.ccode', authorised_value => itemloo.ccode ) | html %][% END %] - [% IF ( itemloo.ccode ) %][% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.ccode', authorised_value => itemloo.ccode ) | html %][% END %] - + [% itemloo.itemcallnumber | html %] + + [% IF ( itemloo.copynumber ) %][% itemloo.copynumber | html %][% ELSE %] [% END %] + - [% itemloo.itemcallnumber | html %] + [% itemloo.enumchron | html %] + Due [% itemloo.date_due | $KohaDates as_due_date => 1 %] + [% ELSE %] - [% IF ( itemloo.copynumber ) %][% itemloo.copynumber | html %][% ELSE %] [% END %] - - [% itemloo.enumchron | html %] - - Due [% itemloo.date_due | $KohaDates as_due_date => 1 %] - [% ELSE %] - - [% IF ( itemloo.transfertwhen ) %] - In transit from [% Branches.GetName( itemloo.transfertfrom ) | html %], - to [% Branches.GetName( itemloo.transfertto ) | html %], since [% itemloo.transfertwhen | html %] - [% END %] - [% END %] + [% IF ( itemloo.transfertwhen ) %] + In transit from [% Branches.GetName( itemloo.transfertfrom ) | html %], + to [% Branches.GetName( itemloo.transfertto ) | html %], since [% itemloo.transfertwhen | html %] + [% END %] + [% END %] - [% IF ( itemloo.reservedate ) %] - [% IF ( itemloo.nocancel ) %] - Can't be cancelled when item is in transit + [% IF ( itemloo.reservedate ) %] + [% IF ( itemloo.nocancel ) %] + Can't be cancelled when item is in transit + [% ELSE %] + [% IF ( itemloo.waitingdate ) %]Waiting[% ELSE %]On hold[% END %] + [% IF ( itemloo.canreservefromotherbranches ) %] + for [% itemloo.ReservedFor.firstname | html %] [% itemloo.ReservedFor.surname | html %] + [% END %] + [% IF ( itemloo.waitingdate ) %]at[% ELSE %]expected at[% END %] + [% Branches.GetName( itemloo.ExpectedAtLibrary ) | html %] since + [% IF ( itemloo.waitingdate ) %] + [% itemloo.waitingdate | $KohaDates %] [% ELSE %] - [% IF ( itemloo.waitingdate ) %]Waiting[% ELSE %]On hold[% END %] - [% IF ( itemloo.canreservefromotherbranches ) %] - for [% itemloo.ReservedFor.firstname | html %] [% itemloo.ReservedFor.surname | html %] + [% IF ( itemloo.reservedate ) %] + [% itemloo.reservedate | html %] [% END %] - [% IF ( itemloo.waitingdate ) %]at[% ELSE %]expected at[% END %] - [% Branches.GetName( itemloo.ExpectedAtLibrary ) | html %] since - [% IF ( itemloo.waitingdate ) %] - [% itemloo.waitingdate | $KohaDates %] - [% ELSE %] - [% IF ( itemloo.reservedate ) %] - [% itemloo.reservedate | html %] - [% END %] - [% END %]. - Cancel hold - [% END # /IF itemloo.nocancel %] - [% ELSE %] - Not on hold - [% END # /IF itemloo.reservedate %] + [% END %]. + Cancel hold + [% END # /IF itemloo.nocancel %] + [% ELSE %] + Not on hold + [% END # /IF itemloo.reservedate %] - [% IF itemloo.item_level_holds == "N" %] -
Item level hold not allowed from OPAC - [% ELSIF itemloo.item_level_holds == "F" %] -
Item level hold forced from OPAC - [% END %] + [% IF itemloo.item_level_holds == "N" %] +
Item level hold not allowed from OPAC + [% ELSIF itemloo.item_level_holds == "F" %] +
Item level hold forced from OPAC + [% END %] - [% IF ( itemloo.itemlost ) %] - [% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.itemlost', authorised_value => itemloo.itemlost ) | html %] - [% END %] + [% IF ( itemloo.itemlost ) %] + [% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.itemlost', authorised_value => itemloo.itemlost ) | html %] + [% END %] - [% IF ( itemloo.damaged ) %] - [% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.damaged', authorised_value => itemloo.damaged ) | html %] - [% END %] + [% IF ( itemloo.damaged ) %] + [% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.damaged', authorised_value => itemloo.damaged ) | html %] + [% END %] - [% IF ( itemloo.withdrawn ) %] - [% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.withdrawn', authorised_value => itemloo.withdrawn ) | html %] - [% END %] + [% IF ( itemloo.withdrawn ) %] + [% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.withdrawn', authorised_value => itemloo.withdrawn ) | html %] + [% END %] - [% IF ( itemloo.notforloan ) %] - Not for loan ([% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.notforloan', authorised_value => itemloo.notforloan ) | html %]) - [% END %] -
- [% IF (itemloo.pickup_locations_count > 0) %] - + [% IF ( itemloo.notforloan ) %] + Not for loan ([% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.notforloan', authorised_value => itemloo.notforloan ) | html %]) [% END %] -
- - [% IF ( bibitemloo.hiddencount ) %] -
-

- Show all items ([% bibitemloo.hiddencount | html %] hidden) -

-
- [% END # /IF bibitemloo.hiddencount %] - [% END # /FOREACH bibitemloo %] +
+ [% IF (itemloo.pickup_locations_count > 0) %] + + [% END %] +
+ + [% IF hiddencount %] +
+

+ Show all items ([% biblio.hiddencount | html %] hidden) +

+
+ [% END # /IF hiddencount %] [% ELSE # /UNLESS multi_hold %] @@ -794,7 +794,7 @@   Title - [% UNLESS ( item_level_itypes ) %] + [% UNLESS Koha.Preference('item-level_itypes') %] Item type [% END %] Priority @@ -827,9 +827,9 @@ [% END %] - [% UNLESS ( item_level_itypes ) %] + [% UNLESS Koha.Preference('item-level_itypes') %] - [% biblioloo.itypename | html %] + [% biblioloo.itemtype.translated_description | html %] [% END %] [% biblioloo.rank | html %] @@ -1140,7 +1140,7 @@ var biblionumber = "[% biblionumber | $raw %]"; var borrowernumber = "[% patron.borrowernumber | $raw %]"; var patron_homebranch = "[% To.json( Branches.GetName( patron.branchcode ) ) | $raw %]"; - var override_items = {[% FOREACH bibitemloo IN bibitemloop %][% FOREACH itemloo IN bibitemloo.itemloop %][% IF ( itemloo.override ) %] + var override_items = {[% FOREACH biblio IN biblioloop %][% FOREACH itemloo IN biblio.itemloop %][% IF ( itemloo.override ) %] [% itemloo.itemnumber | html %]: { homebranch: "[% To.json( Branches.GetName( itemloo.homebranch ) ) | $raw %]", holdallowed: "[% itemloo.holdallowed | html %]" diff --git a/reserve/request.pl b/reserve/request.pl index 306e82b1f2b..edce2fdb4b2 100755 --- a/reserve/request.pl +++ b/reserve/request.pl @@ -68,7 +68,12 @@ my ( $template, $borrowernumber, $cookie, $flags ) = get_template_and_user( my $showallitems = $input->param('showallitems'); my $pickup = $input->param('pickup'); -my $itemtypes = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search_with_localization->unblessed } }; +my $itemtypes = { + map { + $_->itemtype => + { %{ $_->unblessed }, image_location => $_->image_location } + } Koha::ItemTypes->search_with_localization->as_list +}; # Select borrowers infos my $findborrower = $input->param('findborrower'); @@ -326,7 +331,6 @@ foreach my $biblionumber (@biblionumbers) { last; } - my $force_hold_level; if ( $patron ) { { # CanBookBeReserved my $canReserve = CanBookBeReserved( $patron->borrowernumber, $biblionumber ); @@ -370,9 +374,7 @@ foreach my $biblionumber (@biblionumbers) { found => undef, } ); - $force_hold_level = $holds->forced_hold_level(); - $biblioloopiter{force_hold_level} = $force_hold_level; - $template->param( force_hold_level => $force_hold_level ); + $template->param( force_hold_level => $holds->forced_hold_level() ); # For a librarian to be able to place multiple record holds for a patron for a record, # we must find out what the maximum number of holds they can place for the patron is @@ -383,208 +385,166 @@ foreach my $biblionumber (@biblionumbers) { $template->param( remaining_holds_for_record => $remaining_holds_for_record ); } - - my $count = Koha::Holds->search( { biblionumber => $biblionumber } )->count(); - my $totalcount = $count; - # adding a fixed value for priority options - my $fixedRank = $count+1; + my $fixedRank = $biblio->holds->count + 1; - my %itemnumbers_of_biblioitem; + my @items = $biblio->items->as_list; - my @hostitems = get_hostitemnumbers_of($biblionumber); - my @itemnumbers; - if (@hostitems){ - push(@itemnumbers, @hostitems); + my @host_items = $biblio->host_items->as_list; + if (@host_items) { + push @items, @host_items; } - my $items = Koha::Items->search({ -or => { biblionumber => $biblionumber, itemnumber => { in => \@itemnumbers } } }); - - unless ( $items->count ) { + unless ( @items ) { # FIXME Then why do we continue? $template->param('noitems' => 1) unless ( $multi_hold ); $biblioloopiter{noitems} = 1; } - ## Here we go backwards again to create hash of biblioitemnumber to itemnumbers - ## this is important when we have analytic items which may be on another record - my ( $iteminfos_of ); - while ( my $item = $items->next ) { - $item = $item->unblessed; - my $biblioitemnumber = $item->{biblioitemnumber}; - my $itemnumber = $item->{itemnumber}; - push( @{ $itemnumbers_of_biblioitem{$biblioitemnumber} }, $itemnumber ); - $iteminfos_of->{$itemnumber} = $item; - } - - my @biblioitemnumbers = keys %itemnumbers_of_biblioitem; - - my $biblioiteminfos_of = { - map { - my $biblioitem = $_; - ( $biblioitem->{biblioitemnumber} => $biblioitem ) - } @{ Koha::Biblioitems->search( - { biblioitemnumber => { -in => \@biblioitemnumbers } }, - { select => ['biblionumber', 'biblioitemnumber', 'publicationyear', 'itemtype']} - )->unblessed - } - }; - - my @bibitemloop; - my @available_itemtypes; - foreach my $biblioitemnumber (@biblioitemnumbers) { - my $biblioitem = $biblioiteminfos_of->{$biblioitemnumber}; - my $num_available = 0; - my $num_override = 0; - my $hiddencount = 0; - my $num_alreadyheld = 0; - - $biblioitem->{force_hold_level} = $force_hold_level; - - $biblioloopiter{description} = $biblioitem->{description}; - $biblioloopiter{itypename} = $biblioitem->{description}; - if ( $biblioitem->{itemtype} ) { - - $biblioitem->{description} = - $itemtypes->{ $biblioitem->{itemtype} }{description}; - - $biblioloopiter{imageurl} = - getitemtypeimagelocation( 'intranet', - $itemtypes->{ $biblioitem->{itemtype} }{imageurl} ); - } - - # iterating through all items first to check if any of them available - # to pass this value further inside down to IsAvailableForItemLevelRequest to - # it's complicated logic to analyse. - # (before this loop was inside that sub loop so it was O(n^2) ) - my $items_any_available; - $items_any_available = ItemsAnyAvailableAndNotRestricted( { biblionumber => $biblioitem->{biblionumber}, patron => $patron }) - if $patron; - - foreach my $itemnumber ( @{ $itemnumbers_of_biblioitem{$biblioitemnumber} } ) { - my $item = $iteminfos_of->{$itemnumber}; - my $do_check; - if ( $patron ) { - $do_check = $patron->do_check_for_previous_checkout($item) if $wants_check; - if ( $do_check && $wants_check ) { - $item->{checked_previously} = $do_check; - if ( $multi_hold ) { - $biblioloopiter{checked_previously} = $do_check; - } else { - $template->param( checked_previously => $do_check ); - } + my $num_available = 0; + my $num_override = 0; + my $hiddencount = 0; + my $num_alreadyheld = 0; + + # iterating through all items first to check if any of them available + # to pass this value further inside down to IsAvailableForItemLevelRequest to + # it's complicated logic to analyse. + # (before this loop was inside that sub loop so it was O(n^2) ) + my $items_any_available; + $items_any_available = ItemsAnyAvailableAndNotRestricted( { biblionumber => $biblio->biblionumber, patron => $patron }) + if $patron; + + for my $item_object ( @items ) { + my $do_check; + my $item = $item_object->unblessed; + if ( $patron ) { + $do_check = $patron->do_check_for_previous_checkout($item) if $wants_check; + if ( $do_check && $wants_check ) { + $item->{checked_previously} = $do_check; + if ( $multi_hold ) { + $biblioloopiter{checked_previously} = $do_check; + } else { + $template->param( checked_previously => $do_check ); } } - $item->{force_hold_level} = $force_hold_level; - - unless (C4::Context->preference('item-level_itypes')) { - $item->{itype} = $biblioitem->{itemtype}; - } + } - $item->{itypename} = $itemtypes->{ $item->{itype} }{description}; - $item->{imageurl} = getitemtypeimagelocation( 'intranet', $itemtypes->{ $item->{itype} }{imageurl} ); - $item->{homebranch} = $item->{homebranch}; + $item->{itemtype} = $itemtypes->{ $item_object->effective_itemtype }; - # if the holdingbranch is different than the homebranch, we show the - # holdingbranch of the document too - if ( $item->{homebranch} ne $item->{holdingbranch} ) { - $item->{holdingbranch} = $item->{holdingbranch}; - } + if($item->{biblionumber} ne $biblio->biblionumber){ + $item->{hosttitle} = Koha::Biblios->find( $item->{biblionumber} )->title; + } - if($item->{biblionumber} ne $biblionumber){ - $item->{hosttitle} = Koha::Biblios->find( $item->{biblionumber} )->title; - } + # if the item is currently on loan, we display its return date and + # change the background color + my $issue = $item_object->checkout; + if ( $issue ) { # FIXME must be moved to the template + $item->{date_due} = $issue->date_due; + $item->{backgroundcolor} = 'onloan'; + } - # if the item is currently on loan, we display its return date and - # change the background color - my $issue = Koha::Checkouts->find( { itemnumber => $itemnumber } ); - if ( $issue ) { - $item->{date_due} = $issue->date_due; - $item->{backgroundcolor} = 'onloan'; - } + # checking reserve + my $holds = $item_object->current_holds; + if ( my $first_hold = $holds->next ) { + my $p = Koha::Patrons->find( $first_hold->borrowernumber ); - # checking reserve - my $item_object = Koha::Items->find( $itemnumber ); - my $holds = $item_object->current_holds; - if ( my $first_hold = $holds->next ) { - my $p = Koha::Patrons->find( $first_hold->borrowernumber ); - - $item->{backgroundcolor} = 'reserved'; - $item->{reservedate} = output_pref({ dt => dt_from_string( $first_hold->reservedate ), dateonly => 1 }); # FIXME Should be formatted in the template - $item->{ReservedFor} = $p; - $item->{ExpectedAtLibrary} = $first_hold->branchcode; - $item->{waitingdate} = $first_hold->waitingdate; - } + $item->{backgroundcolor} = 'reserved'; + $item->{reservedate} = output_pref({ dt => dt_from_string( $first_hold->reservedate ), dateonly => 1 }); # FIXME Should be formatted in the template + $item->{ReservedFor} = $p; + $item->{ExpectedAtLibrary} = $first_hold->branchcode; + $item->{waitingdate} = $first_hold->waitingdate; + } - # Management of the notforloan document - if ( $item->{notforloan} ) { - $item->{backgroundcolor} = 'other'; - } + # Management of the notforloan document + if ( $item->{notforloan} ) { + $item->{backgroundcolor} = 'other'; + } - # Management of lost or long overdue items - if ( $item->{itemlost} ) { - $item->{backgroundcolor} = 'other'; - if ($logged_in_patron->category->hidelostitems && !$showallitems) { - $item->{hide} = 1; - $hiddencount++; - } + # Management of lost or long overdue items + if ( $item->{itemlost} ) { + $item->{backgroundcolor} = 'other'; + if ($logged_in_patron->category->hidelostitems && !$showallitems) { + $item->{hide} = 1; + $hiddencount++; } + } - # Check the transit status - my ( $transfertwhen, $transfertfrom, $transfertto ) = - GetTransfers($itemnumber); + # Check the transit status + my ( $transfertwhen, $transfertfrom, $transfertto ) = + GetTransfers($item_object->itemnumber); # FIXME replace with get_transfer - if ( defined $transfertwhen && $transfertwhen ne '' ) { - $item->{transfertwhen} = output_pref({ dt => dt_from_string( $transfertwhen ), dateonly => 1 }); - $item->{transfertfrom} = $transfertfrom; - $item->{transfertto} = $transfertto; - $item->{nocancel} = 1; - } + if ( defined $transfertwhen && $transfertwhen ne '' ) { + $item->{transfertwhen} = output_pref({ dt => dt_from_string( $transfertwhen ), dateonly => 1 }); + $item->{transfertfrom} = $transfertfrom; + $item->{transfertto} = $transfertto; + $item->{nocancel} = 1; + } - # If there is no loan, return and transfer, we show a checkbox. - $item->{notforloan} ||= 0; - - # if independent branches is on we need to check if the person can reserve - # for branches they arent logged in to - if ( C4::Context->preference("IndependentBranches") ) { - if (! C4::Context->preference("canreservefromotherbranches")){ - # can't reserve items so need to check if item homebranch and userenv branch match if not we can't reserve - my $userenv = C4::Context->userenv; - unless ( C4::Context->IsSuperLibrarian ) { - $item->{cantreserve} = 1 if ( $item->{homebranch} ne $userenv->{branch} ); - } + # If there is no loan, return and transfer, we show a checkbox. + $item->{notforloan} ||= 0; + + # if independent branches is on we need to check if the person can reserve + # for branches they arent logged in to + if ( C4::Context->preference("IndependentBranches") ) { + if (! C4::Context->preference("canreservefromotherbranches")){ + # can't reserve items so need to check if item homebranch and userenv branch match if not we can't reserve + my $userenv = C4::Context->userenv; + unless ( C4::Context->IsSuperLibrarian ) { + $item->{cantreserve} = 1 if ( $item->{homebranch} ne $userenv->{branch} ); } } + } - if ( $patron ) { - my $patron_unblessed = $patron->unblessed; - my $branch = C4::Circulation::_GetCircControlBranch($item, $patron_unblessed); + if ( $patron ) { + my $patron_unblessed = $patron->unblessed; + my $branch = C4::Circulation::_GetCircControlBranch($item, $patron_unblessed); - my $branchitemrule = GetBranchItemRule( $branch, $item->{'itype'} ); + my $branchitemrule = GetBranchItemRule( $branch, $item->{'itype'} ); - $item->{'holdallowed'} = $branchitemrule->{'holdallowed'}; + $item->{'holdallowed'} = $branchitemrule->{'holdallowed'}; - my $can_item_be_reserved = CanItemBeReserved( $patron->borrowernumber, $itemnumber )->{status}; - $item->{not_holdable} = $can_item_be_reserved unless ( $can_item_be_reserved eq 'OK' ); + my $can_item_be_reserved = CanItemBeReserved( $patron->borrowernumber, $item_object->itemnumber )->{status}; + $item->{not_holdable} = $can_item_be_reserved unless ( $can_item_be_reserved eq 'OK' ); - $item->{item_level_holds} = Koha::CirculationRules->get_opacitemholds_policy( { item => $item_object, patron => $patron } ); + $item->{item_level_holds} = Koha::CirculationRules->get_opacitemholds_policy( { item => $item_object, patron => $patron } ); - if ( - !$item->{cantreserve} - && !$exceeded_maxreserves - && $can_item_be_reserved eq 'OK' - # items_any_available defined outside of the current loop, - # so we avoiding loop inside IsAvailableForItemLevelRequest: - && IsAvailableForItemLevelRequest($item_object, $patron, undef, $items_any_available) - ) - { + if ( + !$item->{cantreserve} + && !$exceeded_maxreserves + && $can_item_be_reserved eq 'OK' + # items_any_available defined outside of the current loop, + # so we avoiding loop inside IsAvailableForItemLevelRequest: + && IsAvailableForItemLevelRequest($item_object, $patron, undef, $items_any_available) + ) + { + # Send the pickup locations count to the UI, the pickup locations will be pulled using the API + my $pickup_locations = $item_object->pickup_locations({ patron => $patron }); + $item->{pickup_locations_count} = $pickup_locations->count; + if ( $item->{pickup_locations_count} > 0 ) { + $num_available++; + $item->{available} = 1; + # pass the holding branch for use as default + my $default_pickup_location = $pickup_locations->search({ branchcode => $item->{holdingbranch} })->next; + $item->{default_pickup_location} = $default_pickup_location; + } + else { + $item->{available} = 0; + $item->{not_holdable} = "no_valid_pickup_location"; + } + + push( @available_itemtypes, $item->{itype} ); + } + elsif ( C4::Context->preference('AllowHoldPolicyOverride') ) { + # If AllowHoldPolicyOverride is set, it should override EVERY restriction, not just branch item rules + # with the exception of itemAlreadyOnHold because, you know, the item is already on hold + if ( $can_item_be_reserved ne 'itemAlreadyOnHold' ) { # Send the pickup locations count to the UI, the pickup locations will be pulled using the API my $pickup_locations = $item_object->pickup_locations({ patron => $patron }); $item->{pickup_locations_count} = $pickup_locations->count; if ( $item->{pickup_locations_count} > 0 ) { - $num_available++; - $item->{available} = 1; + $item->{override} = 1; + $num_override++; # pass the holding branch for use as default my $default_pickup_location = $pickup_locations->search({ branchcode => $item->{holdingbranch} })->next; $item->{default_pickup_location} = $default_pickup_location; @@ -593,61 +553,39 @@ foreach my $biblionumber (@biblionumbers) { $item->{available} = 0; $item->{not_holdable} = "no_valid_pickup_location"; } + } else { $num_alreadyheld++ } - push( @available_itemtypes, $item->{itype} ); - } - elsif ( C4::Context->preference('AllowHoldPolicyOverride') ) { - # If AllowHoldPolicyOverride is set, it should override EVERY restriction, not just branch item rules - # with the exception of itemAlreadyOnHold because, you know, the item is already on hold - if ( $can_item_be_reserved ne 'itemAlreadyOnHold' ) { - # Send the pickup locations count to the UI, the pickup locations will be pulled using the API - my $pickup_locations = $item_object->pickup_locations({ patron => $patron }); - $item->{pickup_locations_count} = $pickup_locations->count; - if ( $item->{pickup_locations_count} > 0 ) { - $item->{override} = 1; - $num_override++; - # pass the holding branch for use as default - my $default_pickup_location = $pickup_locations->search({ branchcode => $item->{holdingbranch} })->next; - $item->{default_pickup_location} = $default_pickup_location; - } - else { - $item->{available} = 0; - $item->{not_holdable} = "no_valid_pickup_location"; - } - } else { $num_alreadyheld++ } - - push( @available_itemtypes, $item->{itype} ); - } + push( @available_itemtypes, $item->{itype} ); + } - # If none of the conditions hold true, then neither override nor available is set and the item cannot be checked + # If none of the conditions hold true, then neither override nor available is set and the item cannot be checked - # Show serial enumeration when needed - if ($item->{enumchron}) { - $itemdata_enumchron = 1; - } - # Show collection when needed - if ($item->{ccode}) { - $itemdata_ccode = 1; - } + # Show serial enumeration when needed + if ($item->{enumchron}) { + $itemdata_enumchron = 1; + } + # Show collection when needed + if ($item->{ccode}) { + $itemdata_ccode = 1; } - - push @{ $biblioitem->{itemloop} }, $item; } - # While we can't override an alreay held item, we should be able to override the others - # Unless all items are already held - if ( $num_override > 0 && ($num_override + $num_alreadyheld) == scalar( @{ $biblioitem->{itemloop} } ) ) { - # That is, if all items require an override - $template->param( override_required => 1 ); - } elsif ( $num_available == 0 ) { - $template->param( none_available => 1 ); - $biblioloopiter{warn} = 1; - $biblioloopiter{none_avail} = 1; - } - $template->param( hiddencount => $hiddencount); + push @{ $biblioloopiter{itemloop} }, $item; + } - push @bibitemloop, $biblioitem; + $biblioloopiter{biblioitem} = $biblio->biblioitem; + + # While we can't override an alreay held item, we should be able to override the others + # Unless all items are already held + if ( $num_override > 0 && ($num_override + $num_alreadyheld) == scalar( @{ $biblioloopiter{itemloop} } ) ) { + # That is, if all items require an override + $template->param( override_required => 1 ); + } elsif ( $num_available == 0 ) { + $template->param( none_available => 1 ); + $biblioloopiter{warn} = 1; + $biblioloopiter{none_avail} = 1; } + $template->param( hiddencount => $hiddencount); @available_itemtypes = uniq( @available_itemtypes ); $template->param( available_itemtypes => \@available_itemtypes ); @@ -717,7 +655,6 @@ foreach my $biblionumber (@biblionumbers) { # display infos $template->param( - bibitemloop => \@bibitemloop, itemdata_enumchron => $itemdata_enumchron, itemdata_ccode => $itemdata_ccode, date => $date, @@ -764,6 +701,7 @@ if ( C4::Context->preference( 'AllowHoldDateInFuture' ) ) { $template->param( SuspendHoldsIntranet => C4::Context->preference('SuspendHoldsIntranet'), AutoResumeSuspendedHolds => C4::Context->preference('AutoResumeSuspendedHolds'), + borrowernumber => $borrowernumber_hold, ); # printout the page -- 2.25.1