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

(-)a/C4/Circulation.pm (-67 / +85 lines)
Lines 2529-2534 sub GetBiblioIssues { Link Here
2529
    return \@issues;
2529
    return \@issues;
2530
}
2530
}
2531
2531
2532
2533
=head2 IsItemAvailableForCheckout
2534
2535
  $available = ($itemnumber);
2536
2537
Find out whether an item doesn't have any holds, item level or more
2538
biblio level holds than there are available items.
2539
2540
C<$itemnumber> is the number of the item to check the availability for.
2541
2542
=cut
2543
sub IsItemAvailableForCheckout {
2544
    my ($itemnumber) = @_;
2545
    my ( $resfound, $resrec, undef ) = C4::Reserves::CheckReserves($itemnumber);
2546
2547
    # This item can fill one or more unfilled reserve, can those unfilled reserves
2548
    # all be filled by other available items?
2549
    if ( $resfound )
2550
    {
2551
        my $schema = Koha::Database->new()->schema();
2552
2553
        my $item_holds = $schema->resultset('Reserve')->search( { itemnumber => $itemnumber, found => undef } )->count();
2554
        if ($item_holds) {
2555
            # There is an item level hold on this item, no other item can fill the hold
2556
            $resfound = 1;
2557
        }
2558
        else {
2559
2560
            # Get all other items that could possibly fill reserves
2561
            my @itemnumbers = $schema->resultset('Item')->search(
2562
                {
2563
                    biblionumber => $resrec->{biblionumber},
2564
                    onloan       => undef,
2565
                    notforloan   => 0,
2566
                    -not         => { itemnumber => $itemnumber }
2567
                },
2568
                { columns => 'itemnumber' }
2569
            )->get_column('itemnumber')->all();
2570
2571
            # Get all other reserves that could have been filled by this item
2572
            my @borrowernumbers;
2573
            while (1) {
2574
                my ( $reserve_found, $reserve, undef ) =
2575
                  C4::Reserves::CheckReserves( $itemnumber, undef, undef, \@borrowernumbers );
2576
2577
                if ($reserve_found) {
2578
                    push( @borrowernumbers, $reserve->{borrowernumber} );
2579
                }
2580
                else {
2581
                    last;
2582
                }
2583
            }
2584
2585
            # If the count of the union of the lists of reservable items for each borrower
2586
            # is equal or greater than the number of borrowers, we know that all reserves
2587
            # can be filled with available items. We can get the union of the sets simply
2588
            # by pushing all the elements onto an array and removing the duplicates.
2589
            my @reservable;
2590
            my %borrowers;
2591
            ITEM: foreach my $i (@itemnumbers) {
2592
                my $item = GetItem($i);
2593
                next if IsItemOnHoldAndFound($i);
2594
                for my $b (@borrowernumbers) {
2595
                    my $borr = $borrowers{$b} //= Koha::Patrons->find( $b )->unblessed;
2596
                    next unless IsAvailableForItemLevelRequest($item, $borr);
2597
                    next unless CanItemBeReserved($b,$i);
2598
2599
                    push @reservable, $i;
2600
                    if (@reservable >= @borrowernumbers) {
2601
                        $resfound = 0;
2602
                        last ITEM;
2603
                    }
2604
                    last;
2605
                }
2606
            }
2607
        }
2608
    }
2609
2610
    return !$resfound;
2611
}
2612
2613
2532
=head2 GetUpcomingDueIssues
2614
=head2 GetUpcomingDueIssues
2533
2615
2534
  my $upcoming_dues = GetUpcomingDueIssues( { days_in_advance => 4 } );
2616
  my $upcoming_dues = GetUpcomingDueIssues( { days_in_advance => 4 } );
Lines 2600-2671 sub CanBookBeRenewed { Link Here
2600
    my $patron = Koha::Patrons->find( $borrowernumber )
2682
    my $patron = Koha::Patrons->find( $borrowernumber )
2601
      or return;
2683
      or return;
2602
2684
2603
    my ( $resfound, $resrec, undef ) = C4::Reserves::CheckReserves($itemnumber);
2685
    my ( $resfound, undef, undef ) = C4::Reserves::CheckReserves($itemnumber);
2604
2686
    return ( 0, "on_reserve" ) if !C4::Context->preference('AllowRenewalIfOtherItemsAvailable') && $resfound;
2605
    # This item can fill one or more unfilled reserve, can those unfilled reserves
2687
    return ( 0, "on_reserve" ) if !IsItemAvailableForCheckout($itemnumber);
2606
    # all be filled by other available items?
2607
    if ( $resfound
2608
        && C4::Context->preference('AllowRenewalIfOtherItemsAvailable') )
2609
    {
2610
        my $schema = Koha::Database->new()->schema();
2611
2612
        my $item_holds = $schema->resultset('Reserve')->search( { itemnumber => $itemnumber, found => undef } )->count();
2613
        if ($item_holds) {
2614
            # There is an item level hold on this item, no other item can fill the hold
2615
            $resfound = 1;
2616
        }
2617
        else {
2618
2619
            # Get all other items that could possibly fill reserves
2620
            my @itemnumbers = $schema->resultset('Item')->search(
2621
                {
2622
                    biblionumber => $resrec->{biblionumber},
2623
                    onloan       => undef,
2624
                    notforloan   => 0,
2625
                    -not         => { itemnumber => $itemnumber }
2626
                },
2627
                { columns => 'itemnumber' }
2628
            )->get_column('itemnumber')->all();
2629
2630
            # Get all other reserves that could have been filled by this item
2631
            my @borrowernumbers;
2632
            while (1) {
2633
                my ( $reserve_found, $reserve, undef ) =
2634
                  C4::Reserves::CheckReserves( $itemnumber, undef, undef, \@borrowernumbers );
2635
2636
                if ($reserve_found) {
2637
                    push( @borrowernumbers, $reserve->{borrowernumber} );
2638
                }
2639
                else {
2640
                    last;
2641
                }
2642
            }
2643
2644
            # If the count of the union of the lists of reservable items for each borrower
2645
            # is equal or greater than the number of borrowers, we know that all reserves
2646
            # can be filled with available items. We can get the union of the sets simply
2647
            # by pushing all the elements onto an array and removing the duplicates.
2648
            my @reservable;
2649
            my %borrowers;
2650
            ITEM: foreach my $i (@itemnumbers) {
2651
                my $item = GetItem($i);
2652
                next if IsItemOnHoldAndFound($i);
2653
                for my $b (@borrowernumbers) {
2654
                    my $borr = $borrowers{$b} //= Koha::Patrons->find( $b )->unblessed;
2655
                    next unless IsAvailableForItemLevelRequest($item, $borr);
2656
                    next unless CanItemBeReserved($b,$i);
2657
2658
                    push @reservable, $i;
2659
                    if (@reservable >= @borrowernumbers) {
2660
                        $resfound = 0;
2661
                        last ITEM;
2662
                    }
2663
                    last;
2664
                }
2665
            }
2666
        }
2667
    }
2668
    return ( 0, "on_reserve" ) if $resfound;    # '' when no hold was found
2669
2688
2670
    return ( 1, undef ) if $override_limit;
2689
    return ( 1, undef ) if $override_limit;
2671
2690
2672
- 

Return to bug 21373