Enforce one-payment-per-xact-per-call
authorMike Rylander <mrylander@gmail.com>
Fri, 15 Nov 2013 21:40:36 +0000 (16:40 -0500)
committerMike Rylander <mrylander@gmail.com>
Wed, 20 Nov 2013 15:55:20 +0000 (10:55 -0500)
There is no legitimate reason for a transaction to receive more than
one payment per call to open-ils.circ open-ils.circ.money.payment,
but we have seen the staff client generate such a data structure. This
leads to seemingly duplicate payments, and is bad all around.  So,
we will enforce the restriction by taking only the first payment per
xact in the list of payments.

Signed-off-by: Mike Rylander <mrylander@gmail.com>
Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Money.pm

index b46e578..c127d75 100644 (file)
@@ -162,8 +162,16 @@ sub make_payments {
     # first collect the transactions and make sure the transaction
     # user matches the requested user
     my %xacts;
+
+    # We rewrite the payments array for sanity's sake, to avoid more
+    # than one payment per transaction per call, which is not legitimate
+    # but has been seen in the wild coming from the staff client.  This
+    # is presumably a staff client (xulrunner) bug.
+    my @unique_xact_payments;
     for my $pay (@{$payments->{payments}}) {
         my $xact_id = $pay->[0];
+        next if (exists($xacts{$xact_id}));
+
         my $xact = $e->retrieve_money_billable_transaction_summary($xact_id)
             or return $e->die_event;
         
@@ -173,7 +181,9 @@ sub make_payments {
         }
 
         $xacts{$xact_id} = $xact;
+        push @unique_xact_payments, $pay;
     }
+    $payments->{payments} = \@unique_xact_payments;
 
     my @payment_objs;