Skip to content

Commit b981186

Browse files
authored
Merge pull request #111 from Pear-Trading/Release-v0.10.6
v0.10.6 Release
2 parents 37deb7f + 358c0ca commit b981186

File tree

14 files changed

+229
-47
lines changed

14 files changed

+229
-47
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,17 @@
22

33
# Next Release
44

5+
# v0.10.6
6+
7+
* Fixed organisation submission
8+
* Changed category listing code
9+
* Made transaction upload code more lenient
10+
* Added API ability to edit and delete transactions
11+
* Added test for above
12+
* Made test dumping more sane
13+
* Fixed quantised transaction calcuations for weeks on sqlite
14+
* Amended customer snippet, category list and customer stats tests
15+
516
# v0.10.5
617

718
* **Admin Feature** Removed generic Transaction List, replaced with a new

lib/Pear/LocalLoop.pm

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ sub startup {
154154
$api->post('/stats/leaderboard')->to('api-stats#post_leaderboards');
155155
$api->post('/stats/leaderboard/paged')->to('api-stats#post_leaderboards_paged');
156156
$api->post('/outgoing-transactions')->to('api-transactions#post_transaction_list_purchases');
157+
$api->post('/recurring-transactions')->to('api-transactions#update_recurring');
158+
$api->post('/recurring-transactions/delete')->to('api-transactions#delete_recurring');
157159

158160

159161
my $api_v1 = $api->under('/v1');

lib/Pear/LocalLoop/Controller/Api/Categories.pm

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ sub post_category_list {
3131
value => { sum => 'value' },
3232
category_id => 'category_id',
3333
essential => 'essential',
34-
}
34+
},
3535
],
36-
group_by => [ qw/ category_id quantised_weeks / ],
36+
group_by => [ qw/ category_id quantised_weeks essential value / ],
3737
order_by => { '-desc' => 'value' },
3838
}
3939
);
@@ -43,7 +43,7 @@ sub post_category_list {
4343
for my $cat_trans ( $month_transaction_category_rs->all ) {
4444
my $quantised = $c->db_datetime_parser->parse_datetime($cat_trans->get_column('quantised'));
4545
my $days = $c->format_iso_date( $quantised ) || 0;
46-
my $category = $cat_trans->get_column('category_id') || 0;
46+
my $category = $cat_trans->get_column('category_id') || undef;
4747
my $value = ($cat_trans->get_column('value') || 0) / 100000;
4848
$data->{categories}->{$days} = [] unless exists $data->{categories}->{$days};
4949
push @{ $data->{categories}->{$days} }, {

lib/Pear/LocalLoop/Controller/Api/Transactions.pm

Lines changed: 121 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,21 @@ has error_messages => sub {
88
required => { message => 'No email sent.', status => 400 },
99
email => { message => 'Email is invalid.', status => 400 },
1010
},
11+
value => {
12+
required => { message => 'transaction amount is missing', status => 400 },
13+
number => { message => 'transaction amount does not look like a number', status => 400 },
14+
gt_num => { message => 'transaction amount cannot be equal to or less than zero', status => 400 },
15+
},
16+
apply_time => {
17+
required => { message => 'purchase time is missing', status => 400 },
18+
is_full_iso_datetime => { message => 'time is in incorrect format', status => 400 },
19+
},
20+
id => {
21+
required => { message => 'Recurring Transaction not found', status => 400 },
22+
},
23+
category => {
24+
in_resultset => { message => 'Category is invalid', status => 400 },
25+
},
1126
};
1227
};
1328

@@ -30,7 +45,11 @@ sub post_transaction_list_purchases {
3045
},
3146
);
3247

33-
# purchase_time needs timezone attached to it
48+
my $recurring_transactions = $c->schema->resultset('TransactionRecurring')->search({
49+
buyer_id => $user->id,
50+
});
51+
52+
# purchase_time needs timezone attached to it
3453
my @transaction_list = (
3554
map {{
3655
seller => $_->seller->name,
@@ -39,11 +58,112 @@ sub post_transaction_list_purchases {
3958
}} $transactions->all
4059
);
4160

61+
my @recurring_transaction_list = (
62+
map {{
63+
id => $_->id,
64+
seller => $_->seller->name,
65+
value => $_->value / 100000,
66+
start_time => $c->format_iso_datetime($_->start_time),
67+
last_updated => $c->format_iso_datetime($_->last_updated) || undef,
68+
essential => $_->essential,
69+
category => $_->category_id || 0,
70+
recurring_period => $_->recurring_period,
71+
}} $recurring_transactions->all
72+
);
73+
4274
return $c->render( json => {
4375
success => Mojo::JSON->true,
4476
transactions => \@transaction_list,
77+
recurring_transactions => \@recurring_transaction_list,
4578
page_no => $transactions->pager->total_entries,
4679
});
4780
}
4881

