From 772ff5461140558a2af570c740cc49d32c4850da 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 | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 35651f2..c52b2b1 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -2821,14 +2821,20 @@ sub CanBookBeRenewed { 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 ( - $now->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" ); @@ -3064,11 +3070,16 @@ sub GetSoonestRenewDate { and $issuingrule->{norenewalbefore} ne "" ) { 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