X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fgeocode_Mixin.pm;h=9ac8e7a884d8c066a11005e29646a6f6b4620cda;hp=498b7cf97c44edb3ffa1571d0df9b4e355d25918;hb=b429a422185206c645c84ec1c3540494d336b943;hpb=528e7e1cb1a6d05f87847bf9fd9b7e0e9fc33f6f diff --git a/FS/FS/geocode_Mixin.pm b/FS/FS/geocode_Mixin.pm index 498b7cf97..9ac8e7a88 100644 --- a/FS/FS/geocode_Mixin.pm +++ b/FS/FS/geocode_Mixin.pm @@ -4,6 +4,7 @@ use strict; use vars qw( $DEBUG $me ); use Carp; use Locale::Country; +use Geo::Coder::Googlev3; #compile time for now, until others are supported use FS::Record qw( qsearchs qsearch ); use FS::Conf; use FS::cust_pkg; @@ -96,19 +97,22 @@ sub location_label { $notfirst++; } - my %location_type; - if ( 1 ) { #ikano, switch on via config - { no warnings 'void'; - eval { 'use FS::part_export::ikano;' }; - die $@ if $@; + my $lt = $self->get($prefix.'location_type'); + if ( $lt ) { + 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 = (); #? } - %location_type = FS::part_export::ikano->location_types; - } else { - %location_type = (); #? + + $line .= ' '.&$escape( $location_type{$lt} || $lt ); } - $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'); @@ -128,6 +132,36 @@ sub location_label { $line; } +=item set_coord + +=cut + +sub set_coord { + my $self = shift; + my $pre = scalar(@_) ? shift : ''; + + #my $module = FS::Conf->new->config('geocode_module') || 'Geo::Coder::Googlev3'; + + my $geocoder = Geo::Coder::Googlev3->new; + my $location = $geocoder->geocode( location => + $self->get($pre.'address1'). ','. + ( $self->get($pre.'address2') ? $self->get($pre.'address2').',' : '' ). + $self->get($pre.'city'). ','. + $self->get($pre.'state'). ','. + code2country($self->get($pre.'country')) + ); + + #errors? + + my $geo_loc = $location->{'geometry'}{'location'} or return; + if ( $geo_loc->{'lat'} && $geo_loc->{'lng'} ) { + $self->set($pre.'latitude', $geo_loc->{'lat'} ); + $self->set($pre.'longitude', $geo_loc->{'lng'} ); + $self->set($pre.'coord_auto', 'Y'); + } + +} + =item geocode DATA_VENDOR Returns a value for the customer location as encoded by DATA_VENDOR. @@ -152,7 +186,8 @@ sub geocode { $zip ||= ''; $plus4 ||= ''; #CCH specific location stuff - my $extra_sql = "AND plus4lo <= '$plus4' AND plus4hi >= '$plus4'"; + my $extra_sql = $plus4 ? "AND plus4lo <= '$plus4' AND plus4hi >= '$plus4'" + : ''; my @cust_tax_location = qsearch( { @@ -165,50 +200,12 @@ sub geocode { $geocode = $cust_tax_location[0]->geocode if scalar(@cust_tax_location); - $geocode; -} - -=item alternize - -Attempts to parse data for location_type and location_number from address1 -and address2. + warn "WARNING: customer ". $self->custnum. + ": multiple locations for zip ". $self->get("${prefix}zip"). + "; using arbitrary geocode $geocode\n" + if scalar(@cust_tax_location) > 1; -=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" - : ''; + $geocode; } =back