+ # if we unapplied any payments from line items, also unapply that
+ # amount from the invoice
+ 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{$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;
+ return "Error unapplying payment: $error";
+ }
+ }