diff --git a/TrsrDB/HTTP.pm b/TrsrDB/HTTP.pm index 556f871..8c7ae28 100644 --- a/TrsrDB/HTTP.pm +++ b/TrsrDB/HTTP.pm @@ -72,15 +72,17 @@ sub startup { my $admin = $auth->under(sub { shift->stash('grade') > 1 }); $admin->any('/admin')->to('admin#dash'); + $admin->any( [qw/GET POST/] => '/account/:account' => { account => undef }) + ->to('account#upsert'); $admin->post('/:account/in')->to('credit#upsert'); $admin->post('/:account/out')->to('debit#upsert'); $admin->get('/:account/credits')->to('credit#list'); $admin->get('/:account/debits')->to('debit#list'); $admin->post('/:account/transfer')->to('account#transfer'); $admin->any( [qw/GET POST PATCH/] => '/credit/:id' )->to('credit#upsert'); - $admin->post('/credit')->to('credit#upsert'); + $admin->any( [qw/GET POST/] => '/credit')->to('credit#upsert'); $admin->any( [qw/GET POST PATCH/] => '/debit/*id' )->to('debit#upsert'); - $admin->post('/debit')->to('debit#upsert'); + $admin->any( [qw/GET POST/] => '/debit')->to('debit#upsert'); $admin->get('/:action')->to(controller => 'admin'); $auth->get('/')->to('account#list')->name('home'); diff --git a/TrsrDB/HTTP/Account.pm b/TrsrDB/HTTP/Account.pm index 21b2f24..4de2247 100644 --- a/TrsrDB/HTTP/Account.pm +++ b/TrsrDB/HTTP/Account.pm @@ -18,6 +18,40 @@ sub list { } +sub upsert { + my $self = shift; + + my $db = $self->app->db; + my $account_rs = $db->resultset("Account"); + my $account; + if ( my $name = $self->stash("account") ) { + $self->stash( name => $name ); + $account = $account_rs->find($name); + } + else { + $self->stash( name => undef ); + $account = $account_rs->new({}); + } + $self->stash( account => $account ); + + if ( $self->req->method eq 'POST' ) { + for my $field ($account->result_source->columns) { + my $value = $self->param($field); + $account->$field($value); + } + $account->update_or_insert(); + $self->redirect_to("home"); + } + else { + my @types = $account_rs->search({ type => { '!=' => q// } }, { + columns => ['type'], distinct => 1 + })->get_column("type")->all; + $self->stash( types => \@types ); + } + + return; +} + sub history { my $self = shift; my $history = $self->app->db->resultset("History")->search({ @@ -34,18 +68,20 @@ sub transfer { my $credits = $account->available_credits; my $arrears = $account->current_arrears; - return $self->redirect_to('home') - if !( $credits->count() && $arrears->count() ); + if ( $self->req->method eq 'POST' ) { + $db->make_transfers( + $self->every_param('credits') + => $self->every_param('debits') + ); + } + + if ( !( $credits->count && $arrears->count ) ) { + $self->redirect_to('home'); + return; + } $self->stash( credits => $credits, arrears => $arrears ); - return if $self->req->method ne 'POST'; - - $db->make_transfers( - $self->every_param('credits') - => $self->every_param('debits') - ); - return; } diff --git a/TrsrDB/HTTP/Credit.pm b/TrsrDB/HTTP/Credit.pm index a3ef990..1ca167d 100644 --- a/TrsrDB/HTTP/Credit.pm +++ b/TrsrDB/HTTP/Credit.pm @@ -18,7 +18,10 @@ sub list { return; } - $self->stash( credits => $account->credits_rs ); + my $rs = $account->search_related( + credits => {}, { order_by => { -desc => [qw/date/] } } + ); + $self->stash( credits => $rs ); return; diff --git a/TrsrDB/HTTP/Debit.pm b/TrsrDB/HTTP/Debit.pm index 76d86b9..ec6c9cd 100644 --- a/TrsrDB/HTTP/Debit.pm +++ b/TrsrDB/HTTP/Debit.pm @@ -18,7 +18,10 @@ sub list { return; } - $self->stash( debits => $account->debits_rs ); + my $rs = $account->search_related( + debits => {}, { order_by => { -desc => [qw/date/] }} + ); + $self->stash( debits => $rs ); return; @@ -29,17 +32,36 @@ sub upsert { my $db = $self->app->db; my $id = $self->stash("id"); - my $account = $self->stash("account"); + my @FIELDS = qw/billId date purpose value targetCredit/; + my $debtor = $self->stash("account") // $self->param("debtor"); + if ( $self->req->method eq 'POST' && $debtor =~ s{^@}{} ) { + + my $group_members = $db->resultset('Account')->search({ + type => $debtor + }); + + while ( my $m = $group_members->next ) { + my %props = map { $_ => $self->param($_) } @FIELDS; + for ( $props{billId} ) { + s{\%u}{ $m->ID }e or $_ .= "-" . $m->ID; + } + $m->debits->create( \%props ); + } + + $self->redirect_to('home'); + return; + } + my $method = $id ? 'find_or_new' : 'new'; my $debit = $db->resultset("Debit")->$method( - { $id ? (billId => $id) : (), debtor => $account } + { $id ? (billId => $id) : (), debtor => $debtor } ); $self->stash( debit => $debit ); if ( $self->req->method eq 'GET' ) { my $targets - = $db->resultset("Credit")->search({ account => { '!=' => $account } }, + = $db->resultset("Credit")->search({ account => { '!=' => $debtor } }, { join => 'income', '+select' => [ { count => 'income.targetCredit', -as => 'targetted_by' } ], group_by => ['income.targetCredit'], @@ -52,7 +74,7 @@ sub upsert { return; } - for my $field ( qw/billId debtor date purpose value targetCredit/ ) { + for my $field ( @FIELDS ) { my $value = $self->param($field); $debit->$field($value); } diff --git a/site/style.css b/site/style.css index 51d020c..504c1d3 100644 --- a/site/style.css +++ b/site/style.css @@ -34,7 +34,12 @@ table td.centered { table td.number { text-align: right; - font-family: monospace; + font-family: monospace, monospace; /* Hack to prevent browser default size reduction of monospace font */ + font-size:1em; +} + +table td.mark { + background-color:rgba(255,0,0,0.1); } a.transfer-btn { diff --git a/templates/account/list.html.ep b/templates/account/list.html.ep index b93fd9d..01e5cc9 100644 --- a/templates/account/list.html.ep +++ b/templates/account/list.html.ep @@ -5,7 +5,9 @@ AccountEven untilArrearsTransferAvailableEarnedPromisedHistoryReport % my ($type) = q{}; % my $inter_header = begin -<%= shift || 'Club management accounts' %> +% my $group = shift; +<%= $group || 'Club management accounts' %> +Charge'm all % end % while ( my $account = $accounts->next ) { % my $bal = $account->balance; @@ -15,8 +17,8 @@ <%= $inter_header->($t) %> % } % my $u = $account->ID; -<%= $u %> - <%= $bal->even_until // "never" %><%== money $bal->arrears %>listadd +<%= $u %> + <%= $bal->even_until // "never" %><%== money $bal->arrears %>listCharge % my $which = ($bal->arrears && 1) + ($bal->available && 1); % if ( $which == 2 ) { @@ -28,11 +30,11 @@ % else {  N/A  % } - <%== money $bal->available %>listadd<%== money $bal->earned %><%== money $bal->promised %>HistoryReport + <%== money $bal->available %>listCredit<%== money $bal->earned %><%== money $bal->promised %>HistoryReport % } # while -

Reconstructed bank statement

+

Create accountReconstructed bank statement

Column explanation

diff --git a/templates/account/report.html.ep b/templates/account/report.html.ep index b6f87a3..2583fe5 100644 --- a/templates/account/report.html.ep +++ b/templates/account/report.html.ep @@ -2,7 +2,10 @@ +% my $total; % while ( my $record = $report->next ) { +% $total += $record->value; % } +
DateValuePurpose
<%= $record->date %><%== money $record->value %><%== nl2br $record->purpose %>
In total:<%== money $total %>
diff --git a/templates/bankStatement.html.ep b/templates/bankStatement.html.ep index 6a113d0..0f9c091 100644 --- a/templates/bankStatement.html.ep +++ b/templates/bankStatement.html.ep @@ -2,7 +2,11 @@ +% my ($total_credit, $total_debit); % while ( my $record = $records->next ) { - +% $total_credit += $record->credit; +% $total_debit += $record->debit; + % } +
DatePurposeAccountDebitCredit
<%= $record->date %><%= $record->purpose %><%= $record->account %><%= $record->debit %><%= $record->credit %>
<%= $record->date %><%= $record->purpose %><%= $record->account %><%== money $record->debit %><%== money $record->credit %>
Current balance:<%== $total_debit ? money $total_debit : '' %><%== $total_credit ? money $total_credit : '' %>
diff --git a/templates/credit/list.html.ep b/templates/credit/list.html.ep index dcbda59..aaa47f0 100644 --- a/templates/credit/list.html.ep +++ b/templates/credit/list.html.ep @@ -1,8 +1,10 @@ % title 'Income of ' . $account; +

Listed in reverse order:

+ % while ( my $credit = $credits->next ) { - + % }
IdDatePurposevaluespent
<%= $credit->credId %><%= $credit->date %><%== nl2br $credit->purpose %><%== money $credit->value %><%== money $credit->spent %>
<%= $credit->credId %><%= $credit->date %><%== nl2br $credit->purpose %><%== money $credit->value %>"><%== money $credit->spent %>
diff --git a/templates/debit/list.html.ep b/templates/debit/list.html.ep index dcd3313..bd527ae 100644 --- a/templates/debit/list.html.ep +++ b/templates/debit/list.html.ep @@ -1,9 +1,11 @@ % title 'Outcome of ' . $account; +

Listed in reverse order:

+ % while ( my $debit = $debits->next ) { % my $tgt = $debit->target; - + % }
IdDatePurposevaluepaidto
<%= $debit->billId %><%= $debit->date %><%== nl2br $debit->purpose %><%== money $debit->value %><%== money $debit->paid %><%= $tgt->account->ID %>
<%= $debit->billId %><%= $debit->date %><%== nl2br $debit->purpose %><%== money $debit->value %>"><%== money $debit->paid %><%= $tgt->account->ID %>
diff --git a/templates/debit/upsert.html.ep b/templates/debit/upsert.html.ep index 4746874..1858466 100644 --- a/templates/debit/upsert.html.ep +++ b/templates/debit/upsert.html.ep @@ -26,7 +26,7 @@ oops % my $cmpacc = $targets->[0][1]; % my $target = $debit->targetCredit // ''; % end % $r{debtor} = begin - +% my $g = param 'group'; + debtor %>"> % end