Andreu Playà
ES
← Todos los proyectos Diario de obra

pms_ixa

Un sistema de gestión para una cartera de alojamientos de corta y larga estancia: reservas, clientes, facturación y los canales de venta por los que llegan las estancias.

Estado En producción
Inicio Mayo 2026
Stack Node · Vue 3 · SQLite

Qué es

Resumen

Un calendario de reservas con lo operativo enganchado: clientes y sus documentos, facturación por estancia, y un catálogo fijo de canales de venta —cada uno se activa o se desactiva y lleva su propia comisión—. Los canales no son nombres que alguien tecleó: cada uno es un driver que la aplicación conoce, y por eso más adelante pudo hablar el protocolo de calendario de esos portales.

Multiusuario desde el primer día, así que los problemas interesantes nunca fueron los del CRUD: quién puede cambiar qué, cómo se demuestra después qué se cambió, y cómo llega una release a la instancia en marcha sin un instante a medio aplicar en el que la carcasa es nueva y la API vieja.

Cómo evolucionó

El arco

Mayo — que funcione. El calendario, filas de reserva desplegables que se editan sin salir, componentes de campo reutilizables, y un sistema de diseño extraído del SCSS disperso una vez la forma se asentó. Dos idiomas antes de acabar el mes.

Junio — que sea fiable. Autorización aplicada en vez de supuesta, y un registro de auditoría inmutable: cada cambio aceptado deja constancia y nadie puede retocarla sin que se note.

Agosto — que aguante. La persistencia pasó de ficheros JSON a SQLite embebido con una conversión puntual, y el servidor se niega a arrancar contra un esquema que no reconoce. Los roles pasaron a ser cuatro, con el permiso decidido en la ruta. El despliegue dejó de ser un paso manual. Después llegaron la sincronización bidireccional de calendarios y una bandeja pública de solicitudes, que convirtieron una herramienta interna en algo con lo que habla el mundo exterior — y eso, a su vez, es la razón de que una contraseña dejara de ser toda la respuesta.

El arco, en una línea: un CRUD en mayo; en septiembre, un sistema con trazabilidad, camino de migración, tubería de release y doble factor.

Pantallas

Interfaz
Calendario — captura pendiente
El calendario de reservas: estancias coloreadas por canal, y el día de hoy dibujado como una caja sobre toda la columna.
Métricas — captura pendiente
Métricas de ocupación y facturación, rediseñadas en junio.

Registro de cambios

Lo último primero

Agosto 2026

2026-08

Verificación en dos pasos Seguridad

Una contraseña ya no es toda la respuesta. Cualquier cuenta puede pedir un código de seis dígitos enviado a su propia dirección, opcional y activable desde el perfil. Un administrador puede quitárselo a quien pierda el acceso al buzón donde llega.

2026-08

Los canales pasan a ser drivers Funcionalidad

Un canal dejó de ser un nombre tecleado y pasó a ser un driver que la aplicación conoce, con su propia marca y su comisión. Las estancias directas también son un canal: sin intermediario, sin comisión y no se pueden borrar.

2026-08

Sincronización de calendarios en dos sentidos Funcionalidad

Lee los calendarios de los canales y publica el propio, así que una estancia reservada en cualquier sitio bloquea las fechas en todos. Además, una bandeja para las solicitudes que llegan de la web pública y un endpoint de disponibilidad de solo lectura que esta puede consultar.

2026-08

Cuatro roles, decididos en la ruta Seguridad

Las comprobaciones de permiso se movieron a donde se atiende la petición, en vez de estar repartidas por la interfaz. Un rol se cambia, una cuenta se borra, un correo se guarda: tres operaciones distintas que antes eran una sola, borrosa.

2026-08

Tubería de despliegue automatizada Infraestructura

Se ejecutan los tests, se construye y publica la imagen, se redespliega la instancia, y la tubería espera al health check y confirma la versión desplegada antes de darlo por hecho. Hay una instancia de desarrollo aparte, sembrada con datos reales. La carcasa de la SPA se sirve con no-store, de modo que un despliegue nunca puede quedarse a medio aplicar en el navegador de nadie.

2026-08

SQLite sustituye a los ficheros JSON Infraestructura

SQLite embebido en lugar de ficheros en disco, con una conversión puntual para los datos existentes y el esquema colapsado en una sola migración antes del lanzamiento. El servidor se niega a arrancar contra un esquema que no reconoce, en vez de corromper uno que entiende a medias.

2026-08

Pasada de endurecimiento Seguridad

El límite de intentos de login se ancla a una IP de cliente que no se puede falsificar. Un cuerpo malformado responde 400, no 500. Los errores que llegan arriba se registran en vez de convertirse en un 500 silencioso. Dos fallos que los tests no podían ver aparecieron al ejecutar contra el contenedor real.

Junio 2026

2026-06

Auditoría y autorización aplicada Seguridad

Cada cambio aceptado escribe un registro inmutable. La autorización dejó de ser una suposición sobre quién llega a una pantalla y pasó a ser una regla que el servidor hace cumplir.

2026-06

Rediseño de la página de métricas Funcionalidad

Reconstruida para que los números se lean de un vistazo, y arreglados el recorte de filas y los rangos de fechas que encogían en pantallas estrechas.

Mayo 2026

2026-05

Dos idiomas y un sistema de diseño Refactor

Inglés y castellano con vue-i18n, el SCSS disperso centralizado en una capa de estilos, los SVG en línea sustituidos por assets reales, y subcomponentes de campo reutilizables para que editar se comporte igual en todas partes.

2026-05

El calendario, editable sin salir Funcionalidad

Filas de reserva desplegables que se editan sin abandonar el calendario, una pantalla de administración de clientes, autogestión por usuario, y la jerarquía de navegación que la aplicación sigue usando.

2026-05

Primer commit Inicio

Un monorepo, un servidor Node, un cliente Vue, y una reserva que se podía anotar.