Browse Source

He creado una serie de opciones para la gestión de las cuentas

Celestino Rey 1 year ago
parent
commit
3e2e3e8367

BIN
db.sqlite3


BIN
finanzas/__pycache__/forms.cpython-312.pyc


BIN
finanzas/__pycache__/urls.cpython-312.pyc


BIN
finanzas/__pycache__/views.cpython-312.pyc


+ 8 - 0
finanzas/forms.py

@@ -1,6 +1,7 @@
 from django import forms
 from .models import Movimiento, Cuenta
 
+
 class MovimientoForm(forms.ModelForm):
     class Meta:
         model = Movimiento
@@ -9,7 +10,14 @@ class MovimientoForm(forms.ModelForm):
             'fecha': forms.DateInput(attrs={'type': 'date'})
         }
 
+
 class FiltroForm(forms.Form):
     fecha_inicio = forms.DateField(required=False, widget=forms.DateInput(attrs={'type': 'date'}))
     fecha_fin = forms.DateField(required=False, widget=forms.DateInput(attrs={'type': 'date'}))
     cuenta = forms.ModelChoiceField(queryset=Cuenta.objects.all(), required=False)
+
+
+class CuentaForm(forms.ModelForm):
+    class Meta:
+        model = Cuenta
+        fields = ['nombre', 'tipo', 'saldo']

+ 5 - 0
finanzas/urls.py

@@ -4,5 +4,10 @@ from . import views
 urlpatterns = [
     path('', views.dashboard, name='dashboard'),
     path('agregar/', views.agregar_movimiento, name='agregar_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'),
+    path('cuentas/<int:cuenta_id>/eliminar/', views.eliminar_cuenta, name='eliminar_cuenta'),
 ]
 
+

+ 50 - 2
finanzas/views.py

@@ -1,8 +1,8 @@
-from django.shortcuts import render, redirect
+from django.shortcuts import render, redirect,  get_object_or_404
 
 from accounts import models
 from .models import Movimiento, Cuenta
-from .forms import MovimientoForm, FiltroForm
+from .forms import MovimientoForm, FiltroForm, CuentaForm
 from django.contrib.auth.decorators import login_required
 
 @login_required
@@ -54,3 +54,51 @@ def agregar_movimiento(request):
         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, 'agregar_movimiento.html', {'form': form})
+
+
+@login_required
+def agregar_cuenta(request):
+    if request.method == 'POST':
+        form = CuentaForm(request.POST)
+        if form.is_valid():
+            cuenta = form.save(commit=False)
+            cuenta.usuario = request.user
+            cuenta.save()
+            return redirect('dashboard')
+    else:
+        form = CuentaForm()
+    return render(request, 'agregar_cuenta.html', {'form': form})
+
+
+@login_required
+def listar_cuentas(request):
+    cuentas = Cuenta.objects.filter(usuario=request.user)
+    return render(request, 'listar_cuentas.html', {'cuentas': cuentas})
+
+
+@login_required
+def editar_cuenta(request, cuenta_id):
+    cuenta = get_object_or_404(Cuenta, id=cuenta_id, usuario=request.user)
+    if request.method == 'POST':
+        form = CuentaForm(request.POST, instance=cuenta)
+        if form.is_valid():
+            form.save()
+            return redirect('listar_cuentas')
+    else:
+        form = CuentaForm(instance=cuenta)
+    return render(request, 'editar_cuenta.html', {'form': form})
+
+
+@login_required
+def eliminar_cuenta(request, cuenta_id):
+    cuenta = get_object_or_404(Cuenta, id=cuenta_id, usuario=request.user)
+    tiene_movimientos = cuenta.movimientos_salida.exists() or cuenta.movimientos_entrada.exists()
+
+    if request.method == 'POST' and not tiene_movimientos:
+        cuenta.delete()
+        return redirect('listar_cuentas')
+
+    return render(request, 'eliminar_cuenta.html', {
+        'cuenta': cuenta,
+        'tiene_movimientos': tiene_movimientos,
+    })

