qualification address handling changes, RT#7111
authorivan <ivan>
Sun, 13 Mar 2011 18:56:03 +0000 (18:56 +0000)
committerivan <ivan>
Sun, 13 Mar 2011 18:56:03 +0000 (18:56 +0000)
FS/FS/geocode_Mixin.pm
FS/FS/part_export/ikano.pm
FS/FS/qual.pm
httemplate/edit/process/qual.cgi
httemplate/elements/location.html
httemplate/elements/tr-select-cust_location.html

index 08e7b86..498b7cf 100644 (file)
@@ -38,7 +38,8 @@ and other location fields.
 =item location_hash
 
 Returns a list of key/value pairs, with the following keys: address1, address2,
 =item location_hash
 
 Returns a list of key/value pairs, with the following keys: address1, address2,
-city, county, state, zip, country.  The shipping address is used if present.
+city, county, state, zip, country, geocode, location_type, location_number,
+location_kind.  The shipping address is used if present.
 
 =cut
 
 
 =cut
 
@@ -88,12 +89,29 @@ sub location_label {
   my $prefix = $self->has_ship_address ? 'ship_' : '';
 
   my $notfirst = 0;
   my $prefix = $self->has_ship_address ? 'ship_' : '';
 
   my $notfirst = 0;
-  foreach (qw ( address1 address2 location_type location_number ) ) {
+  foreach (qw ( address1 address2 ) ) {
     my $method = "$prefix$_";
     $line .= ($notfirst ? $separator : ''). &$escape($self->$method)
       if $self->$method;
     $notfirst++;
   }
     my $method = "$prefix$_";
     $line .= ($notfirst ? $separator : ''). &$escape($self->$method)
       if $self->$method;
     $notfirst++;
   }
+
+  my %location_type;
+  if ( 1 ) { #ikano, switch on via config
+    { no warnings 'void';
+      eval { 'use FS::part_export::ikano;' };
+      die $@ if $@;
+    }
+    %location_type = FS::part_export::ikano->location_types;
+  } else {
+    %location_type = (); #?
+  }
+
+  $line .= ' '. &$escape( $location_type{ $self->get($prefix.'location_type') })
+    if $self->get($prefix.'location_type');
+  $line .= ' '. &$escape($self->get($prefix.'location_number'))
+    if $self->get($prefix.'location_number');
+
   $notfirst = 0;
   foreach (qw ( city county state zip ) ) {
     my $method = "$prefix$_";
   $notfirst = 0;
   foreach (qw ( city county state zip ) ) {
     my $method = "$prefix$_";
@@ -150,6 +168,49 @@ sub geocode {
   $geocode;
 }
 
   $geocode;
 }
 
+=item alternize
+
+Attempts to parse data for location_type and location_number from address1
+and address2.
+
+=cut
+
+sub alternize {
+  my $self = shift;
+  my $prefix = $self->has_ship_address ? 'ship_' : '';
+
+  return '' if $self->get($prefix.'location_type')
+            || $self->get($prefix.'location_number');
+
+  my %parse;
+  if ( 1 ) { #ikano, switch on via config
+    { no warnings 'void';
+      eval { 'use FS::part_export::ikano;' };
+      die $@ if $@;
+    }
+    %parse = FS::part_export::ikano->location_types_parse;
+  } else {
+    %parse = (); #?
+  }
+
+  foreach my $from ('address1', 'address2') {
+    foreach my $parse ( keys %parse ) {
+      my $value = $self->get($prefix.$from);
+      if ( $value =~ s/(^|\W+)$parse\W+(\w+)\W*$//i ) {
+        $self->set($prefix.'location_type', $parse{$parse});
+        $self->set($prefix.'location_number', $2);
+        $self->set($prefix.$from, $value);
+        return '';
+      }
+    }
+  }
+
+  #nothing matched, no changes
+  $self->get($prefix.'address2')
+    ? "Can't parse unit type and number from ${prefix}address2"
+    : '';
+}
+
 =back
 
 =head1 BUGS
 =back
 
 =head1 BUGS
index 153b4a6..b04defa 100644 (file)
@@ -51,12 +51,24 @@ sub location_types {
     'LOT'  => 'Lot',
     'RM'   => 'Room',
     'SLIP' => 'Slip',
     'LOT'  => 'Lot',
     'RM'   => 'Room',
     'SLIP' => 'Slip',
+    'SUIT' => 'Suite',
     'TRLR' => 'Trailer',
     'UNIT' => 'Unit',
     'WING' => 'Wing',
   );
 }
 
     'TRLR' => 'Trailer',
     'UNIT' => 'Unit',
     'WING' => 'Wing',
   );
 }
 
