|
Lines 31-36
use C4::Biblio;
Link Here
|
| 31 |
use Koha::DateUtils; |
31 |
use Koha::DateUtils; |
| 32 |
use Koha::Items; |
32 |
use Koha::Items; |
| 33 |
use Koha::Patrons; |
33 |
use Koha::Patrons; |
|
|
34 |
use Koha::Libraries; |
| 34 |
|
35 |
|
| 35 |
use List::Util qw(shuffle); |
36 |
use List::Util qw(shuffle); |
| 36 |
use List::MoreUtils qw(any); |
37 |
use List::MoreUtils qw(any); |
|
Lines 361-366
sub GetItemsAvailableToFillHoldRequestsForBib {
Link Here
|
| 361 |
} @items ]; |
362 |
} @items ]; |
| 362 |
} |
363 |
} |
| 363 |
|
364 |
|
|
|
365 |
=head2 _checkHoldPolicy |
| 366 |
|
| 367 |
_checkHoldPolicy($item, $request) |
| 368 |
|
| 369 |
check if item agrees with hold policies |
| 370 |
|
| 371 |
=cut |
| 372 |
|
| 373 |
sub _checkHoldPolicy { |
| 374 |
my ($item, $request) = @_; |
| 375 |
|
| 376 |
return 0 unless $item->{holdallowed}; |
| 377 |
return 0 if $item->{holdallowed} == 1 && $item->{homebranch} ne $request->{borrowerbranch}; |
| 378 |
|
| 379 |
my $library = Koha::Libraries->find($item->{homebranch}); |
| 380 |
|
| 381 |
return 0 if $item->{'holdallowed'} == 3 && !$library->validate_hold_sibling({branchcode => $request->{borrowerbranch}}); |
| 382 |
|
| 383 |
my $hold_fulfillment_policy = $item->{hold_fulfillment_policy}; |
| 384 |
|
| 385 |
return 0 if $hold_fulfillment_policy eq 'holdgroup' && !$library->validate_hold_sibling({branchcode => $request->{branchcode}}); |
| 386 |
return 0 if $hold_fulfillment_policy eq 'homebranch' && $request->{branchcode} ne $item->$hold_fulfillment_policy; |
| 387 |
return 0 if $hold_fulfillment_policy eq 'holdingbranch' && $request->{branchcode} ne $item->$hold_fulfillment_policy; |
| 388 |
|
| 389 |
my $patronLibrary = Koha::Libraries->find($request->{borrowerbranch}); |
| 390 |
|
| 391 |
return 0 if $hold_fulfillment_policy eq 'patrongroup' && !patronLibrary->validate_hold_sibling({branchcode => $request->{branchcode}}); |
| 392 |
|
| 393 |
return 1; |
| 394 |
|
| 395 |
} |
| 396 |
|
| 364 |
=head2 MapItemsToHoldRequests |
397 |
=head2 MapItemsToHoldRequests |
| 365 |
|
398 |
|
| 366 |
MapItemsToHoldRequests($hold_requests, $available_items, $branches, $transport_cost_matrix) |
399 |
MapItemsToHoldRequests($hold_requests, $available_items, $branches, $transport_cost_matrix) |
|
Lines 409-419
sub MapItemsToHoldRequests {
Link Here
|
| 409 |
|
442 |
|
| 410 |
my $local_hold_match; |
443 |
my $local_hold_match; |
| 411 |
foreach my $item (@$available_items) { |
444 |
foreach my $item (@$available_items) { |
| 412 |
next |
445 |
next if $item->{_object}->exclude_from_local_holds_priority; |
| 413 |
if ( !$item->{holdallowed} ) |
446 |
|
| 414 |
|| ( $item->{holdallowed} == 1 |
447 |
next unless _checkHoldPolicy($item, $request); |
| 415 |
&& $item->{homebranch} ne $request->{borrowerbranch} ) |
|
|
| 416 |
|| $item->{_object}->exclude_from_local_holds_priority; |
| 417 |
|
448 |
|
| 418 |
next if $request->{itemnumber} && $request->{itemnumber} != $item->{itemnumber}; |
449 |
next if $request->{itemnumber} && $request->{itemnumber} != $item->{itemnumber}; |
| 419 |
|
450 |
|
|
Lines 468-479
sub MapItemsToHoldRequests {
Link Here
|
| 468 |
if ( |
499 |
if ( |
| 469 |
exists $items_by_itemnumber{ $request->{itemnumber} } |
500 |
exists $items_by_itemnumber{ $request->{itemnumber} } |
| 470 |
and not exists $allocated_items{ $request->{itemnumber} } |
501 |
and not exists $allocated_items{ $request->{itemnumber} } |
| 471 |
and ( # Don't fill item level holds that contravene the hold pickup policy at this time |
502 |
and _checkHoldPolicy($items_by_itemnumber{ $request->{itemnumber} }, $request) # Don't fill item level holds that contravene the hold pickup policy at this time |
| 472 |
( $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} eq 'any' ) |
|
|
| 473 |
|| ( $request->{branchcode} eq $items_by_itemnumber{ $request->{itemnumber} }->{ $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} } ) |
| 474 |
and ( !$request->{itemtype} # If hold itemtype is set, item's itemtype must match |
503 |
and ( !$request->{itemtype} # If hold itemtype is set, item's itemtype must match |
| 475 |
|| $items_by_itemnumber{ $request->{itemnumber} }->{itype} eq $request->{itemtype} ) |
504 |
|| $items_by_itemnumber{ $request->{itemnumber} }->{itype} eq $request->{itemtype} ) |
| 476 |
) |
505 |
|
| 477 |
and $items_by_itemnumber{ $request->{itemnumber} }->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ) |
506 |
and $items_by_itemnumber{ $request->{itemnumber} }->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ) |
| 478 |
|
507 |
|
| 479 |
) |
508 |
) |
|
Lines 527-534
sub MapItemsToHoldRequests {
Link Here
|
| 527 |
|
556 |
|
| 528 |
if ( |
557 |
if ( |
| 529 |
$request->{borrowerbranch} eq $item->{homebranch} |
558 |
$request->{borrowerbranch} eq $item->{homebranch} |
| 530 |
&& ( ( $item->{hold_fulfillment_policy} eq 'any' ) # Don't fill item level holds that contravene the hold pickup policy at this time |
559 |
&& _checkHoldPolicy($item, $request) # Don't fill item level holds that contravene the hold pickup policy at this time |
| 531 |
|| $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} } ) |
|
|
| 532 |
&& ( !$request->{itemtype} # If hold itemtype is set, item's itemtype must match |
560 |
&& ( !$request->{itemtype} # If hold itemtype is set, item's itemtype must match |
| 533 |
|| ( $request->{itemnumber} && ( $items_by_itemnumber{ $request->{itemnumber} }->{itype} eq $request->{itemtype} ) ) ) |
561 |
|| ( $request->{itemnumber} && ( $items_by_itemnumber{ $request->{itemnumber} }->{itype} eq $request->{itemtype} ) ) ) |
| 534 |
) |
562 |
) |
|
Lines 550-557
sub MapItemsToHoldRequests {
Link Here
|
| 550 |
next unless $items_by_itemnumber{ $item->{itemnumber} }->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ); |
578 |
next unless $items_by_itemnumber{ $item->{itemnumber} }->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ); |
| 551 |
|
579 |
|
| 552 |
# Don't fill item level holds that contravene the hold pickup policy at this time |
580 |
# Don't fill item level holds that contravene the hold pickup policy at this time |
| 553 |
next unless $item->{hold_fulfillment_policy} eq 'any' |
581 |
next unless _checkHoldPolicy($item, $request); |
| 554 |
|| $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} }; |
|
|
| 555 |
|
582 |
|
| 556 |
# If hold itemtype is set, item's itemtype must match |
583 |
# If hold itemtype is set, item's itemtype must match |
| 557 |
next unless ( !$request->{itemtype} |
584 |
next unless ( !$request->{itemtype} |
|
Lines 583-589
sub MapItemsToHoldRequests {
Link Here
|
| 583 |
$holdingbranch ||= $branch; |
610 |
$holdingbranch ||= $branch; |
| 584 |
foreach my $item (@$holding_branch_items) { |
611 |
foreach my $item (@$holding_branch_items) { |
| 585 |
next if $pickup_branch ne $item->{homebranch}; |
612 |
next if $pickup_branch ne $item->{homebranch}; |
| 586 |
next if ( $item->{holdallowed} == 1 && $item->{homebranch} ne $request->{borrowerbranch} ); |
613 |
next unless _checkHoldPolicy($item, $request); |
| 587 |
next unless $items_by_itemnumber{ $item->{itemnumber} }->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ); |
614 |
next unless $items_by_itemnumber{ $item->{itemnumber} }->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ); |
| 588 |
|
615 |
|
| 589 |
# Don't fill item level holds that contravene the hold pickup policy at this time |
616 |
# Don't fill item level holds that contravene the hold pickup policy at this time |
|
Lines 601-623
sub MapItemsToHoldRequests {
Link Here
|
| 601 |
} |
628 |
} |
| 602 |
|
629 |
|
| 603 |
# Now try items from the least cost branch based on the transport cost matrix or StaticHoldsQueueWeight |
630 |
# Now try items from the least cost branch based on the transport cost matrix or StaticHoldsQueueWeight |
| 604 |
unless ( $itemnumber ) { |
631 |
unless ( $itemnumber || !$holdingbranch) { |
| 605 |
foreach my $current_item ( @{ $items_by_branch{$holdingbranch} } ) { |
632 |
foreach my $current_item ( @{ $items_by_branch{$holdingbranch} } ) { |
| 606 |
if ( $holdingbranch && ( $current_item->{holdallowed} == 2 || $request->{borrowerbranch} eq $current_item->{homebranch} ) ) { |
633 |
next unless _checkHoldPolicy($current_item, $request); # Don't fill item level holds that contravene the hold pickup policy at this time |
| 607 |
|
|
|
| 608 |
# Don't fill item level holds that contravene the hold pickup policy at this time |
| 609 |
next unless $current_item->{hold_fulfillment_policy} eq 'any' |
| 610 |
|| $request->{branchcode} eq $current_item->{ $current_item->{hold_fulfillment_policy} }; |
| 611 |
|
634 |
|
| 612 |
# If hold itemtype is set, item's itemtype must match |
635 |
# If hold itemtype is set, item's itemtype must match |
| 613 |
next unless ( !$request->{itemtype} |
636 |
next unless ( !$request->{itemtype} |
| 614 |
|| $current_item->{itype} eq $request->{itemtype} ); |
637 |
|| $current_item->{itype} eq $request->{itemtype} ); |
| 615 |
|
638 |
|
| 616 |
next unless $items_by_itemnumber{ $current_item->{itemnumber} }->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ); |
639 |
next unless $items_by_itemnumber{ $current_item->{itemnumber} }->{_object}->can_be_transferred( { to => $libraries->{ $request->{branchcode} } } ); |
| 617 |
|
640 |
|
| 618 |
$itemnumber = $current_item->{itemnumber}; |
641 |
$itemnumber = $current_item->{itemnumber}; |
| 619 |
last; # quit this loop as soon as we have a suitable item |
642 |
last; # quit this loop as soon as we have a suitable item |
| 620 |
} |
|
|
| 621 |
} |
643 |
} |
| 622 |
} |
644 |
} |
| 623 |
|
645 |
|
|
Lines 629-639
sub MapItemsToHoldRequests {
Link Here
|
| 629 |
or next; |
651 |
or next; |
| 630 |
|
652 |
|
| 631 |
foreach my $item (@$holding_branch_items) { |
653 |
foreach my $item (@$holding_branch_items) { |
| 632 |
next if ( $item->{holdallowed} == 1 && $item->{homebranch} ne $request->{borrowerbranch} ); |
|
|
| 633 |
|
| 634 |
# Don't fill item level holds that contravene the hold pickup policy at this time |
654 |
# Don't fill item level holds that contravene the hold pickup policy at this time |
| 635 |
next unless $item->{hold_fulfillment_policy} eq 'any' |
655 |
next unless _checkHoldPolicy($item, $request); |
| 636 |
|| $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} }; |
|
|
| 637 |
|
656 |
|
| 638 |
# If hold itemtype is set, item's itemtype must match |
657 |
# If hold itemtype is set, item's itemtype must match |
| 639 |
next unless ( !$request->{itemtype} |
658 |
next unless ( !$request->{itemtype} |
| 640 |
- |
|
|