views.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from django.shortcuts import render, redirect, get_object_or_404
  2. from accounts import models
  3. from .models import Movimiento, Cuenta
  4. from .forms import MovimientoForm, FiltroForm, CuentaForm
  5. from django.contrib.auth.decorators import login_required
  6. @login_required
  7. def dashboard(request):
  8. movimientos = Movimiento.objects.filter(usuario=request.user).order_by('-fecha')
  9. ingresos = sum(m.monto for m in movimientos if m.cuenta_destino.tipo == 'ingreso')
  10. gastos = sum(m.monto for m in movimientos if m.cuenta_origen.tipo == 'gasto')
  11. balance = ingresos - gastos
  12. return render(request, 'dashboard.html', {
  13. 'movimientos': movimientos,
  14. 'ingresos': ingresos,
  15. 'gastos': gastos,
  16. 'balance': balance,
  17. 'user': request.user,
  18. })
  19. @login_required
  20. def agregar_movimiento(request):
  21. if request.method == 'POST':
  22. form = MovimientoForm(request.POST)
  23. form.fields['cuenta_origen'].queryset = Cuenta.objects.filter(usuario=request.user)
  24. form.fields['cuenta_destino'].queryset = Cuenta.objects.filter(usuario=request.user)
  25. if form.is_valid():
  26. movimiento = form.save(commit=False)
  27. movimiento.usuario = request.user
  28. movimiento.save()
  29. # Ajustar saldos de cuentas
  30. movimiento.cuenta_origen.saldo -= movimiento.monto
  31. movimiento.cuenta_origen.save()
  32. movimiento.cuenta_destino.saldo += movimiento.monto
  33. movimiento.cuenta_destino.save()
  34. return redirect('dashboard')
  35. else:
  36. form = MovimientoForm()
  37. form.fields['cuenta_origen'].queryset = Cuenta.objects.filter(usuario=request.user)
  38. form.fields['cuenta_destino'].queryset = Cuenta.objects.filter(usuario=request.user)
  39. return render(request, 'agregar_movimiento.html', {'form': form})
  40. @login_required
  41. def agregar_cuenta(request):
  42. if request.method == 'POST':
  43. form = CuentaForm(request.POST)
  44. if form.is_valid():
  45. cuenta = form.save(commit=False)
  46. cuenta.usuario = request.user
  47. cuenta.save()
  48. return redirect('dashboard')
  49. else:
  50. form = CuentaForm()
  51. return render(request, 'agregar_cuenta.html', {'form': form})
  52. @login_required
  53. def listar_cuentas(request):
  54. cuentas = Cuenta.objects.filter(usuario=request.user)
  55. return render(request, 'listar_cuentas.html', {'cuentas': cuentas})
  56. @login_required
  57. def editar_cuenta(request, cuenta_id):
  58. cuenta = get_object_or_404(Cuenta, id=cuenta_id, usuario=request.user)
  59. if request.method == 'POST':
  60. form = CuentaForm(request.POST, instance=cuenta)
  61. if form.is_valid():
  62. form.save()
  63. return redirect('listar_cuentas')
  64. else:
  65. form = CuentaForm(instance=cuenta)
  66. return render(request, 'editar_cuenta.html', {'form': form})
  67. @login_required
  68. def eliminar_cuenta(request, cuenta_id):
  69. cuenta = get_object_or_404(Cuenta, id=cuenta_id, usuario=request.user)
  70. tiene_movimientos = cuenta.movimientos_salida.exists() or cuenta.movimientos_entrada.exists()
  71. if request.method == 'POST' and not tiene_movimientos:
  72. cuenta.delete()
  73. return redirect('listar_cuentas')
  74. return render(request, 'eliminar_cuenta.html', {
  75. 'cuenta': cuenta,
  76. 'tiene_movimientos': tiene_movimientos,
  77. })