Lines 44-49
BEGIN {
Link Here
|
44 |
TransportCostMatrix |
44 |
TransportCostMatrix |
45 |
UpdateTransportCostMatrix |
45 |
UpdateTransportCostMatrix |
46 |
GetPendingHoldRequestsForBib |
46 |
GetPendingHoldRequestsForBib |
|
|
47 |
load_branches_to_pull_from |
48 |
update_queue_for_biblio |
47 |
); |
49 |
); |
48 |
} |
50 |
} |
49 |
|
51 |
|
Lines 204-230
sub CreateQueue {
Link Here
|
204 |
my $bibs_with_pending_requests = GetBibsWithPendingHoldRequests(); |
206 |
my $bibs_with_pending_requests = GetBibsWithPendingHoldRequests(); |
205 |
|
207 |
|
206 |
foreach my $biblionumber (@$bibs_with_pending_requests) { |
208 |
foreach my $biblionumber (@$bibs_with_pending_requests) { |
|
|
209 |
|
207 |
$total_bibs++; |
210 |
$total_bibs++; |
208 |
my $hold_requests = GetPendingHoldRequestsForBib($biblionumber); |
|
|
209 |
my $available_items = GetItemsAvailableToFillHoldRequestsForBib($biblionumber, $branches_to_use); |
210 |
$total_requests += scalar(@$hold_requests); |
211 |
$total_available_items += scalar(@$available_items); |
212 |
|
211 |
|
213 |
my $item_map = MapItemsToHoldRequests($hold_requests, $available_items, $branches_to_use, $transport_cost_matrix); |
212 |
my $result = update_queue_for_biblio( |
214 |
$item_map or next; |
213 |
{ biblio_id => $biblionumber, |
215 |
my $item_map_size = scalar(keys %$item_map) |
214 |
branches_to_use => $branches_to_use, |
216 |
or next; |
215 |
transport_cost_matrix => $transport_cost_matrix, |
|
|
216 |
} |
217 |
); |
217 |
|
218 |
|
218 |
$num_items_mapped += $item_map_size; |
219 |
$total_requests += $result->{requests}; |
219 |
CreatePicklistFromItemMap($item_map); |
220 |
$total_available_items += $result->{available_items}; |
220 |
AddToHoldTargetMap($item_map); |
221 |
$num_items_mapped += $result->{mapped_items}; |
221 |
if (($item_map_size < scalar(@$hold_requests )) and |
|
|
222 |
($item_map_size < scalar(@$available_items))) { |
223 |
# DOUBLE CHECK, but this is probably OK - unfilled item-level requests |
224 |
# FIXME |
225 |
#warn "unfilled requests for $biblionumber"; |
226 |
#warn Dumper($hold_requests), Dumper($available_items), Dumper($item_map); |
227 |
} |
228 |
} |
222 |
} |
229 |
} |
223 |
} |
230 |
|
224 |
|
Lines 855-859
sub least_cost_branch {
Link Here
|
855 |
# return $branch[0] if @branch == 1; |
849 |
# return $branch[0] if @branch == 1; |
856 |
} |
850 |
} |
857 |
|
851 |
|
|
|
852 |
=head3 update_queue_for_biblio |
853 |
|
854 |
my $result = update_queue_for_biblio( |
855 |
{ |
856 |
biblio_id => $biblio_id, |
857 |
[ branches_to_use => $branches_to_use, |
858 |
transport_cost_matrix => $transport_cost_matrix, |
859 |
delete => $delete, ] |
860 |
} |
861 |
); |
862 |
|
863 |
Given a I<biblio_id>, this method calculates and sets the holds queue entries |
864 |
for the biblio's holds, and the hold fill targets (items). |
865 |
|
866 |
=head4 Return value |
867 |
|
868 |
It return a hashref containing: |
869 |
|
870 |
=over |
871 |
|
872 |
=item I<requests>: the pending holds count for the biblio. |
873 |
|
874 |
=item I<available_items> the count of items that are available to fill holds for the biblio. |
875 |
|
876 |
=item I<mapped_items> the total items that got mapped. |
877 |
|
878 |
=back |
879 |
|
880 |
=head4 Optional parameters |
881 |
|
882 |
=over |
883 |
|
884 |
=item I<branches_to_use> a list of branchcodes to be used to restrict which items can be used. |
885 |
|
886 |
=item I<transport_cost_matrix> is the output of C<TransportCostMatrix>. |
887 |
|
888 |
=item I<delete> tells the method to delete prior entries on the related tables for the biblio_id. |
889 |
|
890 |
=back |
891 |
|
892 |
Note: All the optional parameters will be calculated in the method if omitted. They |
893 |
are allowed to be passed to avoid calculating them many times inside loops. |
894 |
|
895 |
=cut |
896 |
|
897 |
sub update_queue_for_biblio { |
898 |
my ($args) = @_; |
899 |
|
900 |
my $biblio_id = $args->{biblio_id}; |
901 |
|
902 |
my $branches_to_use = $args->{branches_to_use} // load_branches_to_pull_from( C4::Context->preference('UseTransportCostMatrix') ); |
903 |
my $transport_cost_matrix; |
904 |
|
905 |
if ( !exists $args->{transport_cost_matrix} |
906 |
&& C4::Context->preference('UseTransportCostMatrix') ) { |
907 |
$transport_cost_matrix = TransportCostMatrix(); |
908 |
} else { |
909 |
$transport_cost_matrix = $args->{transport_cost_matrix}; |
910 |
} |
911 |
|
912 |
if ( $args->{delete} ) { |
913 |
my $dbh = C4::Context->dbh; |
914 |
|
915 |
$dbh->do("DELETE FROM tmp_holdsqueue WHERE biblionumber=$biblio_id"); |
916 |
$dbh->do("DELETE FROM hold_fill_targets WHERE biblionumber=$biblio_id"); |
917 |
} |
918 |
|
919 |
my $hold_requests = GetPendingHoldRequestsForBib($biblio_id); |
920 |
my $available_items = GetItemsAvailableToFillHoldRequestsForBib( $biblio_id, $branches_to_use ); |
921 |
|
922 |
my $result = { |
923 |
requests => scalar( @{$hold_requests} ), |
924 |
available_items => scalar( @{$available_items} ), |
925 |
}; |
926 |
|
927 |
my $item_map = MapItemsToHoldRequests( $hold_requests, $available_items, $branches_to_use, $transport_cost_matrix ); |
928 |
$result->{mapped_items} = scalar( keys %{$item_map} ); |
929 |
|
930 |
if ($item_map) { |
931 |
CreatePicklistFromItemMap($item_map); |
932 |
AddToHoldTargetMap($item_map); |
933 |
} |
934 |
|
935 |
return $result; |
936 |
} |
858 |
|
937 |
|
859 |
1; |
938 |
1; |
860 |
- |
|
|