From b951e5f0698d4e1000a183374c313959d5153adc Mon Sep 17 00:00:00 2001 From: Herculino Trotta Date: Sat, 11 Jan 2025 13:34:49 -0300 Subject: [PATCH] feat(recurring-transaction): update unpaid transactions info when recurring transaction is updated --- app/apps/api/serializers/transactions.py | 5 ++++ app/apps/transactions/forms.py | 2 ++ app/apps/transactions/models.py | 30 ++++++++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/app/apps/api/serializers/transactions.py b/app/apps/api/serializers/transactions.py index e9bfa44..50f3d1e 100644 --- a/app/apps/api/serializers/transactions.py +++ b/app/apps/api/serializers/transactions.py @@ -120,6 +120,11 @@ class RecurringTransactionSerializer(serializers.ModelSerializer): instance.create_upcoming_transactions() return instance + def update(self, instance, validated_data): + instance = super().update(instance, validated_data) + instance.update_unpaid_transactions() + return instance + class TransactionSerializer(serializers.ModelSerializer): category = TransactionCategoryField(required=False) diff --git a/app/apps/transactions/forms.py b/app/apps/transactions/forms.py index 0d8db9b..9045986 100644 --- a/app/apps/transactions/forms.py +++ b/app/apps/transactions/forms.py @@ -767,5 +767,7 @@ class RecurringTransactionForm(forms.ModelForm): instance = super().save(**kwargs) if is_new: instance.create_upcoming_transactions() + else: + instance.update_unpaid_transactions() return instance diff --git a/app/apps/transactions/models.py b/app/apps/transactions/models.py index b503887..45a7fe4 100644 --- a/app/apps/transactions/models.py +++ b/app/apps/transactions/models.py @@ -540,3 +540,33 @@ class RecurringTransaction(models.Model): recurring_transaction.save( update_fields=["last_generated_date", "last_generated_reference_date"] ) + + def update_unpaid_transactions(self): + """ + Updates all unpaid transactions associated with this RecurringTransaction. + + Only unpaid transactions (`is_paid=False`) are modified. Updates fields like + amount, description, category, notes, and many-to-many relationships (tags, entities). + """ + unpaid_transactions = self.transactions.filter(is_paid=False) + + for existing_transaction in unpaid_transactions: + # Update fields based on RecurringTransaction + existing_transaction.amount = self.amount + existing_transaction.description = self.description + existing_transaction.category = self.category + existing_transaction.notes = self.notes + + # Update many-to-many relationships + existing_transaction.tags.set(self.tags.all()) + existing_transaction.entities.set(self.entities.all()) + + # Save updated transaction + existing_transaction.save() + + def delete_unpaid_transactions(self): + """ + Deletes all unpaid transactions associated with this RecurringTransaction. + """ + today = timezone.localdate(timezone.now()) + self.transactions.filter(is_paid=False, date__gt=today).delete()