optimize CDR rating after timed rate perf regression, RT#15739
[freeside.git] / httemplate / edit / cust_main.cgi
index 7308c72..e823f7c 100755 (executable)
@@ -1,22 +1,21 @@
-<% include('/elements/header.html',
-      "Customer $action",
+<& /elements/header.html,
+      $title,
       '',
       ' onUnload="myclose()"' #hmm, in billing.html
-) %>
+&>
 
-<% include('/elements/error.html') %>
+<& /elements/error.html &>
 
 <FORM NAME   = "CustomerForm"
       METHOD = "POST"
       ACTION = "<% popurl(1) %>process/cust_main.cgi"
-%#      STYLE = "margin-bottom: 0"
-%#      STYLE="margin-top: 0; margin-bottom: 0">
 >
 
-<INPUT TYPE="hidden" NAME="custnum" VALUE="<% $custnum %>">
+<INPUT TYPE="hidden" NAME="custnum"     VALUE="<% $custnum %>">
+<INPUT TYPE="hidden" NAME="prospectnum" VALUE="<% $prospectnum %>">
 
 % if ( $custnum ) { 
-  Customer #<B><% $cust_main->display_custnum %></B> - 
+  <% mt('Customer #') |h %><B><% $cust_main->display_custnum %></B> - 
   <B><FONT COLOR="#<% $cust_main->statuscolor %>">
     <% ucfirst($cust_main->status) %>
   </FONT></B>
 % } 
 
 %# agent, agent_custid, refnum (advertising source), referral_custnum
-<% include('cust_main/top_misc.html', $cust_main, 'custnum' => $custnum ) %>
+<& cust_main/top_misc.html, $cust_main, 'custnum' => $custnum  &>
 
 %# birthdate
 % if ( $conf->exists('cust_main-enable_birthdate') ) {
   <BR>
-  <% include('cust_main/birthdate.html', $cust_main) %>
+  <& cust_main/birthdate.html, $cust_main &>
+% }
+
+%# latitude and longitude
+% if ( $conf->exists('cust_main-require_censustract') ) {
+%   my ($latitude, $longitude) = $cust_main->service_coordinates;
+%   $latitude ||= $conf->config('company_latitude') || '';
+%   $longitude ||= $conf->config('company_longitude') || '';
+  <INPUT NAME="latitude" TYPE="hidden" VALUE="<% $latitude |h %>">
+  <INPUT NAME="longitude" TYPE="hidden" VALUE="<% $longitude |h %>">
 % }
 
 %# contact info
 
 %  my $same_checked = '';
 %  my $ship_disabled = '';
+%  my @ship_style = ();
 %  unless ( $cust_main->ship_last && $same ne 'Y' ) {
 %    $same_checked = 'CHECKED';
-%    $ship_disabled = 'DISABLED STYLE="background-color: #dddddd"';
+%    $ship_disabled = 'DISABLED';
+%    push @ship_style, 'background-color:#dddddd';
 %    foreach (
 %      qw( last first company address1 address2 city county state zip country
-%          daytime night fax )
+%          latitude longitude coord_auto
+%          daytime night fax mobile )
 %    ) {
 %      $cust_main->set("ship_$_", $cust_main->get($_) );
 %    }
 %  }
 
-<BR><BR>
-<FONT SIZE="+1"><B>Billing address</B></FONT>
+<BR>
+<FONT SIZE="+1"><B><% mt('Billing address') |h %></B></FONT>
 
