Răsfoiți Sursa

Incluyo elminiar y editar movimientos

Celestino Rey 1 an în urmă
părinte
comite
028420eac3

BIN
db.sqlite3


+ 2 - 0
finanzas/urls.py

@@ -4,6 +4,8 @@ from . import views
 urlpatterns = [
     path('', views.dashboard, name='dashboard'),
     path('agregar/', views.agregar_movimiento, name='agregar_movimiento'),
+    path('movimientos/<int:movimiento_id>/editar/', views.editar_movimiento, name='editar_movimiento'),
+    path('movimientos/<int:movimiento_id>/eliminar/', views.eliminar_movimiento, name='eliminar_movimiento'),
     path('cuentas/nueva/', views.agregar_cuenta, name='agregar_cuenta'),
     path('cuentas/', views.listar_cuentas, name='listar_cuentas'),
     path('cuentas/<int:cuenta_id>/editar/', views.editar_cuenta, name='editar_cuenta'),

+ 56 - 0
finanzas/views.py

@@ -17,6 +17,8 @@ def dashboard(request):
         'favoritas': favoritas,
     })
 
+# Movimientos
+
 @login_required
 def agregar_movimiento(request):
     if request.method == 'POST':
@@ -40,6 +42,60 @@ def agregar_movimiento(request):
     return render(request, 'agregar_movimiento.html', {'form': form})
 
 
+@login_required
+def editar_movimiento(request, movimiento_id):
+    movimiento = get_object_or_404(Movimiento, id=movimiento_id, usuario=request.user)
+    saldo_original_origen = movimiento.cuenta_origen
+    saldo_original_destino = movimiento.cuenta_destino
+    monto_original = movimiento.monto
+
+    if request.method == 'POST':
+        form = MovimientoForm(request.POST, instance=movimiento)
+        form.fields['cuenta_origen'].queryset = Cuenta.objects.filter(usuario=request.user)
+        form.fields['cuenta_destino'].queryset = Cuenta.objects.filter(usuario=request.user)
+        if form.is_valid():
+            movimiento_nuevo = form.save(commit=False)
+
+            # Revertir efecto anterior
+            saldo_original_origen.saldo += monto_original
+            saldo_original_origen.save()
+            saldo_original_destino.saldo -= monto_original
+            saldo_original_destino.save()
+
+            # Aplicar nuevo efecto
+            movimiento_nuevo.usuario = request.user
+            movimiento_nuevo.save()
+            movimiento_nuevo.cuenta_origen.saldo -= movimiento_nuevo.monto
+            movimiento_nuevo.cuenta_origen.save()
+            movimiento_nuevo.cuenta_destino.saldo += movimiento_nuevo.monto
+            movimiento_nuevo.cuenta_destino.save()
+
+            return redirect('dashboard')
+    else:
+        form = MovimientoForm(instance=movimiento)
+        form.fields['cuenta_origen'].queryset = Cuenta.objects.filter(usuario=request.user)
+        form.fields['cuenta_destino'].queryset = Cuenta.objects.filter(usuario=request.user)
+
+    return render(request, 'editar_movimiento.html', {'form': form})
+
+
+@login_required
+def eliminar_movimiento(request, movimiento_id):
+    movimiento = get_object_or_404(Movimiento, id=movimiento_id, usuario=request.user)
+    if request.method == 'POST':
+        # Revertir efecto del movimiento antes de borrarlo
+        movimiento.cuenta_origen.saldo += movimiento.monto
+        movimiento.cuenta_origen.save()
+        movimiento.cuenta_destino.saldo -= movimiento.monto
+        movimiento.cuenta_destino.save()
+        movimiento.delete()
+        return redirect('dashboard')
+
+    return render(request, 'eliminar_movimiento.html', {'movimiento': movimiento})
+
+
+# Cuentas
+
 @login_required
 def agregar_cuenta(request):
     if request.method == 'POST':

+ 2 - 2
templates/dashboard.html

@@ -57,10 +57,10 @@
                         {{ m.descripcion }}
                     </td>
                     <td class="edit">
-                        <a href="#">
+                        <a href="{% url 'editar_movimiento' m.id %}">
                             <i class="bi bi-pencil-square"></i>
                         </a>                        
-                        <a href="#">
+                        <a href="{% url 'eliminar_movimiento' m.id %}">
                             <i class="bi bi-trash3"></i>
                         </a>
                     </td> 

+ 16 - 0
templates/editar_movimiento.html

@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html lang="es">
+<head>
+    <meta charset="UTF-8">
+    <title>Editar Movimiento</title>
+</head>
+<body>
+    <h1>Editar Movimiento</h1>
+    <form method="post">
+        {% csrf_token %}
+        {{ form.as_p }}
+        <button type="submit">Guardar Cambios</button>
+    </form>
+    <a href="{% url 'dashboard' %}">Volver</a>
+</body>
+</html>

+ 16 - 0
templates/elimina_movimiento.html

@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html lang="es">
+<head>
+    <meta charset="UTF-8">
+    <title>Eliminar Movimiento</title>
+</head>
+<body>
+    <h1>¿Estás seguro de que deseas eliminar este movimiento?</h1>
+    <p>{{ movimiento.fecha }} - {{ movimiento.cuenta_origen.nombre }} → {{ movimiento.cuenta_destino.nombre }}: {{ movimiento.monto }}</p>
+    <form method="post">
+        {% csrf_token %}
+        <button type="submit">Sí, eliminar</button>
+        <a href="{% url 'dashboard' %}">Cancelar</a>
+    </form>
+</body>
+</html>