@@ -, +, @@ --- C4/Circulation.pm | 22 +++++++++++-- Koha/CirculationRules.pm | 3 ++ admin/smart-rules.pl | 2 ++ .../bug_14866-add_decreaseloanholds_circrule.perl | 6 ++++ installer/onboarding.pl | 1 + .../prog/en/modules/admin/smart-rules.tt | 7 +++- t/db_dependent/DecreaseLoanHighHolds.t | 37 ++++++++++++++++++++-- 7 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 installer/data/mysql/atomicupdate/bug_14866-add_decreaseloanholds_circrule.perl --- a/C4/Circulation.pm +++ a/C4/Circulation.pm @@ -1329,15 +1329,31 @@ sub checkHighHolds { my $orig_due = C4::Circulation::CalcDateDue( $issuedate, $itype, $branchcode, $borrower ); my $decreaseLoanHighHoldsDuration = C4::Context->preference('decreaseLoanHighHoldsDuration'); - - my $reduced_datedue = $calendar->addDate( $issuedate, $decreaseLoanHighHoldsDuration ); + my $rule = Koha::CirculationRules->get_effective_rule( + { + categorycode => $borrower->{categorycode}, + itemtype => $item_object->effective_itemtype, + branchcode => $branchcode, + rule_name => 'decreaseloanholds', + } + ); + my $reduced_datedue; + my $duration; + if ( defined($rule) && $rule->rule_value ne '' ){ + # overrides decreaseLoanHighHoldsDuration syspref + $duration = $rule->rule_value; + $reduced_datedue = $calendar->addDate( $issuedate, $rule->rule_value ); + } else { + $duration = $decreaseLoanHighHoldsDuration; + $reduced_datedue = $calendar->addDate( $issuedate, $decreaseLoanHighHoldsDuration ); + } $reduced_datedue->set_hour($orig_due->hour); $reduced_datedue->set_minute($orig_due->minute); $reduced_datedue->truncate( to => 'minute' ); if ( DateTime->compare( $reduced_datedue, $orig_due ) == -1 ) { $return_data->{exceeded} = 1; - $return_data->{duration} = $decreaseLoanHighHoldsDuration; + $return_data->{duration} = $duration; $return_data->{due_date} = $reduced_datedue; } } --- 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' ], }, + decreaseloanholds => { + scope => [ 'branchcode', 'categorycode', 'itemtype' ], + }, # Not included (deprecated?): # * accountsent # * reservecharge --- 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 $decreaseloanholds = $input->param('decreaseloanholds') || undef; $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, + decreaseloanholds => $decreaseloanholds, }; Koha::CirculationRules->set_rules( --- a/installer/data/mysql/atomicupdate/bug_14866-add_decreaseloanholds_circrule.perl +++ a/installer/data/mysql/atomicupdate/bug_14866-add_decreaseloanholds_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, 'decreaseloanholds', NULL) }); + + NewVersion( $DBversion, 14866, "Add decreaseloanholds circulation rule" ); +} --- a/installer/onboarding.pl +++ a/installer/onboarding.pl @@ -287,6 +287,7 @@ if ( $step == 5 ) { rentaldiscount => 0, reservesallowed => $reservesallowed, suspension_chargeperiod => undef, + decreaseloanholds => 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 @@ -102,6 +102,7 @@ Days mode Unit Hard due date + Decreased loan period for high holds (day) Fine amount Fine charging interval When to charge @@ -163,8 +164,9 @@ [% SET opacitemholds = all_rules.$c.$i.opacitemholds %] [% SET article_requests = all_rules.$c.$i.article_requests %] [% SET rentaldiscount = all_rules.$c.$i.rentaldiscount %] + [% SET decreaseloanholds = all_rules.$c.$i.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 || 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 || decreaseloanholds %] [% IF show_rule %] [% SET row_count = row_count + 1 %] @@ -242,6 +244,7 @@ None defined [% END %] + [% decreaseloanholds | html %] [% fine | html %] [% chargeperiod | html %] [% IF chargeperiod_charge_at %]Start of interval[% ELSE %]End of interval[% END %] @@ -391,6 +394,7 @@
[% INCLUDE 'date-format.inc' %]
+ @@ -465,6 +469,7 @@ Days mode Unit Hard due date + Decreased loan period for high holds (day) Fine amount Fine charging interval Charge when? --- a/t/db_dependent/DecreaseLoanHighHolds.t +++ a/t/db_dependent/DecreaseLoanHighHolds.t @@ -30,7 +30,7 @@ use Koha::CirculationRules; use t::lib::TestBuilder; use t::lib::Mocks; -use Test::More tests => 19; +use Test::More tests => 21; my $dbh = C4::Context->dbh; my $schema = Koha::Database->new()->schema(); @@ -109,11 +109,11 @@ Koha::CirculationRules->set_rules( lengthunit => 'days', reservesallowed => '99', holds_per_record => '99', + decreaseloanholds => 0, } } ); - my $orig_due = C4::Circulation::CalcDateDue( dt_from_string(), $item->effective_itemtype, @@ -133,9 +133,27 @@ my $patron_hr = { borrowernumber => $patron->id, branchcode => $library->{branch my $data = C4::Circulation::checkHighHolds( $item_hr, $patron_hr ); is( $data->{exceeded}, 1, "Static mode should exceed threshold" ); is( $data->{outstanding}, 6, "Should have 6 outstanding holds" ); -is( $data->{duration}, 1, "Should have duration of 1" ); +is( $data->{duration}, 0, "Should have duration of 0 because of specific circulation rules" ); is( ref( $data->{due_date} ), 'DateTime', "due_date should be a DateTime object" ); +Koha::CirculationRules->set_rules( + { + branchcode => undef, + categorycode => undef, + itemtype => $item->itype, + rules => { + issuelength => '14', + lengthunit => 'days', + reservesallowed => '99', + holds_per_record => '99', + decreaseloanholds => undef, + } + } +); + +$data = C4::Circulation::checkHighHolds( $item_hr, $patron_hr ); +is( $data->{duration}, 1, "Should have a duration of 1 because no specific circulation rules so defaults to system preference" ); + my $duedate = $data->{due_date}; is($duedate->hour, $orig_due->hour, 'New due hour is equal to original due hour.'); is($duedate->min, $orig_due->min, 'New due minute is equal to original due minute.'); @@ -215,4 +233,17 @@ ok( $needsconfirmation->{HIGHHOLDS}, "High holds checkout needs confirmation" ); ( undef, $needsconfirmation ) = CanBookBeIssued( $patron_object, $item->barcode, undef, undef, undef, { override_high_holds => 1 } ); ok( !$needsconfirmation->{HIGHHOLDS}, "High holds checkout does not need confirmation" ); +Koha::CirculationRules->set_rule( + { + branchcode => undef, + categorycode => undef, + itemtype => $item->itype, + rule_name => 'decreaseloanholds', + rule_value => 2, + } +); + +$data = C4::Circulation::checkHighHolds( $item_hr, $patron_hr ); +is( $data->{duration}, 2, "Circulation rules override system preferences" ); + $schema->storage->txn_rollback(); --