correctly unapply payments when applying a lineitem credit with tax, #18676
authorMark Wells <mark@freeside.biz>
Sat, 22 Dec 2012 00:57:32 +0000 (16:57 -0800)
committerMark Wells <mark@freeside.biz>
Sat, 22 Dec 2012 00:57:32 +0000 (16:57 -0800)
FS/FS/cust_credit.pm

index 7741bbe..c716602 100644 (file)
@@ -717,6 +717,8 @@ sub credit_lineitems {
   my %cust_bill_pkg = ();
   my %cust_credit_bill_pkg = ();
   my %taxlisthash = ();
+  # except here they're billpaynums
+  my %unapplied_payments;
   foreach my $billpkgnum ( @{$arg{billpkgnums}} ) {
     my $setuprecur = shift @{$arg{setuprecurs}};
     my $amount = shift @{$arg{amounts}};
@@ -744,7 +746,6 @@ sub credit_lineitems {
 
     push @{$cust_bill_pkg{$invnum}}, $cust_bill_pkg;
 
-    my %unapplied_payments; # billpaynum => amount
     #unapply any payments applied to this line item (other credits too?)
     foreach my $cust_bill_pay_pkg ( $cust_bill_pkg->cust_bill_pay_pkg($setuprecur) ) {
       $error = $cust_bill_pay_pkg->delete;
@@ -755,28 +756,6 @@ sub credit_lineitems {
       $unapplied_payments{$cust_bill_pay_pkg->billpaynum}
         += $cust_bill_pay_pkg->amount;
     }
-    # also unapply that amount from the invoice so it doesn't screw up 
-    # application of the credit
-    foreach my $billpaynum (keys %unapplied_payments) {
-      my $cust_bill_pay = FS::cust_bill_pay->by_key($billpaynum)
-        or die "broken payment application $billpaynum";
-      $error = $cust_bill_pay->delete; # can't replace
-
-      my $new_cust_bill_pay = FS::cust_bill_pay->new({
-          $cust_bill_pay->hash,
-          billpaynum => '',
-          amount => sprintf('%.2f', 
-              $cust_bill_pay->amount - $unapplied_payments{$billpaynum}),
-      });
-
-      if ( $new_cust_bill_pay->amount > 0 ) {
-        $error ||= $new_cust_bill_pay->insert;
-      }
-      if ( $error ) {
-        $dbh->rollback if $oldAutoCommit;
-        return "Error unapplying payment: $error";
-      }
-    }
 
     #$subtotal += $amount;
     $cust_credit_bill{$invnum} += $amount;
@@ -904,8 +883,43 @@ sub credit_lineitems {
           };
 
       } # if $amount > 0
+
+      #unapply any payments applied to the tax
+      foreach my $cust_bill_pay_pkg
+        ( $tax_item->cust_bill_pay_pkg('setup') )
+      {
+        $error = $cust_bill_pay_pkg->delete;
+        if ( $error ) {
+          $dbh->rollback if $oldAutoCommit;
+          return "Error unapplying payment: $error";
+        }
+        $unapplied_payments{$cust_bill_pay_pkg->billpaynum}
+          += $cust_bill_pay_pkg->amount;
+      }
     } #foreach $taxline
 
+    # if we unapplied any payments from line items, also unapply that 
+    # amount from the invoice
+    foreach my $billpaynum (keys %unapplied_payments) {
+      my $cust_bill_pay = FS::cust_bill_pay->by_key($billpaynum)
+        or die "broken payment application $billpaynum";
+      $error = $cust_bill_pay->delete; # can't replace
+
+      my $new_cust_bill_pay = FS::cust_bill_pay->new({
+          $cust_bill_pay->hash,
+          billpaynum => '',
+          amount => sprintf('%.2f', 
+              $cust_bill_pay->amount - $unapplied_payments{$billpaynum}),
+      });
+
+      if ( $new_cust_bill_pay->amount > 0 ) {
+        $error ||= $new_cust_bill_pay->insert;
+      }
+      if ( $error ) {
+        $dbh->rollback if $oldAutoCommit;
+        return "Error unapplying payment: $error";
+      }
+    }
     #insert cust_credit_bill
 
     my $cust_credit_bill = new FS::cust_credit_bill {