From 7f1b4cd8fa28ee2c09e5f95dffed7073f854a815 Mon Sep 17 00:00:00 2001 From: Lucas Gass Date: Tue, 3 Jun 2025 23:19:10 +0000 Subject: [PATCH] Bug 28530: Use DBIC query and return library object --- C4/Circulation.pm | 6 +-- Koha/Library/FloatLimits.pm | 76 ++++++++++++++++++++++++++----------- 2 files changed, 57 insertions(+), 25 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 0b2d2adad20..d6f86c7e276 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -2272,9 +2272,9 @@ sub AddReturn { if ($limit) { my $count = Koha::Items->count( { itype => $limit->itemtype, holdingbranch => $branch } ); if ( $count >= $limit->float_limit ) { - my $transfer_branchcode = Koha::Library::FloatLimits->lowest_ratio_library( $item, $branch ); - if ( $transfer_branchcode ne $branch ) { - $returnbranch = $transfer_branchcode; + my $transfer_library = Koha::Library::FloatLimits->lowest_ratio_library( $item, $branch ); + if ( $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 5697b38b1c5..611b9eb4437 100644 --- a/Koha/Library/FloatLimits.pm +++ b/Koha/Library/FloatLimits.pm @@ -24,6 +24,7 @@ use Modern::Perl; use Koha::Database; use Koha::Library::FloatLimit; +use Koha::Libraries; use C4::Circulation qw(IsBranchTransferAllowed); use base qw(Koha::Objects); @@ -43,40 +44,71 @@ Koha::Library::FloatLimits - Koha Library::FloatLimit object set class sub lowest_ratio_library { my ( $self, $item, $branchcode ) = @_; - my $field = C4::Context->preference('item-level_itypes') ? 'items.itype' : 'biblioitems.itemtype'; - my $query = qq{ - SELECT branchcode - FROM library_float_limits - LEFT JOIN items ON ( items.itype = library_float_limits.itemtype AND items.holdingbranch = library_float_limits.branchcode ) - LEFT JOIN biblioitems ON ( items.biblioitemnumber = biblioitems.biblioitemnumber ) - WHERE library_float_limits.itemtype = ? - AND ( $field = ? OR $field IS NULL ) - AND library_float_limits.float_limit != 0 - GROUP BY branchcode - ORDER BY COUNT(items.holdingbranch)/library_float_limits.float_limit ASC, library_float_limits.float_limit DESC; - }; - - my $results = C4::Context->dbh->selectall_arrayref( - $query, { Slice => {} }, $item->effective_itemtype, - $item->effective_itemtype - ); + my $schema = Koha::Database->new->schema; + + my @float_limits = $schema->resultset('LibraryFloatLimit')->search( + { + itemtype => $item->effective_itemtype, + float_limit => { '!=' => 0 } + } + )->all; + + return unless @float_limits; + + my @candidates; + my $use_item_level = C4::Context->preference('item-level_itypes'); + + foreach my $limit (@float_limits) { + my $branch = $limit->get_column('branchcode'); + my $float_limit_val = $limit->get_column('float_limit'); + + my $item_count; + + if ($use_item_level) { + $item_count = Koha::Items->search( + { + itype => $item->effective_itemtype, + holdingbranch => $branch + } + )->count; + } else { + $item_count = Koha::Items->search( + { + holdingbranch => $branch, + 'biblioitem.itemtype' => $item->effective_itemtype + }, + { join => 'biblioitem' } + )->count; + } + + my $ratio = $item_count / $float_limit_val; + push @candidates, { + branchcode => $branch, + ratio => $ratio, + float_limit => $float_limit_val + }; + } + + @candidates = sort { $a->{ratio} <=> $b->{ratio} || $b->{float_limit} <=> $a->{float_limit} } @candidates; my $UseBranchTransferLimits = C4::Context->preference("UseBranchTransferLimits"); my $BranchTransferLimitsType = C4::Context->preference("BranchTransferLimitsType") eq 'itemtype' ? 'effective_itemtype' : 'ccode'; - foreach my $r (@$results) { + for my $candidate (@candidates) { if ($UseBranchTransferLimits) { my $allowed = C4::Circulation::IsBranchTransferAllowed( - $r->{branchcode}, # to - $branchcode, # from + $candidate->{branchcode}, + $branchcode, $item->$BranchTransferLimitsType ); - return $r->{branchcode} if $allowed; + return Koha::Libraries->find( $candidate->{branchcode} ) if $allowed; } else { - return $r->{branchcode}; + return Koha::Libraries->find( $candidate->{branchcode} ); } } + + return; } =head3 _type -- 2.39.5