/** * This method returns the oldest journal or transaction date known to this budget. * Will cache result. * * @param Budget $budget * * @return Carbon */ public function firstUseDate(Budget $budget) : Carbon { $oldest = Carbon::create()->startOfYear(); $journal = $budget->transactionJournals()->orderBy('date', 'ASC')->first(); if (!is_null($journal)) { $oldest = $journal->date < $oldest ? $journal->date : $oldest; } $transaction = $budget->transactions()->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.id')->orderBy('transaction_journals.date', 'ASC')->first(['transactions.*', 'transaction_journals.date']); if (!is_null($transaction)) { $carbon = new Carbon($transaction->date); $oldest = $carbon < $oldest ? $carbon : $oldest; } return $oldest; }