summaryrefslogtreecommitdiff
path: root/FS/FS/cust_credit.pm
diff options
context:
space:
mode:
authorMark Wells <mark@freeside.biz>2013-01-07 17:14:32 -0800
committerMark Wells <mark@freeside.biz>2013-01-07 17:14:32 -0800
commit2be0687ad93376100101bb270d7ff838b91a869a (patch)
tree03106f3ba600a3b5cd3990e4374ab5fb17333e3e /FS/FS/cust_credit.pm
parenteb70a0b5a299e8e77e64cd10ee515270fbe14044 (diff)
application of line item credits, #20629
Diffstat (limited to 'FS/FS/cust_credit.pm')
-rw-r--r--FS/FS/cust_credit.pm22
1 files changed, 16 insertions, 6 deletions
diff --git a/FS/FS/cust_credit.pm b/FS/FS/cust_credit.pm
index c716602..082b0f2 100644
--- a/FS/FS/cust_credit.pm
+++ b/FS/FS/cust_credit.pm
@@ -646,6 +646,7 @@ Example:
use FS::cust_bill_pkg;
sub credit_lineitems {
my( $class, %arg ) = @_;
+ warn Data::Dumper::Dumper \%arg;
my $curuser = $FS::CurrentUser::CurrentUser;
#some false laziness w/misc/xmlhttp-cust_bill_pkg-calculate_taxes.html
@@ -717,8 +718,7 @@ sub credit_lineitems {
my %cust_bill_pkg = ();
my %cust_credit_bill_pkg = ();
my %taxlisthash = ();
- # except here they're billpaynums
- my %unapplied_payments;
+ my %unapplied_payments; #invoice numbers, and then billpaynums
foreach my $billpkgnum ( @{$arg{billpkgnums}} ) {
my $setuprecur = shift @{$arg{setuprecurs}};
my $amount = shift @{$arg{amounts}};
@@ -753,7 +753,7 @@ sub credit_lineitems {
$dbh->rollback if $oldAutoCommit;
return "Error unapplying payment: $error";
}
- $unapplied_payments{$cust_bill_pay_pkg->billpaynum}
+ $unapplied_payments{$invnum}{$cust_bill_pay_pkg->billpaynum}
+= $cust_bill_pay_pkg->amount;
}
@@ -893,27 +893,37 @@ sub credit_lineitems {
$dbh->rollback if $oldAutoCommit;
return "Error unapplying payment: $error";
}
- $unapplied_payments{$cust_bill_pay_pkg->billpaynum}
+ $unapplied_payments{$invnum}{$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) {
+ foreach my $billpaynum (keys %{$unapplied_payments{$invnum}}) {
my $cust_bill_pay = FS::cust_bill_pay->by_key($billpaynum)
or die "broken payment application $billpaynum";
+ my @subapps = $cust_bill_pay->lineitem_applications;
$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}),
+ $cust_bill_pay->amount
+ - $unapplied_payments{$invnum}{$billpaynum}),
});
if ( $new_cust_bill_pay->amount > 0 ) {
$error ||= $new_cust_bill_pay->insert;
+ # Also reapply it to everything it was applied to before.
+ # Note that we've already deleted cust_bill_pay_pkg records for the
+ # items we're crediting, so they aren't on this list.
+ foreach my $cust_bill_pay_pkg (@subapps) {
+ $cust_bill_pay_pkg->billpaypkgnum('');
+ $cust_bill_pay_pkg->billpaynum($new_cust_bill_pay->billpaynum);
+ $error ||= $cust_bill_pay_pkg->insert;
+ }
}
if ( $error ) {
$dbh->rollback if $oldAutoCommit;