% if ( $error ) {
% $cgi->param('error', $error);
-%
-<% $cgi->redirect(popurl(2). "cust_main.cgi?". $cgi->query_string ) %>
+% my $query = $m->scomp('/elements/create_uri_query', 'secure'=>1);
+<% $cgi->redirect(popurl(2). "cust_main.cgi?$query" ) %>
%
% } else {
%
</%once>
<%init>
-die "access denied"
- unless $FS::CurrentUser::CurrentUser->access_right('Edit customer');
+my $curuser = $FS::CurrentUser::CurrentUser;
+die "access denied" unless $curuser->access_right('Edit customer');
my $conf = new FS::Conf;
if ( $payby ) {
if ( $payby eq 'CHEK' || $payby eq 'DCHK' ) {
- $cgi->param('payinfo',
- $cgi->param('payinfo1'). '@'. $cgi->param('payinfo2') );
+ my $payinfo = $cgi->param('payinfo1'). '@';
+ $payinfo .= $cgi->param('payinfo3').'.'
+ if $conf->config('echeck-country') eq 'CA';
+ $payinfo .= $cgi->param('payinfo2');
+ $cgi->param('payinfo',$payinfo);
}
$cgi->param('paydate',
$cgi->param( 'exp_month' ). '-'. $cgi->param( 'exp_year' ) );
push @invoicing_list, 'FAX' if $cgi->param('invoicing_list_FAX');
$cgi->param('invoicing_list', join(',', @invoicing_list) );
+# is this actually used? if so, we need to clone locations...
+# but I can't find anything that sets this parameter to a non-empty value
+# yes, fec48523d3cf056da08813f9b2b7d633b27aaf8d for #16582 is where it came in,
+# for "duplicate address checking for new customers". afaict still in
+# edit/cust_main/bottomfixup.html (and working?)
+$cgi->param('duplicate_of_custnum') =~ /^(\d+)$/;
+my $duplicate_of = $1;
+
+# if this is enabled, enforce it
+if ( $conf->exists('agent-ship_address', $cgi->param('agentnum')) ) {
+ my $agent = FS::agent->by_key($cgi->param('agentnum'));
+ my $agent_cust_main = $agent->agent_cust_main;
+ if ( $agent_cust_main ) {
+ my $agent_location = $agent_cust_main->ship_location;
+ foreach (qw(address1 city state zip country latitude longitude district)) {
+ $cgi->param("ship_$_", $agent_location->get($_));
+ }
+ }
+}
+
+my %locations;
+for my $pre (qw(bill ship)) {
+
+ my %hash;
+ foreach ( FS::cust_main->location_fields ) {
+ $hash{$_} = scalar($cgi->param($pre.'_'.$_));
+ }
+ $hash{'custnum'} = $cgi->param('custnum');
+ warn Dumper \%hash if $DEBUG;
+ $locations{$pre} = FS::cust_location->new(\%hash);
+}
+
+if ( ($cgi->param('same') || '') eq 'Y' ) {
+ $locations{ship} = $locations{bill};
+}
#create new record object
+# but explicitly avoid setting ship_ fields
my $new = new FS::cust_main ( {
- map {
- $_, scalar($cgi->param($_))
-# } qw(custnum agentnum last first ss company address1 address2 city county
-# state zip daytime night fax payby payinfo paydate payname tax
-# otaker refnum)
- } fields('cust_main')
+ map { ( $_, scalar($cgi->param($_)) ) } (fields('cust_main')),
+ map { ( "ship_$_", '' ) } (FS::cust_main->location_fields)
} );
-if ( defined($cgi->param('same')) && $cgi->param('same') eq "Y" ) {
- $new->setfield("ship_$_", '') foreach qw(
- last first company address1 address2 city county state zip
- country daytime night fax
- );
+$new->invoice_noemail( ($cgi->param('invoice_email') eq 'Y') ? '' : 'Y' );
+
+if ( $duplicate_of ) {
+ # then negate all changes to the customer; the only change we should
+ # make is to order a package, if requested
+ $new = qsearchs('cust_main', { 'custnum' => $duplicate_of })
+ # this should never happen
+ or die "nonexistent existing customer (custnum $duplicate_of)";
+}
+
+for my $pre (qw(bill ship)) {
+ $new->set($pre.'_location', $locations{$pre});
+ $new->set($pre.'_locationnum', $locations{$pre}->locationnum);
}
if ( $cgi->param('no_credit_limit') ) {
$new->tagnum( [ $cgi->param('tagnum') ] );
-my %usedatetime = ( 'birthdate' => 1 );
+$error ||= $new->set_national_id_from_cgi( $cgi );
+
+my %usedatetime = ( 'birthdate' => 1,
+ 'spouse_birthdate' => 1,
+ 'anniversary_date' => 1,
+ );
-foreach my $dfield (qw( birthdate signupdate )) {
+foreach my $dfield (qw(
+ signupdate birthdate spouse_birthdate anniversary_date
+)) {
if ( $cgi->param($dfield) && $cgi->param($dfield) =~ /^([ 0-9\-\/]{0,10})$/) {
if ( $dt ) {
$parsed = $dt->epoch;
} else {
- # $error ||= $cgi->param('birthdate') . " is an invalid birthdate:" . $parser->errmsg;
$error ||= "Invalid $dfield: $value";
}
$new->setfield('paid', $cgi->param('paid') )
if $cgi->param('paid');
-my @exempt_groups = grep /\S/, $conf->config('tax-cust_exempt-groups');
-my @tax_exempt = grep { $cgi->param("tax_$_") eq 'Y' } @exempt_groups;
+my %options = ();
+if ( $curuser->access_right('Edit customer tax exemptions') ) {
+ my @exempt_groups = grep /\S/, $conf->config('tax-cust_exempt-groups');
+ my @tax_exempt = grep { $cgi->param("tax_$_") eq 'Y' } @exempt_groups;
+ $options{'tax_exemption'} = {
+ map { $_ => scalar($cgi->param("tax_$_".'_num')) } @tax_exempt
+ };
+}
#perhaps this stuff should go to cust_main.pm
-if ( $new->custnum eq '' ) {
+if ( $new->custnum eq '' or $duplicate_of ) {
my $cust_pkg = '';
my $svc;
#later 'custnum' => $custnum,
'pkgpart' => $pkgpart,
'locationnum' => scalar($cgi->param('locationnum')),
+ 'salesnum' => scalar($cgi->param('salesnum')),
} );
- #$error ||= $cust_pkg->check;
-
- #$cust_svc = new FS::cust_svc ( { 'svcpart' => $svcpart } );
- #$error ||= $cust_svc->check;
my $part_svc = qsearchs('part_svc', { 'svcpart' => $svcpart } );
my $svcdb = $part_svc->svcdb;
die "$svcdb not handled on new customer yet";
}
- #$error ||= $svc_acct->check;
-
}
+
use Tie::RefHash;
tie my %hash, 'Tie::RefHash';
%hash = ( $cust_pkg => [ $svc ] ) if $cust_pkg;
- $error ||= $new->insert( \%hash, \@invoicing_list,
- 'tax_exemption'=> \@tax_exempt,
- 'prospectnum' => scalar($cgi->param('prospectnum')),
- );
+ if ( $duplicate_of ) {
+ # order the package and service normally
+ $error ||= $new->order_pkgs( \%hash ) if $cust_pkg;
+ }
+ else {
+ # create the customer
+ $error ||= $new->insert( \%hash, \@invoicing_list,
+ %options,
+ prospectnum => scalar($cgi->param('prospectnum')),
+ );
- my $conf = new FS::Conf;
- if ( $conf->exists('backend-realtime') && ! $error ) {
+ my $conf = new FS::Conf;
+ if ( $conf->exists('backend-realtime') && ! $error ) {
- my $berror = $new->bill
- || $new->apply_payments_and_credits
- || $new->collect( 'realtime' => 1 );
- warn "Warning, error billing during backend-realtime: $berror" if $berror;
+ my $berror = $new->bill
+ || $new->apply_payments_and_credits
+ || $new->collect( 'realtime' => 1 );
+ warn "Warning, error billing during backend-realtime: $berror" if $berror;
- }
+ }
+ } #if $duplicate_of
} else { #create old record object
my $old = qsearchs( 'cust_main', { 'custnum' => $new->custnum } );
$error ||= "Old record not found!" unless $old;
+
if ( length($old->paycvv) && $new->paycvv =~ /^\s*\*+\s*$/ ) {
$new->paycvv($old->paycvv);
}
if ($new->stateid =~ /^xxx/) {
$new->stateid($old->stateid);
}
- if ($new->payby =~ /^(CARD|DCRD)$/ && $new->payinfo =~ /xx/) {
+ if ( $new->payby =~ /^(CARD|DCRD)$/
+ && ( $new->payinfo =~ /xx/
+ || $new->payinfo =~ /^\s*N\/A\s+\(tokenized\)\s*$/
+ )
+ )
+ {
$new->payinfo($old->payinfo);
- } elsif ($new->payby =~ /^(CHEK|DCHK)$/ && $new->payinfo =~ /xx/) {
+
+ } elsif ( $new->payby =~ /^(CHEK|DCHK)$/ && $new->payinfo =~ /xx/ ) {
#fix for #3085 "edit of customer's routing code only surprisingly causes
#nothing to happen...
# this probably won't do the right thing when we don't have the
local($FS::cust_main::DEBUG) = $DEBUG if $DEBUG;
local($FS::Record::DEBUG) = $DEBUG if $DEBUG;
+ local($Data::Dumper::Sortkeys) = 1;
+ warn Dumper({ new => $new, old => $old }) if $DEBUG;
+
$error ||= $new->replace( $old, \@invoicing_list,
- 'tax_exemption' => \@tax_exempt,
+ %options,
);
warn "$me returned from replace" if $DEBUG;
}
+unless ( $error ) { #XXX i should be transactional... all in the insert
+ # or replace call
+
+ $error = $new->process_o2m( 'table' => 'contact',
+ 'fields' => FS::contact->cgi_contact_fields,
+ 'params' => scalar($cgi->Vars),
+ );
+}
+
</%init>