feat: changes to Recurring and InstallmentPlan

This commit is contained in:
Herculino Trotta
2024-10-18 19:03:54 -03:00
parent 8e3f398016
commit 8c3dea074f
3 changed files with 44 additions and 14 deletions

View File

@@ -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:

View File

@@ -133,9 +133,9 @@ urlpatterns = [
views.recurring_transaction_delete,
name="recurring_transaction_delete",
),
# path(
# "installment-plans/<int:installment_plan_id>/refresh/",
# views.installment_plan_refresh,
# name="installment_plan_refresh",
# ),
path(
"recurring-transactions/<int:recurring_transaction_id>/toggle-pause/",
views.recurring_transaction_toggle_pause,
name="recurring_transaction_toggle_pause",
),
]

View File

@@ -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