Przeglądaj źródła

Muestra filtros en movimientos

Celestino Rey 1 rok temu
rodzic
commit
2c43202745

+ 5 - 1
src/finanzas/migrations/0001_initial.py

@@ -1,6 +1,7 @@
-# Generated by Django 5.2.1 on 2025-05-20 06:14
+# Generated by Django 4.2.20 on 2025-05-20 08:55
 
 from django.db import migrations, models
+import django.db.models.deletion
 
 
 class Migration(migrations.Migration):
@@ -58,6 +59,9 @@ class Migration(migrations.Migration):
                 ('semana', models.PositiveIntegerField(blank=True, null=True)),
                 ('activa', models.BooleanField(default=True)),
                 ('ultima_ejecucion', models.DateField(blank=True, null=True)),
+                ('categoria', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='finanzas.categoria')),
+                ('cuenta_destino', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='recurrente_entrada', to='finanzas.cuenta')),
+                ('cuenta_origen', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='recurrente_salida', to='finanzas.cuenta')),
             ],
         ),
     ]

+ 15 - 30
src/finanzas/migrations/0002_initial.py

@@ -1,8 +1,8 @@
-# Generated by Django 5.2.1 on 2025-05-20 06:14
+# Generated by Django 4.2.20 on 2025-05-20 08:55
 
-import django.db.models.deletion
 from django.conf import settings
 from django.db import migrations, models
+import django.db.models.deletion
 
 
 class Migration(migrations.Migration):
@@ -10,33 +10,13 @@ class Migration(migrations.Migration):
     initial = True
 
     dependencies = [
-        ('finanzas', '0001_initial'),
         migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('finanzas', '0001_initial'),
     ]
 
     operations = [
         migrations.AddField(
-            model_name='cuenta',
-            name='usuario',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
-        ),
-        migrations.AddField(
-            model_name='movimiento',
-            name='categoria',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='finanzas.categoria'),
-        ),
-        migrations.AddField(
-            model_name='movimiento',
-            name='cuenta_destino',
-            field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='movimientos_entrada', to='finanzas.cuenta'),
-        ),
-        migrations.AddField(
-            model_name='movimiento',
-            name='cuenta_origen',
-            field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='movimientos_salida', to='finanzas.cuenta'),
-        ),
-        migrations.AddField(
-            model_name='movimiento',
+            model_name='transaccionrecurrente',
             name='usuario',
             field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
         ),
@@ -61,22 +41,27 @@ class Migration(migrations.Migration):
             field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
         ),
         migrations.AddField(
-            model_name='transaccionrecurrente',
+            model_name='movimiento',
             name='categoria',
             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='finanzas.categoria'),
         ),
         migrations.AddField(
-            model_name='transaccionrecurrente',
+            model_name='movimiento',
             name='cuenta_destino',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='recurrente_entrada', to='finanzas.cuenta'),
+            field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='movimientos_entrada', to='finanzas.cuenta'),
         ),
         migrations.AddField(
-            model_name='transaccionrecurrente',
+            model_name='movimiento',
             name='cuenta_origen',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='recurrente_salida', to='finanzas.cuenta'),
+            field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='movimientos_salida', to='finanzas.cuenta'),
         ),
         migrations.AddField(
-            model_name='transaccionrecurrente',
+            model_name='movimiento',
+            name='usuario',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
+        ),
+        migrations.AddField(
+            model_name='cuenta',
             name='usuario',
             field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
         ),

+ 0 - 0
src/finanzas/templatetags/__init__.py


+ 8 - 0
src/finanzas/templatetags/range_filters.py

@@ -0,0 +1,8 @@
+from django import template
+
+register = template.Library()
+
+@register.filter
+def to(start, end):
+    """Uso: {% for i in 1|to:12 %} genera del 1 al 12 (includos)"""
+    return range(start, end + 1)

+ 22 - 10
src/finanzas/views.py

