. */ declare(strict_types=1); namespace FireflyIII\Repositories\Budget; use Carbon\Carbon; use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionType; use FireflyIII\User; use Illuminate\Support\Collection; /** * * Class NoBudgetRepository */ class NoBudgetRepository implements NoBudgetRepositoryInterface { /** @var User */ private $user; /** * @param Collection $accounts * @param Carbon $start * @param Carbon $end * * @return array */ public function getNoBudgetPeriodReport(Collection $accounts, Carbon $start, Carbon $end): array { $carbonFormat = app('navigation')->preferredCarbonFormat($start, $end); /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); $collector->setAccounts($accounts)->setRange($start, $end); $collector->setTypes([TransactionType::WITHDRAWAL]); $collector->withoutBudget(); $journals = $collector->getExtractedJournals(); $data = []; /** @var array $journal */ foreach ($journals as $journal) { $currencyId = (int) $journal['currency_id']; $data[$currencyId] = $data[$currencyId] ?? [ 'id' => 0, 'name' => sprintf('%s (%s)', trans('firefly.no_budget'), $journal['currency_name']), 'sum' => '0', 'currency_id' => $currencyId, 'currency_code' => $journal['currency_code'], 'currency_name' => $journal['currency_name'], 'currency_symbol' => $journal['currency_symbol'], 'currency_decimal_places' => $journal['currency_decimal_places'], 'entries' => [], ]; $date = $journal['date']->format($carbonFormat); if (!array_key_exists($date, $data[$currencyId]['entries'])) { $data[$currencyId]['entries'][$date] = '0'; } $data[$currencyId]['entries'][$date] = bcadd($data[$currencyId]['entries'][$date], $journal['amount']); } return $data; } /** * @param User $user */ public function setUser(User $user): void { $this->user = $user; } /** * @param Collection $accounts * @param Carbon $start * @param Carbon $end * * @return array * @deprecated */ public function spentInPeriodWoBudgetMc(Collection $accounts, Carbon $start, Carbon $end): array { /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); $collector->setUser($this->user); $collector->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL])->withoutBudget(); if ($accounts->count() > 0) { $collector->setAccounts($accounts); } $journals = $collector->getExtractedJournals(); $return = []; $total = []; $currencies = []; /** @var array $journal */ foreach ($journals as $journal) { $code = $journal['currency_code']; if (!array_key_exists($code, $currencies)) { $currencies[$code] = [ 'id' => $journal['currency_id'], 'name' => $journal['currency_name'], 'symbol' => $journal['currency_symbol'], 'decimal_places' => $journal['currency_decimal_places'], ]; } $total[$code] = array_key_exists($code, $total) ? bcadd($total[$code], $journal['amount']) : $journal['amount']; } foreach ($total as $code => $spent) { /** @var TransactionCurrency $currency */ $currency = $currencies[$code]; $return[] = [ 'currency_id' => (string) $currency['id'], 'currency_code' => $code, 'currency_name' => $currency['name'], 'currency_symbol' => $currency['symbol'], 'currency_decimal_places' => $currency['decimal_places'], 'amount' => app('steam')->bcround($spent, $currency['decimal_places']), ]; } return $return; } /** @noinspection MoreThanThreeArgumentsInspection */ /** * See reference nr. 15 * See reference nr. 16 * * @param Carbon $start * @param Carbon $end * @param Collection|null $accounts * @param TransactionCurrency|null $currency * * @return array */ public function sumExpenses(Carbon $start, Carbon $end, ?Collection $accounts = null, ?TransactionCurrency $currency = null): array { /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); $collector->setUser($this->user)->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL]); if (null !== $accounts && $accounts->count() > 0) { $collector->setAccounts($accounts); } if (null !== $currency) { $collector->setCurrency($currency); } $collector->withoutBudget(); $collector->withBudgetInformation(); $journals = $collector->getExtractedJournals(); $array = []; foreach ($journals as $journal) { $currencyId = (int) $journal['currency_id']; $array[$currencyId] = $array[$currencyId] ?? [ 'sum' => '0', 'currency_id' => $currencyId, 'currency_name' => $journal['currency_name'], 'currency_symbol' => $journal['currency_symbol'], 'currency_code' => $journal['currency_code'], 'currency_decimal_places' => $journal['currency_decimal_places'], ]; $array[$currencyId]['sum'] = bcadd($array[$currencyId]['sum'], app('steam')->negative($journal['amount'])); } return $array; } }