From a68d565622abefe7acb4aca617d1ca064bc2fd62 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Holger=20Mei=C3=9Fner?= Date: Tue, 2 Jun 2015 15:39:21 +0200 Subject: [PATCH] Bug 14101: Automatic renewals exactly on due date MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit If no value for 'no renewal before' is specified, automatic renewal now falls back on the due date. Also 'no renewal before' can now be zero, so both automatic and manual renewals can be delayed until due date. Test plan: 1) Create some circulation rules with different settings for 'No renewal before' and 'Automatic renewal'. Both daily and hourly loans should work. 2) Try to renew both manually and automatically before and after a renewal should be possible. You can run misc/cronjobs/automatic_renewals.pl for automatic renewal. 3) Confirm that: * Both automatic and manual renewal with 'No renewal before' set to 0 do not happen before the due date (exact DateTime). * Manual renewal with 'No renewal before' set to undef (enter empty string) is unrestricted. * Automatic renewal with 'No renewal before' set to undef does not happen before the due date. Sponsored-by: Hochschule für Gesundheit (hsg), Germany Signed-off-by: Kyle M Hall Signed-off-by: Tomas Cohen Arazi --- C4/Circulation.pm | 26 +++++++++++++++++++++----- admin/smart-rules.pl | 2 +- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index e75ec5e1af..35651f2293 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -2817,12 +2817,15 @@ sub CanBookBeRenewed { return ( 0, 'overdue'); } - if ( $issuingrule->{norenewalbefore} ) { + if ( defined $issuingrule->{norenewalbefore} + and $issuingrule->{norenewalbefore} ne "" ) + { # Get current time and add norenewalbefore. # If this is smaller than date_due, it's too soon for renewal. + my $now = dt_from_string; if ( - DateTime->now( time_zone => C4::Context->tz() )->add( + $now->add( $issuingrule->{lengthunit} => $issuingrule->{norenewalbefore} ) < $itemissue->{date_due} ) @@ -2830,9 +2833,20 @@ sub CanBookBeRenewed { return ( 0, "auto_too_soon" ) if $itemissue->{auto_renew}; return ( 0, "too_soon" ); } + elsif ( $itemissue->{auto_renew} ) { + return ( 0, "auto_renew" ); + } + } + + # Fallback for automatic renewals: + # If norenewalbefore is undef, don't renew before due date. + elsif ( $itemissue->{auto_renew} ) { + my $now = dt_from_string; + return ( 0, "auto_renew" ) + if $now >= $itemissue->{date_due}; + return ( 0, "auto_too_soon" ); } - return ( 0, "auto_renew" ) if $itemissue->{auto_renew}; return ( 1, undef ); } @@ -3044,9 +3058,11 @@ sub GetSoonestRenewDate { my $issuingrule = GetIssuingRule( $borrower->{categorycode}, $item->{itype}, $branchcode ); - my $now = DateTime->now( time_zone => C4::Context->tz() ); + my $now = dt_from_string; - if ( $issuingrule->{norenewalbefore} ) { + if ( defined $issuingrule->{norenewalbefore} + and $issuingrule->{norenewalbefore} ne "" ) + { my $soonestrenewal = $itemissue->{date_due}->subtract( $issuingrule->{lengthunit} => $issuingrule->{norenewalbefore} ); diff --git a/admin/smart-rules.pl b/admin/smart-rules.pl index d43c6865d2..253b08a10c 100755 --- a/admin/smart-rules.pl +++ b/admin/smart-rules.pl @@ -117,7 +117,7 @@ elsif ($op eq 'add') { my $renewalsallowed = $input->param('renewalsallowed'); my $renewalperiod = $input->param('renewalperiod'); my $norenewalbefore = $input->param('norenewalbefore'); - $norenewalbefore = undef if $norenewalbefore eq '0' or $norenewalbefore =~ /^\s*$/; + $norenewalbefore = undef if $norenewalbefore =~ /^\s*$/; my $auto_renew = $input->param('auto_renew') eq 'yes' ? 1 : 0; my $reservesallowed = $input->param('reservesallowed'); my $onshelfholds = $input->param('onshelfholds') || 0; -- 2.39.5