diff --git a/Koha/CirculationRules.pm b/Koha/CirculationRules.pm
index 6f76053ae7..1d07476875 100644
--- a/Koha/CirculationRules.pm
+++ b/Koha/CirculationRules.pm
@@ -213,6 +213,9 @@ our $RULE_KINDS = {
recall_shelf_time => {
scope => [ 'branchcode', 'categorycode', 'itemtype' ],
},
+ holds_pickup_period => {
+ scope => [ 'branchcode', 'categorycode', 'itemtype' ],
+ },
# Not included (deprecated?):
# * accountsent
# * reservecharge
diff --git a/Koha/Hold.pm b/Koha/Hold.pm
index 1a1a859bca..b13892dc6c 100644
--- a/Koha/Hold.pm
+++ b/Koha/Hold.pm
@@ -233,6 +233,17 @@ sub set_waiting {
my $new_expiration_date = dt_from_string($self->waitingdate)->clone->add( days => $max_pickup_delay );
+ 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;
+ }
+
if ( C4::Context->preference("ExcludeHolidaysFromMaxPickUpDelay") ) {
my $itemtype = $self->item ? $self->item->effective_itemtype : $self->biblio->itemtype;
my $daysmode = Koha::CirculationRules->get_effective_daysmode(
diff --git a/admin/smart-rules.pl b/admin/smart-rules.pl
index 499d7e8e5a..49ae398613 100755
--- a/admin/smart-rules.pl
+++ b/admin/smart-rules.pl
@@ -298,47 +298,46 @@ elsif ($op eq 'add') {
my $recall_due_date_interval = $input->param('recall_due_date_interval');
my $recall_overdue_fine = $input->param('recall_overdue_fine');
my $recall_shelf_time = $input->param('recall_shelf_time');
+ my $holds_pickup_period = strip_non_numeric($input->param('holds_pickup_period'));
my $rules = {
- maxissueqty => $maxissueqty,
- maxonsiteissueqty => $maxonsiteissueqty,
- rentaldiscount => $rentaldiscount,
- fine => $fine,
- finedays => $finedays,
- maxsuspensiondays => $maxsuspensiondays,
- suspension_chargeperiod => $suspension_chargeperiod,
- firstremind => $firstremind,
- chargeperiod => $chargeperiod,
- chargeperiod_charge_at => $chargeperiod_charge_at,
- issuelength => $issuelength,
- daysmode => $daysmode,
- lengthunit => $lengthunit,
- hardduedate => $hardduedate,
- hardduedatecompare => $hardduedatecompare,
- renewalsallowed => $renewalsallowed,
- unseen_renewals_allowed => $unseen_renewals_allowed,
- renewalperiod => $renewalperiod,
- norenewalbefore => $norenewalbefore,
- noautorenewalbefore => $noautorenewalbefore,
- auto_renew => $auto_renew,
- no_auto_renewal_after => $no_auto_renewal_after,
- no_auto_renewal_after_hard_limit => $no_auto_renewal_after_hard_limit,
- reservesallowed => $reservesallowed,
- holds_per_record => $holds_per_record,
- holds_per_day => $holds_per_day,
- onshelfholds => $onshelfholds,
- opacitemholds => $opacitemholds,
- overduefinescap => $overduefinescap,
- cap_fine_to_replacement_price => $cap_fine_to_replacement_price,
- article_requests => $article_requests,
- note => $note,
- decreaseloanholds => $decreaseloanholds,
- recalls_allowed => $recalls_allowed,
- recalls_per_record => $recalls_per_record,
- on_shelf_recalls => $on_shelf_recalls,
- recall_due_date_interval => $recall_due_date_interval,
- recall_overdue_fine => $recall_overdue_fine,
- recall_shelf_time => $recall_shelf_time,
+ maxissueqty => $maxissueqty,
+ maxonsiteissueqty => $maxonsiteissueqty,
+ rentaldiscount => $rentaldiscount,
+ fine => $fine,
+ finedays => $finedays,
+ maxsuspensiondays => $maxsuspensiondays,
+ suspension_chargeperiod => $suspension_chargeperiod,
+ firstremind => $firstremind,
+ chargeperiod => $chargeperiod,
+ chargeperiod_charge_at => $chargeperiod_charge_at,
+ issuelength => $issuelength,
+ daysmode => $daysmode,
+ lengthunit => $lengthunit,
+ hardduedate => $hardduedate,
+ hardduedatecompare => $hardduedatecompare,
+ renewalsallowed => $renewalsallowed,
+ unseen_renewals_allowed => $unseen_renewals_allowed,
+ renewalperiod => $renewalperiod,
+ norenewalbefore => $norenewalbefore,
+ noautorenewalbefore => $noautorenewalbefore,
+ auto_renew => $auto_renew,
+ no_auto_renewal_after => $no_auto_renewal_after,
+ no_auto_renewal_after_hard_limit => $no_auto_renewal_after_hard_limit,
+ onshelfholds => $onshelfholds,
+ opacitemholds => $opacitemholds,
+ overduefinescap => $overduefinescap,
+ cap_fine_to_replacement_price => $cap_fine_to_replacement_price,
+ article_requests => $article_requests,
+ note => $note,
+ decreaseloanholds => $decreaseloanholds,
+ recalls_allowed => $recalls_allowed,
+ recalls_per_record => $recalls_per_record,
+ on_shelf_recalls => $on_shelf_recalls,
+ recall_due_date_interval => $recall_due_date_interval,
+ recall_overdue_fine => $recall_overdue_fine,
+ recall_shelf_time => $recall_shelf_time,
+ holds_pickup_period => $holds_pickup_period,
};
Koha::CirculationRules->set_rules(
diff --git a/installer/data/mysql/atomicupdate/bug_8367-add_holds_pickup_period_circrule.perl b/installer/data/mysql/atomicupdate/bug_8367-add_holds_pickup_period_circrule.perl
new file mode 100644
index 0000000000..2f62aa436d
--- /dev/null
+++ b/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" );
+}
diff --git a/installer/onboarding.pl b/installer/onboarding.pl
index d429f01c36..306e891d35 100755
--- a/installer/onboarding.pl
+++ b/installer/onboarding.pl
@@ -287,6 +287,7 @@ if ( $step == 5 ) {
recall_due_date_interval => undef,
recall_overdue_fine => undef,
recall_shelf_time => undef,
+ holds_pickup_period => undef,
}
};
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt
index a5fa1e63c5..65937015f4 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt
@@ -146,6 +146,7 @@
Holds per record (count) |
On shelf holds allowed |
OPAC item level holds |
+ Holds pickup period (day) |
[% IF Koha.Preference('ArticleRequests') %]
Article requests |
[% END %]
@@ -206,8 +207,9 @@
[% SET recall_due_date_interval = all_rules.$c.$i.recall_due_date_interval %]
[% SET recall_overdue_fine = all_rules.$c.$i.recall_overdue_fine %]
[% SET recall_shelf_time = all_rules.$c.$i.recall_shelf_time %]
+ [% 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 || noautorenewalbefore || 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 || recalls_allowed || recalls_per_record || on_shelf_recalls || recall_due_date_interval || recall_overdue_fine || recall_shelf_time %]
+ [% 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 || noautorenewalbefore || 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 || recalls_allowed || recalls_per_record || on_shelf_recalls || recall_due_date_interval || recall_overdue_fine || recall_shelf_time || holds_pickup_period %]
[% IF show_rule %]
[% SET row_count = row_count + 1 %]
@@ -370,6 +372,7 @@
Don't allow
[% END %]
+ | [% holds_pickup_period | html %] |
[% IF Koha.Preference('ArticleRequests') %]
[% IF article_requests == 'no' %]
@@ -519,6 +522,7 @@
|
+ |
[% IF Koha.Preference('ArticleRequests') %]
|