summaryrefslogtreecommitdiff
path: root/FS/FS/cust_pay.pm
diff options
context:
space:
mode:
authorMark Wells <mark@freeside.biz>2012-04-23 20:27:17 -0700
committerMark Wells <mark@freeside.biz>2012-04-23 20:27:17 -0700
commit43e6b2ea06434abead940939c9b04e00e3a72f32 (patch)
treec52854f1b28f35a9d7752205b6d811b61c038d3f /FS/FS/cust_pay.pm
parentaa028b1f28a468df2a3d3a5ff03a856bba2c1254 (diff)
manual control of quick payment application, #15861
Diffstat (limited to 'FS/FS/cust_pay.pm')
-rw-r--r--FS/FS/cust_pay.pm42
1 files changed, 32 insertions, 10 deletions
diff --git a/FS/FS/cust_pay.pm b/FS/FS/cust_pay.pm
index ef30809..e15bf01 100644
--- a/FS/FS/cust_pay.pm
+++ b/FS/FS/cust_pay.pm
@@ -760,6 +760,12 @@ objects. Returns a list, each element representing the status of inserting the
corresponding payment - empty. If there is an error inserting any payment, the
entire transaction is rolled back, i.e. all payments are inserted or none are.
+FS::cust_pay objects may have the pseudo-field 'apply_to', containing a
+reference to an array of (uninserted) FS::cust_bill_pay objects. If so,
+those objects will be inserted with the paynum of the payment, and for
+each one, an error message or an empty string will be inserted into the
+list of errors.
+
For example:
my @errors = FS::cust_pay->batch_insert(@cust_pay);
@@ -786,19 +792,35 @@ sub batch_insert {
local $FS::UID::AutoCommit = 0;
my $dbh = dbh;
- my $errors = 0;
+ my $num_errors = 0;
- my @errors = map {
- my $error = $_->insert( 'manual' => 1 );
- if ( $error ) {
- $errors++;
- } else {
- $_->cust_main->apply_payments;
+ my @errors;
+ foreach my $cust_pay (@_) {
+ my $error = $cust_pay->insert( 'manual' => 1 );
+ push @errors, $error;
+ $num_errors++ if $error;
+
+ if ( ref($cust_pay->get('apply_to')) eq 'ARRAY' ) {
+
+ foreach my $cust_bill_pay ( @{ $cust_pay->apply_to } ) {
+ if ( $error ) { # insert placeholders if cust_pay wasn't inserted
+ push @errors, '';
+ }
+ else {
+ $cust_bill_pay->set('paynum', $cust_pay->paynum);
+ my $apply_error = $cust_bill_pay->insert;
+ push @errors, $apply_error || '';
+ $num_errors++ if $apply_error;
+ }
+ }
+
+ } elsif ( !$error ) { #normal case: apply payments as usual
+ $cust_pay->cust_main->apply_payments;
}
- $error;
- } @_;
- if ( $errors ) {
+ }
+
+ if ( $num_errors ) {
$dbh->rollback if $oldAutoCommit;
} else {
$dbh->commit or die $dbh->errstr if $oldAutoCommit;