Andreu Playà
ES
← Todos los proyectos Diario de obra

tas_ixa

Un sistema de control horario que lee lo que escribe un reloj de fichar físico, acepta correcciones mediante un flujo de aprobación, e informa de las horas realmente trabajadas.

Estado En uso · migración en curso
Inicio Mayo 2026
Stack Node · Vue 3 · SQLite

Qué es

Resumen

Un reloj de fichar en la pared produce exportaciones separadas por tabuladores y ninguna opinión. Esto las convierte en informes de horas por empleado, y resuelve la parte que el aparato no puede: el día que alguien se olvidó de fichar la salida.

La regla de diseño es la que aprendí en máquinas validadas: el histórico no se edita, se corrige. Una corrección es una propuesta hasta que se aprueba, la lectura original se queda donde estaba, y cualquier cambio aplicado se puede deshacer desde un panel de histórico. Una sesión incompleta muestra su duración en curso en lugar de la palabra «incompleta», porque un responsable necesita el número, no la etiqueta.

Cómo evolucionó

El arco

Empezó como un script de Python que interpretaba los ficheros de exportación, le creció una interfaz web y se volvió difícil de razonar: un único fichero de servidor haciéndolo todo. Partirlo en trozos legibles ayudó, pero solo aplazó la decisión.

Mayo — la reescritura. Migrado a un monorepo TypeScript con Vue y Vite, que es donde aterrizaron el flujo de aprobación, el histórico de cambios con deshacer y la subida de varios ficheros a la vez. Después, una pasada deliberada retirando código muerto y los antipatrones que había acumulado la primera versión.

Agosto — los cimientos. Login y sesiones endurecidos contra la fuga de datos personales, un documento de arquitectura para hacer explícitas las fronteras entre módulos, y la persistencia pasando de ficheros planos a SQLite embebido — en curso: esa última migración todavía tiene los tests en rojo, y es lo siguiente que hay que cerrar.

Pantallas

Interfaz
Editor — captura pendiente
El editor de registros, con las correcciones pendientes marcadas aparte de las aplicadas.
Histórico — captura pendiente
Histórico de cambios: qué se corrigió, quién lo hizo y el botón que lo deshace.

Registro de cambios

Lo último primero

Agosto 2026

2026-08

Migración a SQLite Infraestructura

Sustituyendo la persistencia en ficheros JSON por SQLite embebido. En curso: la batería de tests está en rojo mientras se cambia la capa de almacenamiento por debajo.

2026-08

Login y sesiones endurecidos Seguridad

Cerradas las vías por las que podían escaparse datos personales en las respuestas de login y en el manejo de sesiones. En un sistema que guarda a qué hora entró y salió cada persona, ahí está toda la superficie de riesgo.

2026-08

Plano de arquitectura Refactor

Un inventario de módulos y un mapa del flujo de datos por escrito, con una lectura honesta de dónde el código sigue y dónde no sigue una arquitectura limpia. Escrito para que se le pueda discutir, no para decorar el repositorio.

Mayo 2026

2026-05

Reescrito como monorepo TypeScript Refactor

De un servidor en Python a Vue y Vite en un monorepo tipado, con tests. Las mismas funcionalidades, sobre unos cimientos capaces de sostener las siguientes — seguido de una pasada que retiró código sin usar y los antipatrones que había criado la primera versión.

2026-05

Las correcciones, como flujo Funcionalidad

Una corrección se propone, no se aplica: los empleados pueden plantear y cancelar las suyas, quien aprueba acepta o rechaza, y cualquier cambio aplicado se puede deshacer desde un panel de histórico que vive al lado de la cola de pendientes.

2026-05

Leer el aparato Funcionalidad

Subida de varias exportaciones del reloj a la vez, con la vista recargándose a medida que llegan ficheros. Las sesiones incompletas muestran una duración calculada en curso en lugar de la palabra «incompleta».

2026-05

Primer commit Inicio

Un intérprete para una exportación separada por tabuladores, y la sospecha de que aquello no se iba a quedar en un script.