LP#1474566 Avoid credit card payment rounding
authorBill Erickson <berickxx@gmail.com>
Tue, 14 Jul 2015 18:25:34 +0000 (14:25 -0400)
committerBen Shum <ben@evergreener.net>
Sat, 27 Feb 2016 23:05:49 +0000 (18:05 -0500)
Calculate total amount for credit payment as integers to avoid rounding
errors w/ large sets of small billings.

E.g. avoid trying to pay a fine of 9.999999999999 for a set of fines
which should add up to 10.00.

Signed-off-by: Bill Erickson <berickxx@gmail.com>
Signed-off-by: Ben Shum <ben@evergreener.net>
Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Money.pm

index a558777..666b402 100644 (file)
@@ -321,7 +321,8 @@ sub make_payments {
         $amount =~ s/\$//og; # just to be safe
         my $trans = $xacts{$transid};
 
         $amount =~ s/\$//og; # just to be safe
         my $trans = $xacts{$transid};
 
-        $total_paid += $amount;
+        # add amounts as integers
+        $total_paid += (100 * $amount);
 
         my $org_id = $U->xact_org($transid, $e);
 
 
         my $org_id = $U->xact_org($transid, $e);
 
@@ -396,6 +397,9 @@ sub make_payments {
 
     } # all payment objects have been created and inserted. 
 
 
     } # all payment objects have been created and inserted. 
 
+    # return to decimal format, forcing X.YY format for consistency.
+    $total_paid = sprintf("%.2f", $total_paid / 100);
+
     #### NO WRITES TO THE DB ABOVE THIS LINE -- THEY'LL ONLY BE DISCARDED  ###
     $e->rollback;
 
     #### NO WRITES TO THE DB ABOVE THIS LINE -- THEY'LL ONLY BE DISCARDED  ###
     $e->rollback;