82+
sub update_recurring {
83+
my $c = shift;
84+
85+
my $user = $c->stash->{api_user};
86+
87+
my $validation = $c->validation;
88+
$validation->input( $c->stash->{api_json} );
89+
$validation->required('id');
90+
91+
return $c->api_validation_error if $validation->has_error;
92+
93+
my $id = $validation->param('id');
94+
95+
my $recur_transaction = $c->schema->resultset('TransactionRecurring')->find($id);
96+
unless ( $recur_transaction ) {
97+
return $c->render(
98+
json => {
99+
success => Mojo::JSON->false,
100+
message => 'Error Finding Recurring Transaction',
101+
error => 'recurring_error',
102+
},
103+
status => 400,
104+
);
105+
}
106+
107+
$validation->required('recurring_period');
108+
$validation->required('apply_time')->is_full_iso_datetime;
109+
$validation->optional('category')->in_resultset( 'id', $c->schema->resultset('Category'));
110+
$validation->optional('essential');
111+
$validation->required('value');
112+
113+
return $c->api_validation_error if $validation->has_error;
114+
115+
my $apply_time = $c->parse_iso_datetime($validation->param('apply_time'));
116+
117+
$c->schema->storage->txn_do( sub {
118+
$recur_transaction->update({
119+
start_time => $c->format_db_datetime($apply_time),
120+
last_updated => undef,
121+
category_id => $validation->param('category'),
122+
essential => $validation->param('essential'),
123+
value => $validation->param('value') * 100000,
124+
recurring_period => $validation->param('recurring_period'),
125+
});
126+
});
127+
128+
return $c->render( json => {
129+
success => Mojo::JSON->true,
130+
message => 'Recurring Transaction Updated Successfully',
131+
});
132+
133+
}
134+
135+
sub delete_recurring {
136+
my $c = shift;
137+
138+
my $user = $c->stash->{api_user};
139+
140+
my $validation = $c->validation;
141+
$validation->input( $c->stash->{api_json} );
142+
$validation->required('id');
143+
144+
return $c->api_validation_error if $validation->has_error;
145+
146+
my $id = $validation->param('id');
147+
148+
my $recur_transaction = $c->schema->resultset('TransactionRecurring')->find($id);
149+
unless ( $recur_transaction ) {
150+
return $c->render(
151+
json => {
152+
success => Mojo::JSON->false,
153+
message => 'Error Finding Recurring Transaction',
154+
error => 'recurring_error',
155+
},
156+
status => 400,
157+
);
158+
}
159+
160+
$recur_transaction->delete;
161+
162+
return $c->render( json => {
163+
success => Mojo::JSON->true,
164+
message => 'Recurring Transaction Deleted Successfully',
165+
});
166+
167+
}
168+
49169
1;

