From e09c8203b79302fdb6e1568a4c1c649fb5ea48d2 Mon Sep 17 00:00:00 2001 From: Dan Wells Date: Thu, 29 Jan 2015 16:07:27 -0500 Subject: [PATCH] LP#1422379 Move money.billing timestamps back to moment of fine Current code stamps billings into the future, with the underlying concept that the time represents when the billing ends, not when it begins. This is hard to understand, and requires frequent explanation to those not familiar with it. Let's instead do the more natural thing and have the first billing come one second after the due time, then every fine interval after that. Signed-off-by: Dan Wells --- .../lib/OpenILS/Application/Circ/CircCommon.pm | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm index 4947a196e7..449466ef8d 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm @@ -8,7 +8,7 @@ use OpenILS::Event; use OpenSRF::Utils::Logger qw(:logger); use OpenILS::Utils::CStoreEditor q/:funcs/; use OpenILS::Const qw/:const/; -use POSIX qw(ceil); +use POSIX qw(floor); use List::MoreUtils qw(uniq); my $U = "OpenILS::Application::AppUtils"; @@ -535,22 +535,21 @@ sub generate_fines { my $current_fine_total = 0; $current_fine_total += int($_->amount * 100) for (grep { $_ and !$U->is_true($_->voided) } @fines); - my $last_fine; + my $next_fine; if ($fine) { $conn->respond( "Last billing time: ".$fine->billing_ts." (clensed format: ".cleanse_ISO8601( $fine->billing_ts ).")") if $conn; - $last_fine = $parser->parse_datetime( cleanse_ISO8601( $fine->billing_ts ) )->epoch; + my $last_fine = $parser->parse_datetime( cleanse_ISO8601( $fine->billing_ts ) )->epoch; + $next_fine = $last_fine + $fine_interval; } else { $logger->info( "Potential first billing for circ ".$c->id ); - $last_fine = $due; + $next_fine = $due + 1; # first fine comes one second after due time $grace_period = extend_grace_period($class, $c->$circ_lib_method,$c->$due_date_method,$grace_period,undef,$hoo{$c->$circ_lib_method}); } - return if ($last_fine > $now); + return if ($next_fine > $now); # Generate fines for each past interval, including the one we are inside - my $pending_fine_count = ceil( ($now - $last_fine) / $fine_interval ); - - if ( $last_fine == $due # we have no fines yet + if ( $next_fine == $due + 1 # we have no fines yet && $grace_period # and we have a grace period && $now < $due + $grace_period # and some date math says were are within the grace period ) { @@ -559,6 +558,7 @@ sub generate_fines { return; } + my $pending_fine_count = 1 + floor( ($now - $next_fine) / $fine_interval ); # next fine + every fine interval after that $conn->respond( "\t$pending_fine_count pending fine(s)\n" ) if $conn; return unless ($pending_fine_count); @@ -590,9 +590,9 @@ sub generate_fines { } # XXX Use org time zone (or default to 'local') once we have the ou setting built for that - my $billing_ts = DateTime->from_epoch( epoch => $last_fine, time_zone => 'local' ); + my $billing_ts = DateTime->from_epoch( epoch => $next_fine, time_zone => 'local' ); my $current_bill_count = $bill; - while ( $current_bill_count ) { + while ( $current_bill_count > 1 ) { $billing_ts->add( seconds_to_interval_hash( $fine_interval ) ); $current_bill_count--; } -- 2.11.0