package Pear::LocalLoop::Command::latlong_setup; use Mojo::Base 'Mojolicious::Command'; use Mojo::Util 'getopt'; use Geo::UK::Postcode::Regex; use GIS::Distance; has description => 'Set lat/long data on customers and orgs'; has usage => sub { shift->extract_usage }; sub run { my ( $self, @args ) = @_; my $customer_rs = $self->app->schema->resultset('Customer'); my $org_rs = $self->app->schema->resultset('Organisation'); for my $result ( $customer_rs->all, $org_rs->all ) { $self->_set_lat_long_for_result($result); } my $transaction_rs = $self->app->schema->resultset('Transaction'); for my $result ( $transaction_rs->all ) { my $distance = $self->_calculate_distance( $result->buyer->${ \$result->buyer->type }, $result->seller->${ \$result->seller->type }, ); $result->update( { distance => $distance } ) if defined $distance; } return 1; } sub _set_lat_long_for_result { my ( $self, $result ) = @_; my $parsed_postcode = Geo::UK::Postcode::Regex->parse( $result->postcode ); my $pc_rs = $self->app->schema->resultset('GbPostcode'); if ( $parsed_postcode->{valid} && !$parsed_postcode->{non_geographical} ) { my $gb_pc = $pc_rs->find( { outcode => $parsed_postcode->{outcode}, incode => $parsed_postcode->{incode}, } ); if ($gb_pc) { $result->update( { latitude => $gb_pc->latitude, longitude => $gb_pc->longitude, } ); } } return 1; } sub _calculate_distance { my ( $self, $buyer, $seller ) = @_; my $gis = GIS::Distance->new(); my $buyer_lat = $buyer->latitude; my $buyer_long = $buyer->longitude; my $seller_lat = $seller->latitude; my $seller_long = $seller->longitude; if ( $buyer_lat && $buyer_long && $seller_lat && $seller_long ) { return $gis->distance( $buyer_lat, $buyer_long => $seller_lat, $seller_long )->meters; } else { print STDERR "missing lat-long for: " . $buyer->name . " or " . $seller->name . "\n"; } return; } =head1 SYNOPSIS Usage: APPLICATION latlong_setup [OPTIONS] Options: none for now =cut 1;