From 8a8aa7ca71025f496da923abfca01ef0757d58e3 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 15 May 2021 12:58:19 +0200 Subject: [PATCH] Fix #4774 --- .../Controllers/Recurring/EditController.php | 1 - app/Jobs/CreateRecurringTransactions.php | 5 +++-- .../Recurring/RecurringRepository.php | 22 ++++++++++++++++++- .../RecurringRepositoryInterface.php | 11 +++++++++- .../Support/RecurringTransactionTrait.php | 3 +++ .../Update/RecurrenceUpdateService.php | 8 +++++++ 6 files changed, 45 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Recurring/EditController.php b/app/Http/Controllers/Recurring/EditController.php index 6610053912..06cbb852e8 100644 --- a/app/Http/Controllers/Recurring/EditController.php +++ b/app/Http/Controllers/Recurring/EditController.php @@ -162,7 +162,6 @@ class EditController extends Controller public function update(RecurrenceFormRequest $request, Recurrence $recurrence) { $data = $request->getAll(); - $this->recurring->update($recurrence, $data); $request->session()->flash('success', (string)trans('firefly.updated_recurrence', ['title' => $recurrence->title])); diff --git a/app/Jobs/CreateRecurringTransactions.php b/app/Jobs/CreateRecurringTransactions.php index 31f3dd82b3..340a2a7e50 100644 --- a/app/Jobs/CreateRecurringTransactions.php +++ b/app/Jobs/CreateRecurringTransactions.php @@ -384,6 +384,7 @@ class CreateRecurringTransactions implements ShouldQueue 'group_title' => $groupTitle, 'transactions' => $this->getTransactionData($recurrence, $repetition, $date), ]; + /** @var TransactionGroup $group */ $group = $this->groupRepository->store($array); $this->created++; @@ -428,8 +429,8 @@ class CreateRecurringTransactions implements ShouldQueue 'amount' => $transaction->amount, 'budget_id' => $this->repository->getBudget($transaction), 'budget_name' => null, - 'category_id' => null, - 'category_name' => $this->repository->getCategory($transaction), + 'category_id' => $this->repository->getCategoryId($transaction), + 'category_name' => $this->repository->getCategoryName($transaction), 'source_id' => $transaction->source_id, 'source_name' => null, 'destination_id' => $transaction->destination_id, diff --git a/app/Repositories/Recurring/RecurringRepository.php b/app/Repositories/Recurring/RecurringRepository.php index ec04b519d0..148a0da1db 100644 --- a/app/Repositories/Recurring/RecurringRepository.php +++ b/app/Repositories/Recurring/RecurringRepository.php @@ -133,7 +133,7 @@ class RecurringRepository implements RecurringRepositoryInterface * * @return null|string */ - public function getCategory(RecurrenceTransaction $recTransaction): ?string + public function getCategoryName(RecurrenceTransaction $recTransaction): ?string { $return = ''; /** @var RecurrenceTransactionMeta $meta */ @@ -146,6 +146,26 @@ class RecurringRepository implements RecurringRepositoryInterface return '' === $return ? null : $return; } + /** + * Get the category from a recurring transaction transaction. + * + * @param RecurrenceTransaction $recTransaction + * + * @return null|int + */ + public function getCategoryId(RecurrenceTransaction $recTransaction): ?int + { + $return = ''; + /** @var RecurrenceTransactionMeta $meta */ + foreach ($recTransaction->recurrenceTransactionMeta as $meta) { + if ('category_id' === $meta->name) { + $return = (int)$meta->value; + } + } + + return '' === $return ? null : $return; + } + /** * Returns the journals created for this recurrence, possibly limited by time. * diff --git a/app/Repositories/Recurring/RecurringRepositoryInterface.php b/app/Repositories/Recurring/RecurringRepositoryInterface.php index 511c7c5d96..6d9e6a36ff 100644 --- a/app/Repositories/Recurring/RecurringRepositoryInterface.php +++ b/app/Repositories/Recurring/RecurringRepositoryInterface.php @@ -79,7 +79,16 @@ interface RecurringRepositoryInterface * * @return null|string */ - public function getCategory(RecurrenceTransaction $recTransaction): ?string; + public function getCategoryName(RecurrenceTransaction $recTransaction): ?string; + + /** + * Get the category from a recurring transaction transaction. + * + * @param RecurrenceTransaction $recTransaction + * + * @return null|int + */ + public function getCategoryId(RecurrenceTransaction $recTransaction): ?int; /** * Returns the count of journals created for this recurrence, possibly limited by time. diff --git a/app/Services/Internal/Support/RecurringTransactionTrait.php b/app/Services/Internal/Support/RecurringTransactionTrait.php index 45089c8d4c..205931e2a1 100644 --- a/app/Services/Internal/Support/RecurringTransactionTrait.php +++ b/app/Services/Internal/Support/RecurringTransactionTrait.php @@ -264,6 +264,9 @@ trait RecurringTransactionTrait $categoryFactory->setUser($transaction->recurrence->user); $category = $categoryFactory->findOrCreate($categoryId, null); if (null === $category) { + // remove category: + $transaction->recurrenceTransactionMeta()->where('name', 'category_id')->delete(); + $transaction->recurrenceTransactionMeta()->where('name', 'category_name')->delete(); return; } diff --git a/app/Services/Internal/Update/RecurrenceUpdateService.php b/app/Services/Internal/Update/RecurrenceUpdateService.php index cc6a3cfc40..7570e9f9b3 100644 --- a/app/Services/Internal/Update/RecurrenceUpdateService.php +++ b/app/Services/Internal/Update/RecurrenceUpdateService.php @@ -286,9 +286,17 @@ class RecurrenceUpdateService if (array_key_exists('budget_id', $current)) { $this->setBudget($match, (int)$current['budget_id']); } + // reset category if name is set but empty: + // can be removed when v1 is retired. + if (array_key_exists('category_name', $current) && '' === (string)$current['category_name']) { + $current['category_name'] = null; + $current['category_id'] = 0; + } + if (array_key_exists('category_id', $current)) { $this->setCategory($match, (int)$current['category_id']); } + if (array_key_exists('tags', $current)) { $this->updateTags($match, $current['tags']); }