From 7fd5a8812219f4bd0a2150d57aba6d626783e335 Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 20 Dec 2024 05:31:16 +0100 Subject: [PATCH] Add more column conversions. --- app/Handlers/Observer/BudgetLimitObserver.php | 2 +- .../Observer/PiggyBankEventObserver.php | 59 +++++++++++++++++++ app/Handlers/Observer/PiggyBankObserver.php | 31 +++++++--- app/Handlers/Observer/TransactionObserver.php | 24 ++++++++ app/Providers/EventServiceProvider.php | 10 +++- ..._12_19_061003_add_native_amount_column.php | 9 +-- 6 files changed, 119 insertions(+), 16 deletions(-) create mode 100644 app/Handlers/Observer/PiggyBankEventObserver.php diff --git a/app/Handlers/Observer/BudgetLimitObserver.php b/app/Handlers/Observer/BudgetLimitObserver.php index 4e0b6a2606..aa859eb484 100644 --- a/app/Handlers/Observer/BudgetLimitObserver.php +++ b/app/Handlers/Observer/BudgetLimitObserver.php @@ -51,6 +51,6 @@ class BudgetLimitObserver $budgetLimit->native_amount = $converter->convert($budgetLimit->transactionCurrency, $userCurrency, today(), $budgetLimit->amount); } $budgetLimit->saveQuietly(); - Log::debug('Bill native amounts are updated.'); + Log::debug('Budget limit native amounts are updated.'); } } diff --git a/app/Handlers/Observer/PiggyBankEventObserver.php b/app/Handlers/Observer/PiggyBankEventObserver.php new file mode 100644 index 0000000000..b8b34006a2 --- /dev/null +++ b/app/Handlers/Observer/PiggyBankEventObserver.php @@ -0,0 +1,59 @@ +updateNativeAmount($event); + } + + public function created(PiggyBankEvent $event): void + { + Log::debug('Observe "created" of a piggy bank event.'); + $this->updateNativeAmount($event); + } + + private function updateNativeAmount(PiggyBankEvent $event): void + { + $userCurrency = app('amount')->getDefaultCurrencyByUserGroup($event->piggyBank->accounts()->first()->user->userGroup); + $event->native_amount = null; + if ($event->piggyBank->transactionCurrency->id !== $userCurrency->id) { + $converter = new ExchangeRateConverter(); + $converter->setIgnoreSettings(true); + $event->native_amount = $converter->convert($event->piggyBank->transactionCurrency, $userCurrency, today(), $event->amount); + } + $event->saveQuietly(); + Log::debug('Piggy bank event native amount is updated.'); + } + + +} diff --git a/app/Handlers/Observer/PiggyBankObserver.php b/app/Handlers/Observer/PiggyBankObserver.php index da111a17af..8619085fdc 100644 --- a/app/Handlers/Observer/PiggyBankObserver.php +++ b/app/Handlers/Observer/PiggyBankObserver.php @@ -26,24 +26,37 @@ namespace FireflyIII\Handlers\Observer; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBankRepetition; +use FireflyIII\Support\Http\Api\ExchangeRateConverter; +use Illuminate\Support\Facades\Log; /** * Class PiggyBankObserver */ class PiggyBankObserver { + public function updated(PiggyBank $piggyBank): void + { + Log::debug('Observe "updated" of a piggy bank.'); + $this->updateNativeAmount($piggyBank); + } + public function created(PiggyBank $piggyBank): void { - app('log')->debug('Observe "created" of a piggy bank. DO NOTHING.'); + Log::debug('Observe "created" of a piggy bank.'); + $this->updateNativeAmount($piggyBank); + } - // $repetition = new PiggyBankRepetition(); - // $repetition->piggyBank()->associate($piggyBank); - // $repetition->start_date = $piggyBank->start_date; - // $repetition->start_date_tz = $piggyBank->start_date->format('e'); - // $repetition->target_date = $piggyBank->target_date; - // $repetition->target_date_tz = $piggyBank->target_date?->format('e'); - // $repetition->current_amount = '0'; - // $repetition->save(); + private function updateNativeAmount(PiggyBank $piggyBank): void + { + $userCurrency = app('amount')->getDefaultCurrencyByUserGroup($piggyBank->accounts()->first()->user->userGroup); + $piggyBank->native_target_amount = null; + if ($piggyBank->transactionCurrency->id !== $userCurrency->id) { + $converter = new ExchangeRateConverter(); + $converter->setIgnoreSettings(true); + $piggyBank->native_target_amount = $converter->convert($piggyBank->transactionCurrency, $userCurrency, today(), $piggyBank->target_amount); + } + $piggyBank->saveQuietly(); + Log::debug('Piggy bank native target amount is updated.'); } /** diff --git a/app/Handlers/Observer/TransactionObserver.php b/app/Handlers/Observer/TransactionObserver.php index ece823e6b3..ed0eda2fce 100644 --- a/app/Handlers/Observer/TransactionObserver.php +++ b/app/Handlers/Observer/TransactionObserver.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\Handlers\Observer; use FireflyIII\Models\Transaction; +use FireflyIII\Support\Http\Api\ExchangeRateConverter; use FireflyIII\Support\Models\AccountBalanceCalculator; use Illuminate\Support\Facades\Log; @@ -47,6 +48,7 @@ class TransactionObserver AccountBalanceCalculator::recalculateForJournal($transaction->transactionJournal); } } + $this->updateNativeAmount($transaction); } public function created(Transaction $transaction): void @@ -58,5 +60,27 @@ class TransactionObserver AccountBalanceCalculator::recalculateForJournal($transaction->transactionJournal); } } + $this->updateNativeAmount($transaction); + } + + private function updateNativeAmount(Transaction $transaction): void { + $userCurrency = app('amount')->getDefaultCurrencyByUserGroup($transaction->transactionJournal->user->userGroup); + $transaction->native_amount = null; + $transaction->native_foreign_amount = null; + // first normal amount + if ($transaction->transactionCurrency->id !== $userCurrency->id) { + $converter = new ExchangeRateConverter(); + $converter->setIgnoreSettings(true); + $transaction->native_amount = $converter->convert($transaction->transactionCurrency, $userCurrency, $transaction->transactionJournal->date, $transaction->amount); + } + // then foreign amount + if ($transaction->foreignCurrency?->id !== $userCurrency->id && null !== $transaction->foreign_amount) { + $converter = new ExchangeRateConverter(); + $converter->setIgnoreSettings(true); + $transaction->native_foreign_amount = $converter->convert($transaction->foreignCurrency, $userCurrency, $transaction->transactionJournal->date, $transaction->foreign_amount); + } + + $transaction->saveQuietly(); + Log::debug('Transaction native amounts are updated.'); } } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index afcc11eacb..c6d99b083c 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -62,8 +62,10 @@ use FireflyIII\Handlers\Observer\AttachmentObserver; use FireflyIII\Handlers\Observer\AutoBudgetObserver; use FireflyIII\Handlers\Observer\AvailableBudgetObserver; use FireflyIII\Handlers\Observer\BillObserver; +use FireflyIII\Handlers\Observer\BudgetLimitObserver; use FireflyIII\Handlers\Observer\BudgetObserver; use FireflyIII\Handlers\Observer\CategoryObserver; +use FireflyIII\Handlers\Observer\PiggyBankEventObserver; use FireflyIII\Handlers\Observer\PiggyBankObserver; use FireflyIII\Handlers\Observer\RecurrenceObserver; use FireflyIII\Handlers\Observer\RecurrenceTransactionObserver; @@ -81,8 +83,10 @@ use FireflyIII\Models\AutoBudget; use FireflyIII\Models\AvailableBudget; use FireflyIII\Models\Bill; use FireflyIII\Models\Budget; +use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\Category; use FireflyIII\Models\PiggyBank; +use FireflyIII\Models\PiggyBankEvent; use FireflyIII\Models\Recurrence; use FireflyIII\Models\RecurrenceTransaction; use FireflyIII\Models\Rule; @@ -264,13 +268,15 @@ class EventServiceProvider extends ServiceProvider private function registerObservers(): void { Attachment::observe(new AttachmentObserver()); - PiggyBank::observe(new PiggyBankObserver()); Account::observe(new AccountObserver()); - AvailableBudget::observe(new AvailableBudgetObserver()); AutoBudget::observe(new AutoBudgetObserver()); + AvailableBudget::observe(new AvailableBudgetObserver()); Bill::observe(new BillObserver()); Budget::observe(new BudgetObserver()); + BudgetLimit::observe(new BudgetLimitObserver()); Category::observe(new CategoryObserver()); + PiggyBank::observe(new PiggyBankObserver()); + PiggyBankEvent::observe(new PiggyBankEventObserver()); Recurrence::observe(new RecurrenceObserver()); RecurrenceTransaction::observe(new RecurrenceTransactionObserver()); Rule::observe(new RuleObserver()); diff --git a/database/migrations/2024_12_19_061003_add_native_amount_column.php b/database/migrations/2024_12_19_061003_add_native_amount_column.php index 35c6928742..7d777e13b6 100644 --- a/database/migrations/2024_12_19_061003_add_native_amount_column.php +++ b/database/migrations/2024_12_19_061003_add_native_amount_column.php @@ -12,12 +12,13 @@ return new class extends Migration { 'available_budgets' => ['native_amount'], // works 'bills' => ['native_amount_min', 'native_amount_max'], // works 'budget_limits' => ['native_amount'], // works - 'piggy_bank_events' => ['native_amount'], - 'piggy_banks' => ['native_target_amount'], - 'transactions' => ['native_amount', 'native_foreign_amount'], + 'piggy_bank_events' => ['native_amount'], // works + 'piggy_banks' => ['native_target_amount'], // works + 'transactions' => ['native_amount', 'native_foreign_amount'], // works // TODO native currency changes, reset everything. - // button to recalculate all native amounts on selected pages? + // TODO button to recalculate all native amounts on selected pages? + // TODO check if you use the correct date for the excange rate ];