. */ declare(strict_types=1); namespace Tests\Traits; use DB; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use FireflyIII\Models\Bill; use FireflyIII\Models\Budget; use FireflyIII\Models\Category; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\Tag; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\User; /** * Trait CollectsValues */ trait CollectsValues { /** * @return User */ public function user(): User { return User::where('email', 'james@firefly')->first(); } /** * @return User */ public function nonAdminUser(): User { return User::where('email', 'no_admin@firefly')->first(); } /** * @return Budget */ public function getRandomBudget(): Budget { return $this->user()->budgets()->inRandomOrder()->first(); } /** * @return Category */ public function getRandomCategory(): Category { return $this->user()->categories()->inRandomOrder()->first(); } /** * @return Bill */ public function getRandomBill(): Bill { return $this->user()->bills()->inRandomOrder()->first(); } /** * @return PiggyBank */ public function getRandomPiggyBank(): PiggyBank { return $this->user()->piggyBanks()->inRandomOrder()->first(); } /** * @return Tag */ public function getRandomTag(): Tag { return $this->user()->tags()->inRandomOrder()->first(); } /** * @return TransactionJournal */ public function getRandomWithdrawal(): TransactionJournal { return $this->getRandomJournal(TransactionType::WITHDRAWAL); } /** * @return TransactionJournal */ public function getRandomTransfer(): TransactionJournal { return $this->getRandomJournal(TransactionType::TRANSFER); } /** * @return TransactionJournal */ public function getRandomDeposit(): TransactionJournal { return $this->getRandomJournal(TransactionType::DEPOSIT); } /** * @param string $type * @return TransactionJournal * @throws FireflyException */ private function getRandomJournal(string $type): TransactionJournal { $query = DB::table('transactions') ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') ->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') ->where('transaction_journals.user_id', $this->user()->id) ->whereNull('transaction_journals.deleted_at') ->whereNull('transactions.deleted_at') ->where('transaction_types.type', $type) ->groupBy('transactions.transaction_journal_id') ->having('ct', '=', 2) ->inRandomOrder()->take(1); $result = $query->get( [ 'transactions.transaction_journal_id', 'transaction_journals.transaction_type_id', DB::raw('COUNT(transaction_journal_id) as ct'), ] )->first(); if (null === $result) { throw new FireflyException(sprintf('Cannot find suitable %s to use.', $type)); } return TransactionJournal::find((int) $result->transaction_journal_id); } /** * @return TransactionCurrency */ public function getEuro(): TransactionCurrency { return TransactionCurrency::whereCode('EUR')->first(); } /** * @return TransactionCurrency */ public function getDollar(): TransactionCurrency { return TransactionCurrency::whereCode('USD')->first(); } /** * @param int|null $except * * @return Account */ public function getRandomAsset(?int $except = null): Account { return $this->getRandomAccount(AccountType::ASSET, $except); } /** * @param int|null $except * * @return Account */ public function getRandomDebt(?int $except = null): Account { return $this->getRandomAccount(AccountType::DEBT, $except); } /** * @param int|null $except * * @return Account */ public function getRandomLoan(?int $except = null): Account { return $this->getRandomAccount(AccountType::LOAN, $except); } /** * @param int|null $except * * @return Account */ public function getRandomRevenue(?int $except = null): Account { return $this->getRandomAccount(AccountType::REVENUE, $except); } /** * @param int|null $except * * @return Account */ public function getRandomExpense(?int $except = null): Account { return $this->getRandomAccount(AccountType::EXPENSE, $except); } /** * @param string $type * * @param int|null $except * * @return Account */ private function getRandomAccount(string $type, ?int $except): Account { $query = Account:: leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') ->whereNull('accounts.deleted_at') ->where('accounts.user_id', $this->user()->id) ->where('account_types.type', $type) ->inRandomOrder()->take(1); if (null !== $except) { $query->where('accounts.id', '!=', $except); } return $query->first(['accounts.*']); } }