From 8c3dea074fc2a16d697ebca69d7e43e454729698 Mon Sep 17 00:00:00 2001 From: Herculino Trotta Date: Fri, 18 Oct 2024 19:03:54 -0300 Subject: [PATCH] feat: changes to Recurring and InstallmentPlan --- app/apps/transactions/models.py | 18 ++++++----- app/apps/transactions/urls.py | 10 +++---- .../views/recurring_transactions.py | 30 ++++++++++++++++++- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/app/apps/transactions/models.py b/app/apps/transactions/models.py index ad21ab7..c8eac96 100644 --- a/app/apps/transactions/models.py +++ b/app/apps/transactions/models.py @@ -187,7 +187,7 @@ class InstallmentPlan(models.Model): def save(self, *args, **kwargs): if not self.reference_date: - self.reference_date = self.start_date.replace(day=1) + self.reference_date = self.start_date if not self.installment_start: self.installment_start = 1 @@ -372,7 +372,7 @@ class RecurringTransaction(models.Model): def save(self, *args, **kwargs): if not self.reference_date: - self.reference_date = self.start_date.replace(day=1) + self.reference_date = self.start_date instance = super().save(*args, **kwargs) return instance @@ -381,8 +381,8 @@ class RecurringTransaction(models.Model): current_date = self.start_date reference_date = self.reference_date end_date = min( - self.end_date or timezone.now().date() + relativedelta(years=1), - timezone.now().date() + relativedelta(years=1), + self.end_date or timezone.now().date() + (self.get_recurrence_delta() * 5), + timezone.now().date() + (self.get_recurrence_delta() * 5), ) while current_date <= end_date: @@ -403,7 +403,7 @@ class RecurringTransaction(models.Model): account=self.account, type=self.type, date=date, - reference_date=reference_date, + reference_date=reference_date.replace(day=1), amount=self.amount, description=self.description, category=self.category, @@ -430,7 +430,8 @@ class RecurringTransaction(models.Model): def generate_upcoming_transactions(cls): today = timezone.now().date() recurring_transactions = cls.objects.filter( - models.Q(end_date__isnull=True) | models.Q(end_date__gte=today) + models.Q(models.Q(end_date__isnull=True) | models.Q(end_date__gte=today)) + & models.Q(paused=False) ) for recurring_transaction in recurring_transactions: @@ -447,8 +448,9 @@ class RecurringTransaction(models.Model): current_date = start_date end_date = min( - recurring_transaction.end_date or today + relativedelta(years=1), - today + relativedelta(years=1), + recurring_transaction.end_date + or today + (recurring_transaction.get_recurrence_delta() * 6), + today + (recurring_transaction.get_recurrence_delta() * 6), ) while current_date <= end_date: diff --git a/app/apps/transactions/urls.py b/app/apps/transactions/urls.py index e749361..545e664 100644 --- a/app/apps/transactions/urls.py +++ b/app/apps/transactions/urls.py @@ -133,9 +133,9 @@ urlpatterns = [ views.recurring_transaction_delete, name="recurring_transaction_delete", ), - # path( - # "installment-plans//refresh/", - # views.installment_plan_refresh, - # name="installment_plan_refresh", - # ), + path( + "recurring-transactions//toggle-pause/", + views.recurring_transaction_toggle_pause, + name="recurring_transaction_toggle_pause", + ), ] diff --git a/app/apps/transactions/views/recurring_transactions.py b/app/apps/transactions/views/recurring_transactions.py index aeed07e..087a223 100644 --- a/app/apps/transactions/views/recurring_transactions.py +++ b/app/apps/transactions/views/recurring_transactions.py @@ -9,6 +9,7 @@ from django.views.decorators.http import require_http_methods from apps.common.decorators.htmx import only_htmx from apps.transactions.forms import RecurringTransactionForm from apps.transactions.models import RecurringTransaction +from apps.transactions.tasks import generate_recurring_transactions @login_required @@ -24,7 +25,9 @@ def recurring_transactions_index(request): @login_required @require_http_methods(["GET"]) def recurring_transactions_list(request): - recurring_transactions = RecurringTransaction.objects.all().order_by("-end_date") + recurring_transactions = RecurringTransaction.objects.all().order_by( + "-start_date", "description", "id" + ) return render( request, @@ -124,6 +127,31 @@ def recurring_transaction_edit(request, recurring_transaction_id): # ) +@only_htmx +@login_required +@require_http_methods(["GET"]) +def recurring_transaction_toggle_pause(request, recurring_transaction_id): + installment_plan = get_object_or_404( + RecurringTransaction, id=recurring_transaction_id + ) + current_paused = installment_plan.paused + installment_plan.paused = not current_paused + installment_plan.save(update_fields=["paused"]) + + if current_paused: + messages.success(request, _("Recurring transaction unpaused successfully")) + generate_recurring_transactions.defer() + else: + messages.success(request, _("Recurring transaction paused successfully")) + + return HttpResponse( + status=204, + headers={ + "HX-Trigger": "updated, hide_offcanvas, toasts", + }, + ) + + @only_htmx @login_required @csrf_exempt