Sfoglia il codice sorgente

Opción de duplicar movimiento

Celestino Rey 1 anno fa
parent
commit
adb021e0ec

BIN
db.sqlite3


+ 1 - 0
finanzas/urls.py

@@ -7,6 +7,7 @@ urlpatterns = [
     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('movimientos/<int:movimiento_id>/duplicar/', views.duplicar_movimiento, name='duplicar_movimiento'),
     # Cuentas
     path('cuentas/nueva/', views.agregar_cuenta, name='agregar_cuenta'),
     path('cuentas/', views.listar_cuentas, name='listar_cuentas'),

+ 35 - 0
finanzas/views.py

@@ -94,6 +94,41 @@ def eliminar_movimiento(request, movimiento_id):
     return render(request, 'eliminar_movimiento.html', {'movimiento': movimiento})
 
 
+@login_required
+def duplicar_movimiento(request, movimiento_id):
+    original = get_object_or_404(Movimiento, id=movimiento_id, usuario=request.user)
+
+    # Crear una copia del movimiento sin guardar
+    movimiento_nuevo = Movimiento(
+        cuenta_origen=original.cuenta_origen,
+        cuenta_destino=original.cuenta_destino,
+        monto=original.monto,
+        fecha=original.fecha,
+        descripcion=original.descripcion,
+        usuario=request.user,
+    )
+
+    if request.method == 'POST':
+        form = MovimientoForm(request.POST, instance=movimiento_nuevo)
+        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():
+            nuevo = form.save(commit=False)
+            nuevo.usuario = request.user
+            nuevo.save()
+            # Ajustar saldos
+            nuevo.cuenta_origen.saldo -= nuevo.monto
+            nuevo.cuenta_origen.save()
+            nuevo.cuenta_destino.saldo += nuevo.monto
+            nuevo.cuenta_destino.save()
+            return redirect('dashboard')
+    else:
+        form = MovimientoForm(instance=movimiento_nuevo)
+        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, 'duplicar_movimiento.html', {'form': form})
+
 # Cuentas
 
 @login_required

+ 3 - 0
templates/dashboard.html

@@ -62,6 +62,9 @@
                         </a>                        
                         <a href="{% url 'eliminar_movimiento' m.id %}">
                             <i class="bi bi-trash3"></i>
+                        </a>                        
+                        <a href="{% url 'duplicar_movimiento' m.id %}">
+                            <i class="bi bi-copy"></i>
                         </a>
                     </td> 
                 </tr>

+ 24 - 0
templates/duplicar_movimiento.html

@@ -0,0 +1,24 @@
+{% extends "base.html" %}
+
+{% block interface %}
+
+<section id="interface">
+    <div class="board">
+        {% include "_navigation.html" %}
+        <div class="div-form">
+            <h1>Duplicar Movimiento</h1>
+            <div class="form-group">
+                <form method="post">
+                    {% csrf_token %}
+                    {{ form.as_p }}
+                    <button class="btn btn-success" type="submit">Guardar copia</button>
+                </form>
+            </div>
+        </div>
+
+        <div class="botones">
+            <a href="{% url 'dashboard' %}"><button class="btn btn-danger" type="button">Cancelar</button></a>
+        </div>
+    </div>
+</section>
+{% endblock %}

+ 6 - 6
templates/editar_movimiento.html

@@ -8,12 +8,12 @@
         <div class="div-form">
             <h1>Editar Movimiento</h1>
             <div class="form-group">
-
-            <form method="post">
-                {% csrf_token %}
-                {{ form.as_p }}
-                <button class="btn btn-success" type="submit">Guardar cambios</button>
-            </form>
+                <form method="post">
+                    {% csrf_token %}
+                    {{ form.as_p }}
+                    <button class="btn btn-success" type="submit">Guardar cambios</button>
+                </form>
+            </div>
         </div>
     </div>
     <div class="botones">