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 ;