Commit Graph

161 Commits

Author SHA1 Message Date
22563df48a Muestra las etiquetas en tabla con su numero de gastos
El listado de etiquetas era una lista sin mas, sin forma de saber cuales
estaban en uso. Pasa a tabla, en linea con el resto de listados, y anade
una columna con el numero de gastos que usa cada etiqueta.

El contador se calcula con annotate(Count("expenses")) en la vista, en vez
de contar desde la plantilla, para no provocar una query por fila.

Incluye tambien el estado vacio, que la lista no tenia.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-09 15:36:02 +02:00
e65b15ccf8 Extrae helpers de vistas y rehace los listados de cuentas y categorias
Saca de home() dos ayudantes reutilizables:

- _account_balances(): calcula el saldo de cada cuenta con dos queries
  agregadas en lugar de llamar a account.current_balance() en bucle,
  que disparaba un N+1.
- _category_tree(): aplana las categorias en preorden con su profundidad,
  para poder indentarlas en la plantilla.

Con ellos, account_list pasa a mostrar el saldo calculado de cada cuenta
(antes usaba current_balance() desde la plantilla) y category_list muestra
un arbol indentado en vez de una columna "Categoria padre" que obligaba a
reconstruir la jerarquia mentalmente.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-09 15:34:37 +02:00
b04a8db080 Amplia el dashboard de Home: KPIs, saldos, comparativa y movimientos
home() (views.py) y expenses/home.html pasan de mostrar tres numeros
sueltos y un listado plano de ultimos gastos a un panel mas completo:

- Saldo total y desglose por cuenta (account_balances/total_balance),
  calculado con dos queries agregadas (values().annotate(Sum(...)))
  en vez de N+1 llamadas a account.current_balance() en un bucle.
- Comparativa del gasto del mes en curso contra el mes anterior
  (prev_total/diff_amount/diff_pct), con aviso de que el mes en curso
  esta incompleto y la comparacion no es equivalente.
- Avisos (has_alerts) cuando hay objetivos excedidos o cuentas en
  negativo, con enlace directo a objetivos/cuentas.
- "Ultimos movimientos" mezcla gastos e ingresos (antes solo se veian
  los ultimos gastos) ordenados por fecha, con icono/color segun tipo.
- Se reutiliza una unica query de Goal tanto para el widget de
  objetivos (show_on_home) como para las alertas de excedidos
  (is_exceeded()), en vez de dos queries separadas.

base.css: nuevo bloque "/* Home widgets */" con las clases que usa la
plantilla (.home-section, .kpi-grid/.kpi-card, .balance-*,
.movements-list/.movement-*, .amount-positive/.amount-negative,
.comparison), incluyendo un ajuste responsive que oculta la cuenta en
movil (<480px).

