@@ -, +, @@ system by patron category in the "Checkout limit by patron category". ( Should we rename this section? ) number of holds that patron has. Lets make that number 'X'. --- C4/Reserves.pm | 28 ++++++++ admin/smart-rules.pl | 48 ++++++++++++-- .../prog/en/modules/admin/smart-rules.tt | 9 +++ t/db_dependent/Holds.t | 76 +++++++++++++++++++++- 4 files changed, 156 insertions(+), 5 deletions(-) --- a/C4/Reserves.pm +++ a/C4/Reserves.pm @@ -48,6 +48,7 @@ use Koha::IssuingRules; use Koha::Items; use Koha::ItemTypes; use Koha::Patrons; +use Koha::CirculationRules; use List::MoreUtils qw( firstidx any ); use Carp; @@ -398,6 +399,33 @@ sub CanItemBeReserved { return 'tooManyReserves'; } + # Now we need to check hold limits by patron category + my $rule = Koha::CirculationRules->find( + { + categorycode => $borrower->{categorycode}, + branchcode => $borrower->{branchcode}, + itemtype => undef, + rule_name => 'max_holds', + } + ); + $rule ||= Koha::CirculationRules->find( + { + categorycode => $borrower->{categorycode}, + branchcode => undef,, + itemtype => undef, + rule_name => 'max_holds', + } + ); + if ( $rule ) { + my $total_holds_count = Koha::Holds->search( + { + borrowernumber => $borrower->{borrowernumber} + } + )->count(); + + return 'tooManyReserves' if $total_holds_count >= $rule->rule_value; + } + my $circ_control_branch = C4::Circulation::_GetCircControlBranch( $item->unblessed(), $borrower ); my $branchitemrule = --- a/admin/smart-rules.pl +++ a/admin/smart-rules.pl @@ -32,6 +32,7 @@ use Koha::Logger; use Koha::RefundLostItemFeeRule; use Koha::RefundLostItemFeeRules; use Koha::Libraries; +use Koha::CirculationRules; use Koha::Patron::Categories; my $input = CGI->new; @@ -93,6 +94,15 @@ elsif ($op eq 'delete-branch-cat') { AND categorycode = ?"); $sth_delete->execute($branch, $categorycode); } + Koha::CirculationRules->set_rule( + { + branchcode => $branch, + categorycode => $categorycode, + itemtype => undef, + rule_name => 'max_holds', + rule_value => undef, + } + ); } elsif ($op eq 'delete-branch-item') { my $itemtype = $input->param('itemtype'); @@ -277,10 +287,20 @@ elsif ($op eq "add-branch-cat") { $sth_search->execute(); my $res = $sth_search->fetchrow_hashref(); if ($res->{total}) { - $sth_update->execute($maxissueqty, $maxonsiteissueqty); + $sth_update->execute( $maxissueqty, $maxonsiteissueqty ); } else { - $sth_insert->execute($maxissueqty, $maxonsiteissueqty); + $sth_insert->execute( $maxissueqty, $maxonsiteissueqty ); } + + Koha::CirculationRules->set_rule( + { + branchcode => undef, + categorycode => undef, + itemtype => undef, + rule_name => 'max_holds', + rule_value => $max_holds, + } + ); } else { my $sth_search = $dbh->prepare("SELECT count(*) AS total FROM default_borrower_circ_rules @@ -299,10 +319,20 @@ elsif ($op eq "add-branch-cat") { $sth_search->execute($categorycode); my $res = $sth_search->fetchrow_hashref(); if ($res->{total}) { - $sth_update->execute($maxissueqty, $maxonsiteissueqty, $categorycode); + $sth_update->execute( $maxissueqty, $maxonsiteissueqty, $categorycode ); } else { - $sth_insert->execute($categorycode, $maxissueqty, $maxonsiteissueqty); + $sth_insert->execute( $categorycode, $maxissueqty, $maxonsiteissueqty ); } + + Koha::CirculationRules->set_rule( + { + branchcode => undef, + categorycode => $categorycode, + itemtype => undef, + rule_name => 'max_holds', + rule_value => $max_holds, + } + ); } } elsif ($categorycode eq "*") { my $sth_search = $dbh->prepare("SELECT count(*) AS total @@ -351,6 +381,16 @@ elsif ($op eq "add-branch-cat") { } else { $sth_insert->execute($branch, $categorycode, $maxissueqty, $maxonsiteissueqty); } + + Koha::CirculationRules->set_rule( + { + branchcode => $branch, + categorycode => $categorycode, + itemtype => undef, + rule_name => 'max_holds', + rule_value => $max_holds, + } + ); } } elsif ($op eq "add-branch-item") { --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt @@ -1,4 +1,5 @@ [% USE Branches %] +[% USE CirculationRules %] [% SET footerjs = 1 %] [% INCLUDE 'doc-head-open.inc' %]