+ 17 - 12
templates/_menu.html

@@ -7,19 +7,24 @@
    </div>
    
    <div class="items">
-       <li>
-          <i class="bi bi-house-door-fill"></i>
-          <a href="#">Principal</a></i>
-       </li>
+      <li>
+         <i class="bi bi-house-door-fill"></i>
+         <a href="{% url 'agregar_movimiento' %}">Agregar Movimiento</a></i>
+      </li>
 
-       <li>
-          <i class="bi bi-info-circle-fill"></i>
-           <a href="#">Ayuda</a></i>
-       </li>
+      <li>
+         <i class="bi bi-info-circle-fill"></i>
+         <a href="{% url 'agregar_cuenta' %}">Agregar Cuenta</a>
+      </li>
+      
+      <li>
+         <i class="bi bi-info-circle-fill"></i>
+         <a href="{% url 'listar_cuentas' %}">Ver Cuentas</a>
+      </li>
 
-       <li>
-          <i class="bi bi-question-circle-fill"></i>           
-           <a href="#">Acerca de ...</a></i>
-       </li>
+      <li>
+         <i class="bi bi-question-circle-fill"></i>           
+          <a href="#">Acerca de ...</a></i>
+      </li>
     </div>
 </section>

+ 16 - 0
templates/agregar_cuenta.html

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

+ 1 - 1
templates/dashboard.html

@@ -36,7 +36,7 @@
         {% include "_menu.html" %}
         <h2>Balance: {{ balance }}</h2>
         <p>Ingresos: {{ ingresos }} | Gastos: {{ gastos }}</p>
-        <a href="{% url 'agregar_movimiento' %}">Agregar Movimiento</a>
+
 
         <h3>Filtrar movimientos</h3>
         <form method="get">

+ 16 - 0
templates/editar_cuenta.html

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

+ 22 - 0
templates/eliminar_cuenta.html

@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang="es">
+<head>
+    <meta charset="UTF-8">
+    <title>Eliminar Cuenta</title>
+</head>
+<body>
+    <h1>Eliminar Cuenta</h1>
+
+    {% if tiene_movimientos %}
+        <p>No puedes eliminar la cuenta <strong>{{ cuenta.nombre }}</strong> porque tiene movimientos asociados.</p>
+        <a href="{% url 'listar_cuentas' %}">Volver</a>
+    {% else %}
+        <p>¿Estás seguro que deseas eliminar la cuenta <strong>{{ cuenta.nombre }}</strong>?</p>
+        <form method="post">
+            {% csrf_token %}
+            <button type="submit">Sí, eliminar</button>
+            <a href="{% url 'listar_cuentas' %}">Cancelar</a>
+        </form>
+    {% endif %}
+</body>
+</html>

+ 33 - 0
templates/listar_cuentas.html

@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html lang="es">
+<head>
+    <meta charset="UTF-8">
+    <title>Mis Cuentas</title>
+</head>
+<body>
+    <h1>Mis Cuentas</h1>
+    <table border="1">
+        <tr>
+            <th>Nombre</th>
+            <th>Tipo</th>
+            <th>Saldo</th>
+            <th>Acciones</th>
+        </tr>
+        {% for cuenta in cuentas %}
+            <tr>
+                <td>{{ cuenta.nombre }}</td>
+                <td>{{ cuenta.get_tipo_display }}</td>
+                <td>{{ cuenta.saldo }}</td>
+                <td>
+                    <a href="{% url 'editar_cuenta' cuenta.id %}">Editar</a> |
+                    <a href="{% url 'eliminar_cuenta' cuenta.id %}">Eliminar</a>
+                </td>                
+            </tr>
+        {% empty %}
+            <tr><td colspan="3">No tienes cuentas aún.</td></tr>
+        {% endfor %}
+    </table>
+    <a href="{% url 'agregar_cuenta' %}">Agregar Cuenta</a> |
+    <a href="{% url 'dashboard' %}">Volver al Dashboard</a>
+</body>
+</html>