Created graphs in the dashboard with the evolution by account

This commit is contained in:
JKuijperM 2026-02-05 17:02:10 +01:00
parent 3ba1dbe4df
commit 4e94aa3713
3 changed files with 93 additions and 1 deletions

View File

@ -1,8 +1,10 @@
from datetime import date
from decimal import Decimal
from django.db import models
from django.conf import settings
from django.db.models import Sum
from django.db.models.fields import related
from django.db.models.functions import ExtractMonth
class Category(models.Model):
name = models.CharField(max_length=100)
@ -58,6 +60,41 @@ class Account(models.Model):
)
return self.initial_balance + income_total - expenses_total
def monthly_balance(self, year=None):
year = year or date.today().year
incomes = (
self.incomes
.filter(date__year=year)
.annotate(month=ExtractMonth('date'))
.values('month')
.annotate(total=Sum('amount'))
)
expenses = (
self.expenses
.filter(date__year=year)
.annotate(month=ExtractMonth('date'))
.values('month')
.annotate(total=Sum('amount'))
)
income_map = {i['month']: i['total'] for i in incomes}
expenses_map = {e['month']: e['total'] for e in expenses}
balance = self.initial_balance
data = []
for month in range(1, 13):
balance += income_map.get(month, 0)
balance -= expenses_map.get(month, 0)
data.append({
'month': month,
'balance': float(balance),
})
return data
def __str__(self):
return self.name

View File

@ -225,7 +225,7 @@
<!-- Chart -->
<!-- ========================= -->
<h3>Distribución mensual (año completo)</h3>
<h2>Distribución mensual (año completo)</h2>
<canvas id="expensesChart"></canvas>
@ -249,5 +249,44 @@
<hr>
<h2>Evolución anual por cuenta ({{ selected_year }})</h2>
<div class="dashboard-grid">
{% for acc in accounts_charts %}
<div class="card card-chart">
<h3>{{ acc.name }}</h3>
<p><strong>Saldo actual:</strong> {{ acc.current_balance|floatformat:2 }} €</p>
<canvas id="accountChart{{ acc.id }}"></canvas>
</div>
{% endfor %}
</div>
<script>
const monthLabels = {{ chart_labels|safe }};
{% for acc in accounts_charts %}
new Chart(
document.getElementById('accountChart{{ acc.id }}'),
{
type: 'line',
data: {
labels: monthLabels,
datasets: [{
label: 'Saldo',
data: {{ acc.data|safe }},
fill: true,
tension: 0.3,
}]
},
options: {
responsive: true,
maintainAspectRatio: false
}
}
);
{% endfor %}
</script>
{% endblock %}

View File

@ -482,6 +482,21 @@ def dashboard(request):
'difference_abs': abs(difference),
})
# ------------------
# Previous expenses by category
# ------------------
accounts_charts = []
for account in accounts:
monthly_data = account.monthly_balance(selected_year)
m_balance = [row['balance'] for row in monthly_data]
accounts_charts.append({
'id': account.id,
'name': account.name,
'data': m_balance,
'current_balance': account.current_balance(),
})
# Send the data to the dashboard
return render(request, 'expenses/dashboard.html', {
'by_category': by_category,
@ -506,6 +521,7 @@ def dashboard(request):
'selected_account': account_id,
'selected_account_obj': selected_account_obj,
'kpi_balance': kpi_balance,
'accounts_charts': accounts_charts,
})