Hourly fine periods do not charge enough
authorDan Wells <dbw2@calvin.edu>
Thu, 1 Sep 2011 13:13:47 +0000 (09:13 -0400)
committerMike Rylander <mrylander@gmail.com>
Sat, 3 Sep 2011 16:45:09 +0000 (12:45 -0400)
Hourly fine periods are not charging for the first period of
overdue-ness. If an item is due at 2:00pm and has a fine of
$.50 per hour, the first fine should be eligible for generation
at 2:01pm. As it stands, the first fine does not generate until
an entire fine period has elapsed, so in this case, 3:00pm.

The previous version of the code had a special case for day-
granular fine periods, so a majority of fines were not affected.
This commit expands the same idea (charging for the fine period
you are currently "in") to all fine periods.

Signed-off-by: Dan Wells <dbw2@calvin.edu>
Signed-off-by: Mike Rylander <mrylander@gmail.com>

Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm

index d54575d..6a2b6d6 100644 (file)
@@ -12,6 +12,7 @@ use OpenILS::Utils::PermitHold;
 use DateTime;
 use DateTime::Format::ISO8601;
 use OpenILS::Utils::Penalty;
+use POSIX qw(ceil);
 
 sub isTrue {
        my $v = shift;
@@ -920,10 +921,8 @@ sub generate_fines {
                        }
 
             next if ($last_fine > $now);
-            my $pending_fine_count = int( ($now - $last_fine) / $fine_interval ); 
-
-            # Generate fines for the interval we are currently inside, when the fine interval is some multiple of 1d
-            $pending_fine_count++ if ($fine_interval && ($fine_interval % 86400 == 0));
+            # 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
                  && $grace_period                           # and we have a grace period