From ab96435929fa9844ebe95ebf2f349051989e9dd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?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=UTF-8 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 --- 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 43b8f93..5e54d24 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -2818,12 +2818,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} ) @@ -2831,9 +2834,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 ); } @@ -3045,9 +3059,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 bedaef3..a14327c 100755 --- a/admin/smart-rules.pl +++ b/admin/smart-rules.pl @@ -115,7 +115,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; -- 1.7.10.4