treasuredb/TrsrDB/HTTP/Account.pm

117 lines
2.8 KiB
Perl

use strict;
package TrsrDB::HTTP::Account;
use Mojo::Base 'Mojolicious::Controller';
use Carp qw(croak);
sub list {
my $self = shift;
my $accounts = $self->app->db->resultset("Account");
my $user = $self->stash("user");
my %args = $user->grade ? ()
: $accounts->find( $user->user_id ) ? ( 'me.ID' => $user->user_id )
: ( type => q{} );
$accounts = $accounts->search(\%args, {
order_by => { -asc => [qw/type balance.even_until me.ID/] },
prefetch => 'balance'
});
$self->stash( accounts => $accounts );
return;
}
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 %query = ( account => $self->stash("account") );
if ( my $p = $self->param("purpose") ) {
# ...
}
my $history = $self->app->db->resultset("History")->search(
TrsrDB::HTTP::process_table_filter_widget(
$self, \%query,
{ order_by => { -desc => [qw/date/] } }
)
);
$self->stash( history => $history );
}
sub transfer {
my $self = shift;
my $db = $self->app->db;
my $account = $db->resultset("Account")->find( $self->stash("account") );
my $credits = $account->available_credits;
my $arrears = $account->current_arrears;
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;
}
sub report {
my $self = shift;
my $account = $self->app->db
->resultset("Account")
->find( $self->stash("account") )
;
$self->stash( report => $account->report->search_rs(
{}, { order_by => { -asc => [qw/date/] } }
) );
}
1;