Bug 26076: Sum the amount due in the database query instead of a loop in Perl
authorKyle M Hall <kyle@bywatersolutions.com>
Tue, 28 Jul 2020 16:49:35 +0000 (12:49 -0400)
committerJonathan Druart <jonathan.druart@bugs.koha-community.org>
Mon, 24 Aug 2020 08:12:49 +0000 (10:12 +0200)
This appears to be a bug due to inaccuracies in floating point math. I've been unable to reproduce it on demand. Sometimes when using the "Write off selected" button, Koha will give the error that the payment is more than the amount owed, even though they are the same. The solution I've implemented is to move the summation from Perl code to the database query. This video demonstrates the issue and afterward, shows the error goes away after the patch is applied: https://monosnap.com/file/pG69HC7iI9mU9kkuoCtbkVzVTffKlE

Test Plan:
1) Apply this patch
2) Restart all the things!
3) Verify that "Write off selected" functions as usual

Signed-off-by: Amit Gupta <amit.gupta@informaticsglobal.com>

Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>

members/paycollect.pl

index c258560..a8f449e 100755 (executable)
@@ -145,7 +145,7 @@ if ( $selected_accts ) {
     }
     my @acc = split /,/, $selected_accts;
 
-    @selected_accountlines = Koha::Account::Lines->search(
+    my $selected_accountlines = Koha::Account::Lines->search(
         {
             borrowernumber    => $borrowernumber,
             amountoutstanding => { '<>' => 0 },
@@ -154,8 +154,9 @@ if ( $selected_accts ) {
         { order_by => 'date' }
     );
 
-    $total_due = 0; # Reset and recalculate total due
-    map { $total_due += $_->amountoutstanding } @selected_accountlines;
+    $total_due = $selected_accountlines->_resultset->get_column('amountoutstanding')->sum();
+
+    @selected_accountlines = $selected_accountlines->as_list;
 }