@@ -, +, @@ +finedays is in days, so hourly loans must multiply by 24 +grace period is measured in the same units as the loan DateTime::Duration->new( $unit => $issuingrule->{firstremind} ); DateTime::Duration->new( days => $issuingrule->{firstremind} ); --- C4/Circulation.pm | 11 ++++------- .../Circulation/IssuingRules/maxsuspensiondays.t | 22 +++++++++++++++++++++- 2 files changed, 25 insertions(+), 8 deletions(-) --- a/C4/Circulation.pm +++ a/C4/Circulation.pm @@ -2158,21 +2158,18 @@ sub _debar_user_on_return { GetIssuingRule( $borrower->{categorycode}, $item->{itype}, $branchcode ); my $finedays = $issuingrule->{finedays}; my $unit = $issuingrule->{lengthunit}; - my $chargeable_units = C4::Overdues::get_chargeable_units($unit, $dt_due, $dt_today, $branchcode); if ($finedays) { - # finedays is in days, so hourly loans must multiply by 24 - # thus 1 hour late equals 1 day suspension * finedays rate - $finedays = $finedays * 24 if ( $unit eq 'hours' ); - # grace period is measured in the same units as the loan my $grace = DateTime::Duration->new( $unit => $issuingrule->{firstremind} ); - my $deltadays = DateTime::Duration->new( - days => $chargeable_units + my $deltadays = C4::Overdues::get_chargeable_units('days', $dt_due, $dt_today, $branchcode); + $deltadays = DateTime::Duration->new( + days => $deltadays, ); + if ( $deltadays->subtract($grace)->is_positive() ) { my $suspension_days = $deltadays * $finedays; --- a/t/db_dependent/Circulation/IssuingRules/maxsuspensiondays.t +++ a/t/db_dependent/Circulation/IssuingRules/maxsuspensiondays.t @@ -1,5 +1,5 @@ use Modern::Perl; -use Test::More tests => 2; +use Test::More tests => 3; use MARC::Record; use MARC::Field; @@ -92,6 +92,26 @@ is( ); DelDebarment( $debarments->[0]->{borrower_debarment_id} ); +# Test with lengthunit => 'hours' +$circulation_module->mock('GetIssuingRule', sub { + return { + firstremind => 0, + finedays => 2, + maxsuspensiondays => 100, + lengthunit => 'hours', + } +}); +$daysafter10 = dt_from_string->add_duration(DateTime::Duration->new(days => 10)); +AddIssue( $borrower, $barcode, $daysago20 ); +AddReturn( $barcode, $branchcode ); +$debarments = GetDebarments({borrowernumber => $borrower->{borrowernumber}}); +is( + $debarments->[0]->{expiration}, + output_pref({ dt => $daysafter40, dateformat => 'iso', dateonly => 1 }), + 'calculate suspension with lengthunit hours.' +); +DelDebarment( $debarments->[0]->{borrower_debarment_id} ); + # C4::Context->userenv sub Mock_userenv { --