primaryCurrency = Amount::getPrimaryCurrency(); $this->convertToPrimary = Amount::convertToPrimary(); $this->noBudgetRepository = app(NoBudgetRepositoryInterface::class); $this->opsRepository = app(OperationsRepositoryInterface::class); $this->repository = app(BudgetRepositoryInterface::class); } #[Override] public function enrich(Collection $collection): Collection { $this->collection = $collection; $this->collectIds(); $this->collectCurrencies(); $this->collectSpentInfo(); $this->appendCollectedData(); return $this->collection; } #[Override] public function enrichSingle(array|Model $model): array|Model { Log::debug(__METHOD__); $collection = new Collection([$model]); $collection = $this->enrich($collection); return $collection->first(); } #[Override] public function setUser(User $user): void { $this->user = $user; $this->setUserGroup($user->userGroup); } #[Override] public function setUserGroup(UserGroup $userGroup): void { $this->userGroup = $userGroup; $this->noBudgetRepository->setUserGroup($userGroup); $this->opsRepository->setUserGroup($userGroup); $this->repository->setUserGroup($userGroup); } private function collectIds(): void { /** @var AvailableBudget $availableBudget */ foreach ($this->collection as $availableBudget) { $this->ids[] = (int)$availableBudget->id; $this->currencyIds[(int)$availableBudget->id] = (int)$availableBudget->transaction_currency_id; } $this->ids = array_unique($this->ids); } private function collectSpentInfo(): void { $start = $this->collection->min('start_date'); $end = $this->collection->max('end_date'); $allActive = $this->repository->getActiveBudgets(); $spentInBudgets = $this->opsRepository->collectExpenses($start, $end, null, $allActive, null); $spentOutsideBudgets = $this->noBudgetRepository->collectExpenses($start, $end, null, null, null); foreach ($this->collection as $availableBudget) { $id = (int)$availableBudget->id; $currencyId = $this->currencyIds[$id]; $currency = $this->currencies[$currencyId]; $filteredSpentInBudgets = $this->opsRepository->sumCollectedExpenses($spentInBudgets, $availableBudget->start_date, $availableBudget->end_date, $currency, false); $filteredSpentOutsideBudgets = $this->opsRepository->sumCollectedExpenses($spentOutsideBudgets, $availableBudget->start_date, $availableBudget->end_date, $currency, false); $this->spentInBudgets[$id] = array_values($filteredSpentInBudgets); $this->spentOutsideBudgets[$id] = array_values($filteredSpentOutsideBudgets); if (true === $this->convertToPrimary) { $pcFilteredSpentInBudgets = $this->opsRepository->sumCollectedExpenses($spentInBudgets, $availableBudget->start_date, $availableBudget->end_date, $currency, true); $pcFilteredSpentOutsideBudgets = $this->opsRepository->sumCollectedExpenses($spentOutsideBudgets, $availableBudget->start_date, $availableBudget->end_date, $currency, true); $this->pcSpentInBudgets[$id] = array_values($pcFilteredSpentInBudgets); $this->pcSpentOutsideBudgets[$id] = array_values($pcFilteredSpentOutsideBudgets); } // filter arrays on date. // send them to sumCollection thing. // save. } // first collect, then filter and append. } private function appendCollectedData(): void { $this->collection = $this->collection->map(function (AvailableBudget $item) { $id = (int)$item->id; $currencyId = $this->currencyIds[$id]; $currency = $this->currencies[$currencyId]; $meta = [ 'currency' => $currency, 'spent_in_budgets' => $this->spentInBudgets[$id] ?? [], 'pc_spent_in_budgets' => $this->pcSpentInBudgets[$id] ?? [], 'spent_outside_budgets' => $this->spentOutsideBudgets[$id] ?? [], 'pc_spent_outside_budgets' => $this->pcSpentOutsideBudgets[$id] ?? [], ]; $item->meta = $meta; return $item; }); } private function collectCurrencies(): void { $ids = array_unique(array_values($this->currencyIds)); $set = TransactionCurrency::whereIn('id', $ids)->get(); foreach ($set as $currency) { $this->currencies[(int)$currency->id] = $currency; } } }