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