Browse Source

Arreglo estilo de la pantalla de login y dashboard

Celestino Rey 1 year ago
parent
commit
283f719e3a

BIN
accounts/__pycache__/models.cpython-312.pyc


BIN
db.sqlite3


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


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


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


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


+ 4 - 2
finanzas/admin.py

@@ -1,5 +1,7 @@
+# budget/admin.py
+
 from django.contrib import admin
-from .models import Categoria, Movimiento
+from .models import Movimiento, Cuenta
 
-admin.site.register(Categoria)
 admin.site.register(Movimiento)
+admin.site.register(Cuenta)

+ 3 - 3
finanzas/forms.py

@@ -1,10 +1,10 @@
 from django import forms
-from .models import Movimiento, Categoria
+from .models import Movimiento, Cuenta
 
 class MovimientoForm(forms.ModelForm):
     class Meta:
         model = Movimiento
-        fields = ['categoria', 'monto', 'fecha', 'descripcion']
+        fields = ['cuenta_origen', 'cuenta_destino', 'monto', 'fecha', 'descripcion']
         widgets = {
             'fecha': forms.DateInput(attrs={'type': 'date'})
         }
@@ -12,4 +12,4 @@ class MovimientoForm(forms.ModelForm):
 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'}))
-    categoria = forms.ModelChoiceField(queryset=Categoria.objects.all(), required=False)
+    cuenta = forms.ModelChoiceField(queryset=Cuenta.objects.all(), required=False)

+ 43 - 0
finanzas/migrations/0002_remove_movimiento_categoria_cuenta_and_more.py

@@ -0,0 +1,43 @@
+# Generated by Django 5.2 on 2025-05-04 14:38
+
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('finanzas', '0001_initial'),
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='movimiento',
+            name='categoria',
+        ),
+        migrations.CreateModel(
+            name='Cuenta',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('nombre', models.CharField(max_length=100)),
+                ('tipo', models.CharField(choices=[('ingreso', 'Ingreso'), ('gasto', 'Gasto')], max_length=10)),
+                ('saldo', models.DecimalField(decimal_places=2, default=0.0, max_digits=10)),
+                ('usuario', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+        migrations.AddField(
+            model_name='movimiento',
+            name='cuenta_destino',
+            field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='movimientos_entrada', to='finanzas.cuenta'),
+        ),
+        migrations.AddField(
+            model_name='movimiento',
+            name='cuenta_origen',
+            field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='movimientos_salida', to='finanzas.cuenta'),
+        ),
+        migrations.DeleteModel(
+            name='Categoria',
+        ),
+    ]

BIN
finanzas/migrations/__pycache__/0002_remove_movimiento_categoria_cuenta_and_more.cpython-312.pyc


+ 9 - 7
finanzas/models.py

@@ -1,24 +1,26 @@
 from django.db import models
 from reymotausers.models import ReyMotaUser
 
-class Categoria(models.Model):
-    TIPO_CHOICES = (
+class Cuenta(models.Model):
+    TIPO_CUENTA_CHOICES = (
         ('ingreso', 'Ingreso'),
         ('gasto', 'Gasto'),
     )
-    nombre = models.CharField(max_length=50)
-    tipo = models.CharField(max_length=10, choices=TIPO_CHOICES)
+    nombre = models.CharField(max_length=100)
+    tipo = models.CharField(max_length=10, choices=TIPO_CUENTA_CHOICES)
+    saldo = models.DecimalField(max_digits=10, decimal_places=2, default=0.0)
+    usuario = models.ForeignKey(ReyMotaUser, on_delete=models.CASCADE)
 
     def __str__(self):
         return f"{self.nombre} ({self.tipo})"
 
 class Movimiento(models.Model):
     usuario = models.ForeignKey(ReyMotaUser, on_delete=models.CASCADE)
-    categoria = models.ForeignKey(Categoria, on_delete=models.CASCADE)
+    cuenta_origen = models.ForeignKey(Cuenta, on_delete=models.CASCADE, related_name='movimientos_salida', default=1)
+    cuenta_destino = models.ForeignKey(Cuenta, on_delete=models.CASCADE, related_name='movimientos_entrada', default=1)
     monto = models.DecimalField(max_digits=10, decimal_places=2)
     fecha = models.DateField()
     descripcion = models.TextField(blank=True, null=True)
 
     def __str__(self):
-        return f"{self.categoria.nombre} - {self.monto} ({self.fecha})"
-
+        return f"{self.cuenta_origen.nombre} → {self.cuenta_destino.nombre} - {self.monto} ({self.fecha})"

+ 20 - 7
finanzas/views.py

@@ -1,25 +1,28 @@
 from django.shortcuts import render, redirect
-from .models import Movimiento, Categoria
+
+from accounts import models
+from .models import Movimiento, Cuenta
 from .forms import MovimientoForm, FiltroForm
 from django.contrib.auth.decorators import login_required
-from datetime import datetime
 
 @login_required
 def dashboard(request):
     movimientos = Movimiento.objects.filter(usuario=request.user).order_by('-fecha')
 
     form = FiltroForm(request.GET or None)
+    form.fields['cuenta'].queryset = Cuenta.objects.filter(usuario=request.user)
 
     if form.is_valid():
         if form.cleaned_data['fecha_inicio']:
             movimientos = movimientos.filter(fecha__gte=form.cleaned_data['fecha_inicio'])
         if form.cleaned_data['fecha_fin']:
             movimientos = movimientos.filter(fecha__lte=form.cleaned_data['fecha_fin'])
-        if form.cleaned_data['categoria']:
-            movimientos = movimientos.filter(categoria=form.cleaned_data['categoria'])
+        if form.cleaned_data['cuenta']:
+            cuenta = form.cleaned_data['cuenta']
+            movimientos = movimientos.filter(models.Q(cuenta_origen=cuenta) | models.Q(cuenta_destino=cuenta))
 
-    ingresos = sum(m.monto for m in movimientos if m.categoria.tipo == 'ingreso')
-    gastos = sum(m.monto for m in movimientos if m.categoria.tipo == 'gasto')
+    ingresos = sum(m.monto for m in movimientos if m.cuenta_destino.tipo == 'ingreso')
+    gastos = sum(m.monto for m in movimientos if m.cuenta_origen.tipo == 'gasto')
     balance = ingresos - gastos
     return render(request, 'dashboard.html', {
         'movimientos': movimientos,
@@ -27,17 +30,27 @@ def dashboard(request):
         'gastos': gastos,
         'balance': balance,
         'form': form,
+        'user': request.user,
     })
 
 @login_required
 def agregar_movimiento(request):
     if request.method == 'POST':
         form = MovimientoForm(request.POST)
+        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 = form.save(commit=False)
             movimiento.usuario = request.user
             movimiento.save()
+            # Ajustar saldos de cuentas
+            movimiento.cuenta_origen.saldo -= movimiento.monto
+            movimiento.cuenta_origen.save()
+            movimiento.cuenta_destino.saldo += movimiento.monto
+            movimiento.cuenta_destino.save()
             return redirect('dashboard')
     else:
         form = MovimientoForm()
-    return render(request, 'agregar_movimiento.html', {'form': form})
+        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})

