/** * @param Category $category * @param Collection $accounts * * @return Carbon */ public function lastUseDate(Category $category, Collection $accounts) : Carbon { $last = null; /** @var TransactionJournal $first */ $lastJournalQuery = $category->transactionJournals()->orderBy('date', 'DESC'); if ($accounts->count() > 0) { // filter journals: $ids = $accounts->pluck('id')->toArray(); $lastJournalQuery->leftJoin('transactions as t', 't.transaction_journal_id', '=', 'transaction_journals.id'); $lastJournalQuery->whereIn('t.account_id', $ids); } $lastJournal = $lastJournalQuery->first(['transaction_journals.*']); if ($lastJournal) { $last = $lastJournal->date; } // check transactions: $lastTransactionQuery = $category->transactions()->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')->orderBy('transaction_journals.date', 'DESC'); if ($accounts->count() > 0) { // filter journals: $ids = $accounts->pluck('id')->toArray(); $lastTransactionQuery->whereIn('transactions.account_id', $ids); } $lastTransaction = $lastTransactionQuery->first(['transaction_journals.*']); if (!is_null($lastTransaction) && (!is_null($last) && $lastTransaction->date < $last || is_null($last))) { $last = new Carbon($lastTransaction->date); } if (is_null($last)) { return new Carbon('1900-01-01'); } return $last; }