usability: customer tags with checkboxes instead of a select-multiple
[freeside.git] / httemplate / edit / process / cust_main.cgi
index a9f7cf4..2cb1648 100755 (executable)
@@ -1,5 +1,15 @@
 % if ( $error ) {
 %   $cgi->param('error', $error);
+%   # workaround for create_uri_query's mangling of unicode characters,
+%   # false laziness with FS::Record::ut_coord
+%   use charnames ':full';
+%   for my $pre (qw(bill ship)) {
+%     foreach (qw( latitude longitude)) {
+%       my $coord = $cgi->param($pre.'_'.$_);
+%       $coord =~ s/\N{DEGREE SIGN}\s*$//;
+%       $cgi->param($pre.'_'.$_, $coord);
+%     }
+%   }
 %   my $query = $m->scomp('/elements/create_uri_query', 'secure'=>1);
 <% $cgi->redirect(popurl(2). "cust_main.cgi?$query" ) %>
 %
@@ -76,8 +86,8 @@ if ( ($cgi->param('same') || '') eq 'Y' ) {
 # but explicitly avoid setting ship_ fields
 
 my $new = new FS::cust_main ( {
-  map { ( $_, scalar($cgi->param($_)) ) } (fields('cust_main')),
-  map { ( "ship_$_", '' ) } (FS::cust_main->location_fields)
+  (map { ( $_, scalar($cgi->param($_)) ) } (fields('cust_main'))),
+  (map { ( "ship_$_", '' ) } (FS::cust_main->location_fields))
 } );
 
 warn Dumper( $new ) if $DEBUG > 1;
@@ -99,7 +109,12 @@ if ( $cgi->param('no_credit_limit') ) {
   $new->setfield('credit_limit', '');
 }
 
-$new->tagnum( [ $cgi->param('tagnum') ] );
+#$new->tagnum( [ $cgi->param('tagnum') ] );
+my $params = $cgi->Vars;
+$new->tagnum( [
+  map { /^tagnum(\d+)/ && $1 }
+    grep { /^tagnum(\d+)/ && $cgi->param($_) } keys %$params
+] );
 
 $error ||= $new->set_national_id_from_cgi( $cgi );
 
@@ -156,24 +171,23 @@ if ( $curuser->access_right('Edit customer tax exemptions') ) {
   };
 }
 
-$options{'contact_params'} = scalar($cgi->Vars);
 $options{'cust_payby_params'} = scalar($cgi->Vars);
 
-my $email;
-
 if ( $cgi->param('residential_commercial') eq 'Residential' ) {
 
-  $email = $cgi->param('invoice_email') || '';
+  my $email = $cgi->param('invoice_email') || '';
   if ( length($email) == 0 and $conf->exists('cust_main-require_invoicing_list_email', $agentnum) ) {
     $error = 'Email address required';
   }
 
+  $options{'invoicing_list'} = [ split(/\s*,\s*/, $email) ];
   # XXX really should include the phone numbers in here also
 
 } else {
 
-  # contact UI is enabled; everything will be passed through via
-  # contact_params
+  # contact UI is enabled
+  $options{'contact_params'} = scalar($cgi->Vars);
+
   if ($conf->exists('cust_main-require_invoicing_list_email', $agentnum)) {
     my $has_email = 0;
     foreach my $prefix (grep /^contactnum\d+$/, $cgi->param) {
@@ -189,6 +203,15 @@ if ( $cgi->param('residential_commercial') eq 'Residential' ) {
 
 }
 
+# kind of a hack, but some tax data vendors require a status and others
+# don't.
+my $vendor = $conf->config('tax_data_vendor');
+if ( $vendor eq 'avalara' or $vendor eq 'suretax' ) {
+  if ( ! $cgi->param('taxstatusnum') ) {
+    $error ||= 'Tax status required';
+  }
+}
+
 #perhaps this stuff should go to cust_main.pm
 if ( $new->custnum eq '' or $duplicate_of ) {
 
@@ -296,7 +319,6 @@ if ( $new->custnum eq '' or $duplicate_of ) {
   else {
     # create the customer
     $error ||= $new->insert( \%hash,
-                             [ $email ],
                              %options,
                              prospectnum => scalar($cgi->param('prospectnum')),
                            );
@@ -334,9 +356,9 @@ if ( $new->custnum eq '' or $duplicate_of ) {
   local($FS::Record::DEBUG)    = $DEBUG if $DEBUG;
 
   local($Data::Dumper::Sortkeys) = 1;
-  warn Dumper({ new => $new, old => $old }) if $DEBUG;
+  warn Dumper({ new => $new, old => $old, options => \%options}) if $DEBUG;
 
-  $error ||= $new->replace( $old, [ $email ], %options );
+  $error ||= $new->replace( $old, %options );
 
   warn "$me returned from replace" if $DEBUG;