Expanded reports.

This commit is contained in:
James Cole
2015-05-15 22:00:00 +02:00
parent aae003be33
commit 911c7c662a
5 changed files with 209 additions and 156 deletions

View File

@@ -227,6 +227,7 @@ class ReportQuery implements ReportQueryInterface
$object->name = intval($object->account_encrypted) == 1 ? Crypt::decrypt($object->name) : $object->name; $object->name = intval($object->account_encrypted) == 1 ? Crypt::decrypt($object->name) : $object->name;
} }
); );
$data->sortByDesc('queryAmount');
return $data; return $data;
} }

View File

@@ -30,6 +30,7 @@ class ReportController extends Controller
*/ */
public function __construct(ReportHelperInterface $helper, ReportQueryInterface $query) public function __construct(ReportHelperInterface $helper, ReportQueryInterface $query)
{ {
parent::__construct();
$this->query = $query; $this->query = $query;
$this->helper = $helper; $this->helper = $helper;
@@ -246,7 +247,7 @@ class ReportController extends Controller
return view( return view(
'reports.month', 'reports.month',
compact( compact(
'income', 'expenses', 'budgets', 'accounts', 'categories','shared', 'income', 'expenses', 'budgets', 'accounts', 'categories', 'shared',
'date', 'subTitle', 'displaySum', 'subTitleIcon' 'date', 'subTitle', 'displaySum', 'subTitleIcon'
) )
); );
@@ -259,25 +260,76 @@ class ReportController extends Controller
*/ */
public function year($year, $shared = false) public function year($year, $shared = false)
{ {
$date = new Carbon('01-01-' . $year);
$subTitle = trans('firefly.reportForYear',['year' => $year]); $end = clone $date;
$subTitle = trans('firefly.reportForYear', ['year' => $year]);
$subTitleIcon = 'fa-bar-chart';
$totalExpense = 0;
$totalIncome = 0;
if ($shared == 'shared') { if ($shared == 'shared') {
$shared = true; $shared = true;
$subTitle = trans('firefly.reportForYearShared',['year' => $year]); $subTitle = trans('firefly.reportForYearShared', ['year' => $year]);
} }
$date = new Carbon('01-01-' . $year);
$end = clone $date;
$end->endOfYear(); $end->endOfYear();
$subTitleIcon = 'fa-bar-chart'; /**
$mainTitleIcon = 'fa-line-chart'; * ALL ACCOUNTS
$balances = $this->helper->yearBalanceReport($date, $shared); * Summarized as well.
$groupedIncomes = $this->query->journalsByRevenueAccount($date, $end, $shared); */
$groupedExpenses = $this->query->journalsByExpenseAccount($date, $end, $shared); $accounts = $this->query->getAllAccounts($date, $end, $shared);
$accountsSums = ['start' => 0, 'end' => 0, 'diff' => 0];
// summarize:
foreach ($accounts as $account) {
$accountsSums['start'] += $account->startBalance;
$accountsSums['end'] += $account->endBalance;
$accountsSums['diff'] += ($account->endBalance - $account->startBalance);
}
/**
* ALL INCOMES.
* Grouped, sorted and summarized.
*/
$set = $this->query->incomeInPeriod($date, $end, $shared);
// group, sort and sum:
$incomes = [];
foreach ($set as $entry) {
$id = $entry->account_id;
$totalIncome += floatval($entry->queryAmount);
if (isset($incomes[$id])) {
$incomes[$id]['amount'] += floatval($entry->queryAmount);
$incomes[$id]['count']++;
} else {
$incomes[$id] = [
'amount' => floatval($entry->queryAmount),
'name' => $entry->name,
'count' => 1,
];
}
}
unset($set, $id);
/**
* GET ALL EXPENSES
* Summarized.
*/
$expenses = $this->query->journalsByExpenseAccount($date, $end, $shared);
foreach ($expenses as $expense) {
$totalExpense += floatval($expense->queryAmount);
}
return view( return view(
'reports.year', compact('date','shared', 'groupedIncomes', 'groupedExpenses', 'year', 'balances', 'subTitle', 'subTitleIcon', 'mainTitleIcon') 'reports.year',
compact(
'date', // the date for this report.
'shared', // is a shared report?
'totalExpense', 'totalIncome', // total income and expense.
'accounts', // all accounts
'accountsSums', // sums for all accounts
'incomes', 'expenses', // expenses and incomes.
'subTitle', 'subTitleIcon' // subtitle and subtitle icon.
)
); );
} }

View File

@@ -88,6 +88,13 @@ return [
'reportForYear' => 'Yearly report for :year', 'reportForYear' => 'Yearly report for :year',
'reportForYearShared' => 'Yearly report for :year (including shared accounts)', 'reportForYearShared' => 'Yearly report for :year (including shared accounts)',
'incomeVsExpenses' => 'Income vs. expenses',
'accountBalances' => 'Account balances',
'balanceStartOfYear' => 'Balance at start of year',
'balanceEndOfYear' => 'Balance at end of year',
'difference' => 'Difference',
'in' => 'In',
'out' => 'Out',
// charts: // charts:
'dayOfMonth' => 'Day of the month', 'dayOfMonth' => 'Day of the month',

View File

@@ -88,6 +88,13 @@ return [
'reportForYear' => 'Jaaroverzicht :year', 'reportForYear' => 'Jaaroverzicht :year',
'reportForYearShared' => 'Jaaroverzicht :year (inclusief gedeelde rekeningen)', 'reportForYearShared' => 'Jaaroverzicht :year (inclusief gedeelde rekeningen)',
'incomeVsExpenses' => 'Inkomsten tegenover uitgaven',
'accountBalances' => 'Rekeningsaldi',
'balanceStartOfYear' => 'Saldo aan het begin van het jaar',
'balanceEndOfYear' => 'Saldo aan het einde van het jaar',
'difference' => 'Verschil',
'in' => 'In',
'out' => 'Uit',
// charts: // charts:
'dayOfMonth' => 'Dag vd maand', 'dayOfMonth' => 'Dag vd maand',

View File

@@ -2,12 +2,12 @@
{% block content %} {% block content %}
{{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, date, shared) }} {{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, date, shared) }}
<div class="row"> <div class="row">
<div class="col-lg-10 col-md-8 col-sm-12"> <div class="col-lg-10 col-md-8 col-sm-12">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<i class="fa fa-line-chart"></i> <i class="fa fa-line-chart"></i>
Income vs. expenses {{ 'incomeVsExpenses'|_ }}
</div> </div>
<div class="panel-body"> <div class="panel-body">
<div id="income-expenses-chart"></div> <div id="income-expenses-chart"></div>
@@ -18,55 +18,44 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<i class="fa fa-calendar"></i> <i class="fa fa-calendar"></i>
Income vs. expenses {{ 'incomeVsExpenses'|_ }}
</div> </div>
<div class="panel-body"> <div class="panel-body">
<div id="income-expenses-sum-chart"></div> <div id="income-expenses-sum-chart"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-lg-6 col-md-6 col-sm-6"> <div class="col-lg-6 col-md-6 col-sm-6">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<i class="fa fa-credit-card fa-fw"></i> <i class="fa fa-credit-card fa-fw"></i>
Account balance {{ 'accountBalances'|_ }}
</div> </div>
<table class="table table-bordered table-striped"> <table class="table table-bordered table-striped">
<tr> <tr>
<th>Name</th> <th>{{ 'name'|_ }}</th>
<th>Balance at start of year</th> <th>{{ 'balanceStartOfYear'|_ }}</th>
<th>Balance at end of year</th> <th>{{ 'balanceStartOfYear'|_ }}</th>
<th>Difference</th> <th>{{ 'difference'|_ }}</th>
</tr> </tr>
{% set start = 0 %} {% for account in accounts %}
{% set end = 0 %}
{% set diff = 0 %}
{% for balance in balances %}
{% set start = start + balance.start %}
{% set end = end + balance.end %}
{% set diff = diff + (balance.end - balance.start) %}
{% if not balance.hide %}
<tr> <tr>
<td> <td>
<a href="{{ route('accounts.show', balance.account.id) }}">{{ balance.account.name }}</a> <a href="{{ route('accounts.show',account.id) }}" title="{{ account.name }}">{{ account.name }}</a>
{% if balance.shared %}
<small><em>shared</em></small>
{% endif %}
</td> </td>
<td>{{ balance.start|formatAmount }}</td> <td>{{ account.startBalance|formatAmount }}</td>
<td>{{ balance.end|formatAmount }}</td> <td>{{ account.endBalance|formatAmount }}</td>
<td>{{ (balance.end - balance.start)|formatAmount }}</td> <td>{{ (account.endBalance - account.startBalance)|formatAmount }}</td>
</tr> </tr>
{% endif %}
{% endfor %} {% endfor %}
<tr> <tr>
<td><em>Sum of sums</em></td> <td><em>Sum of sums</em></td>
<td>{{ start|formatAmount }}</td> <td>{{ accountsSums.start|formatAmount }}</td>
<td>{{ end|formatAmount }}</td> <td>{{ accountsSums.end|formatAmount }}</td>
<td>{{ diff|formatAmount }}</td> <td>{{ accountsSums.diff|formatAmount }}</td>
</tr> </tr>
</table> </table>
</div> </div>
@@ -74,30 +63,22 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<i class="fa fa-fw fa-exchange" title="Transfer"></i> <i class="fa fa-fw fa-exchange" title="Transfer"></i>
Income vs. expense {{ 'incomeVsExpenses'|_ }}
</div> </div>
{% set incomeSum = 0 %}
{% set expenseSum = 0 %}
{% for income in groupedIncomes %}
{% set incomeSum = incomeSum + (income.queryAmount*-1) %}
{% endfor %}
{% for expense in groupedExpenses %}
{% set expenseSum = expenseSum + expense.queryAmount %}
{% endfor %}
<table class="table table-bordered table-striped"> <table class="table table-bordered table-striped">
<tr> <tr>
<td>In</td> <td>{{ 'in'|_ }}</td>
<td>{{ incomeSum|formatAmount }}</td> <td>{{ totalIncome|formatAmount }}</td>
</tr> </tr>
<tr> <tr>
<td>Out</td> <td>{{ 'out'|_ }}</td>
<td><span class="text-danger">{{ expenseSum|formatAmountPlain }}</span></td> <td><span class="text-danger">{{ totalExpense|formatAmountPlain }}</span></td>
</tr> </tr>
<tr> <tr>
<td>Difference</td> <td>{{ 'difference'|_ }}</td>
<td>{{ (incomeSum - expenseSum)|formatAmount }}</td> <td>{{ (totalIncome - totalExpense)|formatAmount }}</td>
</tr> </tr>
</table> </table>
</div> </div>
@@ -106,20 +87,24 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<i class="fa fa-long-arrow-right fa-fw"></i> <i class="fa fa-long-arrow-right fa-fw"></i>
Income {{ 'income'|_ }}
</div> </div>
<table class="table"> <table class="table">
{% set sum = 0 %} {% for id,row in incomes %}
{% for income in groupedIncomes %}
{% set sum = sum + (income.queryAmount * -1) %}
<tr> <tr>
<td><a href="{{route('accounts.show',income.account_id)}}">{{ income.name }}</a></td> <td>
<td>{{ (income.queryAmount * -1)|formatAmount }}</td> <a href="{{ route('accounts.show',id) }}" title="{{ row.name }}">{{ row.name }}</a>
{% if row.count > 1 %}
<br /><small>{{ row.count }} {{ 'transactions'|_|lower }}</small>
{% endif %}
</td>
<td>{{ row.amount|formatAmount }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
<tr> <tr>
<td><em>Sum</em></td> <td><em>{{ 'sum'|_ }}</em></td>
<td>{{ sum|formatAmount }}</td> <td>{{ totalIncome|formatAmount }}</td>
</tr> </tr>
</table> </table>
</div> </div>
@@ -128,51 +113,52 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<i class="fa fa-long-arrow-left fa-fw"></i> <i class="fa fa-long-arrow-left fa-fw"></i>
Expenses {{ 'expenses'|_ }}
</div> </div>
<table class="table"> <table class="table">
{% set sum =0 %} {% set sum =0 %}
{% for expense in groupedExpenses %} {% for expense in expenses %}
<tr> <tr>
<td><a href="{{route('accounts.show',expense.id)}}">{{ expense.name }}</a></td> <td><a href="{{ route('accounts.show',expense.id) }}">{{ expense.name }}</a></td>
<td><span class="text-danger">{{ expense.queryAmount|formatAmountPlain }}</span></td> <td><span class="text-danger">{{ expense.queryAmount|formatAmountPlain }}</span></td>
</tr> </tr>
{% set sum = sum + (expense.queryAmount * -1) %} {% set sum = sum + (expense.queryAmount * -1) %}
{% endfor %} {% endfor %}
<tr> <tr>
<td><em>Sum</em></td> <td><em>{{ 'sum'|_ }}</em></td>
<td>{{ sum|formatAmount }}</td> <td>{{ sum|formatAmount }}</td>
</tr> </tr>
</table> </table>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-lg-12 col-md-12 col-sm-12"> <div class="col-lg-12 col-md-12 col-sm-12">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<i class="fa fa-tasks fa-fw"></i> <i class="fa fa-tasks fa-fw"></i>
Budgets {{ 'budgets'|_ }}
</div> </div>
<div class="panel-body"> <div class="panel-body">
<div id="budgets"></div> <div id="budgets"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block scripts %} {% block scripts %}
<!-- load the libraries and scripts necessary for Google Charts: --> <!-- load the libraries and scripts necessary for Google Charts: -->
<script type="text/javascript" src="https://www.google.com/jsapi"></script> <script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript" src="js/gcharts.options.js"></script> <script type="text/javascript" src="js/gcharts.options.js"></script>
<script type="text/javascript" src="js/gcharts.js"></script> <script type="text/javascript" src="js/gcharts.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var year = '{{year}}'; var year = '{{date.year}}';
var shared = {% if shared %}'/shared'{% else %}''{% endif %}; var shared = {% if shared %}'/shared'
</script> {% else %}''{% endif %};
</script>
<script type="text/javascript" src="js/reports.js"></script> <script type="text/javascript" src="js/reports.js"></script>
{% endblock %} {% endblock %}