summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FS/FS/Conf.pm1
-rw-r--r--FS/FS/Misc/Geo.pm51
2 files changed, 52 insertions, 0 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 479e9ab..d5e8960 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -4440,6 +4440,7 @@ and customer address. Include units.',
'section' => 'invoicing',
'description' => 'Instead of showing payments (and credits) applied to the invoice, show those received since the previous invoice date.',
'type' => 'checkbox',
+ 'uscensus' => 'U.S. Census Bureau',
},
{
diff --git a/FS/FS/Misc/Geo.pm b/FS/FS/Misc/Geo.pm
index dbc383a..1e17b5f 100644
--- a/FS/FS/Misc/Geo.pm
+++ b/FS/FS/Misc/Geo.pm
@@ -236,6 +236,8 @@ sub wa_sales {
die "WA tax district lookup error: $error";
}
+###### USPS Standardization ######
+
sub standardize_usps {
my $class = shift;
@@ -292,6 +294,55 @@ sub standardize_usps {
addr_clean=> 'Y' }
}
+###### U.S. Census Bureau ######
+
+sub standardize_uscensus {
+ my $self = shift;
+ my $location = shift;
+
+ eval "use Geo::USCensus::Geocoding";
+ die $@ if $@;
+
+ if ( $location->{country} ne 'US' ) {
+ # soft failure
+ warn "standardize_uscensus not for use in country ".$location->{country}."\n";
+ $location->{addr_clean} = '';
+ return $location;
+ }
+
+ my $request = {
+ street => $location->{address1},
+ city => $location->{city},
+ state => $location->{state},
+ zip => $location->{zip},
+ debug => ($DEBUG || 0),
+ };
+
+ my $result = Geo::USCensus::Geocoding->query($request);
+ if ( $result->is_match ) {
+ # unfortunately we get the address back as a single line
+ if ($result->address =~ /^(.*), (.*), ([A-Z]{2}), (\d{5}.*)$/) {
+ return +{
+ address1 => $1,
+ city => $2,
+ state => $3,
+ zip => $4,
+ address2 => uc($location->{address2}),
+ latitude => $result->latitude,
+ longitude => $result->longitude,
+ censustract => $result->censustract,
+ };
+ } else {
+ die "can't parse address '".$result->address."'";
+ }
+ } else {
+ warn Dumper($result) if $DEBUG;
+ die $result->error_message;
+ }
+}
+
+####### EZLOCATE (obsolete) #######
+
sub _tomtom_query { # helper method for the below
my %args = @_;
my $result = Geo::TomTom::Geocoding->query(%args);