X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FHoldsQueue.pm;h=ce525ba64b6d6ade04ff4323769831806e6af633;hb=e0e063a85b654af623ea1da068d6fd23e8ec3833;hp=7cadfecc91f02e37558aae79b8fb5bc8904a51a1;hpb=456348aba9a13413b0409f11d21d5f0133f498fe;p=koha.git diff --git a/C4/HoldsQueue.pm b/C4/HoldsQueue.pm index 7cadfecc91..ce525ba64b 100755 --- a/C4/HoldsQueue.pm +++ b/C4/HoldsQueue.pm @@ -25,11 +25,11 @@ use warnings; use C4::Context; use C4::Search; use C4::Items; -use C4::Branch; use C4::Circulation; use C4::Members; use C4::Biblio; use Koha::DateUtils; +use Koha::Patrons; use List::Util qw(shuffle); use List::MoreUtils qw(any); @@ -101,7 +101,7 @@ sub UpdateTransportCostMatrix { my $sth = $dbh->prepare("INSERT INTO transport_cost (frombranch, tobranch, cost, disable_transfer) VALUES (?, ?, ?, ?)"); - $dbh->do("TRUNCATE TABLE transport_cost"); + $dbh->do("DELETE FROM transport_cost"); foreach (@$records) { my $cost = $_->{cost}; my $from = $_->{frombranch}; @@ -110,7 +110,7 @@ sub UpdateTransportCostMatrix { $cost ||= 0; } elsif ( !defined ($cost) || ($cost !~ m/(0|[1-9][0-9]*)(\.[0-9]*)?/o) ) { - warn "Invalid $from -> $to cost $cost - must be a number >= 0, disablig"; + warn "Invalid $from -> $to cost $cost - must be a number >= 0, disabling"; $cost = 0; $_->{disable_transfer} = 1; } @@ -146,7 +146,7 @@ sub GetHoldsQueueItems { $sth->execute(@bind_params); my $items = []; while ( my $row = $sth->fetchrow_hashref ){ - my $record = GetMarcBiblio($row->{biblionumber}); + my $record = GetMarcBiblio({ biblionumber => $row->{biblionumber} }); if ($record){ $row->{subtitle} = [ map { $_->{subfield} } @{ GetRecordValue( 'subtitle', $record, '' ) } ]; $row->{parts} = GetRecordValue('parts',$record,'')->[0]->{subfield}; @@ -278,7 +278,7 @@ sub GetPendingHoldRequestsForBib { my $dbh = C4::Context->dbh; my $request_query = "SELECT biblionumber, borrowernumber, itemnumber, priority, reserves.branchcode, - reservedate, reservenotes, borrowers.branchcode AS borrowerbranch + reservedate, reservenotes, borrowers.branchcode AS borrowerbranch, itemtype FROM reserves JOIN borrowers USING (borrowernumber) WHERE biblionumber = ? @@ -368,6 +368,7 @@ sub GetItemsAvailableToFillHoldRequestsForBib { sub MapItemsToHoldRequests { my ($hold_requests, $available_items, $branches_to_use, $transport_cost_matrix) = @_; + # handle trival cases return unless scalar(@$hold_requests) > 0; return unless scalar(@$available_items) > 0; @@ -388,8 +389,66 @@ sub MapItemsToHoldRequests { # figure out which item-level requests can be filled my $num_items_remaining = scalar(@$available_items); + + # Look for Local Holds Priority matches first + if ( C4::Context->preference('LocalHoldsPriority') ) { + my $LocalHoldsPriorityPatronControl = + C4::Context->preference('LocalHoldsPriorityPatronControl'); + my $LocalHoldsPriorityItemControl = + C4::Context->preference('LocalHoldsPriorityItemControl'); + + foreach my $request (@$hold_requests) { + next if (defined($request->{itemnumber})); #skip item level holds in local priority checking + last if $num_items_remaining == 0; + + my $local_hold_match; + foreach my $item (@$available_items) { + next + if ( !$item->{holdallowed} ) + || ( $item->{holdallowed} == 1 + && $item->{homebranch} ne $request->{borrowerbranch} ); + + my $local_holds_priority_item_branchcode = + $item->{$LocalHoldsPriorityItemControl}; + + my $local_holds_priority_patron_branchcode = + ( $LocalHoldsPriorityPatronControl eq 'PickupLibrary' ) + ? $request->{branchcode} + : ( $LocalHoldsPriorityPatronControl eq 'HomeLibrary' ) + ? $request->{borrowerbranch} + : undef; + + $local_hold_match = + $local_holds_priority_item_branchcode eq + $local_holds_priority_patron_branchcode; + + if ($local_hold_match) { + if ( exists $items_by_itemnumber{ $item->{itemnumber} } + and not exists $allocated_items{ $item->{itemnumber} } + and not $request->{allocated}) + { + $item_map{ $item->{itemnumber} } = { + borrowernumber => $request->{borrowernumber}, + biblionumber => $request->{biblionumber}, + holdingbranch => $item->{holdingbranch}, + pickup_branch => $request->{branchcode} + || $request->{borrowerbranch}, + item_level => 0, + reservedate => $request->{reservedate}, + reservenotes => $request->{reservenotes}, + }; + $allocated_items{ $item->{itemnumber} }++; + $request->{allocated} = 1; + $num_items_remaining--; + } + } + } + } + } + foreach my $request (@$hold_requests) { last if $num_items_remaining == 0; + next if $request->{allocated}; # is this an item-level request? if (defined($request->{itemnumber})) { @@ -400,6 +459,8 @@ sub MapItemsToHoldRequests { and ( # Don't fill item level holds that contravene the hold pickup policy at this time ( $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} eq 'any' ) || ( $request->{branchcode} eq $items_by_itemnumber{ $request->{itemnumber} }->{ $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} } ) + and ( !$request->{itemtype} # If hold itemtype is set, item's itemtype must match + || $items_by_itemnumber{ $request->{itemnumber} }->{itype} eq $request->{itemtype} ) ) ) @@ -438,6 +499,7 @@ sub MapItemsToHoldRequests { my $pull_branches; foreach my $request (@$hold_requests) { last if $num_items_remaining == 0; + next if $request->{allocated}; next if defined($request->{itemnumber}); # already handled these # look for local match first @@ -451,6 +513,8 @@ sub MapItemsToHoldRequests { $request->{borrowerbranch} eq $item->{homebranch} && ( ( $item->{hold_fulfillment_policy} eq 'any' ) # Don't fill item level holds that contravene the hold pickup policy at this time || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} } ) + && ( !$request->{itemtype} # If hold itemtype is set, item's itemtype must match + || $items_by_itemnumber{ $request->{itemnumber} }->{itype} eq $request->{itemtype} ) ) { $itemnumber = $item->{itemnumber}; @@ -472,6 +536,10 @@ sub MapItemsToHoldRequests { next unless $item->{hold_fulfillment_policy} eq 'any' || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} }; + # If hold itemtype is set, item's itemtype must match + next unless ( !$request->{itemtype} + || $item->{itype} eq $request->{itemtype} ); + $itemnumber = $item->{itemnumber}; last; } @@ -504,6 +572,10 @@ sub MapItemsToHoldRequests { next unless $item->{hold_fulfillment_policy} eq 'any' || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} }; + # If hold itemtype is set, item's itemtype must match + next unless ( !$request->{itemtype} + || $item->{itype} eq $request->{itemtype} ); + $itemnumber = $item->{itemnumber}; $holdingbranch = $branch; last PULL_BRANCHES; @@ -519,6 +591,10 @@ sub MapItemsToHoldRequests { next unless $current_item->{hold_fulfillment_policy} eq 'any' || $request->{branchcode} eq $current_item->{ $current_item->{hold_fulfillment_policy} }; + # If hold itemtype is set, item's itemtype must match + next unless ( !$request->{itemtype} + || $current_item->{itype} eq $request->{itemtype} ); + $itemnumber = $current_item->{itemnumber}; last; # quit this loop as soon as we have a suitable item } @@ -539,6 +615,10 @@ sub MapItemsToHoldRequests { next unless $item->{hold_fulfillment_policy} eq 'any' || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} }; + # If hold itemtype is set, item's itemtype must match + next unless ( !$request->{itemtype} + || $item->{itype} eq $request->{itemtype} ); + $itemnumber = $item->{itemnumber}; $holdingbranch = $branch; last PULL_BRANCHES2; @@ -598,14 +678,14 @@ sub CreatePicklistFromItemMap { my $barcode = $item->{barcode}; my $itemcallnumber = $item->{itemcallnumber}; - my $borrower = GetMember('borrowernumber'=>$borrowernumber); - my $cardnumber = $borrower->{'cardnumber'}; - my $surname = $borrower->{'surname'}; - my $firstname = $borrower->{'firstname'}; - my $phone = $borrower->{'phone'}; + my $patron = Koha::Patrons->find( $borrowernumber ); + my $cardnumber = $patron->cardnumber; + my $surname = $patron->surname; + my $firstname = $patron->firstname; + my $phone = $patron->phone; - my $bib = GetBiblioData($biblionumber); - my $title = $bib->{title}; + my $biblio = Koha::Biblios->find( $biblionumber ); + my $title = $biblio->title; $sth_load->execute($biblionumber, $itemnumber, $barcode, $surname, $firstname, $phone, $borrowernumber, $cardnumber, $reservedate, $title, $itemcallnumber,