Saltar al contenido
Esteban Padilla
Volver a los proyectos

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
Siguiente caso Reemplazar dos SaaS sin que nadie los extrañe