From 0097c6652226e7c9edbbfd3fc4e31274c3b0400a Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 10 Aug 2019 14:41:08 +0200 Subject: [PATCH] Refactor journal repositories. --- .../Commands/Upgrade/MigrateToGroups.php | 60 ++-- .../Upgrade/TransactionIdentifier.php | 7 +- .../Upgrade/TransferCurrenciesCorrections.php | 4 + app/Providers/JournalServiceProvider.php | 24 +- .../Journal/JournalCLIRepository.php | 275 ++++++++++++++++++ .../Journal/JournalCLIRepositoryInterface.php | 83 ++++++ .../Journal/JournalRepository.php | 206 +------------ .../Journal/JournalRepositoryInterface.php | 92 ------ .../Commands/Upgrade/MigrateToGroupsTest.php | 29 +- .../Commands/Upgrade/MigrateToRulesTest.php | 18 +- .../Upgrade/TransactionIdentifierTest.php | 9 +- 11 files changed, 454 insertions(+), 353 deletions(-) create mode 100644 app/Repositories/Journal/JournalCLIRepository.php diff --git a/app/Console/Commands/Upgrade/MigrateToGroups.php b/app/Console/Commands/Upgrade/MigrateToGroups.php index 35c8053305..2b46196a5b 100644 --- a/app/Console/Commands/Upgrade/MigrateToGroups.php +++ b/app/Console/Commands/Upgrade/MigrateToGroups.php @@ -26,6 +26,7 @@ use Exception; use FireflyIII\Factory\TransactionGroupFactory; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; +use FireflyIII\Repositories\Journal\JournalCLIRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Services\Internal\Destroy\JournalDestroyService; use Illuminate\Console\Command; @@ -58,6 +59,8 @@ class MigrateToGroups extends Command private $groupFactory; /** @var JournalRepositoryInterface */ private $journalRepository; + /** @var JournalCLIRepositoryInterface */ + private $cliRepository; /** @var JournalDestroyService */ private $service; private $count; @@ -122,6 +125,7 @@ class MigrateToGroups extends Command $this->journalRepository = app(JournalRepositoryInterface::class); $this->service = app(JournalDestroyService::class); $this->groupFactory = app(TransactionGroupFactory::class); + $this->cliRepository = app(JournalCLIRepositoryInterface::class); } /** @@ -195,7 +199,7 @@ class MigrateToGroups extends Command */ private function makeGroupsFromAll(): void { - $orphanedJournals = $this->journalRepository->getJournalsWithoutGroup(); + $orphanedJournals = $this->cliRepository->getJournalsWithoutGroup(); $count = count($orphanedJournals); if ($count > 0) { Log::debug(sprintf('Going to convert %d transaction journals. Please hold..', $count)); @@ -215,7 +219,7 @@ class MigrateToGroups extends Command */ private function makeGroupsFromSplitJournals(): void { - $splitJournals = $this->journalRepository->getSplitJournals(); + $splitJournals = $this->cliRepository->getSplitJournals(); if ($splitJournals->count() > 0) { $this->info(sprintf('Going to convert %d split transaction(s). Please hold..', $splitJournals->count())); /** @var TransactionJournal $journal */ @@ -248,6 +252,7 @@ class MigrateToGroups extends Command $this->journalRepository->setUser($journal->user); $this->groupFactory->setUser($journal->user); + $this->cliRepository->setUser($journal->user); $data = [ // mandatory fields. @@ -255,32 +260,31 @@ class MigrateToGroups extends Command 'transactions' => [], ]; $destTransactions = $this->getDestinationTransactions($journal); - $budgetId = $this->journalRepository->getJournalBudgetId($journal); - $categoryId = $this->journalRepository->getJournalCategoryId($journal); - $notes = $this->journalRepository->getNoteText($journal); - $tags = $this->journalRepository->getTags($journal); - $internalRef = $this->journalRepository->getMetaField($journal, 'internal-reference'); - $sepaCC = $this->journalRepository->getMetaField($journal, 'sepa_cc'); - $sepaCtOp = $this->journalRepository->getMetaField($journal, 'sepa_ct_op'); - $sepaCtId = $this->journalRepository->getMetaField($journal, 'sepa_ct_id'); - $sepaDb = $this->journalRepository->getMetaField($journal, 'sepa_db'); - $sepaCountry = $this->journalRepository->getMetaField($journal, 'sepa_country'); - $sepaEp = $this->journalRepository->getMetaField($journal, 'sepa_ep'); - $sepaCi = $this->journalRepository->getMetaField($journal, 'sepa_ci'); - $sepaBatchId = $this->journalRepository->getMetaField($journal, 'sepa_batch_id'); - $externalId = $this->journalRepository->getMetaField($journal, 'external-id'); - $originalSource = $this->journalRepository->getMetaField($journal, 'original-source'); - $recurrenceId = $this->journalRepository->getMetaField($journal, 'recurrence_id'); - $bunq = $this->journalRepository->getMetaField($journal, 'bunq_payment_id'); - $hash = $this->journalRepository->getMetaField($journal, 'import_hash'); - $hashTwo = $this->journalRepository->getMetaField($journal, 'import_hash_v2'); - $interestDate = $this->journalRepository->getMetaDate($journal, 'interest_date'); - $bookDate = $this->journalRepository->getMetaDate($journal, 'book_date'); - $processDate = $this->journalRepository->getMetaDate($journal, 'process_date'); - $dueDate = $this->journalRepository->getMetaDate($journal, 'due_date'); - $paymentDate = $this->journalRepository->getMetaDate($journal, 'payment_date'); - $invoiceDate = $this->journalRepository->getMetaDate($journal, 'invoice_date'); - + $budgetId = $this->cliRepository->getJournalBudgetId($journal); + $categoryId = $this->cliRepository->getJournalCategoryId($journal); + $notes = $this->cliRepository->getNoteText($journal); + $tags = $this->cliRepository->getTags($journal); + $internalRef = $this->cliRepository->getMetaField($journal, 'internal-reference'); + $sepaCC = $this->cliRepository->getMetaField($journal, 'sepa_cc'); + $sepaCtOp = $this->cliRepository->getMetaField($journal, 'sepa_ct_op'); + $sepaCtId = $this->cliRepository->getMetaField($journal, 'sepa_ct_id'); + $sepaDb = $this->cliRepository->getMetaField($journal, 'sepa_db'); + $sepaCountry = $this->cliRepository->getMetaField($journal, 'sepa_country'); + $sepaEp = $this->cliRepository->getMetaField($journal, 'sepa_ep'); + $sepaCi = $this->cliRepository->getMetaField($journal, 'sepa_ci'); + $sepaBatchId = $this->cliRepository->getMetaField($journal, 'sepa_batch_id'); + $externalId = $this->cliRepository->getMetaField($journal, 'external-id'); + $originalSource = $this->cliRepository->getMetaField($journal, 'original-source'); + $recurrenceId = $this->cliRepository->getMetaField($journal, 'recurrence_id'); + $bunq = $this->cliRepository->getMetaField($journal, 'bunq_payment_id'); + $hash = $this->cliRepository->getMetaField($journal, 'import_hash'); + $hashTwo = $this->cliRepository->getMetaField($journal, 'import_hash_v2'); + $interestDate = $this->cliRepository->getMetaDate($journal, 'interest_date'); + $bookDate = $this->cliRepository->getMetaDate($journal, 'book_date'); + $processDate = $this->cliRepository->getMetaDate($journal, 'process_date'); + $dueDate = $this->cliRepository->getMetaDate($journal, 'due_date'); + $paymentDate = $this->cliRepository->getMetaDate($journal, 'payment_date'); + $invoiceDate = $this->cliRepository->getMetaDate($journal, 'invoice_date'); Log::debug(sprintf('Will use %d positive transactions to create a new group.', $destTransactions->count())); diff --git a/app/Console/Commands/Upgrade/TransactionIdentifier.php b/app/Console/Commands/Upgrade/TransactionIdentifier.php index fcbde7e17a..f79545dc58 100644 --- a/app/Console/Commands/Upgrade/TransactionIdentifier.php +++ b/app/Console/Commands/Upgrade/TransactionIdentifier.php @@ -23,6 +23,7 @@ namespace FireflyIII\Console\Commands\Upgrade; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; +use FireflyIII\Repositories\Journal\JournalCLIRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use Illuminate\Console\Command; use Illuminate\Database\QueryException; @@ -51,6 +52,9 @@ class TransactionIdentifier extends Command /** @var JournalRepositoryInterface */ private $journalRepository; + /** @var JournalCLIRepositoryInterface */ + private $cliRepository; + /** @var int */ private $count; @@ -81,7 +85,7 @@ class TransactionIdentifier extends Command return 0; } // @codeCoverageIgnoreEnd - $journals = $this->journalRepository->getSplitJournals(); + $journals = $this->cliRepository->getSplitJournals(); /** @var TransactionJournal $journal */ foreach ($journals as $journal) { $this->updateJournalIdentifiers($journal); @@ -111,6 +115,7 @@ class TransactionIdentifier extends Command private function stupidLaravel(): void { $this->journalRepository = app(JournalRepositoryInterface::class); + $this->cliRepository = app(JournalCLIRepositoryInterface::class); $this->count = 0; } diff --git a/app/Console/Commands/Upgrade/TransferCurrenciesCorrections.php b/app/Console/Commands/Upgrade/TransferCurrenciesCorrections.php index bcb5582f26..d833944234 100644 --- a/app/Console/Commands/Upgrade/TransferCurrenciesCorrections.php +++ b/app/Console/Commands/Upgrade/TransferCurrenciesCorrections.php @@ -29,6 +29,7 @@ use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; +use FireflyIII\Repositories\Journal\JournalCLIRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use Illuminate\Console\Command; use Log; @@ -60,6 +61,8 @@ class TransferCurrenciesCorrections extends Command private $currencyRepos; /** @var JournalRepositoryInterface */ private $journalRepos; + /** @var JournalCLIRepositoryInterface */ + private $cliRepos; /** @var int */ private $count; @@ -125,6 +128,7 @@ class TransferCurrenciesCorrections extends Command $this->accountRepos = app(AccountRepositoryInterface::class); $this->currencyRepos = app(CurrencyRepositoryInterface::class); $this->journalRepos = app(JournalRepositoryInterface::class); + $this->cliRepos = app(JournalCLIRepositoryInterface::class); $this->accountCurrencies = []; $this->resetInformation(); } diff --git a/app/Providers/JournalServiceProvider.php b/app/Providers/JournalServiceProvider.php index d5bbcacc19..590583c2ec 100644 --- a/app/Providers/JournalServiceProvider.php +++ b/app/Providers/JournalServiceProvider.php @@ -26,6 +26,8 @@ use FireflyIII\Helpers\Collector\GroupCollector; use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Repositories\Journal\JournalAPIRepository; use FireflyIII\Repositories\Journal\JournalAPIRepositoryInterface; +use FireflyIII\Repositories\Journal\JournalCLIRepository; +use FireflyIII\Repositories\Journal\JournalCLIRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepository; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepository; @@ -63,7 +65,7 @@ class JournalServiceProvider extends ServiceProvider { $this->app->bind( GroupCollectorInterface::class, - function (Application $app) { + static function (Application $app) { /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollector::class); if ($app->auth->check()) { @@ -82,7 +84,7 @@ class JournalServiceProvider extends ServiceProvider { $this->app->bind( TransactionGroupRepositoryInterface::class, - function (Application $app) { + static function (Application $app) { /** @var TransactionGroupRepositoryInterface $repository */ $repository = app(TransactionGroupRepository::class); if ($app->auth->check()) { @@ -101,7 +103,7 @@ class JournalServiceProvider extends ServiceProvider { $this->app->bind( JournalRepositoryInterface::class, - function (Application $app) { + static function (Application $app) { /** @var JournalRepositoryInterface $repository */ $repository = app(JournalRepository::class); if ($app->auth->check()) { @@ -115,7 +117,7 @@ class JournalServiceProvider extends ServiceProvider // also bind new API repository $this->app->bind( JournalAPIRepositoryInterface::class, - function (Application $app) { + static function (Application $app) { /** @var JournalAPIRepositoryInterface $repository */ $repository = app(JournalAPIRepository::class); if ($app->auth->check()) { @@ -125,5 +127,19 @@ class JournalServiceProvider extends ServiceProvider return $repository; } ); + + // also bind new CLI repository + $this->app->bind( + JournalCLIRepositoryInterface::class, + static function (Application $app) { + /** @var JournalCLIRepositoryInterface $repository */ + $repository = app(JournalCLIRepository::class); + if ($app->auth->check()) { + $repository->setUser(auth()->user()); + } + + return $repository; + } + ); } } diff --git a/app/Repositories/Journal/JournalCLIRepository.php b/app/Repositories/Journal/JournalCLIRepository.php new file mode 100644 index 0000000000..53e9103ba8 --- /dev/null +++ b/app/Repositories/Journal/JournalCLIRepository.php @@ -0,0 +1,275 @@ +. + */ + +namespace FireflyIII\Repositories\Journal; + + +use Carbon\Carbon; +use DB; +use Exception; +use FireflyIII\Models\TransactionJournal; +use FireflyIII\Support\CacheProperties; +use FireflyIII\User; +use Illuminate\Support\Collection; +use Log; +use stdClass; + +/** + * Class JournalCLIRepository + */ +class JournalCLIRepository implements JournalCLIRepositoryInterface +{ + /** @var User */ + private $user; + + /** + * Constructor. + */ + public function __construct() + { + if ('testing' === config('app.env')) { + Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this))); + } + } + + /** + * Get all transaction journals with a specific type, regardless of user. + * + * @param array $types + * + * @return Collection + */ + public function getAllJournals(array $types): Collection + { + return TransactionJournal + ::leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') + ->whereIn('transaction_types.type', $types) + ->with(['user', 'transactionType', 'transactionCurrency', 'transactions', 'transactions.account']) + ->get(['transaction_journals.*']); + } + + /** + * Return the ID of the budget linked to the journal (if any) or the transactions (if any). + * + * @param TransactionJournal $journal + * + * @return int + */ + public function getJournalBudgetId(TransactionJournal $journal): int + { + $budget = $journal->budgets()->first(); + if (null !== $budget) { + return $budget->id; + } + /** @noinspection NullPointerExceptionInspection */ + $budget = $journal->transactions()->first()->budgets()->first(); + if (null !== $budget) { + return $budget->id; + } + + return 0; + } + + /** + * Return the ID of the category linked to the journal (if any) or to the transactions (if any). + * + * @param TransactionJournal $journal + * + * @return int + */ + public function getJournalCategoryId(TransactionJournal $journal): int + { + $category = $journal->categories()->first(); + if (null !== $category) { + return $category->id; + } + /** @noinspection NullPointerExceptionInspection */ + $category = $journal->transactions()->first()->categories()->first(); + if (null !== $category) { + return $category->id; + } + + return 0; + } + + /** + * Return all journals without a group, used in an upgrade routine. + * + * @return array + */ + public function getJournalsWithoutGroup(): array + { + return TransactionJournal::whereNull('transaction_group_id')->get(['id', 'user_id'])->toArray(); + } + + /** + * Return Carbon value of a meta field (or NULL). + * + * @param TransactionJournal $journal + * @param string $field + * + * @return null|Carbon + */ + public function getMetaDate(TransactionJournal $journal, string $field): ?Carbon + { + $cache = new CacheProperties; + $cache->addProperty('journal-meta-updated'); + $cache->addProperty($journal->id); + $cache->addProperty($field); + + if ($cache->has()) { + $result = null; + try { + $result = new Carbon($cache->get()); // @codeCoverageIgnore + } catch (Exception $e) { + $e->getMessage(); + } + + return $result; + } + + $entry = $journal->transactionJournalMeta()->where('name', $field)->first(); + if (null === $entry) { + return null; + } + $value = null; + try { + $value = new Carbon($entry->data); + } catch (Exception $e) { + $e->getMessage(); + + return null; + } + + $cache->store($entry->data); + + return $value; + } + + /** + * Return value of a meta field (or NULL) as a string. + * + * @param TransactionJournal $journal + * @param string $field + * + * @return null|string + */ + public function getMetaField(TransactionJournal $journal, string $field): ?string + { + $cache = new CacheProperties; + $cache->addProperty('journal-meta-updated'); + $cache->addProperty($journal->id); + $cache->addProperty($field); + + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + + $entry = $journal->transactionJournalMeta()->where('name', $field)->first(); + if (null === $entry) { + return null; + } + + $value = $entry->data; + + if (is_array($value)) { + $return = implode(',', $value); + $cache->store($return); + + return $return; + } + + // return when something else: + try { + $return = (string)$value; + $cache->store($return); + } catch (Exception $e) { + Log::error($e->getMessage()); + + return ''; + } + + return $return; + } + + /** + * Return text of a note attached to journal, or NULL + * + * @param TransactionJournal $journal + * + * @return string|null + */ + public function getNoteText(TransactionJournal $journal): ?string + { + $note = $journal->notes()->first(); + if (null === $note) { + return null; + } + + return $note->text; + } + + /** + * Returns all journals with more than 2 transactions. Should only return empty collections + * in Firefly III > v4.8.0. + * + * @return Collection + */ + public function getSplitJournals(): Collection + { + $query = TransactionJournal + ::leftJoin('transactions', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') + ->groupBy('transaction_journals.id'); + $result = $query->get(['transaction_journals.id as id', DB::raw('count(transactions.id) as transaction_count')]); + $journalIds = []; + /** @var stdClass $row */ + foreach ($result as $row) { + if ((int)$row->transaction_count > 2) { + $journalIds[] = (int)$row->id; + } + } + $journalIds = array_unique($journalIds); + + return TransactionJournal + ::with(['transactions']) + ->whereIn('id', $journalIds)->get(); + } + + /** + * Return all tags as strings in an array. + * + * @param TransactionJournal $journal + * + * @return array + */ + public function getTags(TransactionJournal $journal): array + { + return $journal->tags()->get()->pluck('tag')->toArray(); + } + + /** + * @param User $user + */ + public function setUser(User $user): void + { + $this->user = $user; + } +} \ No newline at end of file diff --git a/app/Repositories/Journal/JournalCLIRepositoryInterface.php b/app/Repositories/Journal/JournalCLIRepositoryInterface.php index ed08f09e98..c506fc2a08 100644 --- a/app/Repositories/Journal/JournalCLIRepositoryInterface.php +++ b/app/Repositories/Journal/JournalCLIRepositoryInterface.php @@ -21,7 +21,10 @@ namespace FireflyIII\Repositories\Journal; +use Carbon\Carbon; +use FireflyIII\Models\TransactionJournal; use FireflyIII\User; +use Illuminate\Support\Collection; /** * Interface JournalCLIRepositoryInterface @@ -33,4 +36,84 @@ interface JournalCLIRepositoryInterface */ public function setUser(User $user); + /** + * Return all tags as strings in an array. + * + * @param TransactionJournal $journal + * + * @return array + */ + public function getTags(TransactionJournal $journal): array; + + /** + * Returns all journals with more than 2 transactions. Should only return empty collections + * in Firefly III > v4.8.0. + * + * @return Collection + */ + public function getSplitJournals(): Collection; + + /** + * Return text of a note attached to journal, or NULL + * + * @param TransactionJournal $journal + * + * @return string|null + */ + public function getNoteText(TransactionJournal $journal): ?string; + + /** + * Return value of a meta field (or NULL). + * + * @param TransactionJournal $journal + * @param string $field + * + * @return null|string + */ + public function getMetaField(TransactionJournal $journal, string $field): ?string; + + /** + * Return Carbon value of a meta field (or NULL). + * + * @param TransactionJournal $journal + * @param string $field + * + * @return null|Carbon + */ + public function getMetaDate(TransactionJournal $journal, string $field): ?Carbon; + + /** + * Return all journals without a group, used in an upgrade routine. + * + * @return array + */ + public function getJournalsWithoutGroup(): array; + + /** + * Get all transaction journals with a specific type, regardless of user. + * + * @param array $types + * + * @return Collection + */ + public function getAllJournals(array $types): Collection; + + /** + * Return the ID of the budget linked to the journal (if any) or the transactions (if any). + * + * @param TransactionJournal $journal + * + * @return int + */ + public function getJournalBudgetId(TransactionJournal $journal): int; + + /** + * Return the ID of the category linked to the journal (if any) or to the transactions (if any). + * + * @param TransactionJournal $journal + * + * @return int + */ + public function getJournalCategoryId(TransactionJournal $journal): int; + } \ No newline at end of file diff --git a/app/Repositories/Journal/JournalRepository.php b/app/Repositories/Journal/JournalRepository.php index b8be7d59fa..375417358f 100644 --- a/app/Repositories/Journal/JournalRepository.php +++ b/app/Repositories/Journal/JournalRepository.php @@ -23,27 +23,19 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Journal; use Carbon\Carbon; -use DB; -use Exception; -use FireflyIII\Models\Account; -use FireflyIII\Models\AccountType; use FireflyIII\Models\Note; -use FireflyIII\Models\PiggyBankEvent; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournalLink; use FireflyIII\Models\TransactionJournalMeta; -use FireflyIII\Models\TransactionType; use FireflyIII\Services\Internal\Destroy\JournalDestroyService; use FireflyIII\Services\Internal\Destroy\TransactionGroupDestroyService; use FireflyIII\Services\Internal\Update\JournalUpdateService; use FireflyIII\Support\CacheProperties; use FireflyIII\User; use Illuminate\Support\Collection; -use Illuminate\Support\MessageBag; use Log; -use stdClass; /** * Class JournalRepository. @@ -159,79 +151,6 @@ class JournalRepository implements JournalRepositoryInterface return $result; } - /** - * Return the ID of the budget linked to the journal (if any) or the transactions (if any). - * - * @param TransactionJournal $journal - * - * @return int - */ - public function getJournalBudgetId(TransactionJournal $journal): int - { - $budget = $journal->budgets()->first(); - if (null !== $budget) { - return $budget->id; - } - /** @noinspection NullPointerExceptionInspection */ - $budget = $journal->transactions()->first()->budgets()->first(); - if (null !== $budget) { - return $budget->id; - } - - return 0; - } - - /** - * Return the ID of the category linked to the journal (if any) or to the transactions (if any). - * - * @param TransactionJournal $journal - * - * @return int - */ - public function getJournalCategoryId(TransactionJournal $journal): int - { - $category = $journal->categories()->first(); - if (null !== $category) { - return $category->id; - } - /** @noinspection NullPointerExceptionInspection */ - $category = $journal->transactions()->first()->categories()->first(); - if (null !== $category) { - return $category->id; - } - - return 0; - } - - /** - * Return Carbon value of a meta field (or NULL). - * - * @param TransactionJournal $journal - * @param string $field - * - * @return null|Carbon - */ - public function getMetaDate(TransactionJournal $journal, string $field): ?Carbon - { - $cache = new CacheProperties; - $cache->addProperty('journal-meta-updated'); - $cache->addProperty($journal->id); - $cache->addProperty($field); - - if ($cache->has()) { - return new Carbon($cache->get()); // @codeCoverageIgnore - } - - $entry = $journal->transactionJournalMeta()->where('name', $field)->first(); - if (null === $entry) { - return null; - } - $value = new Carbon($entry->data); - $cache->store($entry->data); - - return $value; - } - /** * Return a list of all destination accounts related to journal. * @@ -312,16 +231,6 @@ class JournalRepository implements JournalRepositoryInterface return $amount; } - /** - * Return all journals without a group, used in an upgrade routine. - * - * @return array - */ - public function getJournalsWithoutGroup(): array - { - return TransactionJournal::whereNull('transaction_group_id')->get(['id', 'user_id'])->toArray(); - } - /** * @param TransactionJournalLink $link * @@ -339,109 +248,13 @@ class JournalRepository implements JournalRepositoryInterface return ''; } - /** - * Return value of a meta field (or NULL) as a string. - * - * @param TransactionJournal $journal - * @param string $field - * - * @return null|string - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - */ - public function getMetaField(TransactionJournal $journal, string $field): ?string - { - $cache = new CacheProperties; - $cache->addProperty('journal-meta-updated'); - $cache->addProperty($journal->id); - $cache->addProperty($field); - - if ($cache->has()) { - return $cache->get(); // @codeCoverageIgnore - } - - $entry = $journal->transactionJournalMeta()->where('name', $field)->first(); - if (null === $entry) { - return null; - } - - $value = $entry->data; - - if (is_array($value)) { - $return = implode(',', $value); - $cache->store($return); - - return $return; - } - - // return when something else: - try { - $return = (string)$value; - $cache->store($return); - } catch (Exception $e) { - Log::error($e->getMessage()); - - return ''; - } - - return $return; - } - - /** - * Return text of a note attached to journal, or NULL - * - * @param TransactionJournal $journal - * - * @return string|null - */ - public function getNoteText(TransactionJournal $journal): ?string - { - $note = $journal->notes()->first(); - if (null === $note) { - return null; - } - - return $note->text; - } - /** - * Returns all journals with more than 2 transactions. Should only return empty collections - * in Firefly III > v4.8.0. - * - * @return Collection - */ - public function getSplitJournals(): Collection - { - $query = TransactionJournal - ::leftJoin('transactions', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') - ->groupBy('transaction_journals.id'); - $result = $query->get(['transaction_journals.id as id', DB::raw('count(transactions.id) as transaction_count')]); - $journalIds = []; - /** @var stdClass $row */ - foreach ($result as $row) { - if ((int)$row->transaction_count > 2) { - $journalIds[] = (int)$row->id; - } - } - $journalIds = array_unique($journalIds); - return TransactionJournal - ::with(['transactions']) - ->whereIn('id', $journalIds)->get(); - } - /** - * Return all tags as strings in an array. - * - * @param TransactionJournal $journal - * - * @return array - */ - public function getTags(TransactionJournal $journal): array - { - return $journal->tags()->get()->pluck('tag')->toArray(); - } + + /** * @param int $transactionId @@ -536,21 +349,6 @@ class JournalRepository implements JournalRepositoryInterface return $journal; } - /** - * Get all transaction journals with a specific type, regardless of user. - * - * @param array $types - * @return Collection - */ - public function getAllJournals(array $types): Collection - { - return TransactionJournal - ::leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') - ->whereIn('transaction_types.type', $types) - ->with(['user', 'transactionType', 'transactionCurrency', 'transactions', 'transactions.account']) - ->get(['transaction_journals.*']); - } - /** * Return Carbon value of a meta field (or NULL). * diff --git a/app/Repositories/Journal/JournalRepositoryInterface.php b/app/Repositories/Journal/JournalRepositoryInterface.php index 4a857299ae..8ac858a7b8 100644 --- a/app/Repositories/Journal/JournalRepositoryInterface.php +++ b/app/Repositories/Journal/JournalRepositoryInterface.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Journal; use Carbon\Carbon; -use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournalLink; @@ -33,7 +32,6 @@ use Illuminate\Support\Collection; /** * Interface JournalRepositoryInterface. - * TODO needs cleaning up. Remove unused methods. */ interface JournalRepositoryInterface { @@ -48,16 +46,6 @@ interface JournalRepositoryInterface */ public function searchJournalDescriptions(string $search): Collection; - /** - * TODO maybe create command line repository? - * - * Get all transaction journals with a specific type, regardless of user. - * - * @param array $types - * @return Collection - */ - public function getAllJournals(array $types): Collection; - /** * Deletes a transaction group. * @@ -101,28 +89,6 @@ interface JournalRepositoryInterface */ public function firstNull(): ?TransactionJournal; - /** - * TODO console repository? - * - * Return the ID of the budget linked to the journal (if any) or the transactions (if any). - * - * @param TransactionJournal $journal - * - * @return int - */ - public function getJournalBudgetId(TransactionJournal $journal): int; - - /** - * TODO console repository? - * - * Return the ID of the category linked to the journal (if any) or to the transactions (if any). - * - * @param TransactionJournal $journal - * - * @return int - */ - public function getJournalCategoryId(TransactionJournal $journal): int; - /** * TODO this method is no longer well-fitted in 4.8.0. Should be refactored and/or removed. * Return a list of all destination accounts related to journal. @@ -152,14 +118,6 @@ interface JournalRepositoryInterface */ public function getJournalTotal(TransactionJournal $journal): string; - /** - * TODO only used on command line. - * Return all journals without a group, used in an upgrade routine. - * - * @return array - */ - public function getJournalsWithoutGroup(): array; - /** * TODO used only in transformer, so only for API use. * @param TransactionJournalLink $link @@ -168,16 +126,6 @@ interface JournalRepositoryInterface */ public function getLinkNoteText(TransactionJournalLink $link): string; - /** - * TODO used only on console - * Return Carbon value of a meta field (or NULL). - * - * @param TransactionJournal $journal - * @param string $field - * - * @return null|Carbon - */ - public function getMetaDate(TransactionJournal $journal, string $field): ?Carbon; /** * Return Carbon value of a meta field (or NULL). @@ -189,49 +137,9 @@ interface JournalRepositoryInterface */ public function getMetaDateById(int $journalId, string $field): ?Carbon; - /** - * TODO used only on the console. - * - * Return value of a meta field (or NULL). - * - * @param TransactionJournal $journal - * @param string $field - * - * @return null|string - */ - public function getMetaField(TransactionJournal $journal, string $field): ?string; - /** - * TODO used only on the console. - * - * Return text of a note attached to journal, or NULL - * - * @param TransactionJournal $journal - * - * @return string|null - */ - public function getNoteText(TransactionJournal $journal): ?string; - /** - * TODO used only on the console. - * - * Returns all journals with more than 2 transactions. Should only return empty collections - * in Firefly III > v4.8.0. - * - * @return Collection - */ - public function getSplitJournals(): Collection; - /** - * TODO used only on the console. - * - * Return all tags as strings in an array. - * - * @param TransactionJournal $journal - * - * @return array - */ - public function getTags(TransactionJournal $journal): array; /** * TODO maybe move to account repository? diff --git a/tests/Unit/Console/Commands/Upgrade/MigrateToGroupsTest.php b/tests/Unit/Console/Commands/Upgrade/MigrateToGroupsTest.php index d0cfbd70e5..8c4d12ff17 100644 --- a/tests/Unit/Console/Commands/Upgrade/MigrateToGroupsTest.php +++ b/tests/Unit/Console/Commands/Upgrade/MigrateToGroupsTest.php @@ -28,6 +28,7 @@ use FireflyIII\Factory\TransactionGroupFactory; use FireflyIII\Models\Configuration; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; +use FireflyIII\Repositories\Journal\JournalCLIRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Services\Internal\Destroy\JournalDestroyService; use Illuminate\Support\Collection; @@ -59,12 +60,13 @@ class MigrateToGroupsTest extends TestCase $journalRepos = $this->mock(JournalRepositoryInterface::class); $service = $this->mock(JournalDestroyService::class); $groupFactory = $this->mock(TransactionGroupFactory::class); + $cliRepos = $this->mock(JournalCLIRepositoryInterface::class); // mock calls: - $journalRepos->shouldReceive('getSplitJournals') + $cliRepos->shouldReceive('getSplitJournals') ->atLeast()->once() ->andReturn(new Collection); - $journalRepos->shouldReceive('getJournalsWithoutGroup') + $cliRepos->shouldReceive('getJournalsWithoutGroup') ->atLeast()->once() ->andReturn([]); @@ -89,6 +91,7 @@ class MigrateToGroupsTest extends TestCase $journalRepos = $this->mock(JournalRepositoryInterface::class); $service = $this->mock(JournalDestroyService::class); $groupFactory = $this->mock(TransactionGroupFactory::class); + $cliRepos = $this->mock(JournalCLIRepositoryInterface::class); $asset = $this->getRandomAsset(); $expense = $this->getRandomExpense(); @@ -121,10 +124,10 @@ class MigrateToGroupsTest extends TestCase $array = $journal->toArray(); // mock calls: - $journalRepos->shouldReceive('getSplitJournals') + $cliRepos->shouldReceive('getSplitJournals') ->atLeast()->once() ->andReturn(new Collection); - $journalRepos->shouldReceive('getJournalsWithoutGroup') + $cliRepos->shouldReceive('getJournalsWithoutGroup') ->atLeast()->once() ->andReturn([$array]); @@ -203,19 +206,21 @@ class MigrateToGroupsTest extends TestCase $journalRepos = $this->mock(JournalRepositoryInterface::class); $service = $this->mock(JournalDestroyService::class); $factory = $this->mock(TransactionGroupFactory::class); + $cliRepos = $this->mock(JournalCLIRepositoryInterface::class); // mock calls: + $cliRepos->shouldReceive('setUser')->atLeast()->once(); $journalRepos->shouldReceive('setUser')->atLeast()->once(); // mock journal things: - $journalRepos->shouldReceive('getJournalBudgetId')->atLeast()->once()->andReturn(0); - $journalRepos->shouldReceive('getJournalCategoryId')->atLeast()->once()->andReturn(0); - $journalRepos->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Some note.'); - $journalRepos->shouldReceive('getTags')->atLeast()->once()->andReturn(['A', 'B']); - $journalRepos->shouldReceive('getMetaField')->atLeast() + $cliRepos->shouldReceive('getJournalBudgetId')->atLeast()->once()->andReturn(0); + $cliRepos->shouldReceive('getJournalCategoryId')->atLeast()->once()->andReturn(0); + $cliRepos->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Some note.'); + $cliRepos->shouldReceive('getTags')->atLeast()->once()->andReturn(['A', 'B']); + $cliRepos->shouldReceive('getMetaField')->atLeast() ->withArgs([Mockery::any(), Mockery::any()]) ->once()->andReturn(null); - $journalRepos->shouldReceive('getMetaDate')->atLeast() + $cliRepos->shouldReceive('getMetaDate')->atLeast() ->withArgs([Mockery::any(), Mockery::any()]) ->once()->andReturn(null); @@ -225,10 +230,10 @@ class MigrateToGroupsTest extends TestCase $factory->shouldReceive('setUser')->atLeast()->once(); - $journalRepos->shouldReceive('getSplitJournals') + $cliRepos->shouldReceive('getSplitJournals') ->atLeast()->once() ->andReturn(new Collection([$journal])); - $journalRepos->shouldReceive('getJournalsWithoutGroup') + $cliRepos->shouldReceive('getJournalsWithoutGroup') ->atLeast()->once() ->andReturn([]); diff --git a/tests/Unit/Console/Commands/Upgrade/MigrateToRulesTest.php b/tests/Unit/Console/Commands/Upgrade/MigrateToRulesTest.php index b84a82c24b..8d98ac5827 100644 --- a/tests/Unit/Console/Commands/Upgrade/MigrateToRulesTest.php +++ b/tests/Unit/Console/Commands/Upgrade/MigrateToRulesTest.php @@ -107,11 +107,12 @@ class MigrateToRulesTest extends TestCase */ public function testHandleEvenBill(): void { - $bill = Bill::create( + $billName = 'I am a bill #' . $this->randomInt(); + $bill = Bill::create( [ 'user_id' => $this->user()->id, 'transaction_currency_id' => null, - 'name' => 'I am a bill', + 'name' => $billName, 'match' => 'some,kind,of,match', 'amount_min' => '30', 'amount_max' => '30', @@ -137,8 +138,8 @@ class MigrateToRulesTest extends TestCase 'active' => true, 'strict' => false, 'stop_processing' => false, // field is no longer used. - 'title' => 'Auto-generated rule for bill "I am a bill"', - 'description' => 'This rule is auto-generated to try to match bill "I am a bill".', + 'title' => sprintf('Auto-generated rule for bill "%s"', $billName), + 'description' => sprintf('This rule is auto-generated to try to match bill "%s".', $billName), 'trigger' => 'store-journal', 'triggers' => [ [ @@ -214,11 +215,12 @@ class MigrateToRulesTest extends TestCase */ public function testHandleUnevenBill(): void { - $bill = Bill::create( + $billName = 'I am a bill #' . $this->randomInt(); + $bill = Bill::create( [ 'user_id' => $this->user()->id, 'transaction_currency_id' => null, - 'name' => 'I am a bill', + 'name' => $billName, 'match' => 'some,kind,of,match', 'amount_min' => '30', 'amount_max' => '40', @@ -244,8 +246,8 @@ class MigrateToRulesTest extends TestCase 'active' => true, 'strict' => false, 'stop_processing' => false, // field is no longer used. - 'title' => 'Auto-generated rule for bill "I am a bill"', - 'description' => 'This rule is auto-generated to try to match bill "I am a bill".', + 'title' => sprintf('Auto-generated rule for bill "%s"', $billName), + 'description' => sprintf('This rule is auto-generated to try to match bill "%s".', $billName), 'trigger' => 'store-journal', 'triggers' => [ [ diff --git a/tests/Unit/Console/Commands/Upgrade/TransactionIdentifierTest.php b/tests/Unit/Console/Commands/Upgrade/TransactionIdentifierTest.php index 042f506a6d..1e305a3006 100644 --- a/tests/Unit/Console/Commands/Upgrade/TransactionIdentifierTest.php +++ b/tests/Unit/Console/Commands/Upgrade/TransactionIdentifierTest.php @@ -26,6 +26,7 @@ use FireflyConfig; use FireflyIII\Models\Configuration; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; +use FireflyIII\Repositories\Journal\JournalCLIRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use Illuminate\Support\Collection; use Log; @@ -54,9 +55,9 @@ class TransactionIdentifierTest extends TestCase { // mock classes: $journalRepos = $this->mock(JournalRepositoryInterface::class); - + $cliRepos = $this->mock(JournalCLIRepositoryInterface::class); // commands: - $journalRepos->shouldReceive('getSplitJournals')->andReturn(new Collection) + $cliRepos->shouldReceive('getSplitJournals')->andReturn(new Collection) ->atLeast()->once(); // configuration @@ -127,9 +128,9 @@ class TransactionIdentifierTest extends TestCase // mock classes: $journalRepos = $this->mock(JournalRepositoryInterface::class); - + $cliRepos = $this->mock(JournalCLIRepositoryInterface::class); // commands: - $journalRepos->shouldReceive('getSplitJournals')->andReturn(new Collection([$journal])) + $cliRepos->shouldReceive('getSplitJournals')->andReturn(new Collection([$journal])) ->atLeast()->once(); // configuration