setAccounts(new Collection([$account]))->setRange($attributes['startDate'], $attributes['endDate'])->setBudget($budget); $journals = $collector->getJournals(); return $journals; } /** * @param Budget $budget * @param array $attributes * * @return Collection */ public function byBudget(Budget $budget, array $attributes): Collection { /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); $collector->setAccounts($attributes['accounts'])->setRange($attributes['startDate'], $attributes['endDate']); if (is_null($budget->id)) { $collector->setTypes([TransactionType::WITHDRAWAL])->withoutBudget(); } if (!is_null($budget->id)) { $collector->setBudget($budget); } $journals = $collector->getJournals(); return $journals; } /** * @param Category $category * @param array $attributes * * @return Collection */ public function byCategory(Category $category, array $attributes): Collection { /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); $collector->setAccounts($attributes['accounts'])->setTypes([TransactionType::WITHDRAWAL, TransactionType::TRANSFER]) ->setRange($attributes['startDate'], $attributes['endDate']) ->setCategory($category); $journals = $collector->getJournals(); return $journals; } /** * @param Account $account * @param array $attributes * * @return Collection */ public function byExpenses(Account $account, array $attributes): Collection { /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); $collector->setAccounts(new Collection([$account]))->setRange($attributes['startDate'], $attributes['endDate']) ->setTypes([TransactionType::WITHDRAWAL, TransactionType::TRANSFER]); $journals = $collector->getJournals(); $report = $attributes['accounts']->pluck('id')->toArray(); // accounts used in this report // filter for transfers and withdrawals TO the given $account $journals = $journals->filter( function (Transaction $transaction) use ($report) { // get the destinations: $sources = $transaction->transactionJournal->sourceAccountList()->pluck('id')->toArray(); // do these intersect with the current list? return !empty(array_intersect($report, $sources)); } ); return $journals; } /** * @param Account $account * @param array $attributes * * @return Collection */ public function byIncome(Account $account, array $attributes): Collection { /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); $collector->setAccounts(new Collection([$account]))->setRange($attributes['startDate'], $attributes['endDate']) ->setTypes([TransactionType::DEPOSIT, TransactionType::TRANSFER]); $journals = $collector->getJournals(); $report = $attributes['accounts']->pluck('id')->toArray(); // accounts used in this report // filter the set so the destinations outside of $attributes['accounts'] are not included. $journals = $journals->filter( function (Transaction $transaction) use ($report) { // get the destinations: $destinations = $transaction->destinationAccountList($transaction->transactionJournal)->pluck('id')->toArray(); // do these intersect with the current list? return !empty(array_intersect($report, $destinations)); } ); return $journals; } }