X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=FS%2FFS%2Fcust_main.pm;h=3fb0a87fb54869a464f900fb87af75ef8f4f7b1e;hb=735f73aec092f56df6289e0fe4f655d57c11f93f;hp=9ba1129e555a51d9300f0c4a070cd026a454b7d8;hpb=47d5558991d119d7b8fbd9e8256a78776af5d585;p=freeside.git diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index 9ba1129e5..3fb0a87fb 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -2174,7 +2174,10 @@ reason and reason_otaker arguments will be taken from those objects. sub cancel_pkgs { my( $self, %opt ) = @_; - my $oldAutoCommit = $FS::UID::AutoCommit; + # we're going to cancel services, which is not reversible + die "cancel_pkgs cannot be run inside a transaction" + if $FS::UID::AutoCommit == 0; + local $FS::UID::AutoCommit = 0; return ( 'access denied' ) @@ -2193,7 +2196,7 @@ sub cancel_pkgs { my $ban = new FS::banned_pay $cust_payby->_new_banned_pay_hashref; my $error = $ban->insert; if ($error) { - dbh->rollback if $oldAutoCommit; + dbh->rollback; return ( $error ); } @@ -2213,13 +2216,16 @@ sub cancel_pkgs { 'time' => $cancel_time ); if ($error) { warn "Error billing during cancel, custnum ". $self->custnum. ": $error"; - dbh->rollback if $oldAutoCommit; + dbh->rollback; return ( "Error billing during cancellation: $error" ); } } + dbh->commit; + $FS::UID::AutoCommit = 1; my @errors; - # now cancel all services, the same way we would for individual packages + # now cancel all services, the same way we would for individual packages. + # if any of them fail, cancel the rest anyway. my @cust_svc = map { $_->cust_svc } @pkgs; my @sorted_cust_svc = map { $_->[0] } @@ -2236,7 +2242,6 @@ sub cancel_pkgs { push @errors, $error if $error; } if (@errors) { - dbh->rollback if $oldAutoCommit; return @errors; } @@ -2259,12 +2264,7 @@ sub cancel_pkgs { push @errors, 'pkgnum '.$_->pkgnum.': '.$error if $error; } - if (@errors) { - dbh->rollback if $oldAutoCommit; - return @errors; - } - - return; + return @errors; } sub _banned_pay_hashref { @@ -4769,15 +4769,10 @@ Returns an SQL expression identifying un-cancelled cust_main records. =cut sub uncancelled_sql { uncancel_sql(@_); } -sub uncancel_sql { " - ( 0 < ( $select_count_pkgs - AND ( cust_pkg.cancel IS NULL - OR cust_pkg.cancel = 0 - ) - ) - OR 0 = ( $select_count_pkgs ) - ) -"; } +sub uncancel_sql { + my $self = shift; + "( NOT (".$self->cancelled_sql.") )"; #sensitive to cust_main-status_module +} =item balance_sql