Un número de caso consecutivo también es una credencial
El portal interno y el sitio público de una terminal de transporte regional, hechos de punta a punta.
- Rol
- Todo, de la base de datos al despliegue
- Tiempo
- 12 meses
- Stack
- Next.js · Postgres · Prisma · Astro
- Equipo
- Solo
Problema
Las solicitudes con plazos legales se llevaban a mano, los plazos se contaban en días hábiles sobre un calendario y los reportes se rehacían en hojas de cálculo cada mes. El sitio público corría en un WordPress viejo.
Restricciones
- Plazos legales en días hábiles, con festivos que cambian cada año.
- Un solo desarrollador para todo el producto, de la base de datos al despliegue.
- El sitio público nunca puede revelar nada de la solicitud de otra persona.
- Los números de caso se asignan bajo carga concurrente.
Decisiones
- Elegí un bloqueo consultivo de Postgres en vez de SELECT … FOR UPDATE para asignar números de caso, porque la carrera ocurre antes de que exista la fila; tests de integración compiten contra un Postgres real para demostrarlo.
- Hice la consulta pública para que un número de caso consecutivo no exponga nada por sí solo.
- Generé la tabla de festivos (los que dependen de la Pascua y los que se corren al lunes) en vez de mantener una lista a mano, porque una lista a mano se rompe en silencio cada año.
- Usé un solo motor de cálculo puro para la pantalla y para los reportes en PDF, así los dos nunca pueden diferir.
- Retiré el sitio viejo con redirecciones reconstruidas a partir de tres generaciones de URLs históricas, verificadas en producción.
Resultado
La terminal maneja ahí sus solicitudes, plazos, trámites de personal y reportes, y el sitio público carga rápido en el celular.
- LCP móvil 9,8 s → 2,2 s
- Lighthouse de 94 a 100
- Unos 1.300 tests unitarios