Просмотр исходного кода

Creo opción de búsqueda global

Celestino Rey 1 год назад
Родитель
Сommit
753d037ede

+ 1 - 1
K8S/Makefile

@@ -1,6 +1,6 @@
 export ARQUITECTURA := $(shell lscpu |grep itectur | tr -d ' '| cut -f2 -d':')
 export REGISTRY=registry.reymota.es
-export IMG_VERSION = 0.44
+export IMG_VERSION = 0.45
 export IMG_NGINX_VERSION = 1.4
 
 # limpia todo

+ 9 - 0
TODO.md

@@ -1,8 +1,17 @@
 # Cosas pendientes
 
 ## 2025 05 29
+
 ### Informes en PDF
 Ya saca informes en PDF, pero
 1. el saldo es solo del periodo elegido. No tiene en cuenta el saldo inicial en ese periodo, habría que calcularlo.
 2. las fechas del informe están en formato YYYY-MM-DD
 3. hay que quitar el icono de ver informe normal y probablemente borrar funciones que ya no se usen
+
+## 2025 07 03
+
+Poner opción en menú lateral para búsqueda global
+
+En el informe de cuentas, poner opción de duplicar
+
+Quitar filtro en views de listar_cuentas

+ 2 - 1
src/finanzas/urls.py

@@ -4,6 +4,7 @@ from .views import api_ejecutar_recurrentes
 
 urlpatterns = [
     path('', views.dashboard, name='dashboard'),
+    path('buscatotal/', views.buscatotal, name='buscatotal'),
     # Movimientos
     path('agregar/', views.agregar_movimiento, name='agregar_movimiento'),
     path('movimientos/<int:movimiento_id>/editar/', views.editar_movimiento, name='editar_movimiento'),
@@ -11,7 +12,7 @@ urlpatterns = [
     path('movimientos/<int:movimiento_id>/duplicar/', views.duplicar_movimiento, name='duplicar_movimiento'),
     # Cuentas
     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>/editar/', views.editar_cuenta, name='editar_cuenta'),
     path('cuentas/<int:cuenta_id>/eliminar/', views.eliminar_cuenta, name='eliminar_cuenta'),
     path('cuentas/<int:cuenta_id>/informe/', views.informe_cuenta, name='informe_cuenta'),
     path('cuentas/informe/pdf/', views.informe_cuenta_pdf, name='informe_cuenta_pdf'),

+ 35 - 1
src/finanzas/views.py

@@ -81,6 +81,34 @@ def dashboard(request):
         'anio': anio,
     })
 
+@login_required
+def buscatotal(request):
+    # Copiamos GET para poder modificarlo
+    request.GET = request.GET.copy()
+
+    movimientos = Movimiento.objects.filter(usuario=request.user).order_by('-fecha')
+
+    form_filtro = FiltroForm(request.GET or None)
+
+    fecha_fin = timezone.localtime().strftime('%Y-%m-%d')
+    fecha_inicio = timezone.localtime().date().replace(day=1).strftime('%Y-%m-%d')
+
+    if form_filtro.is_valid():
+        busqueda = form_filtro.cleaned_data.get('buscar')
+        if busqueda:
+            # logger.warning(f"dashboard: busqueda=true {busqueda}")
+            movimientos = movimientos.filter(
+                db_models.Q(descripcion__icontains=busqueda) | db_models.Q(cuenta_origen__nombre__icontains=busqueda) | db_models.Q(cuenta_destino__nombre__icontains=busqueda)
+            )
+
+    return render(request, 'buscatotal.html', {
+        'movimientos': movimientos,
+        'user': request.user,
+        'form_filtro': form_filtro,
+        'fecha_inicio': fecha_inicio,
+        'fecha_fin': fecha_fin,
+    })
+
 # Movimientos
 
 
@@ -264,6 +292,8 @@ def duplicar_movimiento(request, movimiento_id):
 @login_required
 def listar_cuentas(request):
     cuentas = Cuenta.objects.filter(usuario=request.user).order_by('nombre')
+
+    # desde aquí....
     form_filtro = FiltroForm(request.GET or None)
 
     fecha_fin = timezone.localtime().strftime('%Y-%m-%d')
@@ -275,12 +305,16 @@ def listar_cuentas(request):
             cuentas = cuentas.filter(
                 db_models.Q(nombre__icontains=busqueda)
             )
