diff options
-rw-r--r-- | FS/FS/Conf.pm | 15 | ||||
-rw-r--r-- | FS/FS/Misc/Geo.pm | 51 |
2 files changed, 66 insertions, 0 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index 301d972b3..eb4741386 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -4226,6 +4226,7 @@ and customer address. Include units.', 'usps' => 'U.S. Postal Service', 'ezlocate' => 'EZLocate', 'tomtom' => 'TomTom', + 'melissa' => 'Melissa WebSmart', ], }, @@ -4265,6 +4266,20 @@ and customer address. Include units.', }, { + 'key' => 'melissa-userid', + 'section' => 'UI', # it's really not... + 'description' => 'User ID for Melissa WebSmart service. See <a href="http://www.melissadata.com/">the Melissa website</a> for access and pricing.', + 'type' => 'text', + }, + + { + 'key' => 'melissa-enable_geocoding', + 'section' => 'UI', + 'description' => 'Use the Melissa service for census tract and coordinate lookups. Enable this only if your subscription includes geocoding access.', + 'type' => 'checkbox', + }, + + { 'key' => 'cust_main-auto_standardize_address', 'section' => 'UI', 'description' => 'When using USPS web tools, automatically standardize the address without asking.', diff --git a/FS/FS/Misc/Geo.pm b/FS/FS/Misc/Geo.pm index 9f6b89bf2..1af499152 100644 --- a/FS/FS/Misc/Geo.pm +++ b/FS/FS/Misc/Geo.pm @@ -652,6 +652,57 @@ sub subloc_address2 { ($subloc, $addr2); } +sub standardize_melissa { + my $class = shift; + my $location = shift; + + local $@; + eval "use Geo::Melissa::WebSmart"; + die $@ if $@; + + my $id = $conf->config('melissa-userid') + or die "no melissa-userid configured\n"; + my $geocode = $conf->exists('melissa-enable_geocoding') ? 1 : 0; + + my $request = { + id => $id, + a1 => $location->{address1}, + a2 => $location->{address2}, + city => $location->{city}, + state => $location->{state}, + ctry => $location->{country}, + zip => $location->{zip}, + geocode => $geocode, + }; + my $result = Geo::Melissa::WebSmart->query($request); + if ( $result->code =~ /AS01/ ) { # always present on success + my $addr = $result->address; + warn Dumper $addr if $DEBUG > 1; + my $out = { + address1 => $addr->{Address1}, + address2 => $addr->{Address2}, + city => $addr->{City}->{Name}, + state => $addr->{State}->{Abbreviation}, + country => $addr->{Country}->{Abbreviation}, + zip => $addr->{Zip}, + latitude => $addr->{Latitude}, + longitude => $addr->{Longitude}, + addr_clean => 'Y', + }; + if ( $addr->{Census}->{Tract} ) { + my $censustract = $addr->{County}->{Fips} . $addr->{Census}->{Tract}; + # insert decimal point two digits from the end + $censustract =~ s/(\d\d)$/\.$1/; + $out->{censustract} = $censustract; + $out->{censusyear} = $conf->config('census_year'); + } + # we could do a lot more nuanced reporting of the warning/status codes, + # but the UI doesn't support that yet. + return $out; + } else { + die $result->status_message; + } +} =back |