From aeca2ef3b256bc803d7244141edaa8ef3f9a0316 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 5 Nov 2016 10:42:31 +0100 Subject: [PATCH] Move some code around --- app/Helpers/Collector/JournalCollector.php | 30 +++++--- app/Http/Controllers/AccountController.php | 25 +++---- app/Http/Controllers/HomeController.php | 9 +-- .../Controllers/Popup/ReportController.php | 16 ++--- app/Http/Controllers/ReportController.php | 12 ++-- app/Repositories/Account/AccountTasker.php | 71 ------------------- .../Account/AccountTaskerInterface.php | 12 ---- 7 files changed, 52 insertions(+), 123 deletions(-) diff --git a/app/Helpers/Collector/JournalCollector.php b/app/Helpers/Collector/JournalCollector.php index 2b454d47e6..030e7ec7f1 100644 --- a/app/Helpers/Collector/JournalCollector.php +++ b/app/Helpers/Collector/JournalCollector.php @@ -54,7 +54,8 @@ class JournalCollector 'accounts.encrypted as account_encrypted', 'account_types.type as account_type', ]; - + /** @var bool */ + private $filterTransfers = false; /** @var array */ private $group = [ @@ -68,7 +69,6 @@ class JournalCollector 'bills.name', 'transactions.amount', ]; - /** @var bool */ private $joinedCategory = false; /** @var int */ @@ -127,15 +127,17 @@ class JournalCollector $set = $this->query->get(array_values($this->fields)); // filter out transfers: - $set = $set->filter( - function (Transaction $transaction) { - if (!($transaction->transaction_type_type === TransactionType::TRANSFER && bccomp($transaction->transaction_amount, '0') === -1)) { - return $transaction; - } + if ($this->filterTransfers) { + $set = $set->filter( + function (Transaction $transaction) { + if (!($transaction->transaction_type_type === TransactionType::TRANSFER && bccomp($transaction->transaction_amount, '0') === -1)) { + return $transaction; + } - return false; - } - ); + return false; + } + ); + } // loop for decryption. $set->each( @@ -177,6 +179,10 @@ class JournalCollector $this->query->whereIn('transactions.account_id', $accountIds); } + if ($accounts->count() > 1) { + $this->filterTransfers = true; + } + return $this; } @@ -193,6 +199,10 @@ class JournalCollector $this->query->whereIn('transactions.account_id', $accountIds); } + if ($accounts->count() > 1) { + $this->filterTransfers = true; + } + return $this; } diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 09fe795a2d..5258baa91b 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -16,6 +16,7 @@ namespace FireflyIII\Http\Controllers; use Carbon\Carbon; use ExpandedForm; use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Helpers\Collector\JournalCollector; use FireflyIII\Http\Requests\AccountFormRequest; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; @@ -222,12 +223,12 @@ class AccountController extends Controller /** @var Carbon $end */ $end = session('end', Navigation::endOfPeriod(new Carbon, $range)); $page = intval(Input::get('page')); - $pageSize = Preferences::get('transactionPageSize', 50)->data; - $offset = ($page - 1) * $pageSize; - $set = $tasker->getJournalsInPeriod(new Collection([$account]), [], $start, $end); - $count = $set->count(); - $subSet = $set->splice($offset, $pageSize); - $journals = new LengthAwarePaginator($subSet, $count, $pageSize, $page); + $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); + + // replace with journal collector: + $collector = new JournalCollector(auth()->user()); + $collector->setAccounts(new Collection([$account]))->setRange($start, $end)->setLimit($pageSize)->setPage($page); + $journals = $collector->getPaginatedJournals(); $journals->setPath('accounts/show/' . $account->id); // grouped other months thing: @@ -290,12 +291,12 @@ class AccountController extends Controller $subTitle = $account->name . ' (' . Navigation::periodShow($start, $range) . ')'; $page = intval(Input::get('page')); $page = $page === 0 ? 1 : $page; - $pageSize = Preferences::get('transactionPageSize', 50)->data; - $offset = ($page - 1) * $pageSize; - $set = $tasker->getJournalsInPeriod(new Collection([$account]), [], $start, $end); - $count = $set->count(); - $subSet = $set->splice($offset, $pageSize); - $journals = new LengthAwarePaginator($subSet, $count, $pageSize, $page); + $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); + + // replace with journal collector: + $collector = new JournalCollector(auth()->user()); + $collector->setAccounts(new Collection([$account]))->setRange($start, $end)->setLimit($pageSize)->setPage($page); + $journals = $collector->getPaginatedJournals(); $journals->setPath('accounts/show/' . $account->id . '/' . $date); return view('accounts.show_with_date', compact('category', 'date', 'account', 'journals', 'subTitle', 'carbon')); diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 05f3daa755..8137923969 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -15,6 +15,7 @@ namespace FireflyIII\Http\Controllers; use Artisan; use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Helpers\Collector\JournalCollector; use FireflyIII\Models\AccountType; use FireflyIII\Models\Tag; use FireflyIII\Repositories\Account\AccountRepositoryInterface as ARI; @@ -116,11 +117,10 @@ class HomeController extends Controller /** * @param ARI $repository - * @param AccountTaskerInterface $tasker * * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View */ - public function index(ARI $repository, AccountTaskerInterface $tasker) + public function index(ARI $repository) { $types = config('firefly.accountTypesByIdentifier.asset'); @@ -144,8 +144,9 @@ class HomeController extends Controller $showDepositsFrontpage = Preferences::get('showDepositsFrontpage', false)->data; foreach ($accounts as $account) { - $set = $tasker->getJournalsInPeriod(new Collection([$account]), [], $start, $end); - $set = $set->splice(0, 10); + $collector = new JournalCollector(auth()->user()); + $collector->setAccounts(new Collection([$account]))->setRange($start, $end)->setLimit(10)->setPage(1); + $set = $collector->getJournals(); if (count($set) > 0) { $transactions[] = [$set, $account]; diff --git a/app/Http/Controllers/Popup/ReportController.php b/app/Http/Controllers/Popup/ReportController.php index e023cb8284..7f0c7d01fa 100644 --- a/app/Http/Controllers/Popup/ReportController.php +++ b/app/Http/Controllers/Popup/ReportController.php @@ -197,14 +197,14 @@ class ReportController extends Controller */ private function expenseEntry(array $attributes): string { - /** @var AccountTaskerInterface $tasker */ - $tasker = app(AccountTaskerInterface::class); /** @var AccountRepositoryInterface $repository */ $repository = app(AccountRepositoryInterface::class); - $account = $repository->find(intval($attributes['accountId'])); - $types = [TransactionType::WITHDRAWAL, TransactionType::TRANSFER]; - $journals = $tasker->getJournalsInPeriod(new Collection([$account]), $types, $attributes['startDate'], $attributes['endDate']); + $account = $repository->find(intval($attributes['accountId'])); + $types = [TransactionType::WITHDRAWAL, TransactionType::TRANSFER]; + $collector = new JournalCollector(auth()->user()); + $collector->setAccounts(new Collection([$account]))->setRange($attributes['startDate'], $attributes['endDate'])->setTypes($types); + $journals = $collector->getJournals(); $report = $attributes['accounts']->pluck('id')->toArray(); // accounts used in this report // filter for transfers and withdrawals TO the given $account @@ -233,13 +233,13 @@ class ReportController extends Controller */ private function incomeEntry(array $attributes): string { - /** @var AccountTaskerInterface $tasker */ - $tasker = app(AccountTaskerInterface::class); /** @var AccountRepositoryInterface $repository */ $repository = app(AccountRepositoryInterface::class); $account = $repository->find(intval($attributes['accountId'])); $types = [TransactionType::DEPOSIT, TransactionType::TRANSFER]; - $journals = $tasker->getJournalsInPeriod(new Collection([$account]), $types, $attributes['startDate'], $attributes['endDate']); + $collector = new JournalCollector(auth()->user()); + $collector->setAccounts(new Collection([$account]))->setRange($attributes['startDate'], $attributes['endDate'])->setTypes($types); + $journals = $collector->getJournals(); $report = $attributes['accounts']->pluck('id')->toArray(); // accounts used in this report // filter the set so the destinations outside of $attributes['accounts'] are not included. diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index 6ac94f0883..2f024c88bd 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -15,6 +15,7 @@ namespace FireflyIII\Http\Controllers; use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Helpers\Collector\JournalCollector; use FireflyIII\Helpers\Report\ReportHelperInterface; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; @@ -150,8 +151,6 @@ class ReportController extends Controller */ private function auditReport(Carbon $start, Carbon $end, Collection $accounts) { - /** @var AccountTaskerInterface $tasker */ - $tasker = app(AccountTaskerInterface::class); $auditData = []; $dayBefore = clone $start; $dayBefore->subDay(); @@ -160,9 +159,11 @@ class ReportController extends Controller // balance the day before: $id = $account->id; $dayBeforeBalance = Steam::balance($account, $dayBefore); - $journals = $tasker->getJournalsInPeriod(new Collection([$account]), [], $start, $end); - $journals = $journals->reverse(); - $startBalance = $dayBeforeBalance; + $collector = new JournalCollector(auth()->user()); + $collector->setAccounts(new Collection([$account]))->setRange($start, $end); + $journals = $collector->getJournals(); + $journals = $journals->reverse(); + $startBalance = $dayBeforeBalance; /** @var Transaction $journal */ @@ -246,7 +247,6 @@ class ReportController extends Controller // need all years. - // and some id's, joined: $accountIds = []; /** @var Account $account */ diff --git a/app/Repositories/Account/AccountTasker.php b/app/Repositories/Account/AccountTasker.php index 59b46c1b88..8bba27f601 100644 --- a/app/Repositories/Account/AccountTasker.php +++ b/app/Repositories/Account/AccountTasker.php @@ -190,77 +190,6 @@ class AccountTasker implements AccountTaskerInterface return $object; } - /** - * It might be worth it to expand this query to include all account information required. - * - * @param Collection $accounts - * @param array $types - * @param Carbon $start - * @param Carbon $end - * - * @return Collection - */ - public function getJournalsInPeriod(Collection $accounts, array $types, Carbon $start, Carbon $end): Collection - { - $accountIds = $accounts->pluck('id')->toArray(); - $query = Transaction - ::leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') - ->leftJoin('transaction_currencies', 'transaction_currencies.id', 'transaction_journals.transaction_currency_id') - ->leftJoin('transaction_types', 'transaction_types.id', 'transaction_journals.transaction_type_id') - ->leftJoin('bills', 'bills.id', 'transaction_journals.bill_id') - ->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id') - ->leftJoin('account_types', 'accounts.account_type_id', 'account_types.id') - ->whereIn('transactions.account_id', $accountIds) - ->whereNull('transactions.deleted_at') - ->whereNull('transaction_journals.deleted_at') - ->where('transaction_journals.date', '>=', $start->format('Y-m-d')) - ->where('transaction_journals.date', '<=', $end->format('Y-m-d')) - ->where('transaction_journals.user_id', $this->user->id) - ->orderBy('transaction_journals.date', 'DESC') - ->orderBy('transaction_journals.order', 'ASC') - ->orderBy('transaction_journals.id', 'DESC'); - - if (count($types) > 0) { - $query->whereIn('transaction_types.type', $types); - } - - $set = $query->get( - [ - 'transaction_journals.id as journal_id', - 'transaction_journals.description', - 'transaction_journals.date', - 'transaction_journals.encrypted', - //'transaction_journals.transaction_currency_id', - 'transaction_currencies.code as transaction_currency_code', - //'transaction_currencies.symbol as transaction_currency_symbol', - 'transaction_types.type as transaction_type_type', - 'transaction_journals.bill_id', - 'bills.name as bill_name', - 'transactions.id as id', - 'transactions.amount as transaction_amount', - 'transactions.description as transaction_description', - 'transactions.account_id', - 'transactions.identifier', - 'transactions.transaction_journal_id', - 'accounts.name as account_name', - 'accounts.encrypted as account_encrypted', - 'account_types.type as account_type', - - ] - ); - - // loop for decryption. - $set->each( - function (Transaction $transaction) { - $transaction->date = new Carbon($transaction->date); - $transaction->description = intval($transaction->encrypted) === 1 ? Crypt::decrypt($transaction->description) : $transaction->description; - $transaction->bill_name = !is_null($transaction->bill_name) ? Crypt::decrypt($transaction->bill_name) : ''; - } - ); - - return $set; - } - /** * @param Collection $accounts * @param Collection $excluded diff --git a/app/Repositories/Account/AccountTaskerInterface.php b/app/Repositories/Account/AccountTaskerInterface.php index dcb8c10416..dbf1892667 100644 --- a/app/Repositories/Account/AccountTaskerInterface.php +++ b/app/Repositories/Account/AccountTaskerInterface.php @@ -71,18 +71,6 @@ interface AccountTaskerInterface */ public function getAccountReport(Carbon $start, Carbon $end, Collection $accounts): AccountCollection; - /** - * Experimental getJournals method. - * - * @param Collection $accounts - * @param array $types - * @param Carbon $start - * @param Carbon $end - * - * @return Collection - */ - public function getJournalsInPeriod(Collection $accounts, array $types, Carbon $start, Carbon $end): Collection; - /** * @param Collection $accounts * @param Collection $excluded