=item night - phone (optional)
+=item fax - phone (optional)
+
=item payby - `CARD' (credit cards), `BILL' (billing), or `COMP' (free)
=item payinfo - card number, P.O.#, or comp issuer (4-8 lowercase alphanumerics; think username)
Adds this customer to the database. If there is an error, returns the error,
otherwise returns false.
-=item delete
+=item delete NEW_CUSTNUM
+
+This deletes the customer. If there is an error, returns the error, otherwise
+returns false.
-Currently unimplemented. Maybe cancel all of this customer's
-packages (cust_pkg)?
+This will completely remove all traces of the customer record. This is not
+what you want when a customer cancels service; for that, cancel all of the
+customer's packages (see L<FS::cust_pkg/cancel>).
-I don't remove the customer record in the database because there would then
-be no record the customer ever existed (which is bad, no?)
+If the customer has any packages, you need to pass a new (valid) customer
+number for those packages to be transferred to.
+
+You can't delete a customer with invoices (see L<FS::cust_bill>),
+or credits (see L<FS::cust_credit>).
=cut
sub delete {
- return "Can't (yet?) delete customers.";
+ my $self = shift;
+
+ if ( qsearch( 'cust_bill', { 'custnum' => $self->custnum } ) ) {
+ return "Can't delete a customer with invoices";
+ }
+ if ( qsearch( 'cust_credit', { 'custnum' => $self->custnum } ) ) {
+ return "Can't delete a customer with credits";
+ }
+
+ local $SIG{HUP} = 'IGNORE';
+ local $SIG{INT} = 'IGNORE';
+ local $SIG{QUIT} = 'IGNORE';
+ local $SIG{TERM} = 'IGNORE';
+ local $SIG{TSTP} = 'IGNORE';
+ local $SIG{PIPE} = 'IGNORE';
+
+ my @cust_pkg = qsearch( 'cust_pkg', { 'custnum' => $self->custnum } );
+ if ( @cust_pkg ) {
+ my $new_custnum = shift;
+ return "Invalid new customer number: $new_custnum"
+ unless qsearchs( 'cust_main', { 'custnum' => $new_custnum } );
+ foreach my $cust_pkg ( @cust_pkg ) {
+ my %hash = $cust_pkg->hash;
+ $hash{'custnum'} = $new_custnum;
+ my $new_cust_pkg = new FS::cust_pkg ( \%hash );
+ my $error = $new_cust_pkg->replace($cust_pkg);
+ return $error if $error;
+ }
+ }
+ foreach my $cust_main_invoice (
+ qsearch( 'cust_main_invoice', { 'custnum' => $self->custnum } )
+ ) {
+ my $error = $cust_main_invoice->delete;
+ return $error if $error;
+ }
+
+ $self->SUPER::delete;
}
=item replace OLD_RECORD
|| $self->ut_textn('address2')
|| $self->ut_text('city')
|| $self->ut_textn('county')
- || $self->ut_text('state')
+ || $self->ut_textn('state')
|| $self->ut_phonen('daytime')
|| $self->ut_phonen('night')
|| $self->ut_phonen('fax')
return "Unknown referral"
unless qsearchs( 'part_referral', { 'refnum' => $self->refnum } );
- $self->getfield('last') =~ /^([\w \,\.\-\']+)$/ or return "Illegal last name";
+ $self->getfield('last') =~ /^([\w \,\.\-\']+)$/
+ or return "Illegal last name: ". $self->getfield('last');
$self->setfield('last',$1);
- $self->first =~ /^([\w \,\.\-\']+)$/ or return "Illegal first name";
+ $self->first =~ /^([\w \,\.\-\']+)$/
+ or return "Illegal first name: ". $self->first;
$self->first($1);
if ( $self->ss eq '' ) {
my $ss = $self->ss;
$ss =~ s/\D//g;
$ss =~ /^(\d{3})(\d{2})(\d{4})$/
- or return "Illegal social security number";
+ or return "Illegal social security number: ". $self->ss;
$self->ss("$1-$2-$3");
}
- $self->country =~ /^(\w\w)$/ or return "Illegal country";
+ $self->country =~ /^(\w\w)$/ or return "Illegal country: ". $self->country;
$self->country($1);
unless ( qsearchs('cust_main_county', {
'country' => $self->country,
'state' => '',
} ) ) {
- return "Unknown state/county/country"
- #" state ". $self->state. " county ". $self->county. " country ". $self->country
+ return "Unknown state/county/country: ".
+ $self->state. "/". $self->county. "/". $self->country
unless qsearchs('cust_main_county',{
'state' => $self->state,
'county' => $self->county,
} );
}
- $self->zip =~ /^\s*(\w[\w\-\s]{3,8}\w)\s*$/ or return "Illegal zip";
+ $self->zip =~ /^\s*(\w[\w\-\s]{3,8}\w)\s*$/
+ or return "Illegal zip: ". $self->zip;
$self->zip($1);
- $self->payby =~ /^(CARD|BILL|COMP)$/ or return "Illegal payby: ". $self->payby;
+ $self->payby =~ /^(CARD|BILL|COMP)$/
+ or return "Illegal payby: ". $self->payby;
$self->payby($1);
if ( $self->payby eq 'CARD' ) {
my $payinfo = $self->payinfo;
$payinfo =~ s/\D//g;
$payinfo =~ /^(\d{13,16})$/
- or return "Illegal credit card number";
+ or return "Illegal credit card number: ". $self->payinfo;
$payinfo = $1;
$self->payinfo($payinfo);
- validate($payinfo) or return "Illegal credit card number";
+ validate($payinfo)
+ or return "Illegal credit card number: ". $self->payinfo;
return "Unknown card type" if cardtype($self->payinfo) eq "Unknown";
} elsif ( $self->payby eq 'BILL' ) {
$error = $self->ut_textn('payinfo');
- return "Illegal P.O. number" if $error;
+ return "Illegal P.O. number: ". $self->payinfo if $error;
} elsif ( $self->payby eq 'COMP' ) {
$error = $self->ut_textn('payinfo');
- return "Illegal comp account issuer" if $error;
+ return "Illegal comp account issuer: ". $self->payinfo if $error;
}
$self->paydate('');
} else {
$self->paydate =~ /^(\d{1,2})[\/\-](\d{2}(\d{2})?)$/
- or return "Illegal expiration date";
+ or return "Illegal expiration date: ". $self->paydate;
if ( length($2) == 4 ) {
$self->paydate("$2-$1-01");
} elsif ( $2 > 97 ) { #should pry change to check for "this year"
$self->payname( $self->first. " ". $self->getfield('last') );
} else {
$self->payname =~ /^([\w \,\.\-\']+)$/
- or return "Illegal billing name";
+ or return "Illegal billing name: ". $self->payname;
$self->payname($1);
}
- $self->tax =~ /^(Y?)$/ or return "Illegal tax";
+ $self->tax =~ /^(Y?)$/ or return "Illegal tax: ". $self->tax;
$self->tax($1);
$self->otaker(getotaker);
} else { #batch card
- my $cust_pay_batch = new FS::Record ('cust_pay_batch', {
+ my $cust_pay_batch = new FS::cust_pay_batch ( {
'invnum' => $cust_bill->getfield('invnum'),
'custnum' => $self->getfield('custnum'),
'last' => $self->getfield('last'),
=head1 VERSION
-$Id: cust_main.pm,v 1.17 1999-04-10 05:27:38 ivan Exp $
+$Id: cust_main.pm,v 1.24 1999-07-20 10:37:05 ivan Exp $
=head1 BUGS
The delete method.
+The delete method should possibly take an FS::cust_main object reference
+instead of a scalar customer number.
+
Bill and collect options should probably be passed as references instead of a
list.
FS::UID::{datasrc,checkruid} ivan@sisd.com 98-sep-19-21
$Log: cust_main.pm,v $
-Revision 1.17 1999-04-10 05:27:38 ivan
+Revision 1.24 1999-07-20 10:37:05 ivan
+cleaned up the new one-screen signup bits in htdocs/edit/cust_main.cgi to
+prepare for a signup server
+
+Revision 1.23 1999/07/17 02:24:14 ivan
+bug noticed by Steve Gertz <sglist@hollywood.mwis.net>
+
+Revision 1.22 1999/04/15 16:44:36 ivan
+delete customers
+
+Revision 1.21 1999/04/14 07:47:53 ivan
+i18n fixes
+
+Revision 1.20 1999/04/10 08:35:14 ivan
+say what the unknown state/county/country are!
+
+Revision 1.19 1999/04/10 07:38:06 ivan
+_all_ check stuff with illegal data return the bad data too, to help debugging
+
+Revision 1.18 1999/04/10 06:54:11 ivan
+ditto
+
+Revision 1.17 1999/04/10 05:27:38 ivan
display an illegal payby, to assist importing
Revision 1.16 1999/04/07 14:32:19 ivan