mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-09-30 02:26:58 +00:00
Moved more stuff to the journal collector.
This commit is contained in:
@@ -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
|
||||||
*
|
*
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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();
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
Reference in New Issue
Block a user