Bugzilla – Attachment 129200 Details for
Bug 29043
Items are processed but not displayed on request.pl before a patron is selected
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 29043: [ALTERNATIVE PATCH] Don't fetch biblios info unless a patron is picked
Bug-29043-ALTERNATIVE-PATCH-Dont-fetch-biblios-inf.patch (text/plain), 36.42 KB, created by
Jonathan Druart
on 2022-01-07 16:58:40 UTC
(
hide
)
Description:
Bug 29043: [ALTERNATIVE PATCH] Don't fetch biblios info unless a patron is picked
Filename:
MIME Type:
Creator:
Jonathan Druart
Created:
2022-01-07 16:58:40 UTC
Size:
36.42 KB
patch
obsolete
>From f7d5e42fc1c5eb77ebbda57c6e610bda7c103fa7 Mon Sep 17 00:00:00 2001 >From: Jonathan Druart <jonathan.druart@bugs.koha-community.org> >Date: Fri, 7 Jan 2022 17:56:37 +0100 >Subject: [PATCH] Bug 29043: [ALTERNATIVE PATCH] Don't fetch biblios info > unless a patron is picked > >If we haven't picked a patron or a club yet we don't need to fetch >biblios, items and holdability infos >--- > reserve/request.pl | 687 +++++++++++++++++++++++---------------------- > 1 file changed, 350 insertions(+), 337 deletions(-) > >diff --git a/reserve/request.pl b/reserve/request.pl >index bbf7ad5d894..0d7c142804b 100755 >--- a/reserve/request.pl >+++ b/reserve/request.pl >@@ -198,6 +198,9 @@ $template->param( > multi_hold => $multi_hold, > ); > >+# If we are coming from the search result and only 1 is selected >+$biblionumber ||= $biblionumbers[0] unless $multi_hold; >+ > # If we have the borrowernumber because we've performed an action, then we > # don't want to try to place another reserve. > if ($borrowernumber_hold && !$action) { >@@ -293,404 +296,414 @@ $template->param( > messageclub => $messageclub > ); > >-# FIXME launch another time GetMember perhaps until (Joubu: Why?) >-my $patron = Koha::Patrons->find( $borrowernumber_hold ); >- >-if ( $patron && $multi_hold ) { >- my @multi_pickup_locations = >- Koha::Biblios->search( { biblionumber => \@biblionumbers } ) >- ->pickup_locations( { patron => $patron } ); >- $template->param( multi_pickup_locations => \@multi_pickup_locations ); >-} > >-my $logged_in_patron = Koha::Patrons->find( $borrowernumber ); >+if ( $club_hold or $borrowernumber_hold ) { >+ # FIXME launch another time GetMember perhaps until (Joubu: Why?) >+ my $patron = Koha::Patrons->find( $borrowernumber_hold ); > >-my $wants_check; >-if ($patron) { >- $wants_check = $patron->wants_check_for_previous_checkout; >-} >-my $itemdata_enumchron = 0; >-my $itemdata_ccode = 0; >-my @biblioloop = (); >-my $no_reserves_allowed = 0; >-foreach my $biblionumber (@biblionumbers) { >- next unless $biblionumber =~ m|^\d+$|; >+ if ( $patron && $multi_hold ) { >+ my @multi_pickup_locations = >+ Koha::Biblios->search( { biblionumber => \@biblionumbers } ) >+ ->pickup_locations( { patron => $patron } ); >+ $template->param( multi_pickup_locations => \@multi_pickup_locations ); >+ } > >- my %biblioloopiter = (); >+ my $logged_in_patron = Koha::Patrons->find( $borrowernumber ); > >- my $biblio = Koha::Biblios->find( $biblionumber ); >- unless ($biblio) { >- $biblioloopiter{noitems} = 1; >- $template->param('nobiblio' => 1); >- last; >+ my $wants_check; >+ if ($patron) { >+ $wants_check = $patron->wants_check_for_previous_checkout; > } >+ my $itemdata_enumchron = 0; >+ my $itemdata_ccode = 0; >+ my @biblioloop = (); >+ my $no_reserves_allowed = 0; >+ foreach my $biblionumber (@biblionumbers) { >+ next unless $biblionumber =~ m|^\d+$|; >+ >+ my %biblioloopiter = (); >+ >+ my $biblio = Koha::Biblios->find( $biblionumber ); >+ unless ($biblio) { >+ $biblioloopiter{noitems} = 1; >+ $template->param('nobiblio' => 1); >+ last; >+ } > >- if ( $patron ) { >- { # CanBookBeReserved >- my $canReserve = CanBookBeReserved( $patron->borrowernumber, $biblionumber ); >- if ( $canReserve->{status} eq 'OK' ) { >+ if ( $patron ) { >+ { # CanBookBeReserved >+ my $canReserve = CanBookBeReserved( $patron->borrowernumber, $biblionumber ); >+ if ( $canReserve->{status} eq 'OK' ) { > >- #All is OK and we can continue >- } >- elsif ( $canReserve->{status} eq 'noReservesAllowed' || $canReserve->{status} eq 'notReservable' ) { >- $no_reserves_allowed = 1; >- } >- elsif ( $canReserve->{status} eq 'tooManyReserves' ) { >- $exceeded_maxreserves = 1; >- $template->param( maxreserves => $canReserve->{limit} ); >- } >- elsif ( $canReserve->{status} eq 'tooManyHoldsForThisRecord' ) { >- $exceeded_holds_per_record = 1; >- $biblioloopiter{ $canReserve->{status} } = 1; >- } >- elsif ( $canReserve->{status} eq 'ageRestricted' ) { >- $template->param( $canReserve->{status} => 1 ); >- $biblioloopiter{ $canReserve->{status} } = 1; >- } >- elsif ( $canReserve->{status} eq 'alreadypossession' ) { >- $template->param( $canReserve->{status} => 1); >- $biblioloopiter{ $canReserve->{status} } = 1; >- } >- else { >- $biblioloopiter{ $canReserve->{status} } = 1; >+ #All is OK and we can continue >+ } >+ elsif ( $canReserve->{status} eq 'noReservesAllowed' || $canReserve->{status} eq 'notReservable' ) { >+ $no_reserves_allowed = 1; >+ } >+ elsif ( $canReserve->{status} eq 'tooManyReserves' ) { >+ $exceeded_maxreserves = 1; >+ $template->param( maxreserves => $canReserve->{limit} ); >+ } >+ elsif ( $canReserve->{status} eq 'tooManyHoldsForThisRecord' ) { >+ $exceeded_holds_per_record = 1; >+ $biblioloopiter{ $canReserve->{status} } = 1; >+ } >+ elsif ( $canReserve->{status} eq 'ageRestricted' ) { >+ $template->param( $canReserve->{status} => 1 ); >+ $biblioloopiter{ $canReserve->{status} } = 1; >+ } >+ elsif ( $canReserve->{status} eq 'alreadypossession' ) { >+ $template->param( $canReserve->{status} => 1); >+ $biblioloopiter{ $canReserve->{status} } = 1; >+ } >+ else { >+ $biblioloopiter{ $canReserve->{status} } = 1; >+ } > } >- } > >- # For multiple holds per record, if a patron has previously placed a hold, >- # the patron can only place more holds of the same type. That is, if the >- # patron placed a record level hold, all the holds the patron places must >- # be record level. If the patron placed an item level hold, all holds >- # the patron places must be item level >- my $holds = Koha::Holds->search( >- { >- borrowernumber => $patron->borrowernumber, >- biblionumber => $biblionumber, >- found => undef, >- } >- ); >- $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 >- my $max_holds_for_record = GetMaxPatronHoldsForRecord( $patron->borrowernumber, $biblionumber ); >- my $remaining_holds_for_record = $max_holds_for_record - $holds->count(); >- $biblioloopiter{remaining_holds_for_record} = $max_holds_for_record; >- $template->param( max_holds_for_record => $max_holds_for_record ); >- $template->param( remaining_holds_for_record => $remaining_holds_for_record ); >- } >+ # For multiple holds per record, if a patron has previously placed a hold, >+ # the patron can only place more holds of the same type. That is, if the >+ # patron placed a record level hold, all the holds the patron places must >+ # be record level. If the patron placed an item level hold, all holds >+ # the patron places must be item level >+ my $holds = Koha::Holds->search( >+ { >+ borrowernumber => $patron->borrowernumber, >+ biblionumber => $biblionumber, >+ found => undef, >+ } >+ ); >+ $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 >+ my $max_holds_for_record = GetMaxPatronHoldsForRecord( $patron->borrowernumber, $biblionumber ); >+ my $remaining_holds_for_record = $max_holds_for_record - $holds->count(); >+ $biblioloopiter{remaining_holds_for_record} = $max_holds_for_record; >+ $template->param( max_holds_for_record => $max_holds_for_record ); >+ $template->param( remaining_holds_for_record => $remaining_holds_for_record ); >+ } > >- # adding a fixed value for priority options >- my $fixedRank = $biblio->holds->count + 1; >+ # adding a fixed value for priority options >+ my $fixedRank = $biblio->holds->count + 1; > >- my @items = $biblio->items->as_list; >+ my @items = $biblio->items->as_list; > >- my @host_items = $biblio->host_items->as_list; >- if (@host_items) { >- push @items, @host_items; >- } >+ my @host_items = $biblio->host_items->as_list; >+ if (@host_items) { >+ push @items, @host_items; >+ } > >- unless ( @items ) { >- # FIXME Then why do we continue? >- $template->param('noitems' => 1) unless ( $multi_hold ); >- $biblioloopiter{noitems} = 1; >- } >+ unless ( @items ) { >+ # FIXME Then why do we continue? >+ $template->param('noitems' => 1) unless ( $multi_hold ); >+ $biblioloopiter{noitems} = 1; >+ } > >- my @available_itemtypes; >- 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 ); >+ my @available_itemtypes; >+ 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->{itemtype} = $itemtypes->{ $item_object->effective_itemtype }; >+ $item->{itemtype} = $itemtypes->{ $item_object->effective_itemtype }; > >- if($item->{biblionumber} ne $biblio->biblionumber){ >- $item->{hosttitle} = Koha::Biblios->find( $item->{biblionumber} )->title; >- } >+ if($item->{biblionumber} ne $biblio->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 = $item_object->checkout; >+ if ( $issue ) { # FIXME must be moved to the template >+ $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 $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($item_object->itemnumber); # FIXME replace with get_transfer >+ # 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); > >- my $branchitemrule = GetBranchItemRule( $branch, $item->{'itype'} ); >+ if ( $patron ) { >+ my $patron_unblessed = $patron->unblessed; >+ my $branch = C4::Circulation::_GetCircControlBranch($item, $patron_unblessed); > >- $item->{'holdallowed'} = $branchitemrule->{'holdallowed'}; >+ my $branchitemrule = GetBranchItemRule( $branch, $item->{'itype'} ); > >- 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->{'holdallowed'} = $branchitemrule->{'holdallowed'}; > >- $item->{item_level_holds} = Koha::CirculationRules->get_opacitemholds_policy( { item => $item_object, patron => $patron } ); >+ 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' ); > >- 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"; >- } >+ $item->{item_level_holds} = Koha::CirculationRules->get_opacitemholds_policy( { item => $item_object, patron => $patron } ); > >- 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' ) { >+ 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 })->as_list; >- $item->{pickup_locations_count} = scalar @pickup_locations; >- >- if ( @pickup_locations ) { >+ 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; >- >- my $default_pickup_location; >- >- # Default to logged-in, if valid >- if ( C4::Context->userenv->{branch} ) { >- ($default_pickup_location) = grep { $_->branchcode eq C4::Context->userenv->{branch} } @pickup_locations; >- } >- >+ # 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} ); >+ } >+ 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 })->as_list; >+ $item->{pickup_locations_count} = scalar @pickup_locations; >+ >+ if ( @pickup_locations ) { >+ $num_available++; >+ $item->{available} = 1; >+ >+ my $default_pickup_location; >+ >+ # Default to logged-in, if valid >+ if ( C4::Context->userenv->{branch} ) { >+ ($default_pickup_location) = grep { $_->branchcode eq C4::Context->userenv->{branch} } @pickup_locations; >+ } >+ >+ $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} ); >+ } > >- # 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 @{ $biblioloopiter{itemloop} }, $item; >- } >+ push @{ $biblioloopiter{itemloop} }, $item; >+ } > >- $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 ); >- >- # existingreserves building >- my @reserveloop; >- my @reserves = Koha::Holds->search( { biblionumber => $biblionumber }, { order_by => 'priority' } ); >- foreach my $res ( >- sort { >- my $a_found = $a->found() || ''; >- my $b_found = $a->found() || ''; >- $a_found cmp $b_found; >- } @reserves >- ) >- { >- my %reserve; >- if ( $res->is_found() ) { >- $reserve{'holdingbranch'} = $res->item()->holdingbranch(); >- $reserve{'biblionumber'} = $res->item()->biblionumber(); >- $reserve{'barcodenumber'} = $res->item()->barcode(); >- $reserve{'wbrcode'} = $res->branchcode(); >- $reserve{'itemnumber'} = $res->itemnumber(); >- $reserve{'wbrname'} = $res->branch()->branchname(); >- $reserve{'atdestination'} = $res->is_at_destination(); >- $reserve{'desk_name'} = ( $res->desk() ) ? $res->desk()->desk_name() : '' ; >- $reserve{'found'} = $res->is_found(); >- $reserve{'inprocessing'} = $res->is_in_processing(); >- $reserve{'intransit'} = $res->is_in_transit(); >+ $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; > } >- elsif ( $res->priority() > 0 ) { >- if ( my $item = $res->item() ) { >- $reserve{'itemnumber'} = $item->id(); >- $reserve{'barcodenumber'} = $item->barcode(); >- $reserve{'item_level_hold'} = 1; >+ $template->param( hiddencount => $hiddencount); >+ >+ @available_itemtypes = uniq( @available_itemtypes ); >+ $template->param( available_itemtypes => \@available_itemtypes ); >+ >+ # existingreserves building >+ my @reserveloop; >+ my @reserves = Koha::Holds->search( { biblionumber => $biblionumber }, { order_by => 'priority' } ); >+ foreach my $res ( >+ sort { >+ my $a_found = $a->found() || ''; >+ my $b_found = $a->found() || ''; >+ $a_found cmp $b_found; >+ } @reserves >+ ) >+ { >+ my %reserve; >+ if ( $res->is_found() ) { >+ $reserve{'holdingbranch'} = $res->item()->holdingbranch(); >+ $reserve{'biblionumber'} = $res->item()->biblionumber(); >+ $reserve{'barcodenumber'} = $res->item()->barcode(); >+ $reserve{'wbrcode'} = $res->branchcode(); >+ $reserve{'itemnumber'} = $res->itemnumber(); >+ $reserve{'wbrname'} = $res->branch()->branchname(); >+ $reserve{'atdestination'} = $res->is_at_destination(); >+ $reserve{'desk_name'} = ( $res->desk() ) ? $res->desk()->desk_name() : '' ; >+ $reserve{'found'} = $res->is_found(); >+ $reserve{'inprocessing'} = $res->is_in_processing(); >+ $reserve{'intransit'} = $res->is_in_transit(); >+ } >+ elsif ( $res->priority() > 0 ) { >+ if ( my $item = $res->item() ) { >+ $reserve{'itemnumber'} = $item->id(); >+ $reserve{'barcodenumber'} = $item->barcode(); >+ $reserve{'item_level_hold'} = 1; >+ } > } >+ >+ $reserve{'expirationdate'} = $res->expirationdate; >+ $reserve{'date'} = $res->reservedate; >+ $reserve{'borrowernumber'} = $res->borrowernumber(); >+ $reserve{'biblionumber'} = $res->biblionumber(); >+ $reserve{'patron'} = $res->borrower; >+ $reserve{'notes'} = $res->reservenotes(); >+ $reserve{'waiting_date'} = $res->waitingdate(); >+ $reserve{'ccode'} = $res->item() ? $res->item()->ccode() : undef; >+ $reserve{'barcode'} = $res->item() ? $res->item()->barcode() : undef; >+ $reserve{'priority'} = $res->priority(); >+ $reserve{'lowestPriority'} = $res->lowestPriority(); >+ $reserve{'suspend'} = $res->suspend(); >+ $reserve{'suspend_until'} = $res->suspend_until(); >+ $reserve{'reserve_id'} = $res->reserve_id(); >+ $reserve{itemtype} = $res->itemtype(); >+ $reserve{branchcode} = $res->branchcode(); >+ $reserve{non_priority} = $res->non_priority(); >+ $reserve{object} = $res; >+ >+ push( @reserveloop, \%reserve ); > } > >- $reserve{'expirationdate'} = $res->expirationdate; >- $reserve{'date'} = $res->reservedate; >- $reserve{'borrowernumber'} = $res->borrowernumber(); >- $reserve{'biblionumber'} = $res->biblionumber(); >- $reserve{'patron'} = $res->borrower; >- $reserve{'notes'} = $res->reservenotes(); >- $reserve{'waiting_date'} = $res->waitingdate(); >- $reserve{'ccode'} = $res->item() ? $res->item()->ccode() : undef; >- $reserve{'barcode'} = $res->item() ? $res->item()->barcode() : undef; >- $reserve{'priority'} = $res->priority(); >- $reserve{'lowestPriority'} = $res->lowestPriority(); >- $reserve{'suspend'} = $res->suspend(); >- $reserve{'suspend_until'} = $res->suspend_until(); >- $reserve{'reserve_id'} = $res->reserve_id(); >- $reserve{itemtype} = $res->itemtype(); >- $reserve{branchcode} = $res->branchcode(); >- $reserve{non_priority} = $res->non_priority(); >- $reserve{object} = $res; >- >- push( @reserveloop, \%reserve ); >- } >+ # get the time for the form name... >+ my $time = time(); > >- # get the time for the form name... >- my $time = time(); >+ $template->param( >+ time => $time, >+ fixedRank => $fixedRank, >+ ); > >- $template->param( >- time => $time, >- fixedRank => $fixedRank, >- ); >+ # display infos >+ $template->param( >+ itemdata_enumchron => $itemdata_enumchron, >+ itemdata_ccode => $itemdata_ccode, >+ date => $date, >+ biblionumber => $biblionumber, >+ findborrower => $findborrower, >+ biblio => $biblio, >+ holdsview => 1, >+ C4::Search::enabled_staff_search_views, >+ ); >+ >+ $biblioloopiter{biblionumber} = $biblionumber; >+ $biblioloopiter{title} = $biblio->title; >+ $biblioloopiter{rank} = $fixedRank; >+ $biblioloopiter{reserveloop} = \@reserveloop; >+ >+ if (@reserveloop) { >+ $template->param( reserveloop => \@reserveloop ); >+ } > >- # display infos >- $template->param( >- itemdata_enumchron => $itemdata_enumchron, >- itemdata_ccode => $itemdata_ccode, >- date => $date, >- biblionumber => $biblionumber, >- findborrower => $findborrower, >- biblio => $biblio, >- holdsview => 1, >- C4::Search::enabled_staff_search_views, >- ); >- >- $biblioloopiter{biblionumber} = $biblionumber; >- $biblioloopiter{title} = $biblio->title; >- $biblioloopiter{rank} = $fixedRank; >- $biblioloopiter{reserveloop} = \@reserveloop; >- >- if (@reserveloop) { >- $template->param( reserveloop => \@reserveloop ); >- } >+ if ( $patron ) { >+ # Add the valid pickup locations >+ my @pickup_locations = $biblio->pickup_locations({ patron => $patron }); >+ $biblioloopiter{pickup_locations} = \@pickup_locations; >+ $biblioloopiter{pickup_locations_codes} = [ map { $_->branchcode } @pickup_locations ]; >+ } > >- if ( $patron ) { >- # Add the valid pickup locations >- my @pickup_locations = $biblio->pickup_locations({ patron => $patron }); >- $biblioloopiter{pickup_locations} = \@pickup_locations; >- $biblioloopiter{pickup_locations_codes} = [ map { $_->branchcode } @pickup_locations ]; >+ push @biblioloop, \%biblioloopiter; > } >- >- push @biblioloop, \%biblioloopiter; >+ $template->param( biblioloop => \@biblioloop ); >+ $template->param( no_reserves_allowed => $no_reserves_allowed ); >+ $template->param( exceeded_maxreserves => $exceeded_maxreserves ); >+ $template->param( exceeded_holds_per_record => $exceeded_holds_per_record ); >+ $template->param( subscriptionsnumber => CountSubscriptionFromBiblionumber($biblionumber)); >+} elsif ( ! $multi_hold ) { >+ my $biblio = Koha::Biblios->find( $biblionumber ); >+ $template->param( biblio => $biblio ); > } > >-$template->param( biblioloop => \@biblioloop ); >-$template->param( no_reserves_allowed => $no_reserves_allowed ); >-$template->param( biblionumbers => join('/', @biblionumbers) ); >-$template->param( exceeded_maxreserves => $exceeded_maxreserves ); >-$template->param( exceeded_holds_per_record => $exceeded_holds_per_record ); >-$template->param( subscriptionsnumber => CountSubscriptionFromBiblionumber($biblionumber)); >+if ( $multi_hold ) { >+ $template->param( biblionumbers => join('/', @biblionumbers) ); >+} else { >+ $template->param( biblionumber => $biblionumber || $biblionumbers[0] ); >+} > > # pass the userenv branch if no pickup location selected > $template->param( pickup => $pickup || C4::Context->userenv->{branch} ); >-- >2.25.1
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 29043
:
124941
|
125060
|
127731
|
127732
|
128254
|
128309
|
128336
|
128337
|
128338
|
128339
|
128340
|
128421
|
128422
|
128423
|
128474
|
128475
|
128476
|
128971
|
128972
|
128973
|
129200
|
129498
|
129530
|
129531
|
129820
|
129821
|
129915
|
129916
|
129949
|
129950