collection = $collection; $this->currencies = []; // do everything here: $this->getLastActivity(); //$this->getMetaBalances(); $this->collectAccountTypes(); $this->collectMetaData(); $this->collection->transform(function (Account $account) { $account->user_array = ['id' => 1,'bla bla' => 'bla']; $account->balances = collect([ ['balance_id' => 1,'balance' => 5], ['balance_id' => 2,'balance' => 5], ['balance_id' => 3,'balance' => 5], ]); return $account; }); return $this->collection; } /** * TODO this method refers to a single-use method inside Steam that could be moved here. * * @return void */ private function getLastActivity(): void { /** @var AccountRepositoryInterface $accountRepository */ $accountRepository = app(AccountRepositoryInterface::class); $lastActivity = $accountRepository->getLastActivity($this->collection); foreach ($lastActivity as $row) { $this->collection->where('id', $row['account_id'])->first()->last_activity = Carbon::parse($row['date_max'], config('app.timezone')); } } /** * TODO this method refers to a single-use method inside Steam that could be moved here. * * @return void */ private function getMetaBalances(): void { try { $array = app('steam')->balancesByAccountsConverted($this->collection, today()); } catch (FireflyException $e) { Log::error(sprintf('Could not load balances: %s', $e->getMessage())); return; } foreach ($array as $accountId => $row) { $this->collection->where('id', $accountId)->first()->balance = $row['balance']; $this->collection->where('id', $accountId)->first()->native_balance = $row['native_balance']; } } /** * TODO this method refers to a single-use method inside Steam that could be moved here. * * @return void */ private function collectAccountTypes(): void { /** @var AccountRepositoryInterface $accountRepository */ $accountRepository = app(AccountRepositoryInterface::class); $accountTypes = $accountRepository->getAccountTypes($this->collection); $types = []; /** @var AccountType $row */ foreach ($accountTypes as $row) { $types[$row->id] = $row->type; } $this->collection->transform(function (Account $account) use ($types) { $account->type = $types[$account->id]; return $account; }); } private function collectMetaData(): void { /** @var AccountRepositoryInterface $accountRepository */ $accountRepository = app(AccountRepositoryInterface::class); /** @var CurrencyRepositoryInterface $repository */ $repository = app(CurrencyRepositoryInterface::class); $metaFields = $accountRepository->getMetaValues($this->collection, ['currency_id', 'account_role', 'account_number', 'liability_direction', 'interest', 'interest_period', 'current_debt']); $currencyIds = $metaFields->where('name', 'currency_id')->pluck('data')->toArray(); $currencies = []; foreach ($repository->getByIds($currencyIds) as $currency) { $id = $currency->id; $currencies[$id] = $currency; } $this->collection->transform(function (Account $account) use ($metaFields, $currencies) { $set = $metaFields->where('account_id', $account->id); foreach ($set as $entry) { $account->{$entry->name} = $entry->data; if ('currency_id' === $entry->name) { $id = (int) $entry->data; $account->currency_code = $currencies[$id]?->code; $account->currency_symbol = $currencies[$id]?->symbol; $account->currency_decimal_places = $currencies[$id]?->decimal_places; } } return $account; }); } }