+sub location_types_parse {
+  my $class = shift;
+  my %t = $class->location_types;
+  delete $t{''};
+  (
+    (map { $_ => $_ } keys %t),
+    (reverse %t),
+    'STE' => 'SUIT', #USPS
+  );
+}
+
 sub dsl_pull {
 # we distinguish between invalid new data (return error) versus data that
 # has legitimately changed (may eventually execute hooks; now just update)
 sub dsl_pull {
 # we distinguish between invalid new data (return error) versus data that
 # has legitimately changed (may eventually execute hooks; now just update)
@@ -280,6 +292,7 @@ sub qual {
     my %location_hash = $qual->location_hash; 
     return 'No address provided' unless keys %location_hash;
 
     my %location_hash = $qual->location_hash; 
     return 'No address provided' unless keys %location_hash;
 
+    warn Dumper(\%location_hash);
     return 'Location kind is required' unless $location_hash{location_kind};
 
     my $svctn = $qual->phonenum;
     return 'Location kind is required' unless $location_hash{location_kind};
 
     my $svctn = $qual->phonenum;
index 98e137c..d0b3fbd 100644 (file)
@@ -91,7 +91,8 @@ sub insert {
 
   if ( $options{'cust_location'} ) {
     my $cust_location = $options{'cust_location'};
 
   if ( $options{'cust_location'} ) {
     my $cust_location = $options{'cust_location'};
-    my $error = $cust_location->insert;
+    my $method = $cust_location->locationnum ? 'replace' : 'insert';
+    my $error = $cust_location->$method();
     if ( $error ) {
       $dbh->rollback if $oldAutoCommit;
       return $error;
     if ( $error ) {
       $dbh->rollback if $oldAutoCommit;
       return $error;
@@ -186,7 +187,6 @@ sub part_export {
 
 sub location_hash {
     my $self = shift;
 
 sub location_hash {
     my $self = shift;
-    use Data::Dumper; warn Dumper($self);
     if ( $self->locationnum ) {
        my $l = qsearchs( 'cust_location', 
                    { 'locationnum' => $self->locationnum });
     if ( $self->locationnum ) {
        my $l = qsearchs( 'cust_location', 
                    { 'locationnum' => $self->locationnum });
index de076ed..a702047 100644 (file)
@@ -45,14 +45,18 @@ my $locationnum = $1;
 
 my $error = '';
 my $cust_location = '';
 
 my $error = '';
 my $cust_location = '';
+my %location_hash = (
+  map { $_ => scalar($cgi->param($_)) }
+    qw( address1 address2 city county state zip country geocode ),
+    grep scalar($cgi->param($_)),
+      qw( location_type location_number location_kind )
+);
+
 if ( $locationnum == -1 ) { # adding a new one
 
   $cust_location = new FS::cust_location {
     $cust_or_prospect."num" => $custnum_or_prospectnum,
 if ( $locationnum == -1 ) { # adding a new one
 
   $cust_location = new FS::cust_location {
     $cust_or_prospect."num" => $custnum_or_prospectnum,
-    map { $_ => scalar($cgi->param($_)) }
-      qw( address1 address2 city county state zip country geocode ),
-      grep scalar($cgi->param($_)),
-        qw( location_type location_number location_kind )
+    %location_hash,
   };
 
           #locationnum '': default service location
   };
 
           #locationnum '': default service location
@@ -62,15 +66,21 @@ if ( $locationnum == -1 ) { # adding a new one
           #locationnum -2: address not required for qual
 } elsif ( $locationnum == -2 && $phonenum eq '' ) {
   $error = "Nothing to qualify - neither phone number nor address specified";
           #locationnum -2: address not required for qual
 } elsif ( $locationnum == -2 && $phonenum eq '' ) {
   $error = "Nothing to qualify - neither phone number nor address specified";
+
+} else { #existing location, possibly with an edit
+  $cust_location = qsearchs('cust_location', { 'locationnum'=>$locationnum })
+    or die "Unknown locationnum $locationnum";
+  $cust_location->$_($location_hash{$_}) foreach keys %location_hash;
 }
 
 my $qual = new FS::qual {
   'status' => 'N',
 };
 }
 
 my $qual = new FS::qual {
   'status' => 'N',
 };
-$qual->phonenum($phonenum) if $phonenum ne '';
+$qual->phonenum($phonenum)       if $phonenum ne '';
+#$qual->locationnum($locationnum) if $locationnum > 0;
+$qual->exportnum($exportnum)     if $exportnum > 0;
 $qual->set( $cust_or_prospect."num" => $custnum_or_prospectnum )
   unless $locationnum == -1 || $locationnum > 0;
 $qual->set( $cust_or_prospect."num" => $custnum_or_prospectnum )
   unless $locationnum == -1 || $locationnum > 0;
-$qual->exportnum($exportnum) if $exportnum > 0;
 
 $error ||= $qual->insert( 'cust_location' => $cust_location );
 
 
 $error ||= $qual->insert( 'cust_location' => $cust_location );
 
index 0b91add..f36f2c4 100644 (file)
@@ -20,7 +20,7 @@ Example:
 % if ( $opt{'alt_format'} ) {
 
 <TR>
 % if ( $opt{'alt_format'} ) {
 
 <TR>
-    <<%$th%> ALIGN="right">Location kind</<%$th%>>
+    <<%$th%> ALIGN="right">Location&nbsp;kind</<%$th%>>
     <TD>
     <% include('/elements/select.html',
                  'cgi'        => $cgi,
     <TD>
     <% include('/elements/select.html',
                  'cgi'        => $cgi,
@@ -79,7 +79,7 @@ Example:
       >
 
 <TR>
       >
 
 <TR>
-    <<%$th%> ALIGN="right">Unit type and #</<%$th%>>
+    <<%$th%> ALIGN="right">Unit&nbsp;type&nbsp;and&nbsp;#</<%$th%>>
     <TD COLSPAN=7>
 
 %     my $location_type = scalar($cgi->param('location_type'))
     <TD COLSPAN=7>
 
 %     my $location_type = scalar($cgi->param('location_type'))
@@ -136,15 +136,9 @@ Example:
                <% $style %>
         >
 
                <% $style %>
         >
 
-%   if ( $object->get($pre.'address2') ) {
-
-%     #XXX try to parse first
-%     if ( 0 ) {
-%     } else { #XXX i don't work so well when the dropdown is changed :/  i probably need to be triggered by "default service address"
-        Can't parse unit type and number from <B><% $object->get($pre.'address2') |h %></B>
-%    }
-
-% }
+%    #XXX i don't work so well when the dropdown is changed :/  i probably need to be triggered by "default service address"
+%    $alt_err =~ s/(ship_)?address2/'<B>'.encode_entities($object->get($1.'address2')).'<\/B>'/e;
+     <% $alt_err %>
 
     </TD>
 
 
     </TD>
 
@@ -219,6 +213,8 @@ $object->set($pre.'state', $statedefault )
   unless $object->get($pre.'state')
          || $object->get($pre.'country') ne $countrydefault;
 
   unless $object->get($pre.'state')
          || $object->get($pre.'country') ne $countrydefault;
 
+my $alt_err = ($opt{'alt_format'} && !$disabled) ? $object->alternize : '';
+
 my @style = ();
 push @style, 'background-color: #dddddd' if $disabled;
 
 my @style = ();
 push @style, 'background-color: #dddddd' if $disabled;
 
index bb10a83..d17e4df 100644 (file)
@@ -23,27 +23,39 @@ Example:
 
 <SCRIPT TYPE="text/javascript">
 
 
 <SCRIPT TYPE="text/javascript">
 
+  function location_disable(what) {
+%   for (@location_fields, 'city_select') { 
+      what.form.<%$_%>.disabled = true;
+      var ftype = what.form.<%$_%>.tagName;
+      if( ftype == 'SELECT') changeSelect(what.form.<%$_%>, '');
+      else what.form.<%$_%>.value = '';
+      if( ftype != 'SELECT') what.form.<%$_%>.style.backgroundColor = '#dddddd';
+%   } 
+  }
+
+  function location_enable(what) {
+%   for (grep { $_ ne 'location_number' } @location_fields, 'city_select') { 
+      what.form.<%$_%>.disabled = false;
+      var ftype = what.form.<%$_%>.tagName;
+      if( ftype != 'SELECT') what.form.<%$_%>.style.backgroundColor = '#ffffff';
+      if( ftype == 'INPUT' ) what.form.<%$_%>.value = '';
+%   } 
+
+    if ( what.form.location_type.options[what.form.location_type.selectedIndex].value ) {
+      what.form.location_number.disabled = false;
+      what.form.location_number.style.backgroundColor = '#ffffff';
+    }
+    what.form.location_number.value = '';
+  }
+
   function locationnum_changed(what) {
     var locationnum = what.options[what.selectedIndex].value;
     if ( locationnum == -2 ) {
   function locationnum_changed(what) {
     var locationnum = what.options[what.selectedIndex].value;
     if ( locationnum == -2 ) {
-%         for (@location_fields, 'city_select') { 
-            what.form.<%$_%>.disabled = true;
-           var ftype = what.form.<%$_%>.tagName;
-           if( ftype == 'SELECT') changeSelect(what.form.<%$_%>, '');
-           else what.form.<%$_%>.value = '';
-            what.form.<%$_%>.style.backgroundColor = '#dddddd';
-%         } 
-       return;
+      location_disable(what);
+      return;
     }
     }
-    
     if ( locationnum == -1 ) {
     if ( locationnum == -1 ) {
-
-%     for (@location_fields, 'city_select') { 
-        what.form.<%$_%>.disabled = false;
-        what.form.<%$_%>.style.backgroundColor = '#ffffff';
-       var ftype = what.form.<%$_%>.tagName;
-       if( ftype == 'INPUT' ) what.form.<%$_%>.value = '';
-%     } 
+      location_enable(what);
 
       changeSelect(what.form.country, <% $countrydefault |js_string %>);
 
 
       changeSelect(what.form.country, <% $countrydefault |js_string %>);
 
@@ -52,52 +64,45 @@ Example:
                                           ''
                                         )
                      );
                                           ''
                                         )
                      );
+      return;
+    }
 
 
-    } else {
+    if ( locationnum == 0 ) {
+%     if ( $cust_main ) {
+      what.form.address1.value = <% $cust_main->get($prefix.'address1') |js_string %>;
+      what.form.address2.value = <% $cust_main->get($prefix.'address2') |js_string %>;
+      what.form.city.value = <% $cust_main->get($prefix.'city') |js_string %>;
+      what.form.zip.value = <% $cust_main->get($prefix.'zip') |js_string %>;
 
 
-      if ( locationnum == 0 ) {
-%       if ( $cust_main ) {
-        what.form.address1.value = <% $cust_main->get($prefix.'address1') |js_string %>;
-        what.form.address2.value = <% $cust_main->get($prefix.'address2') |js_string %>;
-        what.form.city.value = <% $cust_main->get($prefix.'city') |js_string %>;
-        what.form.zip.value = <% $cust_main->get($prefix.'zip') |js_string %>;
+      changeSelect(what.form.country, <% $cust_main->get($prefix.'country') | js_string %> );
 
 
-        changeSelect(what.form.country, <% $cust_main->get($prefix.'country') | js_string %> );
-
-        country_changed( what.form.country,
-                         fix_state_factory( <% $cust_main->get($prefix.'state') | js_string %>,
-                                            <% $cust_main->get($prefix.'county') | js_string %>
-                                          )
-                       );
-%       }
+      country_changed( what.form.country,
+                       fix_state_factory( <% $cust_main->get($prefix.'state') | js_string %>,
+                                          <% $cust_main->get($prefix.'county') | js_string %>
+                                        )
+                     );
+%     }
 
 
-      } else {
-        get_location( locationnum, update_location );
-      
+    } else {
+      get_location( locationnum, update_location );
+    } 
 
 
-%     if ( $editable ) {
-        if ( locationnum == 0 ) {
-%     }
+%   if ( $editable ) {
+      if ( locationnum == 0 ) {
+%   }
 
 
-%#sleep/wait until dropdowns are updated?
-%         for (@location_fields, 'city_select') { 
-            what.form.<%$_%>.disabled = true;
-            what.form.<%$_%>.style.backgroundColor = '#dddddd';
-%         } 
+%       #sleep/wait until dropdowns are updated?
+        location_disable(what);
 
 
-%     if ( $editable ) {
-        } else {
+%   if ( $editable ) {
+      } else {
 
 
-%#sleep/wait until dropdowns are updated?
-%         for (@location_fields, 'city_select') { 
-            what.form.<%$_%>.disabled = false;
-            what.form.<%$_%>.style.backgroundColor = '#ffffff';
-%         } 
+%       #sleep/wait until dropdowns are updated?
+        location_enable(what);
 
 
-        }
-%     }
+      }
+%   }
 
 
-    }
   }
 
   function fix_state_factory (state, county) {
   }
 
   function fix_state_factory (state, county) {
@@ -181,7 +186,7 @@ Example:
              'disabled'     => $disabled,
              'no_asterisks' => 1,
              'no_bold'      => $opt{'no_bold'},
              'disabled'     => $disabled,
              'no_asterisks' => 1,
              'no_bold'      => $opt{'no_bold'},
-            'alt_format'   => $opt{'alt_format'},
+             'alt_format'   => $opt{'alt_format'},
           )
 %>
 
           )
 %>