prevent automatic geocoding when upgrading an old db, RT#15539
[freeside.git] / FS / FS / cust_main.pm
index 945b4f4..7937a00 100644 (file)
@@ -465,6 +465,8 @@ sub insert {
 
   $self->signupdate(time) unless $self->signupdate;
 
+  $self->censusyear($conf->config('census_year')) if $self->censustract;
+
   $self->auto_agent_custid()
     if $conf->config('cust_main-auto_agent_custid') && ! $self->agent_custid;
 
@@ -1481,6 +1483,31 @@ sub replace {
       && length($self->get($pre.'zip')) >= 10;
   }
 
+  for my $pre ( grep $old->get($_.'coord_auto'), ( '', 'ship_' ) ) {
+
+    $self->set($pre.'coord_auto', '') && next
+      if $self->get($pre.'latitude') && $self->get($pre.'longitude')
+      && (    $self->get($pre.'latitude')  != $old->get($pre.'latitude')
+           || $self->get($pre.'longitude') != $old->get($pre.'longitude')
+         );
+
+    $self->set_coord($pre)
+      if $old->get($pre.'address1') ne $self->get($pre.'address1')
+      || $old->get($pre.'city')     ne $self->get($pre.'city')
+      || $old->get($pre.'state')    ne $self->get($pre.'state')
+      || $old->get($pre.'country')  ne $self->get($pre.'country');
+
+  }
+
+  unless ( $import ) {
+    $self->set_coord
+      if ! $self->coord_auto && ! $self->latitude && ! $self->longitude;
+
+    $self->set_coord('ship_')
+      if $self->has_ship_address && ! $self->ship_coord_auto
+      && ! $self->ship_latitude && ! $self->ship_longitude;
+  }
+
   local($ignore_expired_card) = 1
     if $old->payby  =~ /^(CARD|DCRD)$/
     && $self->payby =~ /^(CARD|DCRD)$/
@@ -1491,6 +1518,12 @@ sub replace {
          || $old->payby  =~ /^(CHEK|DCHK)$/ && $self->payby =~ /^(CHEK|DCHK)$/ )
     && ( $old->payinfo eq $self->payinfo || $old->paymask eq $self->paymask );
 
+  if ( $self->censustract ne '' and $self->censustract ne $old->censustract ) {
+    # update censusyear whenever tract code changes
+    $self->censusyear($conf->config('census_year'));
+  }
+
+
   local $SIG{HUP} = 'IGNORE';
   local $SIG{INT} = 'IGNORE';
   local $SIG{QUIT} = 'IGNORE';
@@ -1696,6 +1729,10 @@ sub check {
     || $self->ut_textn('county')
     || $self->ut_textn('state')
     || $self->ut_country('country')
+    || $self->ut_coordn('latitude')
+    || $self->ut_coordn('longitude')
+    || $self->ut_enum('coord_auto', [ '', 'Y' ])
+    || $self->ut_numbern('censusyear')
     || $self->ut_anything('comments')
     || $self->ut_numbern('referral_custnum')
     || $self->ut_textn('stateid')
@@ -1710,6 +1747,9 @@ sub check {
     || $self->ut_enum('locale', [ '', FS::Locales->locales ])
   ;
 
+  $self->set_coord
+    unless $import || ($self->latitude && $self->longitude);
+
   #barf.  need message catalogs.  i18n.  etc.
   $error .= "Please select an advertising source."
     if $error =~ /^Illegal or empty \(numeric\) refnum: /;
@@ -1807,9 +1847,15 @@ sub check {
       || $self->ut_textn('ship_county')
       || $self->ut_textn('ship_state')
       || $self->ut_country('ship_country')
+      || $self->ut_coordn('ship_latitude')
+      || $self->ut_coordn('ship_longitude')
+      || $self->ut_enum('ship_coord_auto', [ '', 'Y' ] )
     ;
     return $error if $error;
 
+    $self->set_coord('ship_')
+      unless $import || ($self->ship_latitude && $self->ship_longitude);
+
     #false laziness with above
     unless ( qsearchs('cust_main_county', {
       'country' => $self->ship_country,
@@ -2079,6 +2125,7 @@ Returns a list of fields which have ship_ duplicates.
 sub addr_fields {
   qw( last first company
       address1 address2 city county state zip country
+      latitude longitude
       daytime night fax mobile
     );
 }
@@ -2500,8 +2547,9 @@ sub batch_card {
       'custnum'  => $self->custnum,
   } );
 
-  foreach (qw( address1 address2 city state zip country payby payinfo paydate
-               payname )) {
+  foreach (qw( address1 address2 city state zip country latitude longitude
+               payby payinfo paydate payname ))
+  {
     $options{$_} = '' unless exists($options{$_});
   }
 
@@ -4882,6 +4930,36 @@ sub process_bill_and_collect {
   $cust_main->bill_and_collect( %$param );
 }
 
+=item process_censustract_update CUSTNUM
+
+Queueable function to update the census tract to the current year (as set in 
+the 'census_year' configuration variable) and retrieve the new tract code.
+
+=cut
+
+sub process_censustract_update { 
+  eval "use FS::Misc::Geo qw(get_censustract)";
+  die $@ if $@;
+  my $custnum = shift;
+  my $cust_main = qsearchs( 'cust_main', { custnum => $custnum })
+      or die "custnum '$custnum' not found!\n";
+
+  my $new_year = $conf->config('census_year') or return;
+  my $new_tract = get_censustract({ $cust_main->location_hash }, $new_year);
+  if ( $new_tract =~ /^\d/ ) {
+    # then it's a tract code
+        $cust_main->set('censustract', $new_tract);
+    $cust_main->set('censusyear',  $new_year);
+    my $error = $cust_main->replace;
+    die $error if $error;
+  }
+  else {
+    # it's an error message
+    die $new_tract;
+  }
+  return;
+}
+
 sub _upgrade_data { #class method
   my ($class, %opts) = @_;
 
@@ -4908,6 +4986,7 @@ sub _upgrade_data { #class method
   local($ignore_illegal_zip) = 1;
   local($ignore_banned_card) = 1;
   local($skip_fuzzyfiles) = 1;
+  local($import) = 1; #prevent automatic geocoding (need its own variable?)
   $class->_upgrade_otaker(%opts);
 
 }