/** * 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; }
/** * Returns an array with the following key:value pairs: * * yyyy-mm-dd:<amount> * * Where yyyy-mm-dd is the date and <amount> is the money spent using DEPOSITS in the $budget * from all the users accounts. * * @param Budget $budget * @param Carbon $start * @param Carbon $end * * @return array */ public function spentPerDay(Budget $budget, Carbon $start, Carbon $end) { /** @var Collection $query */ $query = $budget->transactionJournals()->transactionTypes([TransactionType::WITHDRAWAL])->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')->where('transactions.amount', '<', 0)->before($end)->after($start)->groupBy('dateFormatted')->get(['transaction_journals.date as dateFormatted', DB::Raw('SUM(`transactions`.`amount`) AS `sum`')]); $return = []; foreach ($query->toArray() as $entry) { $return[$entry['dateFormatted']] = $entry['sum']; } return $return; }
/** * Returns all the transaction journals for a limit, possibly limited by a limit repetition. * * @param Budget $budget * @param LimitRepetition $repetition * @param int $take * * @return LengthAwarePaginator */ public function getJournals(Budget $budget, LimitRepetition $repetition = null, $take = 50) { $cache = new CacheProperties(); $cache->addProperty($budget->id); if ($repetition) { $cache->addProperty($repetition->id); } $cache->addProperty($take); $cache->addProperty('getJournals'); if ($cache->has()) { return $cache->get(); // @codeCoverageIgnore } $offset = intval(Input::get('page')) > 0 ? intval(Input::get('page')) * $take : 0; $setQuery = $budget->transactionJournals()->withRelevantData()->take($take)->offset($offset)->orderBy('transaction_journals.date', 'DESC')->orderBy('transaction_journals.order', 'ASC')->orderBy('transaction_journals.id', 'DESC'); $countQuery = $budget->transactionJournals(); if (!is_null($repetition->id)) { $setQuery->after($repetition->startdate)->before($repetition->enddate); $countQuery->after($repetition->startdate)->before($repetition->enddate); } $set = $setQuery->get(['transaction_journals.*']); $count = $countQuery->count(); $paginator = new LengthAwarePaginator($set, $count, $take, $offset); $cache->store($paginator); return $paginator; }