瀏覽代碼

Ya saca el pdf con el periodo elegido, si pulsas filtrar primero

Celestino Rey 1 年之前
父節點
當前提交
12e0175018
共有 2 個文件被更改,包括 64 次插入 和 47 次删除
  1. 16 0
      src/finanzas/forms.py
  2. 48 47
      src/finanzas/views.py

+ 16 - 0
src/finanzas/forms.py

@@ -163,3 +163,19 @@ class InformeCuentaForm(forms.Form):
 
         for field in self.fields.values():
             field.widget.attrs['class'] = 'form-control'
+
+
+class FiltroInformeCuentaForm(forms.Form):
+    hoy = date.today()
+    desde = forms.ChoiceField(
+        choices=[(i, calendar.month_name[i]) for i in range(1, 13)],
+        initial=hoy.month,
+        required=False,
+        widget=forms.Select(attrs={'class': 'form-control'})
+    )
+    hasta = forms.ChoiceField(
+        choices=[(y, y) for y in range(hoy.year - 5, hoy.year + 1)],
+        initial=hoy.year,
+        required=False,
+        widget=forms.Select(attrs={'class': 'form-control'})
+    )

+ 48 - 47
src/finanzas/views.py

@@ -24,7 +24,7 @@ import re
 
 from accounts import models
 from .models import Movimiento, Cuenta, MovimientoFrecuente, Categoria, TransaccionRecurrente
-from .forms import MovimientoForm, FiltroForm, CuentaForm, FiltroMesAnioForm, FiltroCuentaForm, InformeCuentaForm
+from .forms import MovimientoForm, FiltroForm, CuentaForm, FiltroMesAnioForm, FiltroCuentaForm, InformeCuentaForm, FiltroInformeCuentaForm
 from .recurrentes import procesar_transacciones_recurrentes
 
 
@@ -472,58 +472,59 @@ def resumen_saldos_mensuales(request):
 @login_required
 def informe_cuenta(request):
     cuenta_id = request.GET.get('cuenta_id')
-
-    # obtener fechas desde GET o establecer por defecto (mes actual)
-    hoy = timezone.localtime()
-    primer_dia = hoy.replace(day=1)
-
-    fecha_inicio_str =  request.GET.get('fecha_inicio')
-    fecha_fin_str = request.GET.get('fecha_fin')
-    logger.warning(f"informe_cuenta => fecha_inicio_str: {fecha_inicio_str}. fecha_fin_str: {fecha_fin_str}")
-
-    if fecha_inicio_str and fecha_fin_str:
-        fecha_inicio = datetime.strptime(fecha_inicio_str, '%Y-%m-%d').date()
-        fecha_fin = datetime.strptime(fecha_fin_str, '%Y-%m-%d').date()
-    else:
-        fecha_inicio = primer_dia
-        fecha_fin = hoy
-
-    # Convertir a datetime aware para evitar warnings
-    fecha_inicio_dt = timezone.make_aware(datetime.combine(fecha_inicio, time.min))
-    fecha_fin_dt = timezone.make_aware(datetime.combine(fecha_fin, time.max))
-
     cuenta = get_object_or_404(Cuenta, id=cuenta_id)
 
-    logger.warning(f"informe_cuenta => cuenta: {cuenta}. fecha_inicio_dt: {fecha_inicio_dt}. fecha_fin_dt: {fecha_fin_dt}")
-    
-    movimientos = Movimiento.objects.filter(
-        Q(cuenta_origen=cuenta) | Q(cuenta_destino=cuenta),
-        fecha__range=(fecha_inicio_dt, fecha_fin_dt)
-    ).order_by('fecha')
-
-    logger.warning(f"informe_cuenta => salgo de la búsqueda de movimientos")
+    form = FiltroInformeCuentaForm(request.GET or None)
 
-    # Cálculo de saldos después de cada movimiento
-    saldo = 0
-    movimientos_con_saldo = []
-    for mov in movimientos:
-        if mov.cuenta_origen == cuenta:
-            saldo -= mov.monto
-        elif mov.cuenta_destino == cuenta:
-            saldo += mov.monto
-        movimientos_con_saldo.append((mov, saldo))
+    if form.is_valid():
+        # obtener fechas desde GET o establecer por defecto (mes actual)
+        hoy = timezone.localtime()
+        primer_dia = hoy.replace(day=1)
 
-    # Renderizado del PDF o del HTML como prefieras
-    context = {
-        'cuenta': cuenta,
-        'movimientos_con_saldo': movimientos_con_saldo,
-        'fecha_inicio': fecha_inicio_str,
-        'fecha_fin': fecha_fin_str,
-    }
+        fecha_inicio_str =  request.GET.get('fecha_inicio')
+        fecha_fin_str = request.GET.get('fecha_fin')
+        logger.warning(f"informe_cuenta => fecha_inicio_str: {fecha_inicio_str}. fecha_fin_str: {fecha_fin_str}")
 
-    logger.warning(f"contexto: {context}")
+        if fecha_inicio_str and fecha_fin_str:
+            fecha_inicio = datetime.strptime(fecha_inicio_str, '%Y-%m-%d').date()
+            fecha_fin = datetime.strptime(fecha_fin_str, '%Y-%m-%d').date()
+        else:
+            fecha_inicio = primer_dia
+            fecha_fin = hoy
+
+        # Convertir a datetime aware para evitar warnings
+        fecha_inicio_dt = timezone.make_aware(datetime.combine(fecha_inicio, time.min))
+        fecha_fin_dt = timezone.make_aware(datetime.combine(fecha_fin, time.max))
+
+
+        logger.warning(f"informe_cuenta => cuenta: {cuenta}. fecha_inicio_dt: {fecha_inicio_dt}. fecha_fin_dt: {fecha_fin_dt}")
+        
+        movimientos = Movimiento.objects.filter(
+            Q(cuenta_origen=cuenta) | Q(cuenta_destino=cuenta),
+            fecha__range=(fecha_inicio_dt, fecha_fin_dt)
+        ).order_by('fecha')
+
+        logger.warning(f"informe_cuenta => salgo de la búsqueda de movimientos")
+
+        # Cálculo de saldos después de cada movimiento
+        saldo = 0
+        movimientos_con_saldo = []
+        for mov in movimientos:
+            if mov.cuenta_origen == cuenta:
+                saldo -= mov.monto
+            elif mov.cuenta_destino == cuenta:
+                saldo += mov.monto
+            movimientos_con_saldo.append((mov, saldo))
+
+        # Renderizado del PDF o del HTML como prefieras
+        context = {
+            'cuenta': cuenta,
+            'movimientos_con_saldo': movimientos_con_saldo,
+            'fecha_inicio': fecha_inicio_str,
+            'fecha_fin': fecha_fin_str,
+        }
 
-    return render(request, 'informe_cuenta.html', context)
+        return render(request, 'informe_cuenta.html', context)
 
 
 @login_required