diff options
-rw-r--r-- | FS/FS/geocode_Mixin.pm | 65 | ||||
-rw-r--r-- | FS/FS/part_export/ikano.pm | 13 | ||||
-rw-r--r-- | FS/FS/qual.pm | 4 | ||||
-rw-r--r-- | httemplate/edit/process/qual.cgi | 22 | ||||
-rw-r--r-- | httemplate/elements/location.html | 18 | ||||
-rw-r--r-- | httemplate/elements/tr-select-cust_location.html | 111 |
6 files changed, 159 insertions, 74 deletions
diff --git a/FS/FS/geocode_Mixin.pm b/FS/FS/geocode_Mixin.pm index 08e7b8619..498b7cf97 100644 --- a/FS/FS/geocode_Mixin.pm +++ b/FS/FS/geocode_Mixin.pm @@ -38,7 +38,8 @@ and other location fields. =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 @@ -88,12 +89,29 @@ sub location_label { 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 %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$_"; @@ -150,6 +168,49 @@ sub 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 diff --git a/FS/FS/part_export/ikano.pm b/FS/FS/part_export/ikano.pm index 153b4a606..b04defafa 100644 --- a/FS/FS/part_export/ikano.pm +++ b/FS/FS/part_export/ikano.pm @@ -51,12 +51,24 @@ sub location_types { 'LOT' => 'Lot', 'RM' => 'Room', 'SLIP' => 'Slip', + 'SUIT' => 'Suite', '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) @@ -280,6 +292,7 @@ sub qual { 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; diff --git a/FS/FS/qual.pm b/FS/FS/qual.pm index 98e137c6b..d0b3fbdfe 100644 --- a/FS/FS/qual.pm +++ b/FS/FS/qual.pm @@ -91,7 +91,8 @@ sub insert { 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; @@ -186,7 +187,6 @@ sub part_export { sub location_hash { my $self = shift; - use Data::Dumper; warn Dumper($self); if ( $self->locationnum ) { my $l = qsearchs( 'cust_location', { 'locationnum' => $self->locationnum }); diff --git a/httemplate/edit/process/qual.cgi b/httemplate/edit/process/qual.cgi index de076edda..a702047c5 100644 --- a/httemplate/edit/process/qual.cgi +++ b/httemplate/edit/process/qual.cgi @@ -45,14 +45,18 @@ my $locationnum = $1; 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, - 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 @@ -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"; + +} 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', }; -$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->exportnum($exportnum) if $exportnum > 0; $error ||= $qual->insert( 'cust_location' => $cust_location ); diff --git a/httemplate/elements/location.html b/httemplate/elements/location.html index 0b91add52..f36f2c4cd 100644 --- a/httemplate/elements/location.html +++ b/httemplate/elements/location.html @@ -20,7 +20,7 @@ Example: % if ( $opt{'alt_format'} ) { <TR> - <<%$th%> ALIGN="right">Location kind</<%$th%>> + <<%$th%> ALIGN="right">Location kind</<%$th%>> <TD> <% include('/elements/select.html', 'cgi' => $cgi, @@ -79,7 +79,7 @@ Example: > <TR> - <<%$th%> ALIGN="right">Unit type and #</<%$th%>> + <<%$th%> ALIGN="right">Unit type and #</<%$th%>> <TD COLSPAN=7> % my $location_type = scalar($cgi->param('location_type')) @@ -136,15 +136,9 @@ Example: <% $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> @@ -219,6 +213,8 @@ $object->set($pre.'state', $statedefault ) 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; diff --git a/httemplate/elements/tr-select-cust_location.html b/httemplate/elements/tr-select-cust_location.html index bb10a83de..d17e4dfee 100644 --- a/httemplate/elements/tr-select-cust_location.html +++ b/httemplate/elements/tr-select-cust_location.html @@ -23,27 +23,39 @@ Example: <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 ) { -% 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 ) { - -% 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 %>); @@ -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) { @@ -181,7 +186,7 @@ Example: 'disabled' => $disabled, 'no_asterisks' => 1, 'no_bold' => $opt{'no_bold'}, - 'alt_format' => $opt{'alt_format'}, + 'alt_format' => $opt{'alt_format'}, ) %> |