|
Lines 452-465
sub MapItemsToHoldRequests {
Link Here
|
| 452 |
foreach my $item (@$available_items) { |
452 |
foreach my $item (@$available_items) { |
| 453 |
next if $item->{_object}->exclude_from_local_holds_priority; |
453 |
next if $item->{_object}->exclude_from_local_holds_priority; |
| 454 |
|
454 |
|
| 455 |
next unless _checkHoldPolicy($item, $request); |
455 |
next unless _can_item_fill_request( $item, $request, $libraries ); |
| 456 |
|
456 |
|
| 457 |
next if $request->{itemnumber} && $request->{itemnumber} != $item->{itemnumber}; |
457 |
next if $request->{itemnumber} && $request->{itemnumber} != $item->{itemnumber}; |
| 458 |
|
458 |
|
| 459 |
next if $request->{item_group_id} && $item->{_object}->item_group && $item->{_object}->item_group->id ne $request->{item_group_id}; |
|
|
| 460 |
|
| 461 |
next unless $item->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ); |
| 462 |
|
| 463 |
my $local_holds_priority_item_branchcode = |
459 |
my $local_holds_priority_item_branchcode = |
| 464 |
$item->{$LocalHoldsPriorityItemControl}; |
460 |
$item->{$LocalHoldsPriorityItemControl}; |
| 465 |
|
461 |
|
|
Lines 506-523
sub MapItemsToHoldRequests {
Link Here
|
| 506 |
# is this an item-level request? |
502 |
# is this an item-level request? |
| 507 |
if (defined($request->{itemnumber})) { |
503 |
if (defined($request->{itemnumber})) { |
| 508 |
# fill it if possible; if not skip it |
504 |
# fill it if possible; if not skip it |
| 509 |
if ( |
505 |
if ( exists $items_by_itemnumber{ $request->{itemnumber} } |
| 510 |
exists $items_by_itemnumber{ $request->{itemnumber} } |
|
|
| 511 |
and not exists $allocated_items{ $request->{itemnumber} } |
506 |
and not exists $allocated_items{ $request->{itemnumber} } |
| 512 |
and _checkHoldPolicy($items_by_itemnumber{ $request->{itemnumber} }, $request) # Don't fill item level holds that contravene the hold pickup policy at this time |
507 |
and _can_item_fill_request( $items_by_itemnumber{ $request->{itemnumber} }, $request, $libraries ) ) |
| 513 |
and ( !$request->{itemtype} # If hold itemtype is set, item's itemtype must match |
|
|
| 514 |
|| $items_by_itemnumber{ $request->{itemnumber} }->{itype} eq $request->{itemtype} ) |
| 515 |
and ( !$request->{item_group_id} # If hold item_group is set, item's item_group must match |
| 516 |
|| ( $items_by_itemnumber{ $request->{itemnumber} }->{_object}->item_group |
| 517 |
&& $items_by_itemnumber{ $request->{itemnumber} }->{_object}->item_group->id eq $request->{item_group_id} ) ) |
| 518 |
and $items_by_itemnumber{ $request->{itemnumber} }->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ) |
| 519 |
|
| 520 |
) |
| 521 |
{ |
508 |
{ |
| 522 |
|
509 |
|
| 523 |
$item_map{ $request->{itemnumber} } = { |
510 |
$item_map{ $request->{itemnumber} } = { |
|
Lines 568-586
sub MapItemsToHoldRequests {
Link Here
|
| 568 |
|
555 |
|
| 569 |
my $holding_branch_items = $items_by_branch{$pickup_branch}; |
556 |
my $holding_branch_items = $items_by_branch{$pickup_branch}; |
| 570 |
my $priority_branch = C4::Context->preference('HoldsQueuePrioritizeBranch') // 'homebranch'; |
557 |
my $priority_branch = C4::Context->preference('HoldsQueuePrioritizeBranch') // 'homebranch'; |
| 571 |
if ( $holding_branch_items ) { |
558 |
if ($holding_branch_items) { |
| 572 |
foreach my $item (@$holding_branch_items) { |
559 |
foreach my $item (@$holding_branch_items) { |
| 573 |
next unless $items_by_itemnumber{ $item->{itemnumber} }->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ); |
560 |
next unless _can_item_fill_request( $item, $request, $libraries ); |
| 574 |
|
561 |
|
| 575 |
if ( |
562 |
if ( $request->{borrowerbranch} eq $item->{$priority_branch} ) { |
| 576 |
$request->{borrowerbranch} eq $item->{$priority_branch} |
|
|
| 577 |
&& _checkHoldPolicy($item, $request) # Don't fill item level holds that contravene the hold pickup policy at this time |
| 578 |
&& ( !$request->{itemtype} # If hold itemtype is set, item's itemtype must match |
| 579 |
|| ( $request->{itemnumber} && ( $items_by_itemnumber{ $request->{itemnumber} }->{itype} eq $request->{itemtype} ) ) ) |
| 580 |
&& ( !$request->{item_group_id} # If hold item_group is set, item's item_group must match |
| 581 |
|| ( $item->{_object}->item_group && $item->{_object}->item_group->id eq $request->{item_group_id} ) ) |
| 582 |
) |
| 583 |
{ |
| 584 |
$itemnumber = $item->{itemnumber}; |
563 |
$itemnumber = $item->{itemnumber}; |
| 585 |
last; |
564 |
last; |
| 586 |
} |
565 |
} |
|
Lines 595-615
sub MapItemsToHoldRequests {
Link Here
|
| 595 |
my $holding_branch_items = $items_by_branch{$holdingbranch}; |
574 |
my $holding_branch_items = $items_by_branch{$holdingbranch}; |
| 596 |
foreach my $item (@$holding_branch_items) { |
575 |
foreach my $item (@$holding_branch_items) { |
| 597 |
next if $request->{borrowerbranch} ne $item->{$priority_branch}; |
576 |
next if $request->{borrowerbranch} ne $item->{$priority_branch}; |
| 598 |
next unless $items_by_itemnumber{ $item->{itemnumber} }->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ); |
577 |
next unless _can_item_fill_request( $item, $request, $libraries ); |
| 599 |
|
|
|
| 600 |
# Don't fill item level holds that contravene the hold pickup policy at this time |
| 601 |
next unless _checkHoldPolicy($item, $request); |
| 602 |
|
| 603 |
# If hold itemtype is set, item's itemtype must match |
| 604 |
next unless ( !$request->{itemtype} |
| 605 |
|| $item->{itype} eq $request->{itemtype} ); |
| 606 |
|
| 607 |
# If hold item_group is set, item's item_group must match |
| 608 |
next unless ( |
| 609 |
!$request->{item_group_id} |
| 610 |
|| ( $item->{_object}->item_group |
| 611 |
&& $item->{_object}->item_group->id eq $request->{item_group_id} ) |
| 612 |
); |
| 613 |
|
578 |
|
| 614 |
$itemnumber = $item->{itemnumber}; |
579 |
$itemnumber = $item->{itemnumber}; |
| 615 |
last; |
580 |
last; |
|
Lines 642-660
sub MapItemsToHoldRequests {
Link Here
|
| 642 |
# FIXME: The itention is to follow StaticHoldsQueueWeight, but we don't check that pref |
607 |
# FIXME: The itention is to follow StaticHoldsQueueWeight, but we don't check that pref |
| 643 |
foreach my $item (@$holding_branch_items) { |
608 |
foreach my $item (@$holding_branch_items) { |
| 644 |
next if $pickup_branch ne $item->{homebranch}; |
609 |
next if $pickup_branch ne $item->{homebranch}; |
| 645 |
next unless _checkHoldPolicy($item, $request); |
610 |
next unless _can_item_fill_request( $item, $request, $libraries ); |
| 646 |
next unless $items_by_itemnumber{ $item->{itemnumber} }->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ); |
|
|
| 647 |
|
| 648 |
# If hold itemtype is set, item's itemtype must match |
| 649 |
next unless ( !$request->{itemtype} |
| 650 |
|| $item->{itype} eq $request->{itemtype} ); |
| 651 |
|
| 652 |
# If hold item_group is set, item's item_group must match |
| 653 |
next unless ( |
| 654 |
!$request->{item_group_id} |
| 655 |
|| ( $item->{_object}->item_group |
| 656 |
&& $item->{_object}->item_group->id eq $request->{item_group_id} ) |
| 657 |
); |
| 658 |
|
611 |
|
| 659 |
$itemnumber = $item->{itemnumber}; |
612 |
$itemnumber = $item->{itemnumber}; |
| 660 |
$holdingbranch = $branch; |
613 |
$holdingbranch = $branch; |
|
Lines 665-685
sub MapItemsToHoldRequests {
Link Here
|
| 665 |
# Now try items from the least cost branch based on the transport cost matrix or StaticHoldsQueueWeight |
618 |
# Now try items from the least cost branch based on the transport cost matrix or StaticHoldsQueueWeight |
| 666 |
unless ( $itemnumber || !$holdingbranch) { |
619 |
unless ( $itemnumber || !$holdingbranch) { |
| 667 |
foreach my $current_item ( @{ $items_by_branch{$holdingbranch} } ) { |
620 |
foreach my $current_item ( @{ $items_by_branch{$holdingbranch} } ) { |
| 668 |
next unless _checkHoldPolicy($current_item, $request); # Don't fill item level holds that contravene the hold pickup policy at this time |
621 |
next unless _can_item_fill_request( $current_item, $request, $libraries ); |
| 669 |
|
|
|
| 670 |
# If hold itemtype is set, item's itemtype must match |
| 671 |
next unless ( !$request->{itemtype} |
| 672 |
|| $current_item->{itype} eq $request->{itemtype} ); |
| 673 |
|
| 674 |
next unless $items_by_itemnumber{ $current_item->{itemnumber} }->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ); |
| 675 |
|
| 676 |
# If hold item_group is set, item's item_group must match |
| 677 |
next unless ( |
| 678 |
!$request->{item_group_id} |
| 679 |
|| ( $current_item->{_object}->item_group |
| 680 |
&& $current_item->{_object}->item_group->id eq $request->{item_group_id} ) |
| 681 |
); |
| 682 |
|
| 683 |
|
622 |
|
| 684 |
$itemnumber = $current_item->{itemnumber}; |
623 |
$itemnumber = $current_item->{itemnumber}; |
| 685 |
last; # quit this loop as soon as we have a suitable item |
624 |
last; # quit this loop as soon as we have a suitable item |
|
Lines 694-714
sub MapItemsToHoldRequests {
Link Here
|
| 694 |
or next; |
633 |
or next; |
| 695 |
|
634 |
|
| 696 |
foreach my $item (@$holding_branch_items) { |
635 |
foreach my $item (@$holding_branch_items) { |
| 697 |
# Don't fill item level holds that contravene the hold pickup policy at this time |
|
|
| 698 |
next unless _checkHoldPolicy($item, $request); |
| 699 |
|
| 700 |
# If hold itemtype is set, item's itemtype must match |
| 701 |
next unless ( !$request->{itemtype} |
| 702 |
|| $item->{itype} eq $request->{itemtype} ); |
| 703 |
|
636 |
|
| 704 |
# If hold item_group is set, item's item_group must match |
637 |
next unless _can_item_fill_request( $item, $request, $libraries ); |
| 705 |
next unless ( |
|
|
| 706 |
!$request->{item_group_id} |
| 707 |
|| ( $item->{_object}->item_group |
| 708 |
&& $item->{_object}->item_group->id eq $request->{item_group_id} ) |
| 709 |
); |
| 710 |
|
| 711 |
next unless $items_by_itemnumber{ $item->{itemnumber} }->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ); |
| 712 |
|
638 |
|
| 713 |
$itemnumber = $item->{itemnumber}; |
639 |
$itemnumber = $item->{itemnumber}; |
| 714 |
$holdingbranch = $branch; |
640 |
$holdingbranch = $branch; |
|
Lines 740-745
sub MapItemsToHoldRequests {
Link Here
|
| 740 |
return \%item_map; |
666 |
return \%item_map; |
| 741 |
} |
667 |
} |
| 742 |
|
668 |
|
|
|
669 |
|
| 670 |
=head2 _can_item_fill_request |
| 671 |
|
| 672 |
my $bool = _can_item_fill_request( $item, $request, $libraries ); |
| 673 |
|
| 674 |
This is an internal function of MapItemsToHoldRequests for checking an item against a hold. It uses the custom hashes for item and hold information |
| 675 |
used by thta routine |
| 676 |
|
| 677 |
=cut |
| 678 |
|
| 679 |
sub _can_item_fill_request { |
| 680 |
my ( $item, $request, $libraries ) = @_; |
| 681 |
|
| 682 |
# Don't fill item level holds that contravene the hold pickup policy at this time |
| 683 |
return unless _checkHoldPolicy( $item, $request ); |
| 684 |
|
| 685 |
# If hold itemtype is set, item's itemtype must match |
| 686 |
return unless ( !$request->{itemtype} |
| 687 |
|| $item->{itype} eq $request->{itemtype} ); |
| 688 |
|
| 689 |
# If hold item_group is set, item's item_group must match |
| 690 |
return |
| 691 |
unless ( |
| 692 |
!$request->{item_group_id} |
| 693 |
|| ( $item->{_object}->item_group |
| 694 |
&& $item->{_object}->item_group->id eq $request->{item_group_id} ) |
| 695 |
); |
| 696 |
|
| 697 |
return |
| 698 |
unless $item->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ); |
| 699 |
|
| 700 |
return 1; |
| 701 |
} |
| 702 |
|
| 703 |
|
| 704 |
|
| 743 |
=head2 CreatePickListFromItemMap |
705 |
=head2 CreatePickListFromItemMap |
| 744 |
|
706 |
|
| 745 |
=cut |
707 |
=cut |
| 746 |
- |
|
|