lib/Pear/LocalLoop/Controller/Api/Upload.pm

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ sub post_upload {
147147
# Unknown Organisation
148148
$validation->required('organisation_name');
149149
$validation->optional('street_name');
150-
$validation->required('town');
150+
$validation->optional('town');
151151
$validation->optional('postcode')->postcode;
152152

153153
return $c->api_validation_error if $validation->has_error;
@@ -243,18 +243,21 @@ sub post_category {
243243
my $c = shift;
244244
my $self = $c;
245245

246-
my $categories = { ids => [], names => [] };
247-
248246
my $category_rs = $c->schema->resultset('Category');
249247

250-
for ( $category_rs->all ) {
251-
push @{ $categories->{ ids } }, $_->get_column('id');
252-
push @{ $categories->{ names } }, $_->get_column('name');
253-
}
248+
# for ( $category_rs->all ) {
249+
# push @{ $categories->{ ids } }, $_->get_column('id');
250+
# push @{ $categories->{ names } }, $_->get_column('name');
251+
# }
252+
my %category_list = (
253+
map {
254+
$_->id => $_->name,
255+
} $category_rs->all
256+
);
254257

255258
return $self->render( json => {
256259
success => Mojo::JSON->true,
257-
categories => $categories,
260+
categories => \%category_list,
258261
});
259262
}
260263

lib/Pear/LocalLoop/Plugin/Datetime.pm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ sub register {
6666

6767
$app->helper( format_iso_datetime => sub {
6868
my ( $c, $datetime_obj ) = @_;
69+
return unless defined $datetime_obj;
6970
return $c->iso_datetime_parser->format_datetime(
7071
$datetime_obj,
7172
);

lib/Pear/LocalLoop/Schema/Result/ViewQuantisedTransactionCategoryPg.pm

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@ __PACKAGE__->table('view_quantised_transactions');
1010
__PACKAGE__->result_source_instance->is_virtual(1);
1111

1212
__PACKAGE__->result_source_instance->view_definition( qq/
13-
SELECT "transactions.value",
14-
"transactions.distance",
15-
"transactions.purchase_time",
16-
"transactions.buyer_id",
17-
"transactions.seller_id",
18-
"transactions.essential",
19-
"transaction_category.category_id",
20-
DATE_TRUNC('hour', "transactions.purchase_time") AS "quantised_hours",
21-
DATE_TRUNC('day', "transactions.purchase_time") AS "quantised_days",
22-
DATE_TRUNC('week', "transactions.purchase_time") AS "quantised_weeks"
13+
SELECT "transactions"."value",
14+
"transactions"."distance",
15+
"transactions"."purchase_time",
16+
"transactions"."buyer_id",
17+
"transactions"."seller_id",
18+
"transactions"."essential",
19+
"transaction_category"."category_id",
20+
DATE_TRUNC('hour', "transactions"."purchase_time") AS "quantised_hours",
21+
DATE_TRUNC('day', "transactions"."purchase_time") AS "quantised_days",
22+
DATE_TRUNC('week', "transactions"."purchase_time") AS "quantised_weeks"
2323
FROM "transactions"
24-
LEFT JOIN "transaction_category" ON "transactions.id" = "transaction_category.transaction_id"
24+
LEFT JOIN "transaction_category" ON "transactions"."id" = "transaction_category"."transaction_id"
2525
/);
2626

2727
1;

lib/Pear/LocalLoop/Schema/Result/ViewQuantisedTransactionCategorySQLite.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ SELECT "transactions"."value",
1919
"transaction_category"."category_id",
2020
DATETIME(STRFTIME('%Y-%m-%d %H:00:00',"transactions"."purchase_time")) AS "quantised_hours",
2121
DATETIME(STRFTIME('%Y-%m-%d 00:00:00',"transactions"."purchase_time")) AS "quantised_days",
22-
DATETIME(STRFTIME('%Y-%m-%d 00:00:00',"transactions"."purchase_time", 'weekday 1')) AS "quantised_weeks"
22+
DATETIME(STRFTIME('%Y-%m-%d 00:00:00',"transactions"."purchase_time", 'weekday 0','-6 days')) AS "quantised_weeks"
2323
FROM "transactions"
2424
LEFT JOIN "transaction_category" ON "transactions"."id" = "transaction_category"."transaction_id"
2525
/);

lib/Pear/LocalLoop/Schema/Result/ViewQuantisedTransactionSQLite.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ SELECT "value",
1717
"seller_id",
1818
DATETIME(STRFTIME('%Y-%m-%d %H:00:00',"purchase_time")) AS "quantised_hours",
1919
DATETIME(STRFTIME('%Y-%m-%d 00:00:00',"purchase_time")) AS "quantised_days",
20-
DATETIME(STRFTIME('%Y-%m-%d 00:00:00',"purchase_time", 'weekday 1')) AS "quantised_weeks"
20+
DATETIME(STRFTIME('%Y-%m-%d 00:00:00',"purchase_time",'weekday 0','-6 days')) AS "quantised_weeks"
2121
FROM "transactions"
2222
/);
2323

lib/Test/Pear/LocalLoop.pm

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ sub dump_error {
114114
my $self = shift;
115115
if ( my $error = $self->tx->res->dom->at('pre[id="error"]') ) {
116116
diag $error->text;
117+
} elsif ( my $route_error = $self->tx->res->dom->at('div[id="routes"] > p') ) {
118+
diag $route_error->content;
117119
} else {
118120
diag $self->tx->res->to_string;
119121
}

0 commit comments

Comments
 (0)