+ 1 - 1
templates/_head.html

@@ -6,7 +6,7 @@
         <meta charset="UTF-8">
         <meta http-equiv="X-UA-Compatible" content="IE=edge">
         <meta name="viewport" content="width=device-width, initial-scale=1.0">
-        <title>Creylopez Dashboard</title>
+        <title>Finanzas</title>
      
         <link rel="stylesheet" href="{% static 'style.css' %}">
         <link href="{% static 'bootstrap/css/bootstrap-icons.css' %}" rel="stylesheet" />

+ 0 - 7
templates/_logo.html

@@ -1,7 +0,0 @@
-{% load static %}
-<section id="menu">
-    <div class="logo">
-       <img src="{% static 'images/reymota-logo.svg' %}" alt="">
-       <h2>Finanzas</h2>
-    </div>
-</section>

+ 7 - 3
templates/_menu.html

@@ -1,8 +1,12 @@
 {% load static %}
 
 <section id="menu">
-   {% include "_logo.html" %}
-    <div class="items">
+   <div class="logo">
+      <img src="{% static 'images/reymota-logo.svg' %}" alt="">
+      <h2>Finanzas</h2>
+   </div>
+   
+   <div class="items">
        <li>
           <i class="bi bi-house-door-fill"></i>
           <a href="#">Principal</a></i>
@@ -18,4 +22,4 @@
            <a href="#">Acerca de ...</a></i>
        </li>
     </div>
- </section>
+</section>

+ 24 - 0
templates/dashboard.html

@@ -1,6 +1,9 @@
 {% load i18n static %}
 
 {% include "_head.html" %}
+
+{% include "_menu.html" %}
+
 <section id="interface">
     {% include "_navigation.html" %}
 
@@ -8,6 +11,27 @@
         Bienvenido, {{ user.nombre }}
     </h3>
 
+    <div class="values">
+        <div class="val-box">
+            <div>
+                <h3>Ingresos</h3>
+                <span>{{ ingresos }}</span>
+            </div>
+        </div>
+        <div class="val-box">
+            <div>
+                <h3>Gastos</h3>
+                <span>{{ gastos }}</span>
+            </div>
+        </div>
+        <div class="val-box">
+            <div>
+                <h3>Balance</h3>
+                <span>{{ balance }}</span>
+            </div>
+        </div>
+    </div>
+
     <div class="board">
         {% include "_menu.html" %}
         <h2>Balance: {{ balance }}</h2>

+ 7 - 1
templates/registration/login.html

@@ -2,8 +2,14 @@
 
 {% include "_head.html" %}
 
+<section id="menu">
+    <div class="logo">
+        <img src="{% static 'images/reymota-logo.svg' %}" alt="">
+        <h2>Finanzas</h2>
+    </div>
+</section>
+
 <section id="interface">
-    {% include "_logo.html" %}
 
     <div class="board">
         <h2 class="titulo-login">Entrar en Finanzas</h2>