PMG: Personal Money Guard
v3.24.0

Novedades por versión

  • fix Cierre de mes: se restauró el guardado del histórico (un cambio anterior lo había borrado y cada cierre fallaba) y un cierre fallido ya no altera los saldos de los bancos.
  • chore Runtime migrado a Node 26.12.1 (parches de seguridad del 2026-10-21: Brotli, verificación TLS y bundle de certificados) con guarda de arranque; dependencias sin vulnerabilidades conocidas.
  • fix Protección contra denegación de servicio: expresión regular cuadrática del registro de seguridad, subidas sin sesión, conexiones SSE sin tope y cuerpos de 10 MB.
  • feat CSRF firmado y verificado en toda petición mutadora, cookies con prefijo __Host-, cerrar sesión por POST y UAT tratado con las mismas defensas que producción.
  • fix Autenticación: el inicio de sesión con Microsoft verifica el id_token y usa state y PKCE; JWT con algoritmo fijo, tope de sesión de 7 días y clave opcional JWT_SECRET; cambiar el correo exige la contraseña actual.
  • fix Restauración de backups con topes de tamaño y entradas, lista blanca de archivos y validación completa antes de borrar; el web y el API comparten el mismo motor.
  • fix CSP sin unsafe-inline en scripts (nonce por petición), integridad SRI en las librerías externas, rechazo de operadores NoSQL en las peticiones y cabeceras de privacidad.

  • fix Al abrir un borrador del asistente de IA con medio de pago Efectivo, el formulario enviaba dos veces «Pagado en firme» y «Origen» y el guardado fallaba con «valor.trim is not a function»; ahora el formulario se prellena en el orden correcto.

  • feat En Movimientos puedes escribir, dictar o subir la foto de un recibo y el asistente prepara borradores que prellenan el formulario de registro; tú los revisas y los guardas.
  • feat En Inicio puedes pedir un resumen del periodo y hacerle preguntas al asistente («¿cuánto llevo en transporte?»), con cifras reales de tu presupuesto.
  • feat Nueva página Configuración → Asistente de IA para activarlo con consentimiento y ver tu cuota diaria; los administradores tienen un interruptor global y una prueba de conexión en Administrar Usuarios.

  • feat El asistente responde preguntas como «cuánto llevo en transporte» o «cómo va la Visa» con las cifras reales de tu presupuesto o del último periodo cerrado; la IA solo entiende la pregunta, nunca calcula ni inventa un número.
  • feat Nuevo resumen en palabras del estado del periodo: porcentaje gastado, conceptos con más gasto y conceptos excedidos. Se guarda para no gastar cuota y, si el texto de la IA no pasa la validación, se entrega un resumen estándar.

  • feat POST /api/v1/ia/interpretar acepta ahora un audio (hasta 3 MB) o una foto de recibo (hasta 4 MB), además del texto: se convierten en texto y generan los mismos borradores validados.
  • feat El formato de audio e imagen se comprueba por el contenido real del archivo, no por lo que declare el cliente; con foto, el monto siempre se pide revisar.
  • chore Dos workflows nuevos en n8n (transcribir y leer imagen) con el mismo canal firmado, Groq como modelo principal y Gemini de respaldo.

  • feat Nuevo asistente de IA opcional (apagado por defecto, con consentimiento) que convierte una frase como «almuerzo 28 mil con Nequi» en borradores de movimientos listos para revisar. La IA solo propone: nada se guarda hasta que el usuario lo confirma. Por ahora está disponible en la API; las pantallas llegan después
  • feat Cada borrador trae los conceptos, medios de pago y bancos del propio usuario ya reconocidos, avisa cuando algo es ambiguo o el monto no coincide con lo escrito, y se valida con las mismas reglas que un movimiento normal
  • feat Los administradores pueden apagar el asistente para todos los usuarios con un interruptor global y comprobar la conexión con el servicio de IA
  • feat Seguridad del canal con el servicio de IA: peticiones y respuestas firmadas, protección contra repeticiones, límite diario por usuario y global, y ningún contenido del usuario se guarda ni se registra
  • docs Se documenta el asistente de IA (prompt/ia.md), su contrato en apis.md y openapi.yaml, y las nuevas variables de entorno en render.yaml

  • fix En Presupuesto del Mes, las barras de progreso de la columna Disponible no mostraban avance porque tenían el mismo color que el fondo de la celda; ahora se ven con contraste y pasan a ámbar si el gasto excede lo presupuestado

  • feat Nueva API JSON (/api/v1) pensada para la app Android: inicio de sesión con sesiones renovables por dispositivo, login con Microsoft mediado por el servidor, y acceso a todo lo que hoy hace la web — presupuesto, catálogos, movimientos, pago masivo de tarjetas, cierre de mes, respaldo y restauración, histórico, configuración y administración de usuarios
  • feat Borrar un concepto, medio de pago, banco o pago en firme que tenga movimientos ahora se hace en dos pasos desde la API: primero se listan los movimientos afectados y, si se confirma, se borran en cascada sin dejar nada huérfano
  • feat La restauración de respaldos desde la API valida todo el archivo antes de borrar nada, solo acepta los campos esperados y conserva los préstamos ya cobrados
  • refactor El cierre de mes, la exportación, la política de contraseñas, la vinculación con Microsoft, los temas y la clasificación de conceptos por nombre pasaron a módulos compartidos entre la web y la API, sin cambios para el usuario
  • fix El nombre del archivo ZIP/PDF de cierre indicaba "dev" en el ambiente de pruebas (UAT); ahora indica "uat"
  • docs Se agregó el contrato OpenAPI de la API móvil (prompt/openapi.yaml) y se corrigió la URL de producción en la documentación de despliegue

  • fix Al cambiar la contraseña se cierran las demás sesiones abiertas de esa cuenta (en otros navegadores o dispositivos); la sesión desde la que se hizo el cambio sigue activa. Un usuario eliminado o con el rol modificado pierde o cambia su acceso de inmediato en lugar de conservarlo hasta 6 horas
  • fix Al vincular una cuenta local con Microsoft, la contraseña local deja de servir y la cuenta entra solo por Microsoft
  • fix Editar un valor inicial de banco, un cupo de tarjeta o un presupuestado en Presupuesto ahora usa la misma fórmula que el resto de la vista: el saldo del banco considera ingresos, retiros, transferencias y abonos, y el disponible de la tarjeta considera los abonos
  • fix Presupuesto se actualiza en vivo también al registrar o modificar abonos a TC, ingresos, retiros y transferencias, al cambiar conceptos, medios y orígenes de pago, y al cerrar el mes o restaurar datos
  • fix Se corrigió el retiro de efectivo cuando no se indicaba el banco destino, que fallaba con un error en lugar de usar el banco Efectivo
  • fix Cerrar el mes ya no crea un periodo duplicado si se envía dos veces seguidas (doble clic o reintento), y el archivo ZIP/PDF del cierre ya no lleva ":" en el nombre, carácter que Android y Windows no aceptan
  • fix Los textos de los formularios (por ejemplo las descripciones) ya no admiten los caracteres "<" y ">"; las contraseñas no se modifican
  • fix Las respuestas de error ante solicitudes inválidas (JSON mal formado o demasiado grande) ahora indican el error real en lugar de un fallo genérico
  • fix La edición en línea de movimientos solo acepta los campos propios de cada tipo y verifica que los catálogos y bancos seleccionados pertenezcan al usuario
  • docs Se documentó la especificación de las APIs para la futura app Android (prompt/apis.md)

  • fix Se corrigieron las vulnerabilidades identificadas en la auditoría de seguridad (rate limiting, validación de entrada, cabeceras y manejo de sesión) y se rotaron las credenciales de la infraestructura
  • fix Se restableció el funcionamiento de los botones y acciones en línea de las vistas, que la política de seguridad de contenido (CSP) había bloqueado
  • fix Se corrigió el copiado de un movimiento (CM) en Registrar Movimiento
  • fix Al registrar un gasto la página ahora se redirige en lugar de quedar como resultado de un envío de formulario; así, recargar la página (por ejemplo tras un pago masivo de TC) ya no muestra el aviso del navegador de reenviar información ni arriesga duplicar el gasto

  • fix Al registrar o modificar un movimiento en Registrar Movimiento, la actualización en tiempo real de Presupuesto dejaba en $0 las columnas Gastado y Disponible de cada tarjeta en la tabla de Tarjetas de Crédito (aunque el total sí quedaba correcto), obligando a recargar la página para ver los valores reales — el JavaScript que repinta esa tabla leía los campos con un nombre distinto al que envía el servidor

  • fix Al registrar un Gasto, el campo Origen Pago ya no queda con el primer banco de la lista preseleccionado por defecto — ahora inicia en "Seleccione" para evitar registrar un banco equivocado sin querer
  • feat Los campos Pagado en Firme, Fecha Pago y Origen Pago del formulario de Gasto ahora están agrupados bajo un enlace "Información adicional" que el usuario despliega solo si los necesita diligenciar; los valores por defecto y los ajustes automáticos (por ejemplo al pagar en efectivo o por transferencia) se siguen aplicando igual, y el panel se abre solo si alguna de esas acciones automáticas deja Origen Pago pendiente por diligenciar

  • feat La barra de navegación ahora va de borde a borde en toda la app (antes quedaba centrada con márgenes) — el logo PMG queda pegado al borde izquierdo y las opciones al derecho
  • feat El mockup de teléfono del login se hizo mucho más grande y protagonista en la columna derecha, y ahora incluye el texto "Keeping your future safe" debajo del logo con una animación de glitch estilo Cyberpunk
  • fix En la vista de escritorio, el formulario de inicio de sesión ya no se estiraba a lo ancho de toda la columna — ahora tiene un ancho fijo y compacto, más profesional
  • fix El fondo de la "pantalla" del mockup de teléfono ahora coincide exactamente con el fondo real del logo, sin costura visible
  • fix En móvil, el logo ya no quedaba oculto: ahora se muestra sin el marco de teléfono, directamente como una imagen con esquinas redondeadas y resplandor

  • feat El formulario de inicio de sesión se rediseñó otra vez: en vez de la tarjeta giratoria de la versión anterior, ahora es una pantalla dividida en dos columnas — el formulario a la izquierda (Microsoft como opción principal arriba, usuario y contraseña siempre visible debajo) y a la derecha un panel Cyberpunk con un mockup de teléfono mostrando el logo de PMG
  • chore En pantallas angostas, el panel visual de la derecha se oculta para dejar todo el espacio al formulario

  • feat La pantalla de inicio de sesión ahora usa siempre el tema Neón Cyberpunk mientras no haya una sesión iniciada, sin importar el tema que tenga guardado cualquier usuario en ese navegador
  • feat El formulario de inicio de sesión se rediseñó como una tarjeta que gira: "Iniciar sesión con Microsoft" pasa a ser la opción principal, y un botón secundario permite girar la tarjeta para revelar el formulario clásico de usuario y contraseña. Funciona igual en escritorio y en móvil
  • fix Cuando falla un inicio de sesión con usuario/contraseña, la tarjeta ahora abre directamente en el formulario clásico con el mensaje de error visible, en vez de quedar detrás del botón de Microsoft
  • fix Un fallo al autenticar con Microsoft ahora muestra su mensaje de error correspondiente; antes la página de login no mostraba ningún aviso en ese caso

  • chore La aplicación se renombra de "Plan Mensual de Gastos" a "Personal Money Guard" — la sigla PMG no cambia. Se actualizó el nombre visible en Acerca de, el correo de cierre de periodo y el reporte PDF (título de portada, metadatos y pie de página)
  • chore Se reemplazó el logo en toda la aplicación (favicon, barra de navegación, pantalla de inicio de sesión y portada del reporte PDF) por el nuevo diseño de marca

  • feat En pantallas de escritorio, la vista Presupuesto estrena un panel de indicadores con animación al cargar y al recibir actualizaciones en vivo, contexto adicional bajo cada indicador (variación de bancos, % de cupo de TC usado, % del presupuesto usado, valor recuperado de préstamos) y un indicador de conexión en tiempo real con marca de "actualizado hace..."
  • feat Nueva barra de navegación por pestañas ancladas (Bancos, Tarjetas, Presupuesto, Préstamos) que resalta la sección visible al hacer scroll y permite saltar directo a cada una
  • feat En pantallas muy anchas, cada sección muestra la tabla y su gráfico de análisis lado a lado en vez de tener que abrir el gráfico manualmente
  • feat La columna "Disponible" de Presupuesto del Mes ahora incluye una barra de progreso del gasto por concepto, y el guardado de valores editados muestra una confirmación visual más sobria (notificación flotante en la esquina) además del indicador existente
  • feat Los colores de acento de cada sección (Bancos, Tarjetas, Presupuesto, Préstamos) ahora se adaptan al tema activo en vez de usar una paleta fija, consistente con los 6 temas de la app
  • chore La vista móvil de Presupuesto no cambia: se separó completamente del rediseño de escritorio para no alterar su comportamiento

  • feat El correo electrónico ahora es obligatorio al crear un usuario nuevo desde Administrar Usuarios, con validación de formato y de duplicados
  • feat Nueva sección de auto-servicio en "Cambiar Contraseña" para que cualquier usuario existente cargue o corrija su propio correo (de solo lectura para cuentas Microsoft, que se sincronizan automáticamente)
  • feat Al cerrar un periodo, el sistema genera el mismo reporte PDF del botón manual y lo envía por correo a la dirección registrada del usuario, con un diseño propio inspirado en el tema Neón Cyberpunk; si el usuario no tiene correo o el envío falla, el cierre del periodo se completa igual
  • feat Al confirmar el cierre de mes ahora se muestra un modal de espera mientras se procesa, igual que en inicio de sesión o al registrar un movimiento
  • fix El campo de correo del usuario ahora es único en la base de datos, evitando que dos cuentas locales compartan el mismo correo y confundan la vinculación de cuentas de Microsoft

  • fix En Configuración de Temas, el texto "Tema Actual" siempre mostraba "Océano Azul" sin importar el tema realmente aplicado, porque se actualizaba antes de que la lista de temas disponibles terminara de cargarse. Las tarjetas sí marcaban el tema correcto; ahora el texto también refleja el tema activo real

  • fix En la vista Conceptos, el nombre de cada concepto existente se mostraba sobre un fondo claro fijo que no se adaptaba al tema; en temas oscuros como Neón Cyberpunk el texto quedaba prácticamente invisible. Ahora ese campo usa los mismos colores del tema activo, igual que el resto de la app

  • fix La vista Acerca de tenía su propio fondo y encabezado con colores fijos (un degradado azul/índigo) que nunca cambiaban según el tema elegido; ahora usa los mismos colores del tema activo que el resto de la app, incluyendo el listado de novedades

  • fix Los botones verdes (como "Registrar movimiento" y "Guardar Gasto") tenían texto blanco prácticamente ilegible sobre el verde de Neón Cyberpunk y con contraste insuficiente en los demás temas; ahora usan texto oscuro con buen contraste en los 6 temas
  • fix Mismo ajuste en los botones rojos, que tenían el mismo problema de contraste

  • fix Los mensajes de advertencia (fondo amarillo/naranja) tenían texto blanco en los 6 temas, prácticamente ilegible en Neón Cyberpunk; ahora usan texto oscuro con buen contraste en todos los temas

  • fix Un administrador ya no puede consultar, editar ni eliminar el histórico de movimientos de otro usuario sin su autorización explícita; cada usuario controla este permiso desde su propio Histórico de Periodos, apagado por defecto
  • feat Nuevo interruptor "Permitir que un administrador consulte mi histórico" en Histórico de Periodos, con un aviso de confirmación antes de activarlo

  • feat Al entrar a Inicio, si todavía no se le ha mostrado el modal de novedades de la versión actual, se le presenta automáticamente con el mismo historial de cambios que se ve en Acerca de; una vez lo cierra, no se le vuelve a mostrar hasta que se publique una versión nueva

  • fix La portada del reporte PDF nunca mostraba el apellido del usuario: el helper que arma los datos de usuario para el reporte en router/cerrarMes.js filtraba únicamente código, nombre y rol desde la sesión, descartando el apellido antes de que llegara a construirse el PDF

  • feat La tarjeta "Usuario" de la portada del reporte PDF ahora muestra también el código de usuario, debajo del nombre completo

  • fix Las gráficas de dona del reporte PDF (Gastado vs. Disponible, Deudores vs. Valor recuperado) mostraban el título y la leyenda superpuestos cuando el título era largo; ahora el círculo y el texto se ubican uno al lado del otro y el espacio se calcula según el alto real del título
  • feat La portada del reporte PDF ahora muestra el nombre completo del usuario (nombre y apellido) y presenta Usuario/Fecha de generación/Ambiente en una tarjeta con el mismo estilo visual del resto del reporte, en vez de texto plano

  • feat El reporte PDF de "Generar reporte y backup" se reconstruyó desde cero con un motor que calcula de antemano cuántos movimientos, bancos, tarjetas y conceptos hay y cuánto espacio ocupa cada uno, antes de generar una sola página — elimina las páginas en blanco y los gráficos superpuestos que podían aparecer con muchos bancos o movimientos
  • feat Los movimientos ahora se muestran como tarjetas (igual que en Movimientos), no como tabla: la descripción completa siempre es visible, sin cortarse ni truncarse
  • feat Nueva portada del reporte con los mismos 4 indicadores de Presupuesto (Disponible en Bancos, Cupo Disponible TC, Disponible del Mes, Préstamos Pendientes) y la barra "Gastado del mes", más una sección de resumen con el conteo y total de cada tipo de movimiento
  • feat Bancos, Tarjetas de Crédito, Presupuesto del Mes y Préstamos se presentan dentro de tarjetas de bordes suaves, con los valores negativos resaltados en rojo
  • fix Corrección de varios problemas del reporte anterior: el logo se superponía con el título, el formato de moneda mostraba centavos, y el cierre de mes podía fallar sin registrar el error

  • feat Nueva vista "Histórico de Periodos": cada cierre de mes guarda automáticamente un snapshot con los movimientos y el presupuesto final del periodo (bancos, tarjetas, conceptos, préstamos, gráficas), consultable después de que esos datos se eliminan del periodo activo
  • feat Un administrador puede consultar el histórico de cualquier usuario, editar o eliminar movimientos puntuales de un periodo cerrado, o eliminar un periodo completo
  • feat Nuevo parámetro en Administrar Usuarios para configurar cuántos periodos de histórico se conservan por usuario (por defecto 6); al reducirlo se elimina de inmediato el histórico más antiguo que sobre
  • feat Las tablas de Bancos y Tarjetas de crédito del histórico ahora muestran una fila de totales, igual que la tabla de Presupuesto del mes

  • fix Los valores de disponible/gastado en las tarjetas de la vista móvil de Presupuesto (bancos, tarjetas de crédito y conceptos) eran difíciles de leer en algunos temas; ahora usan fondo sólido y texto blanco con mayor tamaño de letra

  • feat La vista de Presupuesto ahora se actualiza sola, sin recargar la página, cada vez que se registra, edita o elimina un movimiento desde Movimientos (aviso en vivo vía Server-Sent Events)
  • fix Varios totales de Presupuesto (bancos, tarjetas de crédito y conceptos del mes) no se recalculaban correctamente al editar un valor desde la propia vista, tanto en la tabla de escritorio como en las tarjetas de la vista móvil
  • fix Corrección de un color de texto ilegible que aparecía brevemente en las tarjetas de la vista móvil de Presupuesto justo después de actualizarse un valor

  • feat El resumen del pago masivo de tarjetas de crédito ahora muestra una línea por cada tarjeta involucrada, con su propio rango de fechas y total, más una línea final con el total general
  • fix Corrección de la alineación de fechas y totales en ese resumen cuando los nombres de las tarjetas tienen longitudes distintas

  • feat Opción para marcar/desmarcar todos los movimientos visibles (según los filtros aplicados) al registrar un pago masivo de tarjeta de crédito
  • fix Corrección de contraste en los valores de las tarjetas de estadísticas de Inicio con temas oscuros

  • feat Nuevo tema Neón Cyberpunk: esquema oscuro con colores neón vibrantes y fondo con patrón de cuadrícula digital
  • feat Resumen de estadísticas (rango de fechas, tarjetas involucradas y total) en el modal de pago masivo de tarjetas de crédito
  • fix Corrección de contraste y consistencia visual en la vista de Movimientos para los temas oscuros (filtros, tarjetas y edición en línea)
  • fix Corrección del contador de movimientos seleccionados en el botón "Registrar pago TC", ilegible en temas oscuros
  • feat Sistema profesional de versionamiento (SemVer + Conventional Commits) con historial de novedades visible en Acerca de
  • feat En Inicio, se reemplaza la tarjeta "Disponible del Mes" por dos nuevas: Mayor Gasto por Categoría y Préstamos
  • chore Limpieza de documentación temporal de trabajo, conservando únicamente la documentación oficial del proyecto

  • feat Modal de espera profesional al iniciar sesión (usuario/contraseña y Microsoft)
  • feat Pago masivo de tarjetas de crédito: selecciona varios movimientos y márcalos como pagados en un solo paso
  • feat Valores por defecto inteligentes al registrar un gasto (Pagado en Firme y Origen Pago)
  • fix Corrección definitiva del desfase de horas en movimientos — guardado siempre en hora Colombia, visualización según el huso horario real del navegador

  • feat Rediseño visual completo de la vista de Presupuesto (tarjetas KPI, secciones colapsables)
  • feat Filtro por concepto/tipo de gasto en la vista de movimientos
  • feat Origen de pago obligatorio cuando un gasto queda pagado en firme
  • fix Ajustes de contraste y legibilidad en encabezados de tablas

  • refactor Refactor completo del módulo de movimientos: CSS y JS separados en archivos propios, vista dividida en partials, router modularizado
  • feat Cierre de mes: se conservan los préstamos no pagados y se reportan por separado en el PDF
  • feat Parámetros iniciales automáticos para usuarios nuevos
  • feat Dashboard de estadísticas financieras en la página de inicio
  • chore Limpieza general del proyecto: archivos de prueba, scripts y datos obsoletos retirados del repositorio
  • feat Rediseño de las gráficas de presupuesto (carrusel en móvil)
  • docs Documentación técnica del módulo de movimientos

  • feat Segundo hosting en Render.com
  • feat Sistema de logs configurable por ambiente (detallado en desarrollo, mínimo en producción)
  • feat Filtros de préstamo pagado y origen de pago en la vista de movimientos
  • fix Restricciones de cambio de contraseña para usuarios autenticados con Microsoft

  • refactor Rearquitectura de los tipos de movimiento (retiro de efectivo, transferencia entre cuentas)
  • feat Endurecimiento de seguridad: límites de intentos, validaciones estrictas
  • feat Edición en línea de movimientos existentes
  • feat Administración de usuarios y cambio de contraseña
  • feat Temas de colores configurables
  • feat Inicio de sesión con cuenta de Microsoft

  • feat Gestión de gastos, presupuesto mensual y catálogos base (conceptos, medios de pago, orígenes de pago)
  • feat Autenticación de usuarios
  • feat Generación de reportes en PDF
  • feat Cierre de mes
  • feat Ingresos, abonos a tarjeta de crédito y pagos diferidos
Esta aplicación fue creada por Felipe Castaño con el objetivo de llevar unas finanzas sanas y acertadas. Ningún sistema ofrecía lo que se necesitaba, así que él mismo la construyó.
Agradecimientos especiales a su esposa Natalia, quien lo acompañó y apoyó hasta el final con sus conocimientos en contabilidad.