@@ -, +, @@ item type or branch. --- Koha/CirculationRules.pm | 3 + Koha/Hold.pm | 12 ++++ admin/smart-rules.pl | 2 + .../bug_8367-add_holds_pickup_period_circrule.perl | 6 ++ installer/onboarding.pl | 1 + .../prog/en/modules/admin/smart-rules.tt | 7 ++- .../thirdparty/TalkingTech_itiva_outbound.pl | 12 ++++ t/db_dependent/Holds/WaitingReserves.t | 68 +++++++++++++++++++++- 8 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 installer/data/mysql/atomicupdate/bug_8367-add_holds_pickup_period_circrule.perl --- a/Koha/CirculationRules.pm +++ a/Koha/CirculationRules.pm @@ -163,6 +163,9 @@ our $RULE_KINDS = { note => { # This is not really a rule. Maybe we will want to separate this later. scope => [ 'branchcode', 'categorycode', 'itemtype' ], }, + holds_pickup_period => { + scope => [ 'branchcode', 'categorycode', 'itemtype' ], + }, # Not included (deprecated?): # * accountsent # * reservecharge --- a/Koha/Hold.pm +++ a/Koha/Hold.pm @@ -194,6 +194,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 @@ -287,6 +287,7 @@ elsif ($op eq 'add') { my $overduefinescap = $input->param('overduefinescap') || ''; my $cap_fine_to_replacement_price = ($input->param('cap_fine_to_replacement_price') || '') eq 'on'; my $note = $input->param('note'); + 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 = { @@ -320,6 +321,7 @@ elsif ($op eq 'add') { cap_fine_to_replacement_price => $cap_fine_to_replacement_price, article_requests => $article_requests, note => $note, + 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 @@ -287,6 +287,7 @@ if ( $step == 5 ) { rentaldiscount => 0, reservesallowed => $reservesallowed, suspension_chargeperiod => 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 @@ -122,6 +122,7 @@ Holds per record (count) On shelf holds allowed OPAC item level holds + Holds pickup period (day) Article requests Rental discount (%) Actions @@ -161,10 +162,11 @@ [% SET holds_per_record = all_rules.$c.$i.holds_per_record %] [% SET onshelfholds = all_rules.$c.$i.onshelfholds %] [% SET opacitemholds = all_rules.$c.$i.opacitemholds %] + [% SET holds_pickup_period = all_rules.$c.$i.holds_pickup_period %] [% SET article_requests = all_rules.$c.$i.article_requests %] [% SET rentaldiscount = all_rules.$c.$i.rentaldiscount %] - [% 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 || 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 %] + [% 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 || 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 || holds_pickup_period %] [% IF show_rule %] [% SET row_count = row_count + 1 %] @@ -308,6 +310,7 @@ Don't allow [% END %] + [% holds_pickup_period | html %] [% IF article_requests == 'no' %] No @@ -436,6 +439,7 @@ +