diff options
| author | Mark Wells <mark@freeside.biz> | 2016-07-20 09:43:38 -0700 |
|---|---|---|
| committer | Christopher Burger <burgerc@freeside.biz> | 2018-11-21 12:45:53 -0500 |
| commit | 58dfeb5412c54d676119d1c6b8a9ff7edde7e234 (patch) | |
| tree | 8617663945c8a4425baeea90b874a628dea62c0e /FS | |
| parent | b75b481f255cbe08d8e6e6768924a68af4e15f82 (diff) | |
when canceling services across multiple packages, transaction-protect each one separately, from #37177
Conflicts:
FS/FS/cust_main.pm
Diffstat (limited to 'FS')
| -rw-r--r-- | FS/FS/cust_main.pm | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index 88dd0e54b..d0d85b93a 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -34,6 +34,7 @@ use Date::Format; use File::Temp; #qw( tempfile ); use Email::Address; use Business::CreditCard 0.28; +use Try::Tiny; use FS::UID qw( getotaker dbh driver_name ); use FS::Record qw( qsearchs qsearch dbdef regexp_sql ); use FS::Misc qw( generate_email send_email generate_ps do_print money_pretty card_types ); @@ -2495,10 +2496,9 @@ sub cancel_pkgs { } dbh->commit; - $FS::UID::AutoCommit = 1; my @errors; - # now cancel all services, the same way we would for individual packages. - # if any of them fail, cancel the rest anyway. + # try to cancel each service, the same way we would for individual packages, + # but in cancel weight order. my @cust_svc = map { $_->cust_svc } @pkgs; my @sorted_cust_svc = map { $_->[0] } @@ -2511,8 +2511,15 @@ sub cancel_pkgs { foreach my $cust_svc (@sorted_cust_svc) { my $part_svc = $cust_svc->part_svc; next if ( defined($part_svc) and $part_svc->preserve ); - my $error = $cust_svc->cancel; # immediate cancel, no date option - push @errors, $error if $error; + # immediate cancel, no date option + # transactionize individually + my $error = try { $cust_svc->cancel } catch { $_ }; + if ( $error ) { + dbh->rollback; + push @errors, $error; + } else { + dbh->commit; + } } if (@errors) { return @errors; @@ -2540,7 +2547,12 @@ sub cancel_pkgs { } } my $error = $_->cancel(%lopt); - push @errors, 'pkgnum '.$_->pkgnum.': '.$error if $error; + if ( $error ) { + dbh->rollback; + push @errors, 'pkgnum '.$_->pkgnum.': '.$error; + } else { + dbh->commit; + } } return @errors; |
