From d8ce31ba0673c4a38a29c3bfa5dbaa9383ec5ad5 Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Mon, 18 Dec 2023 14:21:57 -0500 Subject: [PATCH] Bug 28530: Implement float limits Test Plan: 1) Apply this patch set 2) Run updatedatabase.pl 3) Restart all the things! 4) Enable UseLibraryFloatLimits 5) Verify items float correctly as per your circulation rules 6) Set some float limits from the Library Float Limits configuration page in the Administration section The simplest solution is to set the float limit from one branch to 1 item, a second to 100 items, and a third to 300 items for a single itemtype 7) Verify checked in items that should have floated at this branch are now transfered to the branch with the best float ratio Signed-off-by: Andrew Fuerste-Henry Signed-off-by: Kris Becker --- C4/Circulation.pm | 17 +++++++++++++++++ circ/returns.pl | 17 +++++++++++++++-- .../prog/en/modules/admin/admin-home.tt | 2 ++ .../prog/en/modules/circ/returns.tt | 2 ++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 31794b7c02f..1fb607944e5 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -51,6 +51,7 @@ use Koha::Patrons; use Koha::Patron::Debarments qw( DelUniqueDebarment AddUniqueDebarment ); use Koha::Database; use Koha::Libraries; +use Koha::Library::FloatLimits; use Koha::Account::Lines; use Koha::Holds; use Koha::Account::Lines; @@ -2247,6 +2248,22 @@ sub AddReturn { # if $hbr was "noreturn" or any other non-item table value, then it should 'float' (i.e. stay at this branch) my $transfer_trigger = $hbr eq 'homebranch' ? 'ReturnToHome' : $hbr eq 'holdingbranch' ? 'ReturnToHolding' : undef; + # check library float limits if enabled if the item isn't being transferred away + if ( ( $returnbranch eq $branch ) && C4::Context->preference('UseLibraryFloatLimits') ) { + 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 } ); + if ( $count >= $limit->float_limit ) { + my $transfer_branchcode = Koha::Library::FloatLimits->lowest_ratio_library( $item, $branch ); + if ( $transfer_branchcode ne $branch ) { + $returnbranch = $transfer_branchcode; + $transfer_trigger = 'LibraryFloatLimit'; + } + } + } + } + my $borrowernumber = $patron ? $patron->borrowernumber : undef; # we don't know if we had a borrower or not my $patron_unblessed = $patron ? $patron->unblessed : {}; diff --git a/circ/returns.pl b/circ/returns.pl index c9c89593a82..dca1c3a4594 100755 --- a/circ/returns.pl +++ b/circ/returns.pl @@ -303,7 +303,6 @@ if ( $barcode && ( $op eq 'cud-checkin' || $op eq 'cud-affect_reserve' ) ) { my $biblio = $item->biblio; $template->param( title => $biblio->title, - returnbranch => $returnbranch, author => $biblio->author, itembiblionumber => $biblio->biblionumber, biblionumber => $biblio->biblionumber, @@ -413,6 +412,8 @@ if ( $barcode && ( $op eq 'cud-checkin' || $op eq 'cud-affect_reserve' ) ) { ); } + $returnbranch = $messages->{NeedsTransfer} if $messages->{NeedsTransfer}; + # Mark missing bundle items as lost and report unexpected items if ( $item && $item->is_bundle @@ -509,6 +510,13 @@ my $recalled = 0; # new op dev : we check if the document must be returned to his homebranch directly, # if the document is transferred, we have warning message . +if ( $messages->{'LibraryFloatLimitTransferRequest'} ) { + $template->param( + LibraryFloatLimitTransferRequest => 1, + itemnumber => $itemnumber, + ); +} + if ( $messages->{'WasTransfered'} ) { $template->param( found => 1, @@ -732,6 +740,8 @@ foreach my $code ( keys %$messages ) { ; } elsif ( $code eq 'TransferredRecall' ) { ; + } elsif ( $code eq 'LibraryFloatLimitTransferRequest' ) { + ; } elsif ( $code eq 'InBundle' ) { $template->param( InBundle => $messages->{InBundle} ); } else { @@ -808,7 +818,10 @@ if ($barcode) { } } -$template->param( itemnumber => $itemnumber ); +$template->param( + itemnumber => $itemnumber, + returnbranch => $returnbranch, +); # Checking if there is a Fast Cataloging Framework $template->param( fast_cataloging => 1 ) if Koha::BiblioFrameworks->find('FA'); diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt index a8813575fa2..993178cd290 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt @@ -108,6 +108,8 @@ >
Transport cost matrix
Define transport costs between branches
+
Library float limits
+
Define when items should be transferred to other libraries on checkin to balance floating collections
[% END %] [% IF ( CAN_user_parameters_manage_item_circ_alerts ) %]
Item circulation alerts
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt index d2b1f676784..650b13f2b79 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt @@ -119,6 +119,8 @@

[%- SWITCH trigger -%] + [%- CASE 'LibraryFloatLimit' -%] + Library has exceeded float limit for this item type [%- CASE 'Manual' -%] Manual [%- CASE 'StockrotationAdvance' -%] -- 2.39.5