@@ -, +, @@ --- C4/Circulation.pm | 4 +- .../Circulation/IssuingRules/maxsuspensiondays.t | 77 +++++++++++++++++++++- 2 files changed, 78 insertions(+), 3 deletions(-) --- a/C4/Circulation.pm +++ a/C4/Circulation.pm @@ -22,7 +22,7 @@ package C4::Circulation; use strict; #use warnings; FIXME - Bug 2505 use DateTime; -use POSIX qw( floor ); +use POSIX qw( floor ceil ); use Koha::DateUtils; use C4::Context; use C4::Stats; @@ -2272,7 +2272,7 @@ sub _debar_user_on_return { if ( $issuing_rule->suspension_chargeperiod > 1 ) { # No need to / 1 and do not consider / 0 $suspension_days = DateTime::Duration->new( - days => floor( $suspension_days->in_units('days') / $issuing_rule->suspension_chargeperiod ) + days => ceil( $suspension_days->in_units('days') / $issuing_rule->suspension_chargeperiod ) ); } --- 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 => 5; +use Test::More tests => 10; use MARC::Record; use MARC::Field; @@ -152,4 +152,79 @@ is( ); DelDebarment( $debarments->[0]->{borrower_debarment_id} ); +# 2 hours before => 0 day of suspension +my $hoursafter2= dt_from_string->add_duration(DateTime::Duration->new(hours => 2)); +AddIssue( $borrower, $barcode, $hoursafter2); +AddReturn( $barcode, $branchcode ); +$debarments = GetDebarments({borrowernumber => $borrower->{borrowernumber}}); +is_deeply( + $debarments, + [], + 'No debarment if in time' +); +DelDebarment( $debarments->[0]->{borrower_debarment_id} ); + +Koha::IssuingRules->search->delete; +# Add 1 day every 2 days +$builder->build( + { + source => 'Issuingrule', + value => { + categorycode => '*', + itemtype => '*', + branchcode => '*', + firstremind => 0, + finedays => 1, + lengthunit => 'hours', + suspension_chargeperiod => 2, + maxsuspensiondays => 100, + } + } +); + +# 20 days late => 20/2 * 1 => 10 days of suspension +AddIssue( $borrower, $barcode, $daysago20 ); +AddReturn( $barcode, $branchcode ); +$debarments = GetDebarments({borrowernumber => $borrower->{borrowernumber}}); +is( + $debarments->[0]->{expiration}, + output_pref({ dt => $daysafter10, dateformat => 'iso', dateonly => 1 }), + 'calculate suspension with lengthunit hours.' +); +DelDebarment( $debarments->[0]->{borrower_debarment_id} ); + +# 1 day late => ceil(1/2) * 1 => 1 day of suspension +my $tomorrow = dt_from_string->add_duration(DateTime::Duration->new( days => 1 )); +AddIssue( $borrower, $barcode, $yesterday); +AddReturn( $barcode, $branchcode ); +$debarments = GetDebarments({borrowernumber => $borrower->{borrowernumber}}); +is( + $debarments->[0]->{expiration}, + output_pref({ dt => $tomorrow, dateformat => 'iso', dateonly => 1 }), + 'calculate suspension with lengthunit hours.' +); +DelDebarment( $debarments->[0]->{borrower_debarment_id} ); + +# 2 hours late => ceil(.x/2) * 1 => 1 day of suspension +AddIssue( $borrower, $barcode, $hoursago2); +AddReturn( $barcode, $branchcode ); +$debarments = GetDebarments({borrowernumber => $borrower->{borrowernumber}}); +is( + $debarments->[0]->{expiration}, + output_pref({ dt => $tomorrow, dateformat => 'iso', dateonly => 1 }), + 'calculate suspension with lengthunit hours.' +); +DelDebarment( $debarments->[0]->{borrower_debarment_id} ); + +# 2 hours before => 0 day of suspension +AddIssue( $borrower, $barcode, $hoursafter2); +AddReturn( $barcode, $branchcode ); +$debarments = GetDebarments({borrowernumber => $borrower->{borrowernumber}}); +is_deeply( + $debarments, + [], + 'No debarment if in time' +); +DelDebarment( $debarments->[0]->{borrower_debarment_id} ); + $schema->storage->txn_rollback; --