Moved more stuff to the journal collector.

This commit is contained in:
James Cole
2016-11-05 17:47:50 +01:00
parent 05dbd30bbd
commit 37435da459
8 changed files with 59 additions and 101 deletions

View File

@@ -8,6 +8,7 @@ use Carbon\Carbon;
use Crypt; use Crypt;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use FireflyIII\Models\Budget;
use FireflyIII\Models\Category; use FireflyIII\Models\Category;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
@@ -70,6 +71,8 @@ class JournalCollector
'transactions.amount', 'transactions.amount',
]; ];
/** @var bool */ /** @var bool */
private $joinedBudget = false;
/** @var bool */
private $joinedCategory = false; private $joinedCategory = false;
/** @var int */ /** @var int */
private $limit; private $limit;
@@ -193,7 +196,7 @@ class JournalCollector
{ {
/** @var AccountRepositoryInterface $repository */ /** @var AccountRepositoryInterface $repository */
$repository = app(AccountRepositoryInterface::class, [$this->user]); $repository = app(AccountRepositoryInterface::class, [$this->user]);
$accounts = $repository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT]); $accounts = $repository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT, AccountType::CASH]);
if ($accounts->count() > 0) { if ($accounts->count() > 0) {
$accountIds = $accounts->pluck('id')->toArray(); $accountIds = $accounts->pluck('id')->toArray();
$this->query->whereIn('transactions.account_id', $accountIds); $this->query->whereIn('transactions.account_id', $accountIds);
@@ -222,6 +225,30 @@ class JournalCollector
} }
/**
* @param Budget $budget
*
* @return JournalCollector
*/
public function setBudget(Budget $budget): JournalCollector
{
if (!$this->joinedBudget) {
// join some extra tables:
$this->joinedBudget = true;
$this->query->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id');
$this->query->leftJoin('budget_transaction', 'budget_transaction.transaction_id', '=', 'transactions.id');
}
$this->query->where(
function (EloquentBuilder $q) use ($budget) {
$q->where('budget_transaction.budget_id', $budget->id);
$q->orWhere('budget_transaction_journal.budget_id', $budget->id);
}
);
return $this;
}
/** /**
* @param Category $category * @param Category $category
* *

View File

@@ -17,6 +17,7 @@ use Amount;
use Carbon\Carbon; use Carbon\Carbon;
use Config; use Config;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\JournalCollector;
use FireflyIII\Http\Requests\BudgetFormRequest; use FireflyIII\Http\Requests\BudgetFormRequest;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
@@ -305,14 +306,13 @@ class BudgetController extends Controller
$start = session('first', Carbon::create()->startOfYear()); $start = session('first', Carbon::create()->startOfYear());
$end = new Carbon; $end = new Carbon;
$page = intval(Input::get('page')) == 0 ? 1 : intval(Input::get('page')); $page = intval(Input::get('page')) == 0 ? 1 : intval(Input::get('page'));
$pageSize = Preferences::get('transactionPageSize', 50)->data; $pageSize = intval(Preferences::get('transactionPageSize', 50)->data);
$offset = ($page - 1) * $pageSize;
$journals = $repository->journalsInPeriod(new Collection([$budget]), new Collection, $start, $end); // budget
$count = $journals->count();
$journals = $journals->slice($offset, $pageSize);
$journals = new LengthAwarePaginator($journals, $count, $pageSize);
$accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET, AccountType::CASH]); $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET, AccountType::CASH]);
// collector:
$collector = new JournalCollector(auth()->user());
$collector->setAllAssetAccounts()->setRange($start, $end)->setBudget($budget)->setLimit($pageSize)->setPage($page);
$journals = $collector->getPaginatedJournals();
$journals->setPath('/budgets/show/' . $budget->id); $journals->setPath('/budgets/show/' . $budget->id);
@@ -347,16 +347,15 @@ class BudgetController extends Controller
$start = $repetition->startdate; $start = $repetition->startdate;
$end = $repetition->enddate; $end = $repetition->enddate;
$page = intval(Input::get('page')) == 0 ? 1 : intval(Input::get('page')); $page = intval(Input::get('page')) == 0 ? 1 : intval(Input::get('page'));
$pageSize = Preferences::get('transactionPageSize', 50)->data; $pageSize = intval(Preferences::get('transactionPageSize', 50)->data);
$offset = ($page - 1) * $pageSize;
$journals = $repository->journalsInPeriod(new Collection([$budget]), new Collection, $start, $end); // budget
$count = $journals->count();
$journals = $journals->slice($offset, $pageSize);
$journals = new LengthAwarePaginator($journals, $count, $pageSize);
$subTitle = trans('firefly.budget_in_month', ['name' => $budget->name, 'month' => $repetition->startdate->formatLocalized($this->monthFormat)]); $subTitle = trans('firefly.budget_in_month', ['name' => $budget->name, 'month' => $repetition->startdate->formatLocalized($this->monthFormat)]);
$accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET, AccountType::CASH]); $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET, AccountType::CASH]);
// collector:
$collector = new JournalCollector(auth()->user());
$collector->setAllAssetAccounts()->setRange($start, $end)->setBudget($budget)->setLimit($pageSize)->setPage($page);
$journals = $collector->getPaginatedJournals();
$journals->setPath('/budgets/show/' . $budget->id . '/' . $repetition->id); $journals->setPath('/budgets/show/' . $budget->id . '/' . $repetition->id);

View File

@@ -101,9 +101,13 @@ class ReportController extends Controller
switch (true) { switch (true) {
case ($role === BalanceLine::ROLE_DEFAULTROLE && !is_null($budget->id)): case ($role === BalanceLine::ROLE_DEFAULTROLE && !is_null($budget->id)):
$journals = $budgetRepository->journalsInPeriod( $collector = new JournalCollector(auth()->user());
new Collection([$budget]), new Collection([$account]), $attributes['startDate'], $attributes['endDate'] $collector
); ->setAccounts(new Collection([$account]))
->setRange($attributes['startDate'], $attributes['endDate'])
->setBudget($budget);
$journals = $collector->getJournals();
break; break;
case ($role === BalanceLine::ROLE_DEFAULTROLE && is_null($budget->id)): case ($role === BalanceLine::ROLE_DEFAULTROLE && is_null($budget->id)):
$budget->name = strval(trans('firefly.no_budget')); $budget->name = strval(trans('firefly.no_budget'));
@@ -150,9 +154,17 @@ class ReportController extends Controller
$budget = $repository->find(intval($attributes['budgetId'])); $budget = $repository->find(intval($attributes['budgetId']));
if (is_null($budget->id)) { if (is_null($budget->id)) {
$journals = $repository->journalsInPeriodWithoutBudget($attributes['accounts'], $attributes['startDate'], $attributes['endDate']); $journals = $repository->journalsInPeriodWithoutBudget($attributes['accounts'], $attributes['startDate'], $attributes['endDate']);
} else { }
if (!is_null($budget->id)) {
// get all expenses in budget in period: // get all expenses in budget in period:
$journals = $repository->journalsInPeriod(new Collection([$budget]), $attributes['accounts'], $attributes['startDate'], $attributes['endDate']); $collector = new JournalCollector(auth()->user());
$collector
->setAccounts($attributes['accounts'])
->setRange($attributes['startDate'], $attributes['endDate'])
->setBudget($budget);
$journals = $collector->getJournals();
} }
$view = view('popup.report.budget-spent-amount', compact('journals', 'budget'))->render(); $view = view('popup.report.budget-spent-amount', compact('journals', 'budget'))->render();

View File

@@ -210,76 +210,6 @@ class BudgetRepository implements BudgetRepositoryInterface
return $set; return $set;
} }
/**
* @param Collection $budgets
* @param Collection $accounts
* @param Carbon $start
* @param Carbon $end
*
* @return Collection
*/
public function journalsInPeriod(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): Collection
{
$return = new Collection;
$accountIds = [];
// expand the number of grabbed fields:
$fields = TransactionJournal::queryFields();
$fields[] = 'source.account_id';
if ($accounts->count() > 0) {
$accountIds = $accounts->pluck('id')->toArray();
}
// first get all journals for all budget(s):
$journalQuery = $this->user->transactionJournals()
->expanded()
->sortCorrectly()
->before($end)
->after($start)
->leftJoin(
'transactions as source',
function (JoinClause $join) {
$join->on('source.transaction_journal_id', '=', 'transaction_journals.id')->where('source.amount', '<', '0');
}
)
->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id')
->whereIn('budget_transaction_journal.budget_id', $budgets->pluck('id')->toArray());
// add account id's, if relevant:
if (count($accountIds) > 0) {
$journalQuery->whereIn('source.account_id', $accountIds);
}
// get them:
$journals = $journalQuery->get(TransactionJournal::queryFields());
// then get transactions themselves.
$transactionQuery = $this->user->transactionJournals()
->expanded()
->before($end)
->sortCorrectly()
->after($start)
->leftJoin('transactions as related', 'related.transaction_journal_id', '=', 'transaction_journals.id')
->leftJoin('budget_transaction', 'budget_transaction.transaction_id', '=', 'related.id')
->leftJoin(
'transactions as source',
function (JoinClause $join) {
$join->on('source.transaction_journal_id', '=', 'transaction_journals.id')->where('source.amount', '<', '0');
}
)
->groupBy(['source.account_id'])
->whereIn('budget_transaction.budget_id', $budgets->pluck('id')->toArray());
if (count($accountIds) > 0) {
$transactionQuery->whereIn('source.account_id', $accountIds);
}
$transactions = $transactionQuery->get($fields);
// return complete set:
$return = $return->merge($transactions);
$return = $return->merge($journals);
return $return;
}
/** /**
* @param Collection $accounts * @param Collection $accounts
* @param Carbon $start * @param Carbon $start

View File

@@ -89,16 +89,6 @@ interface BudgetRepositoryInterface
*/ */
public function getInactiveBudgets(): Collection; public function getInactiveBudgets(): Collection;
/**
* @param Collection $budgets
* @param Collection $accounts
* @param Carbon $start
* @param Carbon $end
*
* @return Collection
*/
public function journalsInPeriod(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): Collection;
/** /**
* @param Collection $accounts * @param Collection $accounts
* @param Carbon $start * @param Carbon $start

View File

@@ -36,7 +36,7 @@
<h3 class="box-title">{{ 'transactions'|_ }}</h3> <h3 class="box-title">{{ 'transactions'|_ }}</h3>
</div> </div>
<div class="box-body"> <div class="box-body">
{% include 'list.journals' with {budgetPerspective: budget} %} {% include 'list.journals-tasker' %}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -10,7 +10,7 @@
<div class="modal-body"> <div class="modal-body">
{% set hideSource = true %} {% set hideSource = true %}
{% set hideBudget = true %} {% set hideBudget = true %}
{% include 'popup/list/journals.twig' %} {% include 'popup/list/journals-tasker.twig' %}
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{ 'close'|_ }}</button> <button type="button" class="btn btn-default" data-dismiss="modal">{{ 'close'|_ }}</button>

View File

@@ -9,7 +9,7 @@
</div> </div>
<div class="modal-body"> <div class="modal-body">
{% set hideBudget = true %} {% set hideBudget = true %}
{% include 'popup/list/journals.twig' %} {% include 'popup/list/journals-tasker' %}
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{ 'close'|_ }}</button> <button type="button" class="btn btn-default" data-dismiss="modal">{{ 'close'|_ }}</button>