views.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. favoritas = Cuenta.objects.filter(favorita='True')
  10. return render(request, 'dashboard.html', {
  11. 'movimientos': movimientos,
  12. 'user': request.user,
  13. 'favoritas': favoritas,
  14. })
  15. # Movimientos
  16. @login_required
  17. def agregar_movimiento(request):
  18. if request.method == 'POST':
  19. form = MovimientoForm(request.POST)
  20. form.fields['cuenta_origen'].queryset = Cuenta.objects.filter(usuario=request.user)
  21. form.fields['cuenta_destino'].queryset = Cuenta.objects.filter(usuario=request.user)
  22. if form.is_valid():
  23. movimiento = form.save(commit=False)
  24. movimiento.usuario = request.user
  25. movimiento.save()
  26. # Ajustar saldos de cuentas
  27. movimiento.cuenta_origen.saldo -= movimiento.monto
  28. movimiento.cuenta_origen.save()
  29. movimiento.cuenta_destino.saldo += movimiento.monto
  30. movimiento.cuenta_destino.save()
  31. return redirect('dashboard')
  32. else:
  33. form = MovimientoForm()
  34. form.fields['cuenta_origen'].queryset = Cuenta.objects.filter(usuario=request.user)
  35. form.fields['cuenta_destino'].queryset = Cuenta.objects.filter(usuario=request.user)
  36. return render(request, 'agregar_movimiento.html', {'form': form})
  37. @login_required
  38. def editar_movimiento(request, movimiento_id):
  39. movimiento = get_object_or_404(Movimiento, id=movimiento_id, usuario=request.user)
  40. saldo_original_origen = movimiento.cuenta_origen
  41. saldo_original_destino = movimiento.cuenta_destino
  42. monto_original = movimiento.monto
  43. if request.method == 'POST':
  44. form = MovimientoForm(request.POST, instance=movimiento)
  45. form.fields['cuenta_origen'].queryset = Cuenta.objects.filter(usuario=request.user)
  46. form.fields['cuenta_destino'].queryset = Cuenta.objects.filter(usuario=request.user)
  47. if form.is_valid():
  48. movimiento_nuevo = form.save(commit=False)
  49. # Revertir efecto anterior
  50. saldo_original_origen.saldo += monto_original
  51. saldo_original_origen.save()
  52. saldo_original_destino.saldo -= monto_original
  53. saldo_original_destino.save()
  54. # Aplicar nuevo efecto
  55. movimiento_nuevo.usuario = request.user
  56. movimiento_nuevo.save()
  57. movimiento_nuevo.cuenta_origen.saldo -= movimiento_nuevo.monto
  58. movimiento_nuevo.cuenta_origen.save()
  59. movimiento_nuevo.cuenta_destino.saldo += movimiento_nuevo.monto
  60. movimiento_nuevo.cuenta_destino.save()
  61. return redirect('dashboard')
  62. else:
  63. form = MovimientoForm(instance=movimiento)
  64. form.fields['cuenta_origen'].queryset = Cuenta.objects.filter(usuario=request.user)
  65. form.fields['cuenta_destino'].queryset = Cuenta.objects.filter(usuario=request.user)
  66. return render(request, 'editar_movimiento.html', {'form': form})
  67. @login_required
  68. def eliminar_movimiento(request, movimiento_id):
  69. movimiento = get_object_or_404(Movimiento, id=movimiento_id, usuario=request.user)
  70. if request.method == 'POST':
  71. # Revertir efecto del movimiento antes de borrarlo
  72. movimiento.cuenta_origen.saldo += movimiento.monto
  73. movimiento.cuenta_origen.save()
  74. movimiento.cuenta_destino.saldo -= movimiento.monto
  75. movimiento.cuenta_destino.save()
  76. movimiento.delete()
  77. return redirect('dashboard')
  78. return render(request, 'eliminar_movimiento.html', {'movimiento': movimiento})
  79. # Cuentas
  80. @login_required
  81. def agregar_cuenta(request):
  82. if request.method == 'POST':
  83. form = CuentaForm(request.POST)
  84. if form.is_valid():
  85. cuenta = form.save(commit=False)
  86. cuenta.usuario = request.user
  87. cuenta.save()
  88. return redirect('dashboard')
  89. else:
  90. form = CuentaForm()
  91. return render(request, 'agregar_cuenta.html', {'form': form})
  92. @login_required
  93. def listar_cuentas(request):
  94. cuentas = Cuenta.objects.filter(usuario=request.user)
  95. return render(request, 'listar_cuentas.html', {'cuentas': cuentas})
  96. @login_required
  97. def editar_cuenta(request, cuenta_id):
  98. cuenta = get_object_or_404(Cuenta, id=cuenta_id, usuario=request.user)
  99. if request.method == 'POST':
  100. form = CuentaForm(request.POST, instance=cuenta)
  101. if form.is_valid():
  102. form.save()
  103. return redirect('listar_cuentas')
  104. else:
  105. form = CuentaForm(instance=cuenta)
  106. return render(request, 'editar_cuenta.html', {'form': form})
  107. @login_required
  108. def eliminar_cuenta(request, cuenta_id):
  109. cuenta = get_object_or_404(Cuenta, id=cuenta_id, usuario=request.user)
  110. tiene_movimientos = cuenta.movimientos_salida.exists() or cuenta.movimientos_entrada.exists()
  111. if request.method == 'POST' and not tiene_movimientos:
  112. cuenta.delete()
  113. return redirect('listar_cuentas')
  114. return render(request, 'eliminar_cuenta.html', {
  115. 'cuenta': cuenta,
  116. 'tiene_movimientos': tiene_movimientos,
  117. })