[freeside-commits] freeside/FS/FS cust_main.pm,1.533,1.534
Ivan,,,
ivan at wavetail.420.am
Tue Aug 10 23:35:22 PDT 2010
Update of /home/cvs/cvsroot/freeside/FS/FS
In directory wavetail.420.am:/tmp/cvs-serv6692/FS/FS
Modified Files:
cust_main.pm
Log Message:
a better customer delete, RT#9564
Index: cust_main.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/cust_main.pm,v
retrieving revision 1.533
retrieving revision 1.534
diff -u -w -d -r1.533 -r1.534
--- cust_main.pm 11 Aug 2010 00:08:41 -0000 1.533
+++ cust_main.pm 11 Aug 2010 06:35:20 -0000 1.534
@@ -1301,7 +1301,7 @@
}
-=item delete NEW_CUSTNUM
+=item delete [ OPTION => VALUE ... ]
This deletes the customer. If there is an error, returns the error, otherwise
returns false.
@@ -1311,18 +1311,20 @@
customer's packages (see L</cancel>).
If the customer has any uncancelled packages, you need to pass a new (valid)
-customer number for those packages to be transferred to. Cancelled packages
-will be deleted. Did I mention that this is NOT what you want when a customer
-cancels service and that you really should be looking see L<FS::cust_pkg/cancel>?
+customer number for those packages to be transferred to, as the "new_customer"
+option. Cancelled packages will be deleted. Did I mention that this is NOT
+what you want when a customer cancels service and that you really should be
+looking at L<FS::cust_pkg/cancel>?
You can't delete a customer with invoices (see L<FS::cust_bill>),
-or credits (see L<FS::cust_credit>), payments (see L<FS::cust_pay>) or
-refunds (see L<FS::cust_refund>).
+statements (see L<FS::cust_statement>), credits (see L<FS::cust_credit>),
+payments (see L<FS::cust_pay>) or refunds (see L<FS::cust_refund>), unless you
+set the "delete_financials" option to a true value.
=cut
sub delete {
- my $self = shift;
+ my( $self, %opt ) = @_;
local $SIG{HUP} = 'IGNORE';
local $SIG{INT} = 'IGNORE';
@@ -1335,26 +1337,47 @@
local $FS::UID::AutoCommit = 0;
my $dbh = dbh;
- if ( $self->cust_bill ) {
+ if ( qsearch('agent', { 'agent_custnum' => $self->custnum } ) ) {
$dbh->rollback if $oldAutoCommit;
- return "Can't delete a customer with invoices";
+ return "Can't delete a master agent customer";
}
- if ( $self->cust_credit ) {
+
+ #use FS::access_user
+ if ( qsearch('access_user', { 'user_custnum' => $self->custnum } ) ) {
$dbh->rollback if $oldAutoCommit;
- return "Can't delete a customer with credits";
+ return "Can't delete a master employee customer";
}
- if ( $self->cust_pay ) {
+
+ tie my %financial_tables, 'Tie::IxHash',
+ 'cust_bill' => 'invoices',
+ 'cust_statement' => 'statements',
+ 'cust_credit' => 'credits',
+ 'cust_pay' => 'payments',
+ 'cust_refund' => 'refunds',
+ ;
+
+ foreach my $table ( keys %financial_tables ) {
+
+ my @records = $self->$table();
+
+ if ( @records && ! $opt{'delete_financials'} ) {
$dbh->rollback if $oldAutoCommit;
- return "Can't delete a customer with payments";
+ return "Can't delete a customer with ". $financial_tables{$table};
}
- if ( $self->cust_refund ) {
+
+ foreach my $record ( @records ) {
+ my $error = $record->delete;
+ if ( $error ) {
$dbh->rollback if $oldAutoCommit;
- return "Can't delete a customer with refunds";
+ return "Error deleting ". $financial_tables{$table}. ": $error\n";
+ }
+ }
+
}
my @cust_pkg = $self->ncancelled_pkgs;
if ( @cust_pkg ) {
- my $new_custnum = shift;
+ my $new_custnum = $opt{'new_custnum'};
unless ( qsearchs( 'cust_main', { 'custnum' => $new_custnum } ) ) {
$dbh->rollback if $oldAutoCommit;
return "Invalid new customer number: $new_custnum";
@@ -1381,7 +1404,14 @@
}
}
- foreach my $table (qw( cust_main_invoice cust_main_exemption cust_tag )) {
+ #cust_tax_adjustment in financials?
+ #cust_pay_pending? ouch
+ foreach my $table (qw(
+ cust_main_invoice cust_main_exemption cust_tag cust_attachment contact
+ cust_location cust_main_note cust_tax_adjustment
+ cust_pay_void cust_pay_batch queue cust_tax_exempt
+ cust_recon
+ )) {
foreach my $record ( qsearch( $table, { 'custnum' => $self->custnum } ) ) {
my $error = $record->delete;
if ( $error ) {
@@ -1391,6 +1421,19 @@
}
}
+ my $sth = $dbh->prepare(
+ 'UPDATE cust_main SET referral_custnum = NULL WHERE referral_custnum = ?'
+ ) or do {
+ my $errstr = $dbh->errstr;
+ $dbh->rollback if $oldAutoCommit;
+ return $errstr;
+ };
+ $sth->execute($self->custnum) or do {
+ my $errstr = $sth->errstr;
+ $dbh->rollback if $oldAutoCommit;
+ return $errstr;
+ };
+
my $error = $self->SUPER::delete;
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
More information about the freeside-commits
mailing list