View | Details | Raw Unified | Return to bug 27068
Collapse All | Expand All

(-)a/C4/HoldsQueue.pm (-32 / +50 lines)
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
                        || $items_by_itemnumber{ $request->{itemnumber} }->{itype} eq $request->{itemtype} )
561
                        || $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
- 

Return to bug 27068