From 6a65ba4b595e24b3989c0c855f29b54b55b7706d Mon Sep 17 00:00:00 2001 From: Lucas Gass Date: Thu, 31 Jul 2025 15:51:09 +0000 Subject: [PATCH] Bug 28530: Fix sorting and pick a random branch in the event of a tie --- C4/Circulation.pm | 11 ++++------- Koha/Library/FloatLimits.pm | 24 +++++++++++------------ t/db_dependent/Koha/Library/FloatLimits.t | 8 +------- 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 145f7b222bd..a8ee46ad748 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -2278,13 +2278,10 @@ sub AddReturn { my $effective_itemtype = $item->effective_itemtype; my $limit = Koha::Library::FloatLimits->find( { itemtype => $effective_itemtype, branchcode => $branch } ); if ($limit) { - my $count = Koha::Items->count( { itype => $limit->itemtype, holdingbranch => $branch } ); - if ( $count >= $limit->float_limit ) { - my $transfer_library = Koha::Library::FloatLimits->lowest_ratio_library( $item, $branch ); - if ( $transfer_library && $transfer_library->branchcode ne $branch ) { - $returnbranch = $transfer_library->branchcode; - $transfer_trigger = 'LibraryFloatLimit'; - } + my $transfer_library = Koha::Library::FloatLimits->lowest_ratio_library( $item, $branch ); + if ( $transfer_library && $transfer_library->branchcode ne $branch ) { + $returnbranch = $transfer_library->branchcode; + $transfer_trigger = 'LibraryFloatLimit'; } } } diff --git a/Koha/Library/FloatLimits.pm b/Koha/Library/FloatLimits.pm index db611314f18..189c67d6cfe 100644 --- a/Koha/Library/FloatLimits.pm +++ b/Koha/Library/FloatLimits.pm @@ -60,9 +60,6 @@ sub lowest_ratio_library { my $branch = $limit->get_column('branchcode'); my $float_limit_val = $limit->get_column('float_limit'); - #don't try to transfer something to where it already is - next if $branch eq $branchcode; - my $item_count; if ($use_item_level) { @@ -98,8 +95,8 @@ sub lowest_ratio_library { join => 'branchtransfers', where => { 'branchtransfers.frombranch' => $branch, - 'branchtransfers.datearrived' => undef, - 'branchtransfers.datecancelled' => undef, + 'branchtransfers.datearrived' => undef, # Still in transit + 'branchtransfers.datecancelled' => undef, #Not cancelled }, distinct => 1 } @@ -147,10 +144,8 @@ sub lowest_ratio_library { $item_count = $at_branch_count + $in_transit_to_count - $in_transit_from_count; } - #don't transfer to branches that are already at their float limit - next if $item_count >= $float_limit_val; - my $ratio = $item_count / $float_limit_val; + push @candidates, { branchcode => $branch, ratio => $ratio, @@ -158,12 +153,14 @@ sub lowest_ratio_library { }; } - @candidates = sort { $a->{ratio} <=> $b->{ratio} || $b->{float_limit} <=> $a->{float_limit} } @candidates; + # sort the branches by lowest ratio in the event of a tie choose a random branch + @candidates = sort { $a->{ratio} <=> $b->{ratio} || rand() <=> rand() } @candidates; my $UseBranchTransferLimits = C4::Context->preference("UseBranchTransferLimits"); my $BranchTransferLimitsType = C4::Context->preference("BranchTransferLimitsType") eq 'itemtype' ? 'effective_itemtype' : 'ccode'; + my $transfer_branch; for my $candidate (@candidates) { if ($UseBranchTransferLimits) { my $allowed = C4::Circulation::IsBranchTransferAllowed( @@ -171,12 +168,15 @@ sub lowest_ratio_library { $branchcode, $item->$BranchTransferLimitsType ); - return Koha::Libraries->find( $candidate->{branchcode} ) if $allowed; + $transfer_branch = Koha::Libraries->find( $candidate->{branchcode} ) if $allowed; + last; } else { - return Koha::Libraries->find( $candidate->{branchcode} ); + $transfer_branch = Koha::Libraries->find( $candidate->{branchcode} ); + last; } } - return; + + return $transfer_branch; } =head3 _type diff --git a/t/db_dependent/Koha/Library/FloatLimits.t b/t/db_dependent/Koha/Library/FloatLimits.t index edc59fd7646..7881130b92c 100755 --- a/t/db_dependent/Koha/Library/FloatLimits.t +++ b/t/db_dependent/Koha/Library/FloatLimits.t @@ -19,7 +19,7 @@ use Modern::Perl; -use Test::More tests => 7; +use Test::More tests => 6; use Koha::Database; use C4::Circulation qw(CreateBranchTransferLimit); @@ -127,12 +127,6 @@ CreateBranchTransferLimit( $to, $from, $code ); is( C4::Circulation::IsBranchTransferAllowed( $to, $from, $code ), 0, "Transfer to best library is no longer allowed" ); say "C4::Circulation::IsBranchTransferAllowed( $to, $from, $code )"; -is( - Koha::Library::FloatLimits->lowest_ratio_library( $item, $library1->{branchcode} )->branchcode, - $library2->{branchcode}, - "Correct library selected for float limit transfer when best cannot be used" -); - subtest 'onloan items excluded from ratio calculation' => sub { plan tests => 5; -- 2.39.5