From 9cedd28800e1c77dd53adab3027494a6f2e1b2cf Mon Sep 17 00:00:00 2001 From: Mark Wells Date: Fri, 21 Dec 2012 16:57:32 -0800 Subject: [PATCH] correctly unapply payments when applying a lineitem credit with tax, #18676 --- FS/FS/cust_credit.pm | 60 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 23 deletions(-) diff --git a/FS/FS/cust_credit.pm b/FS/FS/cust_credit.pm index 7741bbee2..c716602a0 100644 --- a/FS/FS/cust_credit.pm +++ b/FS/FS/cust_credit.pm @@ -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 { -- 2.11.0