@@ -7,13 +7,14 @@ from django.contrib.auth.decorators import login_required
 from django.contrib import messages
 from django.utils.timezone import now
 from django.core.serializers import serialize
-from datetime import date, timedelta
+from datetime import date, timedelta, datetime, time
 from django.conf import settings
-from django.utils.timezone import localtime
+from django.utils.timezone import localtime, now, make_aware, is_naive
+from calendar import monthrange
+from django.utils import timezone
 
 import logging
 import re
-import calendar
 
 from accounts import models
 from .models import Movimiento, Cuenta, MovimientoFrecuente, Categoria, TransaccionRecurrente
@@ -29,11 +30,23 @@ def dashboard(request):
     # Copiamos GET para poder modificarlo
     request.GET = request.GET.copy()
 
-    # Si se solicitó limpiar la búsqueda, la eliminamos de los datos
-    if 'limpiar_busqueda' in request.GET:
-        request.GET['buscar'] = ''
+    hoy = now()
 
-    movimientos = Movimiento.objects.filter(usuario=request.user).order_by('-fecha')
+    # Obtener mes y año de GET o usar el actual
+    mes = int(request.GET.get('mes', hoy.month))
+    anio = int(request.GET.get('anio', hoy.year))
+
+    # Obtener último día del mes
+    ultimo_dia = monthrange(anio, mes)[1]
+
+    # Crear fechas aware
+    inicio_naive = datetime.combine(date(anio, mes, 1), time.min)
+    fin_naive = datetime.combine(date(anio, mes, ultimo_dia), time.max)
+
+    inicio_mes = make_aware(inicio_naive) if is_naive(inicio_naive) else inicio_naive
+    fin_mes = make_aware(fin_naive) if is_naive(fin_naive) else fin_naive
+
+    movimientos = Movimiento.objects.filter(usuario=request.user, fecha__range=(inicio_mes, fin_mes)).order_by('-fecha')
 
     favoritas = Cuenta.objects.filter(favorita='True')
 
@@ -48,15 +61,14 @@ def dashboard(request):
                 db_models.Q(descripcion__icontains=busqueda) | db_models.Q(cuenta_origen__nombre__icontains=busqueda) | db_models.Q(cuenta_destino__nombre__icontains=busqueda)
             )
 
-#    logger.warning(f"Frecuentes: {frecuentes}")
-#    logger.warning(f"Monto: {frecuentes[0].monto}")
-
     return render(request, 'dashboard.html', {
         'movimientos': movimientos,
         'user': request.user,
         'form_filtro': form_filtro,
         'favoritas': favoritas,
         'frecuentes': frecuentes,
+        'mes': mes,
+        'anio': anio,
     })
 
 # Movimientos

+ 1 - 1
src/reymotausers/migrations/0001_initial.py

@@ -1,4 +1,4 @@
-# Generated by Django 5.2.1 on 2025-05-20 06:14
+# Generated by Django 4.2.20 on 2025-05-20 08:55
 
 from django.db import migrations, models
 

+ 19 - 0
src/templates/dashboard.html

@@ -1,6 +1,7 @@
 {% extends "base.html" %}
 
 {% load humanize %}
+{% load range_filters %}
 
 {% block interface %}
 
@@ -37,6 +38,24 @@
     </div>
 
     <div class="board">
+        <div>
+            <form method="get" class="mb-3">
+                <select name="mes">
+                {% for m in 1|to:12 %}
+                    <option value="{{ m }}" {% if m == mes %}selected{% endif %}>
+                    {{ m }}
+                    </option>
+                {% endfor %}
+                </select>
+                <select name="anio">
+                {% for y in 2020|to:anio %}
+                    <option value="{{ y }}" {% if y == anio %}selected{% endif %}>{{ y }}</option>
+                {% endfor %}
+                </select>
+                <button type="submit">Filtrar</button>
+            </form>
+        </div>
+
         <h3>Movimientos recientes</h3>
         <table width="100%">
             <thead>