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

(-)a/C4/Reserves.pm (-1 / +12 lines)
Lines 1188-1194 and canreservefromotherbranches. Link Here
1188
=cut
1188
=cut
1189
1189
1190
sub IsAvailableForItemLevelRequest {
1190
sub IsAvailableForItemLevelRequest {
1191
    my ( $item, $patron, $pickup_branchcode ) = @_;
1191
    my $item                = shift;
1192
    my $patron              = shift;
1193
    my $pickup_branchcode   = shift;
1194
    # items_any_available is precalculated status passed from request.pl when set of items
1195
    # looped outside of IsAvailableForItemLevelRequest to avoid nested loops:
1196
    my $items_any_available = shift;
1192
1197
1193
    my $dbh = C4::Context->dbh;
1198
    my $dbh = C4::Context->dbh;
1194
    # must check the notforloan setting of the itemtype
1199
    # must check the notforloan setting of the itemtype
Lines 1217-1222 sub IsAvailableForItemLevelRequest { Link Here
1217
    if ( $on_shelf_holds == 1 ) {
1222
    if ( $on_shelf_holds == 1 ) {
1218
        return 1;
1223
        return 1;
1219
    } elsif ( $on_shelf_holds == 2 ) {
1224
    } elsif ( $on_shelf_holds == 2 ) {
1225
1226
        # if we have this param predefined from outer caller sub, we just need
1227
        # to return it, so we saving from having loop inside other loop:
1228
        return  $items_any_available ? 0 : 1
1229
            if defined $items_any_available;
1230
            
1220
        my @items =
1231
        my @items =
1221
          Koha::Items->search( { biblionumber => $item->biblionumber } );
1232
          Koha::Items->search( { biblionumber => $item->biblionumber } );
1222
1233
(-)a/reserve/request.pl (-2 / +37 lines)
Lines 444-449 foreach my $biblionumber (@biblionumbers) { Link Here
444
                $itemtypes->{ $biblioitem->{itemtype} }{imageurl} );
444
                $itemtypes->{ $biblioitem->{itemtype} }{imageurl} );
445
        }
445
        }
446
446
447
        # iterating through all items first to check if any of them available
448
        # to pass this value further inside down to IsAvailableForItemLevelRequest to
449
        # it's complicated logic to analyse.
450
        # (before this loop was inside that sub loop so it was O(n^2) )
451
        my $items_any_available;
452
453
        $items_any_available = items_any_available($biblioitemnumber)
454
            if $patron;
455
447
        foreach my $itemnumber ( @{ $itemnumbers_of_biblioitem{$biblioitemnumber} } )    {
456
        foreach my $itemnumber ( @{ $itemnumbers_of_biblioitem{$biblioitemnumber} } )    {
448
            my $item = $iteminfos_of->{$itemnumber};
457
            my $item = $iteminfos_of->{$itemnumber};
449
            my $do_check;
458
            my $do_check;
Lines 557-563 foreach my $biblionumber (@biblionumbers) { Link Here
557
                       !$item->{cantreserve}
566
                       !$item->{cantreserve}
558
                    && !$exceeded_maxreserves
567
                    && !$exceeded_maxreserves
559
                    && $can_item_be_reserved eq 'OK'
568
                    && $can_item_be_reserved eq 'OK'
560
                    && IsAvailableForItemLevelRequest($item_object, $patron)
569
                    # items_any_available defined outside of the current loop,
570
                    # so we avoiding loop inside IsAvailableForItemLevelRequest:
571
                    && IsAvailableForItemLevelRequest($item_object, $patron, undef, $items_any_available)
561
                  )
572
                  )
562
                {
573
                {
563
                    $item->{available} = 1;
574
                    $item->{available} = 1;
Lines 745-747 sub sort_borrowerlist { Link Here
745
    } @{$borrowerslist};
756
    } @{$borrowerslist};
746
    return $ref;
757
    return $ref;
747
}
758
}
748
- 
759
760
sub items_any_available {
761
    my $biblioitemnumber = shift;
762
	my $items_any_available = 0;
763
764
    my @items = Koha::Items->search( { biblionumber => $biblioitemnumber } );
765
766
    foreach my $i (@items) {
767
        my $reserves_control_branch = GetReservesControlBranch( $i->unblessed(), $patron->unblessed );
768
        my $branchitemrule = C4::Circulation::GetBranchItemRule( $reserves_control_branch, $i->itype );
769
770
        $items_any_available = 1
771
          unless $i->itemlost
772
          || $i->notforloan > 0
773
          || $i->withdrawn
774
          || $i->onloan
775
          || IsItemOnHoldAndFound( $i->id )
776
          || ( $i->damaged
777
            && !C4::Context->preference('AllowHoldsOnDamagedItems') )
778
          || Koha::ItemTypes->find( $i->effective_itemtype() )->notforloan
779
          || $branchitemrule->{holdallowed} == 1 && $patron->branchcode ne $i->homebranch;
780
    }
781
782
    return $items_any_available;
783
}

Return to bug 24185