Bug 14101: Automatic renewals exactly on due date

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 <kyle@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
Holger Meißner 2015-06-02 15:39:21 +02:00 committed by Tomas Cohen Arazi
parent 379329861d
commit a68d565622
2 changed files with 22 additions and 6 deletions

View File

@ -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} );

View File

@ -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;