From 0b97f4393789b009d777d2a59d8eb1cf6b079d70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20Mei=C3=9Fner?= Date: Thu, 16 Jul 2015 15:22:55 +0200 Subject: [PATCH] Bug 14395: Code changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch updates the calculation of 'No renewal before' to include the new syspref NoRenewalBeforePrecision. To test: 1) Check out an hour-based loan with 'No renewal before' set to 1. Switch syspref NoRenewalBeforePrecision between 'date' and 'exact time'. Confirm that with both settings the item cannot be renewed until exactly one hour before due. 2) Check out a day-based loan with 'No renewal before' set to 1 day. Confirm that: * with NoRenewalBeforePrecision set to 'date', renewal is possible at 12:00 AM on the day before due. * with NoRenewalBeforePrecision set to 'exact time', renewal is possible at 11:59 PM on the day before due. Sponsored-by: Hochschule für Gesundheit (hsg), Germany --- C4/Circulation.pm | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index f270ce2..953c933 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -2760,13 +2760,20 @@ sub CanBookBeRenewed { if ( defined $issuingrule->{norenewalbefore} ) { - # Get current time and add norenewalbefore. - # If this is smaller than date_due, it's too soon for renewal. - if ( - DateTime->now( time_zone => C4::Context->tz() )->add( - $issuingrule->{lengthunit} => $issuingrule->{norenewalbefore} - ) < $itemissue->{date_due} - ) + # Calculate soonest renewal by subtracting 'No renewal before' from due date + my $soonestrenewal = + $itemissue->{date_due}->clone() + ->subtract( + $issuingrule->{lengthunit} => $issuingrule->{norenewalbefore} ); + + # Depending on syspref reset the exact time, only check the date + if ( C4::Context->preference('NoRenewalBeforePrecision') eq 'date' + and $issuingrule->{lengthunit} eq 'days' ) + { + $soonestrenewal->truncate( to => 'day' ); + } + + if ( $soonestrenewal > DateTime->now( time_zone => C4::Context->tz() ) ) { return ( 0, "auto_too_soon" ) if $itemissue->{auto_renew}; return ( 0, "too_soon" ); @@ -3001,11 +3008,16 @@ sub GetSoonestRenewDate { if ( defined $issuingrule->{norenewalbefore} ) { my $soonestrenewal = - $itemissue->{date_due}->subtract( + $itemissue->{date_due}->clone() + ->subtract( $issuingrule->{lengthunit} => $issuingrule->{norenewalbefore} ); - $soonestrenewal = $now > $soonestrenewal ? $now : $soonestrenewal; - return $soonestrenewal; + if ( C4::Context->preference('NoRenewalBeforePrecision') eq 'date' + and $issuingrule->{lengthunit} eq 'days' ) + { + $soonestrenewal->truncate( to => 'day' ); + } + return $soonestrenewal if $now < $soonestrenewal; } return $now; } -- 1.7.10.4