@@ -, +, @@ --- C4/Circulation.pm | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) --- a/C4/Circulation.pm +++ a/C4/Circulation.pm @@ -2679,24 +2679,23 @@ sub CanBookBeRenewed : PureFunction { # can be filled with available items. We can get the union of the sets simply # by pushing all the elements onto an array and removing the duplicates. my @reservable; - foreach my $b (@borrowernumbers) { - my ($borr) = C4::Members::GetMember( borrowernumber => $b); - foreach my $i (@itemnumbers) { - my $item = GetItem($i); - if ( !IsItemOnHoldAndFound($i) - && IsAvailableForItemLevelRequest( $item, $borr ) - && CanItemBeReserved( $b, $i ) ) - { - push( @reservable, $i ); + my %borrowers; + ITEM: foreach my $i (@itemnumbers) { + my $item = GetItem($i); + next if IsItemOnHoldAndFound($i); + for my $b (@borrowernumbers) { + my $borr = $borrowers{$b}//= C4::Members::GetMember(borrowernumber => $_); + next unless IsAvailableForItemLevelRequest($item, $borr); + next unless CanItemBeReserved($b,$i); + + push @reservable; + if (@reservable >= @borrowernumbers) { + $resfound = 0; + last ITEM; } + last; } } - - @reservable = uniq(@reservable); - - if ( @reservable >= @borrowernumbers ) { - $resfound = 0; - } } } return ( 0, "on_reserve" ) if $resfound; # '' when no hold was found --