Added script for setting up lat/long in db and showing in admin panels
This commit is contained in:
parent
bfcacbee32
commit
0486d910ee
2 changed files with 199 additions and 75 deletions
83
lib/Pear/LocalLoop/Command/latlong_setup.pm
Normal file
83
lib/Pear/LocalLoop/Command/latlong_setup.pm
Normal file
|
@ -0,0 +1,83 @@
|
|||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
Reference in a new issue