+    # hasta aquí, hay que quitarlo
+
+    # en el render hay que pasar solo cuentas.
 
     return render(request, 'listar_cuentas.html',
                   {'cuentas': cuentas,
                    'form_filtro': form_filtro,
                    'fecha_inicio': fecha_inicio,
-                   'fecha_fin': fecha_fin})
+                   'fecha_fin': fecha_fin
+                   })
 
 @login_required
 def eliminar_cuenta(request, cuenta_id):

+ 1 - 1
src/misfinanzas/settings.py

@@ -16,7 +16,7 @@ import logging
 
 
 APP_NAME = "Finanzas"
-APP_VERSION = os.environ.get("APP_VERSION", "17.0.8")  # Valor por defecto si no está definido
+APP_VERSION = os.environ.get("APP_VERSION", "17.0.9")  # Valor por defecto si no está definido
 IMG_VERSION = os.environ.get("IMG_VERSION", "0.0.0-dev")  # Valor por defecto si no está definido
 
 

+ 7 - 2
src/templates/_menu.html

@@ -5,15 +5,20 @@
       <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="{% url 'dashboard' %}">Principal</a></i>
       </li>
+      
+      <li>
+         <i class="bi bi-search"></i>
+         <a href="{% url 'buscatotal' %}">Buscar</a></i>
+      </li>
 
       <li>
-         <i class="bi bi-house-door-fill"></i>
+         <i class="bi bi-file-plus-fill"></i>
          <a href="{% url 'agregar_movimiento' %}">Agregar movimiento</a></i>
       </li>
 

+ 1 - 1
src/templates/_navigation.html

@@ -5,7 +5,7 @@
            <i id="menu-btn" class="bi bi-list"></i>               
         </div>
     </div>
-
+   
     <div class="profile">
         <i class="bi bi-bell"></i> 
         <div class="dropdown">

+ 86 - 0
src/templates/buscatotal.html

@@ -0,0 +1,86 @@
+{% extends "base.html" %}
+
+{% load humanize %}
+
+{% block interface %}
+
+<section id="interface">
+    {% include "_navigation.html" %}
+
+    <h3 class="i-name">
+        Bienvenido, {{ user.nombre }}
+    </h3>
+
+    <div class="board">
+        <div class="form-group">
+            <form method="get" class="form-inline mb-3">
+                <div class="row g-2 align-items-end">
+                    <div class="col-auto">
+                        {{ form_filtro.buscar }}
+                    </div>
+                    <div class="col-auto">
+                        <button type="submit" class="btn btn-primary">Filtrar</button>
+                    </div>
+                    {% if form_filtro.buscar.value %}
+                    <div class="col-auto">
+                        <a href="{% url 'buscatotal' %}" class="btn btn-outline-secondary">Limpiar</a>
+                    </div>
+                    {% endif %}
+                </div>
+            </form>
+        </div>
+
+        <h3>Movimientos recientes</h3>
+        <table width="100%">
+            <thead>
+                <tr>
+                    <td>Fecha</td>
+                    <td>Origen</td>
+                    <td>Destino</td>
+                    <td>Cantidad</td>
+                    <td>Descripción</td>
+                    <td></td>
+                </tr>
+            </thead>
+
+            <tbody>
+
+            {% for m in movimientos %}
+                <tr class="{% cycle 'fila-impar' 'fila-par' %}">
+                    <td class="movimiento">
+                        {{ m.fecha|date:"d-m-Y H:i" }}
+                    </td>                                     
+                    
+                    <td class="movimiento">
+                        <a href="{% url 'informe_cuenta' %}?cuenta_id={{ m.cuenta_origen.id }}&fecha_inicio={{ fecha_inicio }}&fecha_fin={{ fecha_fin }}">{{ m.cuenta_origen }}</a>
+                    </td>
+
+                    <td class="movimiento">
+                        <a href="{% url 'informe_cuenta' %}?cuenta_id={{ m.cuenta_destino.id }}&fecha_inicio={{ fecha_inicio }}&fecha_fin={{ fecha_fin }}">{{ m.cuenta_destino }}</a>
+                    </td>
+
+                    <td class="movimiento-monto">
+                        {{ m.monto|floatformat:2|intcomma }} €
+                    </td>
+
+                    <td class="movimiento">
+                        {{ m.descripcion }}
+                    </td>
+                    <td class="edit">
+                        <a href="{% url 'editar_movimiento' m.id %}">
+                            <i class="bi bi-pencil-square"></i>
+                        </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>
+            {% endfor %}
+            </tbody>
+        </table>
+    </div>
+</section>
+{% endblock %}