Added transaction distance calculation

This commit is contained in:
Tom Bloor 2017-10-03 18:08:30 +01:00
parent 37e8f0b46a
commit 62881a0eda
5 changed files with 75 additions and 3 deletions

View file

@ -5,6 +5,7 @@
* Location is now updated on registration. Customers location is truncated to 2 * Location is now updated on registration. Customers location is truncated to 2
decimal places based on their postcode. decimal places based on their postcode.
* Location is also updated on changing a users postcode * Location is also updated on changing a users postcode
* Distance is now calculated when a transaction is submitted
## Bug Fixes ## Bug Fixes

View file

@ -173,6 +173,7 @@ sub post_upload {
my $purchase_time = $c->parse_iso_datetime($validation->param('purchase_time') || ''); my $purchase_time = $c->parse_iso_datetime($validation->param('purchase_time') || '');
$purchase_time ||= DateTime->now(); $purchase_time ||= DateTime->now();
my $file = defined $upload ? $c->store_file_from_upload( $upload ) : undef; my $file = defined $upload ? $c->store_file_from_upload( $upload ) : undef;
my $distance = $c->get_distance_from_coords( $user->entity->type_object, $organisation );
my $new_transaction = $organisation->entity->create_related( my $new_transaction = $organisation->entity->create_related(
'sales', 'sales',
@ -181,6 +182,7 @@ sub post_upload {
value => $transaction_value * 100000, value => $transaction_value * 100000,
( defined $file ? ( proof_image => $file ) : () ), ( defined $file ? ( proof_image => $file ) : () ),
purchase_time => $c->format_db_datetime($purchase_time), purchase_time => $c->format_db_datetime($purchase_time),
distance => $distance,
} }
); );

View file

@ -1,7 +1,8 @@
package Pear::LocalLoop::Plugin::Postcodes; package Pear::LocalLoop::Plugin::Postcodes;
use Mojo::Base 'Mojolicious::Plugin'; use Mojo::Base 'Mojolicious::Plugin';
use DateTime::Format::Strptime; use Geo::UK::Postcode::Regex;
use GIS::Distance;
sub register { sub register {
my ( $plugin, $app, $conf ) = @_; my ( $plugin, $app, $conf ) = @_;
@ -35,6 +36,23 @@ sub register {
} }
return $location; return $location;
}); });
$app->helper( get_distance_from_coords => sub {
my ( $c, $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 int( $gis->distance( $buyer_lat, $buyer_long => $seller_lat, $seller_long )->meters );
}
return;
});
} }
1; 1;

View file

@ -40,7 +40,7 @@ my $expected_hours = {};
sub increment_day { sub increment_day {
my ( $value, $day, $distance ) = @_; my ( $value, $day, $distance ) = @_;
$value *= 100000; $value *= 100000;
$distance //= 0; $distance //= 845;
$expected_days->{$day} = { $expected_days->{$day} = {
quantised => $day, quantised => $day,
sum_value => ($expected_days->{$day}->{sum_value} || 0) + $value, sum_value => ($expected_days->{$day}->{sum_value} || 0) + $value,
@ -52,7 +52,7 @@ sub increment_day {
sub increment_hour { sub increment_hour {
my ( $value, $day, $distance ) = @_; my ( $value, $day, $distance ) = @_;
$value *= 100000; $value *= 100000;
$distance //= 0; $distance //= 845;
$expected_hours->{$day} = { $expected_hours->{$day} = {
quantised => $day, quantised => $day,
sum_value => ($expected_hours->{$day}->{sum_value} || 0) + $value, sum_value => ($expected_hours->{$day}->{sum_value} || 0) + $value,

51
t/api/upload/distance.t Normal file
View file

@ -0,0 +1,51 @@
use Mojo::Base -strict;
use FindBin qw/ $Bin /;
use Test::More;
use Mojo::JSON;
use Test::Pear::LocalLoop;
use GIS::Distance;
my $framework = Test::Pear::LocalLoop->new(
etc_dir => "$Bin/../../etc",
);
$framework->install_fixtures('full');
my $t = $framework->framework;
my $schema = $t->app->schema;
my $session_key = $framework->login({
email => 'test1@example.com',
password => 'abc123',
});
my $test_purchase_time = "2017-08-14T11:29:07.965+01:00";
$t->post_ok('/api/upload' => json => {
transaction_value => 10,
transaction_type => 1,
purchase_time => $test_purchase_time,
organisation_id => 1,
session_key => $session_key,
})
->status_is(200)
->or($framework->dump_error)
->json_is('/success', Mojo::JSON->true)
->json_like('/message', qr/Upload Successful/);
is $schema->resultset('Transaction')->count, 1, "1 transaction";
my $transaction = $schema->resultset('Transaction')->first;
my $gis = GIS::Distance->new();
my $expected_distance = int( $gis->distance(
# Buyer
54.04, -2.8,
# Seller
54.04725, -2.79611,
)->meters );
is $transaction->distance, $expected_distance, 'Transaction Distance Correct';
done_testing;