mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-02-25 18:45:27 -06:00
Expanded reports.
This commit is contained in:
parent
aae003be33
commit
911c7c662a
@ -227,6 +227,7 @@ class ReportQuery implements ReportQueryInterface
|
||||
$object->name = intval($object->account_encrypted) == 1 ? Crypt::decrypt($object->name) : $object->name;
|
||||
}
|
||||
);
|
||||
$data->sortByDesc('queryAmount');
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
@ -30,6 +30,7 @@ class ReportController extends Controller
|
||||
*/
|
||||
public function __construct(ReportHelperInterface $helper, ReportQueryInterface $query)
|
||||
{
|
||||
parent::__construct();
|
||||
$this->query = $query;
|
||||
$this->helper = $helper;
|
||||
|
||||
@ -246,7 +247,7 @@ class ReportController extends Controller
|
||||
return view(
|
||||
'reports.month',
|
||||
compact(
|
||||
'income', 'expenses', 'budgets', 'accounts', 'categories','shared',
|
||||
'income', 'expenses', 'budgets', 'accounts', 'categories', 'shared',
|
||||
'date', 'subTitle', 'displaySum', 'subTitleIcon'
|
||||
)
|
||||
);
|
||||
@ -259,25 +260,76 @@ class ReportController extends Controller
|
||||
*/
|
||||
public function year($year, $shared = false)
|
||||
{
|
||||
|
||||
$subTitle = trans('firefly.reportForYear',['year' => $year]);
|
||||
$date = new Carbon('01-01-' . $year);
|
||||
$end = clone $date;
|
||||
$subTitle = trans('firefly.reportForYear', ['year' => $year]);
|
||||
$subTitleIcon = 'fa-bar-chart';
|
||||
$totalExpense = 0;
|
||||
$totalIncome = 0;
|
||||
|
||||
if ($shared == 'shared') {
|
||||
$shared = true;
|
||||
$subTitle = trans('firefly.reportForYearShared',['year' => $year]);
|
||||
$shared = true;
|
||||
$subTitle = trans('firefly.reportForYearShared', ['year' => $year]);
|
||||
}
|
||||
$date = new Carbon('01-01-' . $year);
|
||||
$end = clone $date;
|
||||
$end->endOfYear();
|
||||
|
||||
$subTitleIcon = 'fa-bar-chart';
|
||||
$mainTitleIcon = 'fa-line-chart';
|
||||
$balances = $this->helper->yearBalanceReport($date, $shared);
|
||||
$groupedIncomes = $this->query->journalsByRevenueAccount($date, $end, $shared);
|
||||
$groupedExpenses = $this->query->journalsByExpenseAccount($date, $end, $shared);
|
||||
/**
|
||||
* ALL ACCOUNTS
|
||||
* Summarized as well.
|
||||
*/
|
||||
$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(
|
||||
'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.
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -88,6 +88,13 @@ return [
|
||||
|
||||
'reportForYear' => 'Yearly report for :year',
|
||||
'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:
|
||||
'dayOfMonth' => 'Day of the month',
|
||||
|
@ -88,6 +88,13 @@ return [
|
||||
|
||||
'reportForYear' => 'Jaaroverzicht :year',
|
||||
'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:
|
||||
'dayOfMonth' => 'Dag vd maand',
|
||||
|
@ -2,177 +2,163 @@
|
||||
{% block content %}
|
||||
{{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, date, shared) }}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-10 col-md-8 col-sm-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-line-chart"></i>
|
||||
Income vs. expenses
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div id="income-expenses-chart"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-2 col-md-4 col-sm-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-calendar"></i>
|
||||
Income vs. expenses
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div id="income-expenses-sum-chart"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-6 col-md-6 col-sm-6">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-credit-card fa-fw"></i>
|
||||
Account balance
|
||||
<div class="row">
|
||||
<div class="col-lg-10 col-md-8 col-sm-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-line-chart"></i>
|
||||
{{ 'incomeVsExpenses'|_ }}
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div id="income-expenses-chart"></div>
|
||||
</div>
|
||||
</div>
|
||||
<table class="table table-bordered table-striped">
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Balance at start of year</th>
|
||||
<th>Balance at end of year</th>
|
||||
<th>Difference</th>
|
||||
</tr>
|
||||
{% set start = 0 %}
|
||||
{% 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 %}
|
||||
</div>
|
||||
<div class="col-lg-2 col-md-4 col-sm-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-calendar"></i>
|
||||
{{ 'incomeVsExpenses'|_ }}
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div id="income-expenses-sum-chart"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-6 col-md-6 col-sm-6">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-credit-card fa-fw"></i>
|
||||
{{ 'accountBalances'|_ }}
|
||||
</div>
|
||||
<table class="table table-bordered table-striped">
|
||||
<tr>
|
||||
<th>{{ 'name'|_ }}</th>
|
||||
<th>{{ 'balanceStartOfYear'|_ }}</th>
|
||||
<th>{{ 'balanceStartOfYear'|_ }}</th>
|
||||
<th>{{ 'difference'|_ }}</th>
|
||||
</tr>
|
||||
{% for account in accounts %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ route('accounts.show', balance.account.id) }}">{{ balance.account.name }}</a>
|
||||
{% if balance.shared %}
|
||||
<small><em>shared</em></small>
|
||||
{% endif %}
|
||||
<a href="{{ route('accounts.show',account.id) }}" title="{{ account.name }}">{{ account.name }}</a>
|
||||
</td>
|
||||
<td>{{ balance.start|formatAmount }}</td>
|
||||
<td>{{ balance.end|formatAmount }}</td>
|
||||
<td>{{ (balance.end - balance.start)|formatAmount }}</td>
|
||||
<td>{{ account.startBalance|formatAmount }}</td>
|
||||
<td>{{ account.endBalance|formatAmount }}</td>
|
||||
<td>{{ (account.endBalance - account.startBalance)|formatAmount }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<tr>
|
||||
<td><em>Sum of sums</em></td>
|
||||
<td>{{ start|formatAmount }}</td>
|
||||
<td>{{ end|formatAmount }}</td>
|
||||
<td>{{ diff|formatAmount }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-fw fa-exchange" title="Transfer"></i>
|
||||
Income vs. expense
|
||||
{% endfor %}
|
||||
<tr>
|
||||
<td><em>Sum of sums</em></td>
|
||||
<td>{{ accountsSums.start|formatAmount }}</td>
|
||||
<td>{{ accountsSums.end|formatAmount }}</td>
|
||||
<td>{{ accountsSums.diff|formatAmount }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</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 %}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-fw fa-exchange" title="Transfer"></i>
|
||||
{{ 'incomeVsExpenses'|_ }}
|
||||
</div>
|
||||
|
||||
|
||||
<table class="table table-bordered table-striped">
|
||||
<tr>
|
||||
<td>In</td>
|
||||
<td>{{ incomeSum|formatAmount }}</td>
|
||||
<td>{{ 'in'|_ }}</td>
|
||||
<td>{{ totalIncome|formatAmount }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Out</td>
|
||||
<td><span class="text-danger">{{ expenseSum|formatAmountPlain }}</span></td>
|
||||
<td>{{ 'out'|_ }}</td>
|
||||
<td><span class="text-danger">{{ totalExpense|formatAmountPlain }}</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Difference</td>
|
||||
<td>{{ (incomeSum - expenseSum)|formatAmount }}</td>
|
||||
<td>{{ 'difference'|_ }}</td>
|
||||
<td>{{ (totalIncome - totalExpense)|formatAmount }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-md-3 col-sm-3">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-long-arrow-right fa-fw"></i>
|
||||
Income
|
||||
</div>
|
||||
<table class="table">
|
||||
{% set sum = 0 %}
|
||||
{% for income in groupedIncomes %}
|
||||
{% set sum = sum + (income.queryAmount * -1) %}
|
||||
</div>
|
||||
<div class="col-lg-3 col-md-3 col-sm-3">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-long-arrow-right fa-fw"></i>
|
||||
{{ 'income'|_ }}
|
||||
</div>
|
||||
<table class="table">
|
||||
{% for id,row in incomes %}
|
||||
<tr>
|
||||
<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>
|
||||
{% endfor %}
|
||||
|
||||
<tr>
|
||||
<td><a href="{{route('accounts.show',income.account_id)}}">{{ income.name }}</a></td>
|
||||
<td>{{ (income.queryAmount * -1)|formatAmount }}</td>
|
||||
<td><em>{{ 'sum'|_ }}</em></td>
|
||||
<td>{{ totalIncome|formatAmount }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
<tr>
|
||||
<td><em>Sum</em></td>
|
||||
<td>{{ sum|formatAmount }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-md-3 col-sm-3">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-long-arrow-left fa-fw"></i>
|
||||
Expenses
|
||||
</table>
|
||||
</div>
|
||||
<table class="table">
|
||||
{% set sum =0 %}
|
||||
{% for expense in groupedExpenses %}
|
||||
<tr>
|
||||
<td><a href="{{route('accounts.show',expense.id)}}">{{ expense.name }}</a></td>
|
||||
<td><span class="text-danger">{{ expense.queryAmount|formatAmountPlain }}</span></td>
|
||||
</tr>
|
||||
{% set sum = sum + (expense.queryAmount * -1) %}
|
||||
{% endfor %}
|
||||
<tr>
|
||||
<td><em>Sum</em></td>
|
||||
<td>{{ sum|formatAmount }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-12 col-md-12 col-sm-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-tasks fa-fw"></i>
|
||||
Budgets
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div id="budgets"></div>
|
||||
<div class="col-lg-3 col-md-3 col-sm-3">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-long-arrow-left fa-fw"></i>
|
||||
{{ 'expenses'|_ }}
|
||||
</div>
|
||||
<table class="table">
|
||||
{% set sum =0 %}
|
||||
{% for expense in expenses %}
|
||||
<tr>
|
||||
<td><a href="{{ route('accounts.show',expense.id) }}">{{ expense.name }}</a></td>
|
||||
<td><span class="text-danger">{{ expense.queryAmount|formatAmountPlain }}</span></td>
|
||||
</tr>
|
||||
{% set sum = sum + (expense.queryAmount * -1) %}
|
||||
{% endfor %}
|
||||
<tr>
|
||||
<td><em>{{ 'sum'|_ }}</em></td>
|
||||
<td>{{ sum|formatAmount }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-12 col-md-12 col-sm-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-tasks fa-fw"></i>
|
||||
{{ 'budgets'|_ }}
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div id="budgets"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
{% block scripts %}
|
||||
<!-- 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="js/gcharts.options.js"></script>
|
||||
<script type="text/javascript" src="js/gcharts.js"></script>
|
||||
<!-- 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="js/gcharts.options.js"></script>
|
||||
<script type="text/javascript" src="js/gcharts.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var year = '{{year}}';
|
||||
var shared = {% if shared %}'/shared'{% else %}''{% endif %};
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
var year = '{{date.year}}';
|
||||
var shared = {% if shared %}'/shared'
|
||||
{% else %}''{% endif %};
|
||||
</script>
|
||||
|
||||
<script type="text/javascript" src="js/reports.js"></script>
|
||||
<script type="text/javascript" src="js/reports.js"></script>
|
||||
|
||||
{% endblock %}
|
||||
|
Loading…
Reference in New Issue
Block a user