mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2024-12-27 17:31:09 -06:00
More hip report stuff.
This commit is contained in:
parent
cdeac2c6db
commit
b812881cdb
@ -49,5 +49,15 @@ class Balance
|
||||
$this->balanceHeader = $balanceHeader;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Illuminate\Support\Collection
|
||||
*/
|
||||
public function getBalanceLines()
|
||||
{
|
||||
return $this->balanceLines;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -15,9 +15,13 @@ class BalanceLine
|
||||
|
||||
/** @var Collection */
|
||||
protected $balanceEntries;
|
||||
|
||||
/** @var BudgetModel */
|
||||
protected $budget;
|
||||
|
||||
/** @var float */
|
||||
protected $budgetAmount = 0.0;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@ -26,6 +30,9 @@ class BalanceLine
|
||||
$this->balanceEntries = new Collection;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param BalanceEntry $balanceEntry
|
||||
*/
|
||||
public function addBalanceEntry(BalanceEntry $balanceEntry)
|
||||
{
|
||||
$this->balanceEntries->push($balanceEntry);
|
||||
@ -63,5 +70,34 @@ class BalanceLine
|
||||
$this->budget = $budget;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return float
|
||||
*/
|
||||
public function getBudgetAmount()
|
||||
{
|
||||
return $this->budgetAmount;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param float $budgetAmount
|
||||
*/
|
||||
public function setBudgetAmount($budgetAmount)
|
||||
{
|
||||
$this->budgetAmount = $budgetAmount;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return float
|
||||
*/
|
||||
public function left() {
|
||||
$start = $this->getBudgetAmount();
|
||||
/** @var BalanceEntry $balanceEntry */
|
||||
foreach($this->getBalanceEntries() as $balanceEntry) {
|
||||
$start += $balanceEntry->getSpent();
|
||||
}
|
||||
return $start;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@ -109,21 +109,34 @@ class ReportHelper implements ReportHelperInterface
|
||||
$header->addAccount($account);
|
||||
}
|
||||
|
||||
/** @var BudgetModel $budget */
|
||||
foreach ($budgets as $budget) {
|
||||
$line = new BalanceLine;
|
||||
$line->setBudget($budget);
|
||||
|
||||
// get budget amount for current period:
|
||||
$rep = $budget->limitrepetitions()->where('budget_limits.startdate',$start->format('Y-m-d 00:00:00'))->first();
|
||||
if($rep) {
|
||||
$line->setBudgetAmount($rep->amount);
|
||||
}
|
||||
|
||||
// loop accounts:
|
||||
foreach ($accounts as $account) {
|
||||
$balanceEntry = new BalanceEntry;
|
||||
$balanceEntry->setAccount($account);
|
||||
$balanceEntry->setSpent(rand(1, 100));
|
||||
|
||||
// get spent:
|
||||
$spent = $this->query->spentInBudget($account, $budget, $start, $end, $shared); // I think shared is irrelevant.
|
||||
|
||||
$balanceEntry->setSpent($spent);
|
||||
$line->addBalanceEntry($balanceEntry);
|
||||
}
|
||||
// add line to balance:
|
||||
$balance->addBalanceLine($line);
|
||||
}
|
||||
|
||||
// then a new line for without budget.
|
||||
|
||||
$balance->setBalanceHeader($header);
|
||||
|
||||
return $balance;
|
||||
|
@ -7,6 +7,7 @@ use Carbon\Carbon;
|
||||
use Crypt;
|
||||
use DB;
|
||||
use FireflyIII\Models\Account;
|
||||
use FireflyIII\Models\Budget;
|
||||
use FireflyIII\Models\TransactionJournal;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
@ -522,36 +523,28 @@ class ReportQuery implements ReportQueryInterface
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* This query will get all transaction journals and budget information for a specified account
|
||||
* in a certain date range, where the transaction journal does not have a budget.
|
||||
* There is no get() specified, this is up to the method itself.
|
||||
*
|
||||
* @param Account $account
|
||||
* @param Budget $budget
|
||||
* @param Carbon $start
|
||||
* @param Carbon $end
|
||||
* @param bool $shared
|
||||
*
|
||||
* @return Builder
|
||||
* @return float
|
||||
*/
|
||||
protected function queryJournalsNoBudget(Account $account, Carbon $start, Carbon $end)
|
||||
public function spentInBudget(Account $account, Budget $budget, Carbon $start, Carbon $end, $shared = false)
|
||||
{
|
||||
return TransactionJournal::
|
||||
leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id')
|
||||
->leftJoin('budgets', 'budgets.id', '=', 'budget_transaction_journal.budget_id')
|
||||
->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id')
|
||||
->leftJoin(
|
||||
'transactions', function (JoinClause $join) {
|
||||
$join->on('transactions.transaction_journal_id', '=', 'transaction_journals.id')->where('transactions.amount', '<', 0);
|
||||
}
|
||||
)
|
||||
->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id')
|
||||
->before($end)
|
||||
->after($start)
|
||||
->where('accounts.id', $account->id)
|
||||
->where('transaction_journals.user_id', Auth::user()->id)
|
||||
->where('transaction_types.type', 'Withdrawal')
|
||||
->groupBy('budgets.id')
|
||||
->orderBy('budgets.name', 'ASC');
|
||||
|
||||
return floatval(
|
||||
Auth::user()->transactionjournals()
|
||||
->leftJoin('transactions' , 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
|
||||
->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id')
|
||||
->where('transactions.amount', '<', 0)
|
||||
->where('transactions.account_id', $account->id)
|
||||
->before($end)
|
||||
->after($start)
|
||||
->where('budget_transaction_journal.budget_id', $budget->id)
|
||||
->sum('transactions.amount')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -591,4 +584,36 @@ class ReportQuery implements ReportQueryInterface
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* This query will get all transaction journals and budget information for a specified account
|
||||
* in a certain date range, where the transaction journal does not have a budget.
|
||||
* There is no get() specified, this is up to the method itself.
|
||||
*
|
||||
* @param Account $account
|
||||
* @param Carbon $start
|
||||
* @param Carbon $end
|
||||
*
|
||||
* @return Builder
|
||||
*/
|
||||
protected function queryJournalsNoBudget(Account $account, Carbon $start, Carbon $end)
|
||||
{
|
||||
return TransactionJournal::
|
||||
leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id')
|
||||
->leftJoin('budgets', 'budgets.id', '=', 'budget_transaction_journal.budget_id')
|
||||
->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id')
|
||||
->leftJoin(
|
||||
'transactions', function (JoinClause $join) {
|
||||
$join->on('transactions.transaction_journal_id', '=', 'transaction_journals.id')->where('transactions.amount', '<', 0);
|
||||
}
|
||||
)
|
||||
->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id')
|
||||
->before($end)
|
||||
->after($start)
|
||||
->where('accounts.id', $account->id)
|
||||
->where('transaction_journals.user_id', Auth::user()->id)
|
||||
->where('transaction_types.type', 'Withdrawal')
|
||||
->groupBy('budgets.id')
|
||||
->orderBy('budgets.name', 'ASC');
|
||||
}
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ namespace FireflyIII\Helpers\Report;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use FireflyIII\Models\Account;
|
||||
use FireflyIII\Models\Budget;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
/**
|
||||
@ -123,6 +124,17 @@ interface ReportQueryInterface
|
||||
*/
|
||||
public function journalsByCategory(Carbon $start, Carbon $end, $includeShared = false);
|
||||
|
||||
/**
|
||||
* @param Account $account
|
||||
* @param Budget $budget
|
||||
* @param Carbon $start
|
||||
* @param Carbon $end
|
||||
* @param bool $shared
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function spentInBudget(Account $account, Budget $budget, Carbon $start, Carbon $end, $shared = false); // I think shared is irrelevant.
|
||||
|
||||
|
||||
/**
|
||||
* Gets a list of expense accounts and the expenses therein, grouped by that expense account.
|
||||
|
@ -162,70 +162,6 @@ class ReportController extends Controller
|
||||
$categories = $this->helper->getCategoryReport($start, $end, $shared);
|
||||
$balance = $this->helper->getBalanceReport($start, $end, $shared);
|
||||
|
||||
// /**
|
||||
// * DO BUDGETS.
|
||||
// */
|
||||
// /** @var \FireflyIII\Repositories\Budget\BudgetRepositoryInterface $repository */
|
||||
// $repository = App::make('FireflyIII\Repositories\Budget\BudgetRepositoryInterface');
|
||||
// $set = $repository->getBudgets();
|
||||
// $budgets = new Collection;
|
||||
// $budgetSums = ['budgeted' => 0, 'spent' => 0, 'left' => 0, 'overspent' => 0];
|
||||
// /** @var Budget $budget */
|
||||
// foreach ($set as $budget) {
|
||||
// $repetitions = $repository->getBudgetLimitRepetitions($budget, $start, $end);
|
||||
// if ($repetitions->count() == 0) {
|
||||
// $exp = $repository->spentInPeriod($budget, $start, $end, $shared);
|
||||
// $budgets->push([$budget, null, 0, 0, $exp]);
|
||||
// $budgetSums['overspent'] += $exp;
|
||||
// continue;
|
||||
// }
|
||||
// /** @var LimitRepetition $repetition */
|
||||
// foreach ($repetitions as $repetition) {
|
||||
// $exp = $repository->spentInPeriod($budget, $repetition->startdate, $repetition->enddate, $shared);
|
||||
// $left = $exp < floatval($repetition->amount) ? floatval($repetition->amount) - $exp : 0;
|
||||
// $spent = $exp > floatval($repetition->amount) ? 0 : $exp;
|
||||
// $overspent = $exp > floatval($repetition->amount) ? $exp - floatval($repetition->amount) : 0;
|
||||
//
|
||||
// $budgetSums['budgeted'] += floatval($repetition->amount);
|
||||
// $budgetSums['spent'] += $spent;
|
||||
// $budgetSums['left'] += $left;
|
||||
// $budgetSums['overspent'] += $overspent;
|
||||
//
|
||||
// $budgets->push([$budget, $repetition, $left, $spent, $overspent]);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// $noBudgetExpenses = $repository->getWithoutBudgetSum($start, $end);
|
||||
// $budgets->push([null, null, 0, 0, $noBudgetExpenses]);
|
||||
// $budgetSums['overspent'] += $noBudgetExpenses;
|
||||
// unset($noBudgetExpenses, $repository, $set, $repetition, $repetitions, $exp);
|
||||
|
||||
// /**
|
||||
// * GET CATEGORIES:
|
||||
// */
|
||||
// /** @var \FireflyIII\Repositories\Category\CategoryRepositoryInterface $repository */
|
||||
// $repository = App::make('FireflyIII\Repositories\Category\CategoryRepositoryInterface');
|
||||
// $set = $repository->getCategories();
|
||||
// $categories = [];
|
||||
// $categorySum = 0;
|
||||
// foreach ($set as $category) {
|
||||
// $spent = $repository->spentInPeriod($category, $start, $end, $shared);
|
||||
// $categories[] = [$category, $spent];
|
||||
// $categorySum += $spent;
|
||||
// }
|
||||
// // no category:
|
||||
//
|
||||
// // sort with callback:
|
||||
// uasort(
|
||||
// $categories, function ($a, $b) {
|
||||
// if ($a[1] == $b[1]) {
|
||||
// return 0;
|
||||
// }
|
||||
//
|
||||
// return ($a[1] < $b[1]) ? 1 : -1;
|
||||
// }
|
||||
// );
|
||||
// unset($set, $repository, $spent);
|
||||
|
||||
return view(
|
||||
'reports.month',
|
||||
@ -240,103 +176,6 @@ class ReportController extends Controller
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
// get all income and expenses. it's OK.
|
||||
// $income = $this->query->incomeInPeriod($start, $end, $shared);
|
||||
// $expensesSet = $this->query->journalsByExpenseAccount($start, $end, $shared);
|
||||
//
|
||||
// /**
|
||||
// * INCLUDE ORIGINAL BUDGET REPORT HERE:
|
||||
// */
|
||||
// // should show shared reports?
|
||||
// /** @var Preference $pref */
|
||||
// $accountAmounts = []; // array with sums of spent amounts on each account.
|
||||
// $accounts = $this->query->getAllAccounts($start, $end, $shared); // all accounts and some data.
|
||||
//
|
||||
// foreach ($accounts as $account) {
|
||||
//
|
||||
// $budgets = $this->query->getBudgetSummary($account, $start, $end);// get budget summary for this account:
|
||||
// $balancedAmount = $this->query->balancedTransactionsSum($account, $start, $end);
|
||||
// $accountAmounts[$account->id] = $balancedAmount;
|
||||
// // balance out the transactions (see transaction groups & tags) ^^
|
||||
//
|
||||
// // array with budget information for each account:
|
||||
// $array = [];
|
||||
// // should always hide account
|
||||
// $hide = true;
|
||||
// // loop all budgets
|
||||
// /** @var \FireflyIII\Models\Budget $budget */
|
||||
// foreach ($budgets as $budget) {
|
||||
// $id = intval($budget->id);
|
||||
// $data = $budget->toArray();
|
||||
// $array[$id] = $data;
|
||||
//
|
||||
// // no longer hide account if any budget has money in it.
|
||||
// if (floatval($data['queryAmount']) != 0) {
|
||||
// $hide = false;
|
||||
// }
|
||||
// $accountAmounts[$account->id] += $data['queryAmount'];
|
||||
// }
|
||||
// $account->hide = $hide;
|
||||
// $account->budgetInformation = $array;
|
||||
// $account->balancedAmount = $balancedAmount;
|
||||
//
|
||||
// }
|
||||
// /**
|
||||
// * END ORIGINAL BUDGET REPORT
|
||||
// */
|
||||
//
|
||||
// /**
|
||||
// * Start getBudgetsForMonth DONE
|
||||
// */
|
||||
// $budgets = $this->helper->getBudgetsForMonth($date, $shared);
|
||||
//
|
||||
// /**
|
||||
// * End getBudgetsForMonth DONE
|
||||
// */
|
||||
// /**
|
||||
// * Start getCategoriesForMonth DONE
|
||||
// */
|
||||
// // all categories.
|
||||
// $result = $this->query->journalsByCategory($start, $end);
|
||||
// $categories = Steam::makeArray($result);
|
||||
//
|
||||
//
|
||||
// // all transfers
|
||||
// if ($shared === false) {
|
||||
// $result = $this->query->sharedExpensesByCategory($start, $end);
|
||||
// $transfers = Steam::makeArray($result);
|
||||
// $merged = Steam::mergeArrays($categories, $transfers);
|
||||
// } else {
|
||||
// $merged = $categories;
|
||||
// }
|
||||
//
|
||||
//
|
||||
// // sort.
|
||||
// $sorted = Steam::sortNegativeArray($merged);
|
||||
//
|
||||
// // limit to $limit:
|
||||
// $categories = Steam::limitArray($sorted, 10);
|
||||
//
|
||||
// /**
|
||||
// * End getCategoriesForMonth DONE
|
||||
// */
|
||||
//
|
||||
//
|
||||
// // clean up and sort expenses:
|
||||
// $expenses = Steam::makeArray($expensesSet);
|
||||
// $expenses = Steam::sortArray($expenses);
|
||||
// $expenses = Steam::limitArray($expenses, 10);
|
||||
|
||||
//
|
||||
//
|
||||
// return view(
|
||||
// 'reports.month',
|
||||
// compact(
|
||||
// 'income', 'expenses', 'budgets', 'accounts', 'categories', 'shared',
|
||||
// 'date', 'subTitle', 'displaySum', 'subTitleIcon'
|
||||
// )
|
||||
// );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -15,6 +15,24 @@
|
||||
</th>
|
||||
</tr>
|
||||
|
||||
<!-- make rows -->
|
||||
{% for balanceLine in balance.getBalanceLines %}
|
||||
<tr>
|
||||
<td>{{ balanceLine.getBudget.name }}</td>
|
||||
<td>{{ balanceLine.getBudgetAmount|formatAmount }}</td>
|
||||
{% for balanceEntry in balanceLine.getBalanceEntries %}
|
||||
<td class="text-danger">
|
||||
{% if balanceEntry.getSpent != 0 %}
|
||||
{{ (balanceEntry.getSpent*-1)|formatAmountPlain }}
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
<td>
|
||||
{{ balanceLine.left|formatAmount }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
||||
</table>
|
||||
|
||||
<!--
|
@ -47,7 +47,7 @@
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-12 col-md-12 col-sm-12">
|
||||
{% include 'partials/reports/budgets-vs-accounts.twig' %}
|
||||
{% include 'partials/reports/balance.twig' %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
|
Loading…
Reference in New Issue
Block a user