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.
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.
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.
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.
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.
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.
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.
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.
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.
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».
Un intérprete para una exportación separada por tabuladores, y la sospecha de que aquello no se iba a quedar en un script.