From f69b9ac9da683a7cc39d4309fe0b6c77a8ea6234 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 18 Jan 2025 17:20:39 +0100 Subject: [PATCH] Commit updated transformers. --- app/Transformers/AccountTransformer.php | 29 +++--- .../AvailableBudgetTransformer.php | 43 ++++++--- app/Transformers/BillTransformer.php | 88 +++++++++-------- app/Transformers/BudgetLimitTransformer.php | 61 ++++++++---- app/Transformers/BudgetTransformer.php | 94 ++++++++++++------- app/Transformers/CategoryTransformer.php | 38 +++++--- 6 files changed, 220 insertions(+), 133 deletions(-) diff --git a/app/Transformers/AccountTransformer.php b/app/Transformers/AccountTransformer.php index 893f8e7ae0..8c56c0815d 100644 --- a/app/Transformers/AccountTransformer.php +++ b/app/Transformers/AccountTransformer.php @@ -39,14 +39,18 @@ use Symfony\Component\HttpFoundation\ParameterBag; class AccountTransformer extends AbstractTransformer { protected AccountRepositoryInterface $repository; + protected bool $convertToNative; + protected TransactionCurrency $default; /** * AccountTransformer constructor. */ public function __construct() { - $this->parameters = new ParameterBag(); - $this->repository = app(AccountRepositoryInterface::class); + $this->parameters = new ParameterBag(); + $this->repository = app(AccountRepositoryInterface::class); + $this->convertToNative = Amount::convertToNative(); + $this->default = Amount::getDefaultCurrency(); } /** @@ -64,20 +68,19 @@ class AccountTransformer extends AbstractTransformer $liabilityType = (string) config(sprintf('firefly.shortLiabilityNameByFullName.%s', $fullType)); $liabilityType = '' === $liabilityType ? null : strtolower($liabilityType); $liabilityDirection = $this->repository->getMetaValue($account, 'liability_direction'); - $convertToNative = Amount::convertToNative(); // get account role (will only work if the type is asset). - $default = Amount::getDefaultCurrency(); $accountRole = $this->getAccountRole($account, $accountType); $date = $this->getDate(); $date->endOfDay(); - [$currencyId, $currencyCode, $currencySymbol, $decimalPlaces] = $this->getCurrency($account, $default); + [$currencyId, $currencyCode, $currencySymbol, $decimalPlaces] = $this->getCurrency($account); [$creditCardType, $monthlyPaymentDate] = $this->getCCInfo($account, $accountRole, $accountType); - [$openingBalance, $nativeOpeningBalance, $openingBalanceDate] = $this->getOpeningBalance($account, $accountType, $convertToNative); + [$openingBalance, $nativeOpeningBalance, $openingBalanceDate] = $this->getOpeningBalance($account, $accountType, $this->convertToNative); [$interest, $interestPeriod] = $this->getInterest($account, $accountType); - if (!$convertToNative) { + $default = $this->default; + if (!$this->convertToNative) { // reset default currency to NULL, not interesting. $default = null; } @@ -100,13 +103,13 @@ class AccountTransformer extends AbstractTransformer $order = null; } // balance, native balance, virtual balance, native virtual balance? - $finalBalance = Steam::finalAccountBalance($account, $date); - if($convertToNative) { + $finalBalance = Steam::finalAccountBalance($account, $date); + if ($this->convertToNative) { $finalBalance['balance'] = $finalBalance[$currencyCode] ?? '0'; } $currentBalance = app('steam')->bcround($finalBalance['balance'] ?? '0', $decimalPlaces); - $nativeCurrentBalance = $convertToNative ? app('steam')->bcround($finalBalance['native_balance'] ?? '0', $default->decimal_places) : null; + $nativeCurrentBalance = $this->convertToNative ? app('steam')->bcround($finalBalance['native_balance'] ?? '0', $default->decimal_places) : null; return [ 'id' => (string) $account->id, @@ -135,7 +138,7 @@ class AccountTransformer extends AbstractTransformer 'iban' => '' === $account->iban ? null : $account->iban, 'bic' => $this->repository->getMetaValue($account, 'BIC'), 'virtual_balance' => app('steam')->bcround($account->virtual_balance, $decimalPlaces), - 'native_virtual_balance' => $convertToNative ? app('steam')->bcround($account->native_virtual_balance, $default->decimal_places) : null, + 'native_virtual_balance' => $this->convertToNative ? app('steam')->bcround($account->native_virtual_balance, $default->decimal_places) : null, 'opening_balance' => $openingBalance, 'native_opening_balance' => $nativeOpeningBalance, 'opening_balance_date' => $openingBalanceDate, @@ -180,13 +183,13 @@ class AccountTransformer extends AbstractTransformer return $date; } - private function getCurrency(Account $account, TransactionCurrency $default): array + private function getCurrency(Account $account): array { $currency = $this->repository->getAccountCurrency($account); // only grab default when result is null: if (null === $currency) { - $currency = $default; + $currency = $this->default; } $currencyId = (string) $currency->id; $currencyCode = $currency->code; diff --git a/app/Transformers/AvailableBudgetTransformer.php b/app/Transformers/AvailableBudgetTransformer.php index d58a6bebd6..23f4099b7a 100644 --- a/app/Transformers/AvailableBudgetTransformer.php +++ b/app/Transformers/AvailableBudgetTransformer.php @@ -25,9 +25,11 @@ declare(strict_types=1); namespace FireflyIII\Transformers; use FireflyIII\Models\AvailableBudget; +use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\NoBudgetRepositoryInterface; use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; +use FireflyIII\Support\Facades\Amount; /** * Class AvailableBudgetTransformer @@ -37,6 +39,8 @@ class AvailableBudgetTransformer extends AbstractTransformer private NoBudgetRepositoryInterface $noBudgetRepository; private OperationsRepositoryInterface $opsRepository; private BudgetRepositoryInterface $repository; + private TransactionCurrency $default; + private bool $convertToNative; /** * CurrencyTransformer constructor. @@ -46,6 +50,8 @@ class AvailableBudgetTransformer extends AbstractTransformer $this->repository = app(BudgetRepositoryInterface::class); $this->opsRepository = app(OperationsRepositoryInterface::class); $this->noBudgetRepository = app(NoBudgetRepositoryInterface::class); + $this->default = Amount::getDefaultCurrency(); + $this->convertToNative = Amount::convertToNative(); } /** @@ -56,23 +62,32 @@ class AvailableBudgetTransformer extends AbstractTransformer $this->repository->setUser($availableBudget->user); $currency = $availableBudget->transactionCurrency; + $default = $this->default; + if(!$this->convertToNative) { + $default = null; + } $data = [ - 'id' => (string) $availableBudget->id, - 'created_at' => $availableBudget->created_at->toAtomString(), - 'updated_at' => $availableBudget->updated_at->toAtomString(), - 'currency_id' => (string) $currency->id, - 'currency_code' => $currency->code, - 'currency_symbol' => $currency->symbol, - 'currency_decimal_places' => $currency->decimal_places, - 'amount' => app('steam')->bcround($availableBudget->amount, $currency->decimal_places), - 'start' => $availableBudget->start_date->toAtomString(), - 'end' => $availableBudget->end_date->endOfDay()->toAtomString(), - 'spent_in_budgets' => [], - 'spent_no_budget' => [], - 'links' => [ + 'id' => (string) $availableBudget->id, + 'created_at' => $availableBudget->created_at->toAtomString(), + 'updated_at' => $availableBudget->updated_at->toAtomString(), + 'currency_id' => (string) $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'native_currency_id' => null === $default ? null : (string) $default->id, + 'native_currency_code' => $default?->code, + 'native_currency_symbol' => $default?->symbol, + 'native_currency_decimal_places' => $default?->decimal_places, + 'amount' => app('steam')->bcround($availableBudget->amount, $currency->decimal_places), + 'native_amount' => $this->convertToNative ? app('steam')->bcround($availableBudget->native_amount, $currency->decimal_places) : null, + 'start' => $availableBudget->start_date->toAtomString(), + 'end' => $availableBudget->end_date->endOfDay()->toAtomString(), + 'spent_in_budgets' => [], + 'spent_no_budget' => [], + 'links' => [ [ 'rel' => 'self', - 'uri' => '/available_budgets/'.$availableBudget->id, + 'uri' => '/available_budgets/' . $availableBudget->id, ], ], ]; diff --git a/app/Transformers/BillTransformer.php b/app/Transformers/BillTransformer.php index 9fd1189871..0044bc0b6b 100644 --- a/app/Transformers/BillTransformer.php +++ b/app/Transformers/BillTransformer.php @@ -28,8 +28,10 @@ use Carbon\Carbon; use Carbon\CarbonInterface; use FireflyIII\Models\Bill; use FireflyIII\Models\ObjectGroup; +use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Bill\BillRepositoryInterface; +use FireflyIII\Support\Facades\Amount; use FireflyIII\Support\Models\BillDateCalculator; use Illuminate\Support\Collection; @@ -40,14 +42,18 @@ class BillTransformer extends AbstractTransformer { private BillDateCalculator $calculator; private BillRepositoryInterface $repository; + private TransactionCurrency $default; + private bool $convertToNative; /** * BillTransformer constructor. */ public function __construct() { - $this->repository = app(BillRepositoryInterface::class); - $this->calculator = app(BillDateCalculator::class); + $this->repository = app(BillRepositoryInterface::class); + $this->calculator = app(BillDateCalculator::class); + $this->default = Amount::getDefaultCurrency(); + $this->convertToNative = Amount::convertToNative(); } /** @@ -58,23 +64,23 @@ class BillTransformer extends AbstractTransformer */ public function transform(Bill $bill): array { - $defaultCurrency = $this->parameters->get('defaultCurrency') ?? app('amount')->getDefaultCurrency(); + $default = $this->parameters->get('defaultCurrency') ?? $this->default; - $paidData = $this->paidData($bill); - $lastPaidDate = $this->getLastPaidDate($paidData); - $start = $this->parameters->get('start') ?? today()->subYears(10); - $end = $this->parameters->get('end') ?? today()->addYears(10); - $payDates = $this->calculator->getPayDates($start, $end, $bill->date, $bill->repeat_freq, $bill->skip, $lastPaidDate); - $currency = $bill->transactionCurrency; - $notes = $this->repository->getNoteText($bill); - $notes = '' === $notes ? null : $notes; - $objectGroupId = null; - $objectGroupOrder = null; - $objectGroupTitle = null; + $paidData = $this->paidData($bill); + $lastPaidDate = $this->getLastPaidDate($paidData); + $start = $this->parameters->get('start') ?? today()->subYears(10); + $end = $this->parameters->get('end') ?? today()->addYears(10); + $payDates = $this->calculator->getPayDates($start, $end, $bill->date, $bill->repeat_freq, $bill->skip, $lastPaidDate); + $currency = $bill->transactionCurrency; + $notes = $this->repository->getNoteText($bill); + $notes = '' === $notes ? null : $notes; + $objectGroupId = null; + $objectGroupOrder = null; + $objectGroupTitle = null; $this->repository->setUser($bill->user); /** @var null|ObjectGroup $objectGroup */ - $objectGroup = $bill->objectGroups->first(); + $objectGroup = $bill->objectGroups->first(); if (null !== $objectGroup) { $objectGroupId = $objectGroup->id; $objectGroupOrder = $objectGroup->order; @@ -84,7 +90,7 @@ class BillTransformer extends AbstractTransformer $paidDataFormatted = []; $payDatesFormatted = []; foreach ($paidData as $object) { - $date = Carbon::createFromFormat('!Y-m-d', $object['date'], config('app.timezone')); + $date = Carbon::createFromFormat('!Y-m-d', $object['date'], config('app.timezone')); if (null === $date) { $date = today(config('app.timezone')); } @@ -93,24 +99,24 @@ class BillTransformer extends AbstractTransformer } foreach ($payDates as $string) { - $date = Carbon::createFromFormat('!Y-m-d', $string, config('app.timezone')); + $date = Carbon::createFromFormat('!Y-m-d', $string, config('app.timezone')); if (null === $date) { $date = today(config('app.timezone')); } $payDatesFormatted[] = $date->toAtomString(); } // next expected match - $nem = null; - $nemDate = null; - $nemDiff = trans('firefly.not_expected_period'); - $firstPayDate = $payDates[0] ?? null; + $nem = null; + $nemDate = null; + $nemDiff = trans('firefly.not_expected_period'); + $firstPayDate = $payDates[0] ?? null; if (null !== $firstPayDate) { $nemDate = Carbon::createFromFormat('!Y-m-d', $firstPayDate, config('app.timezone')); if (null === $nemDate) { $nemDate = today(config('app.timezone')); } - $nem = $nemDate->toAtomString(); + $nem = $nemDate->toAtomString(); // nullify again when it's outside the current view range. if ( @@ -131,7 +137,7 @@ class BillTransformer extends AbstractTransformer $current = $payDatesFormatted[0] ?? null; if (null !== $current && !$nemDate->isToday()) { - $temp2 = Carbon::createFromFormat('Y-m-d\TH:i:sP', $current); + $temp2 = Carbon::createFromFormat('Y-m-d\TH:i:sP', $current); if (null === $temp2) { $temp2 = today(config('app.timezone')); } @@ -141,18 +147,22 @@ class BillTransformer extends AbstractTransformer } return [ - 'id' => $bill->id, - 'created_at' => $bill->created_at->toAtomString(), - 'updated_at' => $bill->updated_at->toAtomString(), - 'currency_id' => (string) $bill->transaction_currency_id, - 'currency_code' => $currency->code, - 'currency_symbol' => $currency->symbol, - 'currency_decimal_places' => $currency->decimal_places, + 'id' => $bill->id, + 'created_at' => $bill->created_at->toAtomString(), + 'updated_at' => $bill->updated_at->toAtomString(), + 'currency_id' => (string) $bill->transaction_currency_id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'native_currency_id' => null === $default ? null : (string) $default->id, + 'native_currency_code' => $default?->code, + 'native_currency_symbol' => $default?->symbol, + 'native_currency_decimal_places' => $default?->decimal_places, 'name' => $bill->name, 'amount_min' => app('steam')->bcround($bill->amount_min, $currency->decimal_places), 'amount_max' => app('steam')->bcround($bill->amount_max, $currency->decimal_places), - 'native_amount_min' => app('steam')->bcround($bill->native_amount_min, $defaultCurrency->decimal_places), - 'native_amount_max' => app('steam')->bcround($bill->native_amount_max, $defaultCurrency->decimal_places), + 'native_amount_min' => $this->convertToNative ? app('steam')->bcround($bill->native_amount_min, $default->decimal_places) : null, + 'native_amount_max' => $this->convertToNative ? app('steam')->bcround($bill->native_amount_max, $default->decimal_places) : null, 'date' => $bill->date->toAtomString(), 'end_date' => $bill->end_date?->toAtomString(), 'extension_date' => $bill->extension_date?->toAtomString(), @@ -173,7 +183,7 @@ class BillTransformer extends AbstractTransformer 'links' => [ [ 'rel' => 'self', - 'uri' => '/bills/'.$bill->id, + 'uri' => '/bills/' . $bill->id, ], ], ]; @@ -195,13 +205,13 @@ class BillTransformer extends AbstractTransformer // 2023-07-18 this particular date is used to search for the last paid date. // 2023-07-18 the cloned $searchDate is used to grab the correct transactions. /** @var Carbon $start */ - $start = clone $this->parameters->get('start'); - $searchStart = clone $start; + $start = clone $this->parameters->get('start'); + $searchStart = clone $start; $start->subDay(); /** @var Carbon $end */ - $end = clone $this->parameters->get('end'); - $searchEnd = clone $end; + $end = clone $this->parameters->get('end'); + $searchEnd = clone $end; // move the search dates to the start of the day. $searchStart->startOfDay(); @@ -211,7 +221,7 @@ class BillTransformer extends AbstractTransformer app('log')->debug(sprintf('Search parameters are: start: %s', $searchStart->format('Y-m-d'))); // Get from database when bill was paid. - $set = $this->repository->getPaidDatesInRange($bill, $searchStart, $searchEnd); + $set = $this->repository->getPaidDatesInRange($bill, $searchStart, $searchEnd); app('log')->debug(sprintf('Count %d entries in getPaidDatesInRange()', $set->count())); // Grab from array the most recent payment. If none exist, fall back to the start date and pretend *that* was the last paid date. @@ -220,7 +230,7 @@ class BillTransformer extends AbstractTransformer app('log')->debug(sprintf('Result of lastPaidDate is %s', $lastPaidDate->format('Y-m-d'))); // At this point the "next match" is exactly after the last time the bill was paid. - $result = []; + $result = []; foreach ($set as $entry) { $result[] = [ 'transaction_group_id' => (string) $entry->transaction_group_id, diff --git a/app/Transformers/BudgetLimitTransformer.php b/app/Transformers/BudgetLimitTransformer.php index afac7c5684..e38a0b0be7 100644 --- a/app/Transformers/BudgetLimitTransformer.php +++ b/app/Transformers/BudgetLimitTransformer.php @@ -25,8 +25,10 @@ declare(strict_types=1); namespace FireflyIII\Transformers; use FireflyIII\Models\BudgetLimit; +use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; use FireflyIII\Repositories\Budget\OperationsRepository; +use FireflyIII\Support\Facades\Amount; use Illuminate\Support\Collection; use League\Fractal\Resource\Item; @@ -40,6 +42,15 @@ class BudgetLimitTransformer extends AbstractTransformer 'budget', ]; + protected TransactionCurrency $default; + protected bool $convertToNative; + + public function __construct() + { + $this->default = Amount::getDefaultCurrency(); + $this->convertToNative = Amount::convertToNative(); + } + /** * Include Budget * @@ -55,8 +66,8 @@ class BudgetLimitTransformer extends AbstractTransformer */ public function transform(BudgetLimit $budgetLimit): array { - $repository = app(OperationsRepository::class); - $limitRepos = app(BudgetLimitRepositoryInterface::class); + $repository = app(OperationsRepository::class); + $limitRepos = app(BudgetLimitRepositoryInterface::class); $repository->setUser($budgetLimit->budget->user); $limitRepos->setUser($budgetLimit->budget->user); $expenses = $repository->sumExpenses( @@ -82,28 +93,38 @@ class BudgetLimitTransformer extends AbstractTransformer $currencySymbol = $currency->symbol; $currencyDecimalPlaces = $currency->decimal_places; } - $amount = app('steam')->bcround($amount, $currencyDecimalPlaces); + $amount = app('steam')->bcround($amount, $currencyDecimalPlaces); + $default = $this->default; + if (!$this->convertToNative) { + $default = null; + } + return [ - 'id' => (string) $budgetLimit->id, - 'created_at' => $budgetLimit->created_at->toAtomString(), - 'updated_at' => $budgetLimit->updated_at->toAtomString(), - 'start' => $budgetLimit->start_date->toAtomString(), - 'end' => $budgetLimit->end_date->endOfDay()->toAtomString(), - 'budget_id' => (string) $budgetLimit->budget_id, - 'currency_id' => (string) $currencyId, - 'currency_code' => $currencyCode, - 'currency_name' => $currencyName, - 'currency_decimal_places' => $currencyDecimalPlaces, - 'currency_symbol' => $currencySymbol, - 'amount' => $amount, - 'period' => $budgetLimit->period, - 'spent' => $expenses[$currencyId]['sum'] ?? '0', - 'notes' => '' === $notes ? null : $notes, - 'links' => [ + 'id' => (string) $budgetLimit->id, + 'created_at' => $budgetLimit->created_at->toAtomString(), + 'updated_at' => $budgetLimit->updated_at->toAtomString(), + 'start' => $budgetLimit->start_date->toAtomString(), + 'end' => $budgetLimit->end_date->endOfDay()->toAtomString(), + 'budget_id' => (string) $budgetLimit->budget_id, + 'currency_id' => (string) $currencyId, + 'currency_code' => $currencyCode, + 'currency_name' => $currencyName, + 'currency_decimal_places' => $currencyDecimalPlaces, + 'currency_symbol' => $currencySymbol, + 'native_currency_id' => null === $default ? null : (string) $default->id, + 'native_currency_code' => $default?->code, + 'native_currency_symbol' => $default?->symbol, + 'native_currency_decimal_places' => $default?->decimal_places, + 'amount' => $amount, + 'native_amount' => $this->convertToNative ? app('steam')->bcround($budgetLimit->native_amount, $default->decimal_places) : null, + 'period' => $budgetLimit->period, + 'spent' => $expenses[$currencyId]['sum'] ?? '0', // will be in native if convertToNative. + 'notes' => '' === $notes ? null : $notes, + 'links' => [ [ 'rel' => 'self', - 'uri' => '/budgets/limits/'.$budgetLimit->id, + 'uri' => '/budgets/limits/' . $budgetLimit->id, ], ], ]; diff --git a/app/Transformers/BudgetTransformer.php b/app/Transformers/BudgetTransformer.php index 84699c07f2..eb30cafcea 100644 --- a/app/Transformers/BudgetTransformer.php +++ b/app/Transformers/BudgetTransformer.php @@ -26,8 +26,10 @@ namespace FireflyIII\Transformers; use FireflyIII\Enums\AutoBudgetType; use FireflyIII\Models\Budget; +use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; +use FireflyIII\Support\Facades\Amount; use Illuminate\Support\Collection; use Symfony\Component\HttpFoundation\ParameterBag; @@ -38,15 +40,19 @@ class BudgetTransformer extends AbstractTransformer { private OperationsRepositoryInterface $opsRepository; private BudgetRepositoryInterface $repository; + private bool $convertToNative; + private TransactionCurrency $default; /** * BudgetTransformer constructor. */ public function __construct() { - $this->opsRepository = app(OperationsRepositoryInterface::class); - $this->repository = app(BudgetRepositoryInterface::class); - $this->parameters = new ParameterBag(); + $this->opsRepository = app(OperationsRepositoryInterface::class); + $this->repository = app(BudgetRepositoryInterface::class); + $this->parameters = new ParameterBag(); + $this->default = Amount::getDefaultCurrency(); + $this->convertToNative = Amount::convertToNative(); } /** @@ -55,53 +61,71 @@ class BudgetTransformer extends AbstractTransformer public function transform(Budget $budget): array { $this->opsRepository->setUser($budget->user); - $start = $this->parameters->get('start'); - $end = $this->parameters->get('end'); - $autoBudget = $this->repository->getAutoBudget($budget); - $spent = []; + $start = $this->parameters->get('start'); + $end = $this->parameters->get('end'); + $autoBudget = $this->repository->getAutoBudget($budget); + $spent = []; if (null !== $start && null !== $end) { $spent = $this->beautify($this->opsRepository->sumExpenses($start, $end, null, new Collection([$budget]))); } - $abCurrencyId = null; - $abCurrencyCode = null; - $abType = null; - $abAmount = null; - $abPeriod = null; - $notes = $this->repository->getNoteText($budget); + // info for auto budget. + $abType = null; + $abAmount = null; + $abNative = null; + $abPeriod = null; + $notes = $this->repository->getNoteText($budget); - $types = [ + $types = [ AutoBudgetType::AUTO_BUDGET_RESET->value => 'reset', AutoBudgetType::AUTO_BUDGET_ROLLOVER->value => 'rollover', AutoBudgetType::AUTO_BUDGET_ADJUSTED->value => 'adjusted', ]; - + $currency = $autoBudget?->transactionCurrency; + $default = $this->default; + if (!$this->convertToNative) { + $default = null; + } + if(null === $autoBudget) { + $currency = $default; + } if (null !== $autoBudget) { - $abCurrencyId = (string) $autoBudget->transactionCurrency->id; - $abCurrencyCode = $autoBudget->transactionCurrency->code; - $abType = $types[$autoBudget->auto_budget_type]; - $abAmount = app('steam')->bcround($autoBudget->amount, $autoBudget->transactionCurrency->decimal_places); - $abPeriod = $autoBudget->period; + $abType = $types[$autoBudget->auto_budget_type]; + $abAmount = app('steam')->bcround($autoBudget->amount, $currency->decimal_places); + $abNative = $this->convertToNative ? app('steam')->bcround($autoBudget->native_amount, $default->decimal_places) : null; + $abPeriod = $autoBudget->period; } return [ - 'id' => (string) $budget->id, - 'created_at' => $budget->created_at->toAtomString(), - 'updated_at' => $budget->updated_at->toAtomString(), - 'active' => $budget->active, - 'name' => $budget->name, - 'order' => $budget->order, - 'notes' => $notes, - 'auto_budget_type' => $abType, - 'auto_budget_period' => $abPeriod, - 'auto_budget_currency_id' => $abCurrencyId, - 'auto_budget_currency_code' => $abCurrencyCode, - 'auto_budget_amount' => $abAmount, - 'spent' => $spent, - 'links' => [ + 'id' => (string) $budget->id, + 'created_at' => $budget->created_at->toAtomString(), + 'updated_at' => $budget->updated_at->toAtomString(), + 'active' => $budget->active, + 'name' => $budget->name, + 'order' => $budget->order, + 'notes' => $notes, + 'auto_budget_type' => $abType, + 'auto_budget_period' => $abPeriod, + + 'currency_id' => null === $autoBudget ? null : (string) $autoBudget->transactionCurrency->id, + 'currency_code' => $autoBudget?->transactionCurrency->code, + 'currency_name' => $autoBudget?->transactionCurrency->name, + 'currency_decimal_places' => $autoBudget?->transactionCurrency->decimal_places, + 'currency_symbol' => $autoBudget?->transactionCurrency->symbol, + + 'native_currency_id' => null === $default ? null : (string) $default->id, + 'native_currency_code' => $default?->code, + 'native_currency_symbol' => $default?->symbol, + 'native_currency_decimal_places' => $default?->decimal_places, + + // amount and native amount if present. + 'auto_budget_amount' => $abAmount, + 'native_auto_budget_amount' => $abNative, + 'spent' => $spent, // always in native. + 'links' => [ [ 'rel' => 'self', - 'uri' => '/budgets/'.$budget->id, + 'uri' => '/budgets/' . $budget->id, ], ], ]; diff --git a/app/Transformers/CategoryTransformer.php b/app/Transformers/CategoryTransformer.php index bc6fa8f64e..fd20cf602d 100644 --- a/app/Transformers/CategoryTransformer.php +++ b/app/Transformers/CategoryTransformer.php @@ -25,8 +25,10 @@ declare(strict_types=1); namespace FireflyIII\Transformers; use FireflyIII\Models\Category; +use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Category\OperationsRepositoryInterface; +use FireflyIII\Support\Facades\Amount; use Illuminate\Support\Collection; /** @@ -36,14 +38,18 @@ class CategoryTransformer extends AbstractTransformer { private OperationsRepositoryInterface $opsRepository; private CategoryRepositoryInterface $repository; + private TransactionCurrency $default; + private bool $convertToNative; /** * CategoryTransformer constructor. */ public function __construct() { - $this->opsRepository = app(OperationsRepositoryInterface::class); - $this->repository = app(CategoryRepositoryInterface::class); + $this->opsRepository = app(OperationsRepositoryInterface::class); + $this->repository = app(CategoryRepositoryInterface::class); + $this->default = Amount::getDefaultCurrency(); + $this->convertToNative = Amount::convertToNative(); } /** @@ -62,20 +68,28 @@ class CategoryTransformer extends AbstractTransformer $earned = $this->beautify($this->opsRepository->sumIncome($start, $end, null, new Collection([$category]))); $spent = $this->beautify($this->opsRepository->sumExpenses($start, $end, null, new Collection([$category]))); } - $notes = $this->repository->getNoteText($category); + $default = $this->default; + if (!$this->convertToNative) { + $default = null; + } + $notes = $this->repository->getNoteText($category); return [ - 'id' => $category->id, - 'created_at' => $category->created_at->toAtomString(), - 'updated_at' => $category->updated_at->toAtomString(), - 'name' => $category->name, - 'notes' => $notes, - 'spent' => $spent, - 'earned' => $earned, - 'links' => [ + 'id' => $category->id, + 'created_at' => $category->created_at->toAtomString(), + 'updated_at' => $category->updated_at->toAtomString(), + 'name' => $category->name, + 'notes' => $notes, + 'native_currency_id' => null === $default ? null : (string) $default->id, + 'native_currency_code' => $default?->code, + 'native_currency_symbol' => $default?->symbol, + 'native_currency_decimal_places' => $default?->decimal_places, + 'spent' => $spent, + 'earned' => $earned, + 'links' => [ [ 'rel' => 'self', - 'uri' => '/categories/'.$category->id, + 'uri' => '/categories/' . $category->id, ], ], ];