-<% include('cust_main/contact.html',
+<& cust_main/contact.html,
              'cust_main'    => $cust_main,
              'pre'          => '',
              'onchange'     => 'bill_changed(this)',
              'ss'           => $ss,
              'stateid'      => $stateid,
              'same_checked' => $same_checked, #for address2 "Unit #" labeling
-          )
-%>
+&>
 
 <SCRIPT>
 function bill_changed(what) {
   if ( what.form.same.checked ) {
-% for (qw( last first company address1 address2 city zip daytime night fax )) { 
-
+% for (qw( last first company address1 address2 city zip latitude longitude coord_auto daytime night fax mobile )) { 
     what.form.ship_<%$_%>.value = what.form.<%$_%>.value;
 % } 
 
     what.form.ship_country.selectedIndex = what.form.country.selectedIndex;
 
+    function fix_ship_city() {
+      what.form.ship_city_select.selectedIndex = what.form.city_select.selectedIndex;
+      what.form.ship_city.style.display = what.form.city.style.display;
+      what.form.ship_city_select.style.display = what.form.city_select.style.display;
+    }
+
     function fix_ship_county() {
       what.form.ship_county.selectedIndex = what.form.county.selectedIndex;
+      ship_county_changed(what.form.ship_county, fix_ship_city );
     }
 
     function fix_ship_state() {
@@ -88,7 +104,8 @@ function samechanged(what) {
   if ( what.checked ) {
     bill_changed(what);
 
-%   for (qw( last first company address1 address2 city county state zip country daytime night fax )) { 
+%   my @fields = qw( last first company address1 address2 city city_select county state zip country latitude longitude daytime night fax mobile );
+%   for (@fields) { 
       what.form.ship_<%$_%>.disabled = true;
       what.form.ship_<%$_%>.style.backgroundColor = '#dddddd';
 %   } 
@@ -102,7 +119,7 @@ function samechanged(what) {
 
   } else {
 
-%   for (qw( last first company address1 address2 city county state zip country daytime night fax )) { 
+%   for (@fields) { 
       what.form.ship_<%$_%>.disabled = false;
       what.form.ship_<%$_%>.style.backgroundColor = '#ffffff';
 %   } 
@@ -119,28 +136,27 @@ function samechanged(what) {
 </SCRIPT>
 
 <BR>
-<FONT SIZE="+1"><B>Service address</B></FONT>
+<FONT SIZE="+1"><B><% mt('Service address') |h %></B></FONT>
 
-(<INPUT TYPE="checkbox" NAME="same" VALUE="Y" onClick="samechanged(this)" <%$same_checked%>>same as billing address)
-<% include('cust_main/contact.html',
+(<INPUT TYPE="checkbox" NAME="same" VALUE="Y" onClick="samechanged(this)" <%$same_checked%>><% mt('same as billing address') |h %>)
+<& cust_main/contact.html,
              'cust_main' => $cust_main,
              'pre'       => 'ship_',
              'onchange'  => '',
              'disabled'  => $ship_disabled,
-          )
-%>
+             'style'     => \@ship_style
+&>
 
 %# billing info
-<% include( 'cust_main/billing.html', $cust_main,
+<& cust_main/billing.html, $cust_main,
                'payinfo'        => $payinfo,
                'invoicing_list' => \@invoicing_list,
-           )
-%>
+&>
 
 % my $ro_comments = $conf->exists('cust_main-use_comments')?'':'readonly';
 % if (!$ro_comments || $cust_main->comments) {
 
-    <BR>Comments
+    <BR><% mt('Comments') |h %> 
     <% &ntable("#cccccc") %>
       <TR>
         <TD>
@@ -158,24 +174,28 @@ function samechanged(what) {
 
 % unless ( $custnum ) {
 
-    <% include('cust_main/first_pkg.html', $cust_main,
+    <& cust_main/first_pkg.html, $cust_main,
                  'pkgpart_svcpart' => $pkgpart_svcpart,
-                 #svc_acct
+                 'disable_empty'   =>
+                   scalar( $cgi->param('lock_pkgpart') =~ /^(\d+)$/ ),
                  'username'        => $username,
                  'password'        => $password,
                  'popnum'          => $popnum,
                  'saved_domsvc'    => $saved_domsvc,
                  %svc_phone,
-              )
-    %>
+                 %svc_dsl,
+    &>
 
 % }
 
-<INPUT TYPE="hidden" NAME="otaker" VALUE="<% $cust_main->otaker %>">
+<INPUT TYPE="hidden" NAME="locationnum" VALUE="<% $locationnum %>">
+
+<INPUT TYPE="hidden" NAME="usernum" VALUE="<% $cust_main->usernum %>">
 
+%# cust_main/bottomfixup.js
 % foreach my $hidden (
-%    'payauto',
-%    'payinfo', 'payinfo1', 'payinfo2', 'paytype',
+%    'payauto', 'billday',
+%    'payinfo', 'payinfo1', 'payinfo2', 'payinfo3', 'paytype',
 %    'payname', 'paystate', 'exp_month', 'exp_year', 'paycvv',
 %    'paystart_month', 'paystart_year', 'payissue',
 %    'payip',
@@ -184,23 +204,27 @@ function samechanged(what) {
     <INPUT TYPE="hidden" NAME="<% $hidden %>" VALUE="">
 % } 
 
-<% include('cust_main/bottomfixup.html') %>
+<& cust_main/bottomfixup.html &>
 
 <BR>
 <INPUT TYPE    = "button"
        NAME    = "submitButton"
        ID      = "submitButton"
-       VALUE   = "<% $custnum ?  "Apply Changes" : "Add Customer" %>"
+       VALUE   = "<% $custnum ?  emt("Apply changes") : emt("Add Customer") %>"
        onClick = "this.disabled=true; bottomfixup(this.form);"
 >
 </FORM>
 
-<% include('/elements/footer.html') %>
+<& /elements/footer.html &>
 
 <%init>
 
+my $curuser = $FS::CurrentUser::CurrentUser;
+
+#probably redundant given the checks below...
 die "access denied"
-  unless $FS::CurrentUser::CurrentUser->access_right('Edit customer');
+  unless $curuser->access_right('New customer')
+     ||  $curuser->access_right('Edit customer');
 
 my $conf = new FS::Conf;
 
@@ -211,6 +235,9 @@ my $same = '';
 my $pkgpart_svcpart = ''; #first_pkg
 my($username, $password, $popnum, $saved_domsvc) = ( '', '', 0, 0 ); #svc_acct
 my %svc_phone = ();
+my %svc_dsl = ();
+my $prospectnum = '';
+my $locationnum = '';
 
 if ( $cgi->param('error') ) {
 
@@ -219,6 +246,10 @@ if ( $cgi->param('error') ) {
   } );
 
   $custnum = $cust_main->custnum;
+
+  die "access denied"
+    unless $curuser->access_right($custnum ? 'Edit customer' : 'New customer');
+
   @invoicing_list = split( /\s*,\s*/, $cgi->param('invoicing_list') );
   $same = $cgi->param('same');
   $cust_main->setfield('paid' => $cgi->param('paid')) if $cgi->param('paid');
@@ -226,8 +257,12 @@ if ( $cgi->param('error') ) {
   $stateid = $cust_main->stateid; # don't mask an entered value on errors
   $payinfo = $cust_main->payinfo; # don't mask an entered value on errors
 
+  $prospectnum = $cgi->param('prospectnum') || '';
+
   $pkgpart_svcpart = $cgi->param('pkgpart_svcpart') || '';
 
+  $locationnum = $cgi->param('locationnum') || '';
+
   #svc_acct
   $username = $cgi->param('username');
   $password = $cgi->param('_password');
@@ -243,8 +278,15 @@ if ( $cgi->param('error') ) {
   $svc_phone{$_} = $cgi->param($_)
     foreach qw( countrycode phonenum sip_password pin phone_name );
 
+  #svc_dsl (phonenum came in with svc_phone)
+  $svc_phone{$_} = $cgi->param($_)
+    foreach qw( password isp_chg isp_prev vendor_qual_id );
+
 } elsif ( $cgi->keywords ) { #editing
 
+  die "access denied"
+    unless $curuser->access_right('Edit customer');
+
   my( $query ) = $cgi->keywords;
   $query =~ /^(\d+)$/;
   $custnum=$1;
@@ -262,8 +304,13 @@ if ( $cgi->param('error') ) {
 
 } else { #new customer
 
+  die "access denied"
+    unless $curuser->access_right('New customer');
+
   $custnum='';
   $cust_main = new FS::cust_main ( {} );
+  $cust_main->agentnum( $conf->config('default_agentnum') )
+    if $conf->exists('default_agentnum');
   $cust_main->otaker( &getotaker );
   $cust_main->referral_custnum( $cgi->param('referral_custnum') );
   @invoicing_list = ();
@@ -273,14 +320,57 @@ if ( $cgi->param('error') ) {
   $stateid = '';
   $payinfo = '';
 
+  if ( $cgi->param('qualnum') =~ /^(\d+)$/ ) {
+    my $qualnum = $1;
+    my $qual = qsearchs('qual', { 'qualnum' => $qualnum } )
+      or die "unknown qualnum $qualnum";
+
+    my $prospect_main = $qual->cust_or_prospect;
+    $prospectnum = $prospect_main->prospectnum
+      or die "qualification not on a prospect";
+
+    $cust_main->agentnum( $prospect_main->agentnum );
+    $cust_main->company(  $prospect_main->company  );
+
+    #first contact? -> name
+    my @contacts = $prospect_main->contact;
+    my $contact = $contacts[0];
+    $cust_main->first( $contact->first );
+    $cust_main->set( 'last', $contact->get('last') );
+    #contact phone numbers?
+
+    #location -> address  (all prospect quals have location, right?)
+    my $cust_location = $qual->cust_location;
+    $cust_location->dealternize;
+    $cust_main->$_( $cust_location->$_ )
+      foreach qw( address1 address2 city county state zip country latitude longitude coord_auto geocode );
+
+    #locationnum -> package order
+    $locationnum = $qual->locationnum;
+
+    #pkgpart handled by lock_pkgpart below
+
+    #service telephone & vendor_qual_id -> svc_dsl
+    $svc_dsl{$_} = $qual->$_
+      foreach qw( phonenum vendor_qual_id );
+  }
+
+  if ( $cgi->param('lock_pkgpart') =~ /^(\d+)$/ ) {
+    my $pkgpart = $1;
+    my $part_pkg = qsearchs('part_pkg', { 'pkgpart' => $pkgpart } )
+      or die "unknown pkgpart $pkgpart";
+    my $svcpart = $part_pkg->svcpart;
+    $pkgpart_svcpart = $pkgpart.'_'.$svcpart;
+  }
+
 }
 
-my $error = $cgi->param('error');
-$cgi->delete_all();
-$cgi->param('error', $error);
+my %keep = map { $_=>1 } qw( error tagnum lock_agentnum lock_pkgpart );
+$cgi->delete( grep !$keep{$_}, $cgi->param );
 
-my $action = $custnum ? 'Edit' : 'Add';
-$action .= ": ". $cust_main->name if $custnum;
+my $title = $custnum ? 'Edit Customer' : 'Add Customer';
+$title = mt($title);
+$title .= ": ". $cust_main->name if $custnum;
 
 my $r = qq!<font color="#ff0000">*</font>&nbsp;!;