feat: add account and currency info to monthly view

This commit is contained in:
Herculino Trotta
2025-02-01 00:51:16 -03:00
parent a7d8f94412
commit 39c1f634b6
17 changed files with 867 additions and 874 deletions

View File

@@ -19,4 +19,19 @@ urlpatterns = [
views.monthly_summary,
name="monthly_summary",
),
path(
"monthly/<int:month>/<int:year>/summary/accounts/",
views.monthly_account_summary,
name="monthly_account_summary",
),
path(
"monthly/<int:month>/<int:year>/summary/currencies/",
views.monthly_currency_summary,
name="monthly_currency_summary",
),
path(
"monthly/summary/select/<str:selected>/",
views.monthly_summary_select,
name="monthly_summary_select",
),
]

View File

@@ -2,6 +2,7 @@ from django.contrib.auth.decorators import login_required
from django.db.models import (
Q,
)
from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.utils import timezone
from django.views.decorators.http import require_http_methods
@@ -16,6 +17,7 @@ from apps.transactions.models import Transaction
from apps.transactions.utils.calculations import (
calculate_currency_totals,
calculate_percentage_distribution,
calculate_account_totals,
)
from apps.transactions.utils.default_ordering import default_order
@@ -31,6 +33,7 @@ def index(request):
@require_http_methods(["GET"])
def monthly_overview(request, month: int, year: int):
order = request.session.get("monthly_transactions_order", "default")
summary_tab = request.session.get("monthly_summary_tab", "summary")
if month < 1 or month > 12:
from django.http import Http404
@@ -57,6 +60,7 @@ def monthly_overview(request, month: int, year: int):
"previous_year": previous_year,
"filter": f,
"order": order,
"summary_tab": summary_tab,
},
)
@@ -131,3 +135,61 @@ def monthly_summary(request, month: int, year: int):
"monthly_overview/fragments/monthly_summary.html",
context=context,
)
@only_htmx
@login_required
@require_http_methods(["GET"])
def monthly_account_summary(request, month: int, year: int):
# Base queryset with all required filters
base_queryset = Transaction.objects.filter(
reference_date__year=year,
reference_date__month=month,
).exclude(Q(category__mute=True) & ~Q(category=None))
account_data = calculate_account_totals(transactions_queryset=base_queryset.all())
account_percentages = calculate_percentage_distribution(account_data)
context = {
"account_data": account_data,
"account_percentages": account_percentages,
}
return render(
request,
"monthly_overview/fragments/monthly_account_summary.html",
context=context,
)
@only_htmx
@login_required
@require_http_methods(["GET"])
def monthly_currency_summary(request, month: int, year: int):
# Base queryset with all required filters
base_queryset = Transaction.objects.filter(
reference_date__year=year,
reference_date__month=month,
).exclude(Q(category__mute=True) & ~Q(category=None))
currency_data = calculate_currency_totals(base_queryset.all(), ignore_empty=True)
currency_percentages = calculate_percentage_distribution(currency_data)
context = {
"currency_data": currency_data,
"currency_percentages": currency_percentages,
}
return render(
request, "monthly_overview/fragments/monthly_currency_summary.html", context
)
@login_required
@require_http_methods(["GET"])
def monthly_summary_select(request, selected):
request.session["monthly_summary_tab"] = selected
return HttpResponse(
status=204,
)

View File

@@ -11,6 +11,21 @@ urlpatterns = [
views.transaction_all_summary,
name="transactions_all_summary",
),
path(
"transactions/summary/account/",
views.transaction_all_account_summary,
name="transaction_all_account_summary",
),
path(
"transactions/summary/currency/",
views.transaction_all_currency_summary,
name="transaction_all_currency_summary",
),
path(
"transactions/summary/select/<str:selected>/",
views.transaction_all_summary_select,
name="transaction_all_summary_select",
),
path(
"transactions/actions/pay/",
views.bulk_pay_transactions,

View File

@@ -314,9 +314,13 @@ def transaction_pay(request, transaction_id):
@require_http_methods(["GET"])
def transaction_all_index(request):
order = request.session.get("all_transactions_order", "default")
summary_tab = request.session.get("transaction_all_summary_tab", "currency")
f = TransactionsFilter(request.GET)
return render(
request, "transactions/pages/transactions.html", {"filter": f, "order": order}
request,
"transactions/pages/transactions.html",
{"filter": f, "order": order, "summary_tab": summary_tab},
)
@@ -382,16 +386,74 @@ def transaction_all_summary(request):
account_percentages = calculate_percentage_distribution(account_data)
context = {
"income_current": remove_falsey_entries(currency_data, "income_current"),
"income_projected": remove_falsey_entries(currency_data, "income_projected"),
"expense_current": remove_falsey_entries(currency_data, "expense_current"),
"expense_projected": remove_falsey_entries(currency_data, "expense_projected"),
"total_current": remove_falsey_entries(currency_data, "total_current"),
"total_final": remove_falsey_entries(currency_data, "total_final"),
"total_projected": remove_falsey_entries(currency_data, "total_projected"),
"currency_data": currency_data,
"currency_percentages": currency_percentages,
"account_data": account_data,
"account_percentages": account_percentages,
}
return render(request, "transactions/fragments/summary.html", context)
@only_htmx
@login_required
@require_http_methods(["GET"])
def transaction_all_account_summary(request):
transactions = Transaction.objects.prefetch_related(
"account",
"account__group",
"category",
"tags",
"account__exchange_currency",
"account__currency",
"installment_plan",
).all()
f = TransactionsFilter(request.GET, queryset=transactions)
account_data = calculate_account_totals(transactions_queryset=f.qs.all())
account_percentages = calculate_percentage_distribution(account_data)
context = {
"account_data": account_data,
"account_percentages": account_percentages,
}
return render(request, "transactions/fragments/all_account_summary.html", context)
@only_htmx
@login_required
@require_http_methods(["GET"])
def transaction_all_currency_summary(request):
transactions = Transaction.objects.prefetch_related(
"account",
"account__group",
"category",
"tags",
"account__exchange_currency",
"account__currency",
"installment_plan",
).all()
f = TransactionsFilter(request.GET, queryset=transactions)
currency_data = calculate_currency_totals(f.qs.all(), ignore_empty=True)
currency_percentages = calculate_percentage_distribution(currency_data)
context = {
"currency_data": currency_data,
"currency_percentages": currency_percentages,
}
return render(request, "transactions/fragments/all_currency_summary.html", context)
@login_required
@require_http_methods(["GET"])
def transaction_all_summary_select(request, selected):
request.session["transaction_all_summary_tab"] = selected
return HttpResponse(
status=204,
)