@@ -, +, @@ item type or branch. --- a/Koha/CirculationRules.pm +++ a/Koha/CirculationRules.pm @@ -169,6 +169,9 @@ our $RULE_KINDS = { decreaseloanholds => { scope => [ 'branchcode', 'categorycode', 'itemtype' ], }, + holds_pickup_period => { + scope => [ 'branchcode', 'categorycode', 'itemtype' ], + }, # Not included (deprecated?): # * accountsent # * reservecharge --- a/Koha/Hold.pm +++ a/Koha/Hold.pm @@ -196,6 +196,18 @@ sub set_waiting { my $cancel_on_holidays = C4::Context->preference('ExpireReservesOnHolidays'); my $expirationdate = $today->clone; + + my $rule = Koha::CirculationRules->get_effective_rule({ + categorycode => $self->borrower->categorycode, + itemtype => $self->item->effective_itemtype, + branchcode => $self->branchcode, + rule_name => 'holds_pickup_period', + }); + if ( defined($rule) and $rule->rule_value ne '' ){ + # circulation rule overrides ReservesMaxPickUpDelay + $max_pickup_delay = $rule->rule_value; + } + $expirationdate->add(days => $max_pickup_delay); if ( C4::Context->preference("ExcludeHolidaysFromMaxPickUpDelay") ) { --- a/admin/smart-rules.pl +++ a/admin/smart-rules.pl @@ -290,6 +290,7 @@ elsif ($op eq 'add') { my $cap_fine_to_replacement_price = ($input->param('cap_fine_to_replacement_price') || '') eq 'on'; my $note = $input->param('note'); my $decreaseloanholds = $input->param('decreaseloanholds') || undef; + my $holds_pickup_period = strip_non_numeric($input->param('holds_pickup_period')); $debug and warn "Adding $br, $bor, $itemtype, $fine, $maxissueqty, $maxonsiteissueqty, $cap_fine_to_replacement_price"; my $rules = { @@ -325,6 +326,7 @@ elsif ($op eq 'add') { article_requests => $article_requests, note => $note, decreaseloanholds => $decreaseloanholds, + holds_pickup_period => $holds_pickup_period, }; Koha::CirculationRules->set_rules( --- a/installer/data/mysql/atomicupdate/bug_8367-add_holds_pickup_period_circrule.perl +++ a/installer/data/mysql/atomicupdate/bug_8367-add_holds_pickup_period_circrule.perl @@ -0,0 +1,6 @@ +$DBversion = 'XXX'; +if( CheckVersion( $DBversion ) ) { + $dbh->do(q{INSERT IGNORE INTO circulation_rules (branchcode, categorycode, itemtype, rule_name, rule_value) VALUES (NULL, NULL, NULL, 'holds_pickup_period', NULL) }); + + NewVersion( $DBversion, 8367, "Add holds_pickup_period circulation rule" ); +} --- a/installer/onboarding.pl +++ a/installer/onboarding.pl @@ -288,6 +288,7 @@ if ( $step == 5 ) { reservesallowed => $reservesallowed, suspension_chargeperiod => undef, decreaseloanholds => undef, + holds_pickup_period => undef, } }; --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt @@ -126,6 +126,7 @@ Holds per record (count) On shelf holds allowed OPAC item level holds + Holds pickup period (day) Article requests Rental discount (%) Actions @@ -169,8 +170,9 @@ [% SET article_requests = all_rules.$c.$i.article_requests %] [% SET rentaldiscount = all_rules.$c.$i.rentaldiscount %] [% SET decreaseloanholds = all_rules.$c.$i.decreaseloanholds %] + [% SET holds_pickup_period = all_rules.$c.$i.holds_pickup_period %] - [% SET show_rule = note || maxissueqty || maxonsiteissueqty || issuelength || daysmode || lengthunit || hardduedate || hardduedatecompare || fine || chargeperiod || chargeperiod_charge_at || firstremind || overduefinescap || cap_fine_to_replacement_price || finedays || maxsuspensiondays || suspension_chargeperiod || renewalsallowed || unseenrenewalsallowed || renewalperiod || norenewalbefore || auto_renew || no_auto_renewal_after || no_auto_renewal_after_hard_limit || reservesallowed || holds_per_day || holds_per_record || onshelfholds || opacitemholds || article_requests || rentaldiscount || decreaseloanholds %] + [% SET show_rule = note || maxissueqty || maxonsiteissueqty || issuelength || daysmode || lengthunit || hardduedate || hardduedatecompare || fine || chargeperiod || chargeperiod_charge_at || firstremind || overduefinescap || cap_fine_to_replacement_price || finedays || maxsuspensiondays || suspension_chargeperiod || renewalsallowed || unseenrenewalsallowed || renewalperiod || norenewalbefore || auto_renew || no_auto_renewal_after || no_auto_renewal_after_hard_limit || reservesallowed || holds_per_day || holds_per_record || onshelfholds || opacitemholds || article_requests || rentaldiscount || decreaseloanholds || holds_pickup_period %] [% IF show_rule %] [% SET row_count = row_count + 1 %] @@ -318,6 +320,7 @@ Don't allow [% END %] + [% holds_pickup_period | html %] [% IF article_requests == 'no' %] No @@ -450,6 +453,7 @@ +