2018-01-31 12:52:52 +00:00
|
|
|
package Pear::LocalLoop::Controller::Api::V1::User::Medals;
|
|
|
|
use Mojo::Base 'Mojolicious::Controller';
|
|
|
|
use Mojo::JSON qw/true false/;
|
|
|
|
|
|
|
|
sub index {
|
|
|
|
my $c = shift;
|
|
|
|
|
|
|
|
my $validation = $c->validation;
|
|
|
|
$validation->input( $c->stash->{api_json} );
|
|
|
|
|
2018-01-31 12:54:14 +00:00
|
|
|
# Placeholder data
|
|
|
|
my $global_placeholder = {
|
2018-01-31 12:52:52 +00:00
|
|
|
group_name => {
|
|
|
|
threshold => {
|
|
|
|
awarded => true,
|
|
|
|
awarded_at => '2017-01-02T01:00:00Z',
|
|
|
|
threshold => 1,
|
|
|
|
points => 1,
|
|
|
|
},
|
|
|
|
total => 1,
|
|
|
|
},
|
|
|
|
};
|
2018-03-21 12:32:41 +00:00
|
|
|
|
2018-01-31 12:54:14 +00:00
|
|
|
my $organisation_placeholder = {
|
2018-01-31 12:52:52 +00:00
|
|
|
org_id => {
|
|
|
|
group_name => {
|
|
|
|
threshold => {
|
|
|
|
awarded => true,
|
|
|
|
awarded_at => '2017-01-02T01:00:00Z',
|
|
|
|
threshold => 1,
|
|
|
|
points => 1,
|
|
|
|
multiplier => 1,
|
|
|
|
},
|
|
|
|
total => 1,
|
|
|
|
},
|
|
|
|
name => 'Placeholder',
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2018-03-21 12:32:41 +00:00
|
|
|
# James test data
|
|
|
|
my $entity = $c->stash->{api_user}->entity;
|
|
|
|
|
|
|
|
my $now = DateTime->now;
|
|
|
|
my $today = DateTime->today;
|
|
|
|
my $week_ago = $today->clone->subtract( days => 7 );
|
|
|
|
my $purchase_rs = $entity->purchases;
|
|
|
|
# need to add way to search through all transactions and get a true statement to not run this every time
|
|
|
|
|
|
|
|
# https://www.perlmonks.org/?node_id=1092020
|
|
|
|
|
|
|
|
my $day_0 = $purchase_rs->search({
|
|
|
|
'buyer.purchase_time'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
order_by => { -asc => 'buyer.purchase_time' },
|
|
|
|
rows => 1
|
|
|
|
});
|
|
|
|
|
|
|
|
my $day_5 = $day_0->clone->add( days => 5 );
|
|
|
|
|
|
|
|
#shopaholic check (5 transactions in 1 day)
|
|
|
|
my $shopaholic = 0;
|
|
|
|
|
|
|
|
# TODO need to do quantized stuff here
|
|
|
|
|
|
|
|
$check_day = $day_0->clone;
|
|
|
|
while ( $check_day->add(days => 1) < $today )
|
|
|
|
{
|
|
|
|
my $today_transactions = $purchase_rs->search({
|
|
|
|
'buyer.purchase_time'->day => $check_day
|
|
|
|
});
|
|
|
|
|
|
|
|
my $today_count = $today_transactions->count;
|
|
|
|
|
|
|
|
if ( $today_count >= 5 )
|
|
|
|
{
|
|
|
|
$shopaholic = 1;
|
|
|
|
last;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
my $transaction_count = $purchase_rs->count;
|
|
|
|
my $fair_transaction = $purchase_rs->search({
|
|
|
|
'organisation.is_fair' => 1,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
join => { 'buyer' => 'organisation' }
|
|
|
|
});
|
|
|
|
|
|
|
|
my $local_transaction = $purchase_rs->search({
|
|
|
|
'organisation.is_local' => 1,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
join => { 'buyer' => 'organisation' }
|
|
|
|
});
|
|
|
|
|
|
|
|
my $close_transaction = $purchase_rs->search({
|
|
|
|
'me.distance' => { '<', 20000 },
|
|
|
|
});
|
|
|
|
|
|
|
|
# Not unique names
|
|
|
|
my @orgs = $purchase_rs->search({
|
|
|
|
'organisation.id',
|
|
|
|
'organisation.name',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
join => { 'buyer' => 'organisation' },
|
|
|
|
distinct => 1,
|
|
|
|
});
|
|
|
|
|
|
|
|
my $org_completionist_count = 0;
|
|
|
|
|
|
|
|
# Need to add all org medals to each organisation, in loop maybe?
|
|
|
|
my $organisation_medals_test = {
|
|
|
|
for $org (@orgs)
|
|
|
|
{
|
|
|
|
my $org_transactions = $purchase_rs->search({
|
|
|
|
'organisation.id' => $org.id,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
join => { 'buyer' => 'organisation' }
|
|
|
|
});
|
|
|
|
|
|
|
|
my $loyal_customer = $org_transactions->count;
|
|
|
|
|
|
|
|
my $devoted_customer = 0;
|
|
|
|
|
|
|
|
my $org_day_0 = $org_transactions->search({
|
|
|
|
'buyer.purchase_time'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
order_by => { -asc => 'buyer.purchase_time' },
|
|
|
|
rows => 1
|
|
|
|
});
|
|
|
|
|
|
|
|
#Devoted Customer -start
|
|
|
|
my $org_check_day_start = $org_day_0->clone;
|
|
|
|
my $devoted_customer = 0;
|
|
|
|
|
|
|
|
# TODO need to do quantized stuff here
|
|
|
|
|
|
|
|
while ( $org_check_day_start->add(days => 1) < $today )
|
|
|
|
{
|
|
|
|
my $org_check_day_end = $org_check_day_start->clone->add( days => 7 );
|
|
|
|
my $week_transactions = $purchase_rs->search({
|
|
|
|
'buyer.purchase_time'->day => { -between => [ $org_check_day_start, $org_check_day_end ] }
|
|
|
|
});
|
|
|
|
|
|
|
|
my $week_count = $week_transactions->count;
|
|
|
|
|
|
|
|
if ( $week_count >= 5 )
|
|
|
|
{
|
|
|
|
$devoted_customer = 1;
|
|
|
|
last;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#Devoted Customer -end
|
|
|
|
|
|
|
|
#Repeat Customer -start
|
|
|
|
my $repeat_customer_check_day = $org_day_0->clone;
|
|
|
|
my $repeat_customer = 0;
|
|
|
|
|
|
|
|
# TODO need to do quantized stuff here
|
|
|
|
while ( $repeat_customer_check_day->add(days => 1) < $today )
|
|
|
|
{
|
|
|
|
my $today_transactions = $purchase_rs->search({
|
|
|
|
'buyer.purchase_time'->day => $repeat_customer_check_day
|
|
|
|
});
|
|
|
|
|
|
|
|
my $today_count = $today_transactions->count;
|
|
|
|
|
|
|
|
if ( $today_count >= 2 )
|
|
|
|
{
|
|
|
|
$repeat_customer = 1;
|
|
|
|
last;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#Repeat Customer -end
|
|
|
|
|
|
|
|
#Completionist -start
|
|
|
|
if( $loyal_customer >= 50 && $devoted_customer == 1 && $repeat_customer == 1)
|
|
|
|
{
|
|
|
|
$org_completionist_count++;
|
|
|
|
}
|
|
|
|
#Completionist -end
|
|
|
|
|
|
|
|
$org.name => {
|
|
|
|
# Visit org x times
|
|
|
|
LoyalCustomer => {
|
|
|
|
2 => { awarded => false, awarded_at => false, threshold => 2, points => 20, multiplier => 1, },
|
|
|
|
5 => { awarded => false, awarded_at => false, threshold => 5, points => 50, multiplier => 1, },
|
|
|
|
10 => { awarded => false, awarded_at => false, threshold => 10, points => 100, multiplier => 1, },
|
|
|
|
25 => { awarded => false, awarded_at => false, threshold => 25, points => 250, multiplier => 1, },
|
|
|
|
50 => { awarded => false, awarded_at => false, threshold => 50, points => 500, multiplier => 1, },
|
|
|
|
total => $loyal_customer,
|
|
|
|
},
|
|
|
|
# visit org 5 times in one week
|
|
|
|
DevotedCustomer => {
|
|
|
|
1 => { awarded => false, awarded_at => false, threshold => 1, points => 50, multiplier => 1, },
|
|
|
|
total => $devoted_customer,
|
|
|
|
},
|
|
|
|
# visit org twice in one day
|
|
|
|
RepeatCustomer => {
|
|
|
|
2 => { awarded => false, awarded_at => false, threshold => 5, points => 20, multiplier => 1, },
|
|
|
|
total => $repeat_customer,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
my $global_medals_test = {
|
|
|
|
# Total number of transations
|
|
|
|
KeenShopper => {
|
|
|
|
1 => { awarded => false, awarded_at => false, threshold => 1, points => 10, },
|
|
|
|
5 => { awarded => false, awarded_at => false, threshold => 5, points => 50, },
|
|
|
|
25 => { awarded => false, awarded_at => false, threshold => 25, points => 250, },
|
|
|
|
100 => { awarded => false, awarded_at => false, threshold => 100, points => 1000, },
|
|
|
|
1000 => { awarded => false, awarded_at => false, threshold => 1000, points => 10000, },
|
|
|
|
total => $transaction_count,
|
|
|
|
},
|
|
|
|
# Total number of 'fair' transactions
|
|
|
|
FairTradesman => {
|
|
|
|
1 => { awarded => false, awarded_at => false, threshold => 1, points => 10, },
|
|
|
|
5 => { awarded => false, awarded_at => false, threshold => 5, points => 50, },
|
|
|
|
25 => { awarded => false, awarded_at => false, threshold => 25, points => 250, },
|
|
|
|
100 => { awarded => false, awarded_at => false, threshold => 100, points => 1000, },
|
|
|
|
1000 => { awarded => false, awarded_at => false, threshold => 1000, points => 10000, },
|
|
|
|
total => $fair_transaction->count,
|
|
|
|
},
|
|
|
|
# Total number of 'local' transactions
|
|
|
|
LocalLoyalist => {
|
|
|
|
1 => { awarded => false, awarded_at => false, threshold => 1, points => 10, },
|
|
|
|
5 => { awarded => false, awarded_at => false, threshold => 5, points => 50, },
|
|
|
|
25 => { awarded => false, awarded_at => false, threshold => 25, points => 250, },
|
|
|
|
100 => { awarded => false, awarded_at => false, threshold => 100, points => 1000, },
|
|
|
|
1000 => { awarded => false, awarded_at => false, threshold => 1000, points => 10000, },
|
|
|
|
total => $local_transaction->count,
|
|
|
|
},
|
|
|
|
# Total number of 'close' transactions
|
|
|
|
Agoraphobic => {
|
|
|
|
1 => { awarded => false, awarded_at => false, threshold => 1, points => 10, },
|
|
|
|
5 => { awarded => false, awarded_at => false, threshold => 5, points => 50, },
|
|
|
|
25 => { awarded => false, awarded_at => false, threshold => 25, points => 250, },
|
|
|
|
100 => { awarded => false, awarded_at => false, threshold => 100, points => 1000, },
|
|
|
|
1000 => { awarded => false, awarded_at => false, threshold => 1000, points => 10000, },
|
|
|
|
total => $close_transaction->count,
|
|
|
|
},
|
|
|
|
# Visit 5 shops in one day
|
|
|
|
Shopaholic => {
|
|
|
|
1 => { awarded => false, awarded_at => false, threshold => 1, points => 250, },
|
|
|
|
total => $shopaholic,
|
|
|
|
},
|
|
|
|
# Earn all medals for an organisation
|
|
|
|
Completionist => {
|
|
|
|
1 => { awarded => false, awarded_at => false, threshold => 1, points => 500, },
|
|
|
|
3 => { awarded => false, awarded_at => false, threshold => 3, points => 1000, },
|
|
|
|
10 => { awarded => false, awarded_at => false, threshold => 10, points => 2500, },
|
|
|
|
25 => { awarded => false, awarded_at => false, threshold => 25, points => 5000, },
|
|
|
|
50 => { awarded => false, awarded_at => false, threshold => 50, points => 15000, },
|
|
|
|
total => $org_completionist_count,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2018-01-31 12:52:52 +00:00
|
|
|
return $c->render(
|
|
|
|
json => {
|
|
|
|
success => Mojo::JSON->true,
|
2018-01-31 12:54:14 +00:00
|
|
|
global => $global_placeholder,
|
|
|
|
organisation => $organisation_placeholder,
|
2018-01-31 12:52:52 +00:00
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
1;
|