From 1b47c12a22bd3bc3f5e8523c2c1554fd67ebb9e0 Mon Sep 17 00:00:00 2001 From: Herculino Trotta Date: Sun, 5 Jan 2025 11:13:23 -0300 Subject: [PATCH] feat(api): add RecurringTransaction and InstallmentPlan endpoints --- app/apps/api/serializers/transactions.py | 65 +++++++++++++++++++++++- app/apps/api/urls.py | 1 + app/apps/api/views/transactions.py | 13 +++-- 3 files changed, 71 insertions(+), 8 deletions(-) diff --git a/app/apps/api/serializers/transactions.py b/app/apps/api/serializers/transactions.py index 6900220..e9bfa44 100644 --- a/app/apps/api/serializers/transactions.py +++ b/app/apps/api/serializers/transactions.py @@ -19,6 +19,7 @@ from apps.transactions.models import ( TransactionTag, InstallmentPlan, TransactionEntity, + RecurringTransaction, ) @@ -55,7 +56,69 @@ class InstallmentPlanSerializer(serializers.ModelSerializer): class Meta: model = InstallmentPlan - fields = "__all__" + fields = [ + "id", + "account", + "type", + "description", + "number_of_installments", + "installment_start", + "installment_total_number", + "start_date", + "reference_date", + "end_date", + "recurrence", + "installment_amount", + "category", + "tags", + "entities", + "notes", + ] + read_only_fields = ["installment_total_number", "end_date"] + + def create(self, validated_data): + instance = super().create(validated_data) + instance.create_transactions() + return instance + + def update(self, instance, validated_data): + instance = super().update(instance, validated_data) + instance.update_transactions() + return instance + + +class RecurringTransactionSerializer(serializers.ModelSerializer): + category = TransactionCategoryField(required=False) + tags = TransactionTagField(required=False) + entities = TransactionEntityField(required=False) + + class Meta: + model = RecurringTransaction + fields = [ + "id", + "is_paused", + "account", + "type", + "amount", + "description", + "category", + "tags", + "entities", + "notes", + "reference_date", + "start_date", + "end_date", + "recurrence_type", + "recurrence_interval", + "last_generated_date", + "last_generated_reference_date", + ] + read_only_fields = ["last_generated_date", "last_generated_reference_date"] + + def create(self, validated_data): + instance = super().create(validated_data) + instance.create_upcoming_transactions() + return instance class TransactionSerializer(serializers.ModelSerializer): diff --git a/app/apps/api/urls.py b/app/apps/api/urls.py index 4bf0457..b900064 100644 --- a/app/apps/api/urls.py +++ b/app/apps/api/urls.py @@ -9,6 +9,7 @@ router.register(r"categories", views.TransactionCategoryViewSet) router.register(r"tags", views.TransactionTagViewSet) router.register(r"entities", views.TransactionEntityViewSet) router.register(r"installment-plans", views.InstallmentPlanViewSet) +router.register(r"recurring-transactions", views.RecurringTransactionViewSet) router.register(r"account-groups", views.AccountGroupViewSet) router.register(r"accounts", views.AccountViewSet) router.register(r"currencies", views.CurrencyViewSet) diff --git a/app/apps/api/views/transactions.py b/app/apps/api/views/transactions.py index 92c12cf..000ae5e 100644 --- a/app/apps/api/views/transactions.py +++ b/app/apps/api/views/transactions.py @@ -1,4 +1,4 @@ -from rest_framework import permissions, viewsets +from rest_framework import viewsets from apps.api.serializers import ( TransactionSerializer, @@ -6,6 +6,7 @@ from apps.api.serializers import ( TransactionTagSerializer, InstallmentPlanSerializer, TransactionEntitySerializer, + RecurringTransactionSerializer, ) from apps.transactions.models import ( Transaction, @@ -13,6 +14,7 @@ from apps.transactions.models import ( TransactionTag, InstallmentPlan, TransactionEntity, + RecurringTransaction, ) from apps.rules.signals import transaction_updated, transaction_created @@ -53,10 +55,7 @@ class InstallmentPlanViewSet(viewsets.ModelViewSet): queryset = InstallmentPlan.objects.all() serializer_class = InstallmentPlanSerializer - def perform_create(self, serializer): - instance = serializer.save() - instance.create_transactions() - def perform_update(self, serializer): - instance = serializer.save() - instance.create_transactions() +class RecurringTransactionViewSet(viewsets.ModelViewSet): + queryset = RecurringTransaction.objects.all() + serializer_class = RecurringTransactionSerializer