No relacionado con los formularios de los commits anteriores; se
incluye aqui porque estaba pendiente de subir en la misma rama.
2026-09-03 18:01:01 +02:00
5852941136 Mueve 'expenses' antes que 'django.contrib.admin' en INSTALLED_APPS
Sintoma: /accounts/password_change/ renderizaba la pantalla del admin
de Django (cabecera "Administracion de Django", breadcrumb "Inicio >
Cambio de contrasena") en vez de la plantilla de la app.

Causa: con APP_DIRS=True (settings.py) y sin DIRS explicito, Django
busca plantillas recorriendo INSTALLED_APPS en orden y usa la PRIMERA
coincidencia por ruta relativa. django.contrib.admin trae sus propias
registration/password_change_form.html y
registration/password_change_done.html. Como 'django.contrib.admin'
aparecia antes que 'expenses' en la lista, sus plantillas ganaban
siempre a las de nuestra app, que ni siquiera llegaban a evaluarse.

Verificado con el shell de Django (get_template(...).origin.name):

  Antes del cambio:
    registration/password_change_form.html -> .../django/contrib/admin/templates/registration/password_change_form.html
    registration/password_change_done.html -> .../django/contrib/admin/templates/registration/password_change_done.html

  Despues del cambio:
    registration/password_change_form.html -> .../expenses/templates/registration/password_change_form.html
    registration/password_change_done.html -> .../expenses/templates/registration/password_change_done.html

Esto tambien explica por que el bug de las plantillas rotas (extendian
"base.html", que no existe; ver commit anterior) llevaba tanto tiempo
sin dar error: al estar sombreadas, esas plantillas nunca se
renderizaban, asi que su TemplateDoesNotExist nunca saltaba. Y explica
por que el login SI funcionaba pese a la colision de app: el admin
publica su login en "admin/login.html", no en "registration/login.html",
asi que ahi no habia conflicto.

Efecto secundario esperado y comprobado (no es una regresion, pero hay
que saberlo): /admin/password_change/, que Django resuelve tambien por
la ruta "registration/password_change_form.html" cuando un admin
cambia su propia contrasena, ahora renderiza con el layout completo de
la app (menu de navegacion, etc.) en vez del look propio del admin.
Probado con un superusuario contra /admin/, /admin/login/,
/admin/password_change/ y /admin/password_change/done/: los cuatro
responden 200 y el formulario funciona (AdminPasswordChangeForm hereda
los mismos campos old_password/new_password1/new_password2 de
PasswordChangeForm, asi que el parcial generico de campos los pinta
sin problema). El resto del admin (listados, cambio de contrasena de
otros usuarios, etc.) no usa ninguna plantilla bajo registration/ ni
admin/ que la app sobrescriba, asi que no le afecta.

No se reordena alfabeticamente esta lista en el futuro sin tener en
cuenta esto: hay un comentario en el propio settings.py explicandolo.
2026-09-03 18:00:22 +02:00
94308cbfe8 Corrige registration/password_change_*.html: extendian "base.html", que no existe
Ambas plantillas hacian {% extends "base.html" %}, pero en este
proyecto no existe ninguna plantilla llamada asi a nivel raiz: el
layout de la app se llama "expenses/base.html" (esta dentro de
expenses/templates/expenses/, no de expenses/templates/). Con
APP_DIRS=True y DIRS=[] en settings.py, Django busca "base.html" tal
cual en la carpeta templates/ de cada app instalada y no lo encuentra
en ninguna, asi que un {% extends %} a esa ruta lanza
TemplateDoesNotExist en cuanto se intenta renderizar la plantilla.

Esto llevaba tiempo sin detectarse porque, hasta el commit de
INSTALLED_APPS de esta misma tanda, django.contrib.admin sombreaba
estas dos plantillas con las suyas propias (ver ese commit): la
plantilla rota de la app nunca llegaba a cargarse, asi que el error
nunca saltaba. Al arreglar el orden de INSTALLED_APPS estas plantillas
pasan a usarse de verdad, así que había que arreglarlas ahora sí en el
mismo movimiento.

Cambios:
- Ambas extienden "expenses/base.html".
- Se migran al parcial expenses/_form_fields.html y a class="app-form",
  igual que el resto de formularios (ver commit anterior).
- Se anade un enlace de "Volver" a {% url 'home' %} en las dos, y un
  {% block title %} (heredaban el titulo generico "Expenses manager").
2026-09-03 17:59:53 +02:00
581eb202c7 Migra formularios de gastos/ingresos/cuentas/etc al parcial comun
Sustituye {{ form.as_p }} (o el bucle for field in form repetido a
mano en expense_form.html) por {% include "expenses/_form_fields.html" %}
y anade class="app-form" al <form> en:

  - categories/form.html, categories/list.html (alta de categoria)
  - expenses/account_form.html
  - expenses/expense_form.html
  - expenses/income_form.html
  - expenses/tag_form.html
  - fuel/create.html
  - goals/form.html
  - registration/login.html

De paso:
- categories/list.html: se corrige indentacion de la tabla y las
  etiquetas <a> de "Editar"/"Eliminar" (estaban dentro de una celda
  sin problema funcional, solo desalineadas) y se anade una <th> vacia
  para la columna de acciones.
- goals/form.html: el bloque title y el <h1> tenian "Nuevo objetivo"
  fijo aunque la vista goal_edit ya pasa title="Editar objetivo" en el
  contexto; ahora la plantilla usa {{ title }}, asi que el formulario
  de edicion deja de decir "Nuevo objetivo" por error.

No se toca la logica de las vistas ni los formularios en forms.py.
2026-09-03 17:59:28 +02:00
d70d0e4239 Anade sistema de estilos de formulario reutilizable
Los formularios usaban form.as_p (salida generica de Django) o bucles
manuales for field in form repetidos en cada plantilla, sin estilos
propios: inputs/selects/textareas sin padding, borde ni foco visibles,
y cada plantilla resolvia los errores/ayuda de campo a su manera.

Cambios:
- base.css: nuevas clases .app-form, .form-field (label + control en
  columna), estilos de input/select/textarea (incluye estado :focus
  con el color de foco del tema), .form-field-checkbox para campos
  booleanos y .form-help para el help_text de los campos.
- Nuevo parcial expenses/_form_fields.html: itera los campos del
  formulario y renderiza label, control, help_text y errores de forma
  consistente. Incluye un caso especial para el campo "tags" de gastos
  (CheckboxSelectMultiple), que se pinta como lista de chips en vez de
  checkboxes sueltos.

Este commit solo anade el estilo y el parcial; las plantillas que lo
adoptan van en el siguiente commit.
2026-09-03 17:59:01 +02:00
e29c2bc5f2 Reordena el menu de navegacion y limpia enlaces comentados
Mueve el enlace de Cuentas junto al de Repostajes y elimina los
enlaces comentados a Etiquetas y Categorias del menu principal (ya
estan accesibles desde el desplegable de Configuraciones).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-28 13:31:57 +02:00
c371e4cdc3 Mejoras de accesibilidad en formularios, progreso y navegacion
- Anade la utilidad .sr-only en base.css para labels ocultos
  visualmente pero accesibles a lectores de pantalla.
- dashboard.html: labels sr-only en los selects de cuenta/ano/mes del
  formulario de filtros; ARIA completo (role=progressbar,
  aria-valuemin/max/now/label/valuetext) en la barra de progreso del
  widget de objetivos; corrige el bug real de esa barra, que usaba
  goal.percentage en vez de goal.bar_width y podia desbordar el 100%;
  corrige colspan="7" a colspan="5" en la fila vacia de gastos
  recientes (la tabla tiene 5 columnas).
- expense_list.html: id + label sr-only en los selects de ano/mes/
  cuenta; label explicito para el select de categoria; role="group"
  y aria-label en el bloque de filtros por etiquetas (con
  aria-hidden en el texto "Tags:" para evitar doble lectura);
  paginacion pasada de <div> a <nav aria-label="Paginacion de
  gastos">; corrige colspan="4" a colspan="6" en el estado vacio de
  la tabla (6 columnas).
- goals/list.html: mismo ARIA de progreso que en dashboard.html;
  <h2>Objetivos</h2> a <h1>, para que la pagina empiece en h1 como
  el resto.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-28 13:29:35 +02:00
161ea36ff5 Theming de graficos Chart.js para modo claro/oscuro
- Anade charts.js con getChartColors, applyCartesianColors y
  registerThemedChart para centralizar los colores de los graficos segun
  el tema activo y refrescarlos en vivo al cambiar de tema (via
  MutationObserver sobre data-theme).
- Corrige el bug de renderizado en graficos de tipo 'line'
  (TypeError: t.startsWith is not a function): los colores de tema ahora
  se fijan en las opciones al crear cada grafico en lugar de mutarlas
  despues de new Chart(...).
- Anade variables --chart-grid-color y --chart-fill-color en base.css
  (light/dark) e incluye charts.js en base.html.
- Aplica el theming a categoryChart, mainChart y accountChart{id}
  (dashboard.html), miniChart (home.html) y monthlyChart/kmChart
  (fuel/list.html).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-26 17:43:59 +02:00
2fec314f4c Visual improvements 2026-08-05 12:44:56 +02:00
0135421655 Added other test to the navigation 2026-07-31 11:03:30 +02:00
255c035797 Unified the confirm/delete/back buttons 2026-07-31 11:03:06 +02:00
07b9b7c878 Added a night vision and modified the theme of the application 2026-07-30 08:26:48 +02:00
176f9d075c Improvements in the mobile view 2026-07-29 16:41:35 +02:00
bc1a957292 Make responsive 2026-07-29 15:33:10 +02:00
4ad2b59a1c Fixed minor typos 2026-07-29 15:14:14 +02:00
4e03c65c07 Created the .env.example 2026-07-29 13:29:28 +02:00
3e7e1f0aec Merge pull request 'main' (#30) from main into dev
Reviewed-on: #30
2026-07-29 11:21:49 +00:00
e18b1f48d9 Merge branch 'dev' into main 2026-07-29 11:21:12 +00:00
6eb9097908 Actualizar README.md 2026-07-29 11:20:39 +00:00
2d484aa40a Modified the model Goal to use cache with the progress 2026-07-29 08:56:53 +02:00
e5d6b37290 Merge pull request 'Fixed typo' (#28) from dev into main
Reviewed-on: #28
2026-07-28 13:23:17 +00:00
181f1cc98a Merge branch 'dev' of https://gitea.kuijper.es/jkuijperm/expenses_manager into dev 2026-07-28 15:21:16 +02:00
b8fa1ddf72 Fixed typo 2026-07-28 15:21:02 +02:00
956841bb02 Merge pull request 'dev' (#17) from dev into main
Reviewed-on: #17
2026-07-28 11:01:03 +00:00
360e398712 Merge branch 'main' into dev 2026-07-28 11:00:39 +00:00
386fb4dec8 added "more information" in the login page 2026-07-28 12:49:21 +02:00
166a0b8d18 Minor changes 2026-07-27 16:49:37 +02:00
88802360db Refactor fuel form 2026-07-27 15:57:44 +02:00
8d42cc13f3 Merge pull request 'Updated jenkinsfile' (#16) from dev into main
Reviewed-on: #16
2026-07-24 10:46:14 +00:00
35afb08960 Updated jenkinsfile 2026-07-24 12:45:10 +02:00
790fa214e3 Merge pull request 'Fixed bugs 2' (#15) from dev into main
Reviewed-on: #15
2026-07-24 09:38:41 +00:00
a456e903df Merge branch 'main' into dev 2026-07-24 09:38:23 +00:00
e621a6f9f0 Fixed test and jenkins file 2026-07-24 10:04:28 +02:00
ed17d27457 Updated the tests for the project 2026-07-24 09:32:11 +02:00
06e61ed1bf Minor changes 2026-07-24 08:06:22 +02:00
c7ba7a970f Modified the goal functionality 2026-07-23 18:02:05 +02:00
61047df4bf Added the Edit and Delete options to fuel 2026-07-23 15:40:04 +02:00
a2eec67491 Now, the user can't select as category parent itself or childrens 2026-07-23 13:43:53 +02:00
03016209b0 Added "edit" and "delete" options for categories 2026-07-23 11:42:11 +02:00
2267146d0d Renamed "accounts" to "finance-accounts" 2026-07-23 09:34:55 +02:00
0dd8c5bb49 Removed duplicated functionality 2026-07-23 09:28:04 +02:00
c29ed0d8ae Fixed bug 2026-07-23 09:19:31 +02:00
e1b4a6eef7 Clean code 2026-07-23 09:16:33 +02:00
8d1f477940 Fix bugs 2026-07-22 15:22:36 +02:00
a5c47d1380 Merge pull request 'Fixed some minor bugs and update the settings system' (#14) from dev into main
Reviewed-on: #14
2026-07-15 13:26:58 +00:00
5499607cd4 Merge branch 'main' into dev 2026-07-15 13:26:29 +00:00
637b112c4e Modified requirements and updated settings 2026-07-15 15:22:19 +02:00
52adf7191a Fixed typo importing packages 2026-07-13 17:55:49 +02:00