@@ -, +, @@ Switch syspref NoRenewalBeforePrecision between 'date' and 'exact time'. Confirm that with both settings the item cannot be renewed until exactly one hour before due. 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. --- C4/Circulation.pm | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) --- a/C4/Circulation.pm +++ a/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; } --