From 8b2f1d0b4f495c9f3b1dfb1b52d37c63abaf8064 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 6 Nov 2024 19:22:10 +0100 Subject: [PATCH] Add timezones to existing objects. --- .../Integrity/AddTimezonesToDates.php | 113 ++++++++++++++++++ app/Helpers/Collector/GroupCollector.php | 1 + 2 files changed, 114 insertions(+) create mode 100644 app/Console/Commands/Integrity/AddTimezonesToDates.php diff --git a/app/Console/Commands/Integrity/AddTimezonesToDates.php b/app/Console/Commands/Integrity/AddTimezonesToDates.php new file mode 100644 index 0000000000..bf5001c5e4 --- /dev/null +++ b/app/Console/Commands/Integrity/AddTimezonesToDates.php @@ -0,0 +1,113 @@ + ['date'], // done + AvailableBudget::class => ['start_date', 'end_date'], // done + Bill::class => ['date', 'end_date', 'extension_date'], // done + BudgetLimit::class => ['start_date', 'end_date'], // done + CurrencyExchangeRate::class => ['date'], // done + InvitedUser::class => ['expires'], + PiggyBankEvent::class => ['date'], + PiggyBankRepetition::class => ['startdate', 'targetdate'], + PiggyBank::class => ['startdate', 'targetdate'], // done + Recurrence::class => ['first_date', 'repeat_until', 'latest_date'], + Tag::class => ['date'], + TransactionJournal::class => ['date'], + ]; + foreach ($models as $model => $fields) { + $this->addTimezoneToModel($model, $fields); + } + } + + private function addTimezoneToModel(string $model, array $fields): void + { + foreach ($fields as $field) { + $this->addTimezoneToModelField($model, $field); + } + } + + private function addTimezoneToModelField(string $model, string $field): void + { + $shortModel = str_replace('FireflyIII\\Models\\','', $model); + $timezoneField = sprintf('%s_tz', $field); + $items = new Collection(); + try { + $items = $model::whereNull($timezoneField)->get(); + } catch (QueryException $e) { + $this->friendlyError(sprintf('Cannot add timezone to field "%s" of model "%s". Field does not exist.', $field, $shortModel)); + Log::error($e->getMessage()); + } + if(0 === $items->count()) { + $this->friendlyPositive(sprintf('Timezone is present in field "%s" of model "%s".', $field, $shortModel)); + return; + } + $this->friendlyInfo(sprintf('Adding timezone to field "%s" of model "%s".', $field, $shortModel)); + + foreach ($items as $item) { + $item->{$timezoneField} = config('app.timezone'); + $item->saveQuietly(); + } + } +} diff --git a/app/Helpers/Collector/GroupCollector.php b/app/Helpers/Collector/GroupCollector.php index 508eecfc08..47f51eba3f 100644 --- a/app/Helpers/Collector/GroupCollector.php +++ b/app/Helpers/Collector/GroupCollector.php @@ -117,6 +117,7 @@ class GroupCollector implements GroupCollectorInterface 'transaction_journals.transaction_type_id', 'transaction_journals.description', 'transaction_journals.date', + 'transaction_journals.date_tz', 'transaction_journals.order', // types