Alex HerreraDesarrollador de software · Enfoque en ciberseguridad
EN
← Volver a proyectos

Profesional

Seiri | Control de asistencia

El colaborador marca con foto y ubicación desde la obra o la ruta, aunque no tenga señal.

  • Móvil
Rol
Desarrollo
Periodo
2026-05 – 2026-08

Stack

  • React Native (Expo)
  • TypeScript
  • SQLite
  • Next.js
  • MySQL
  • Render

Contexto

Seiri es la aplicación de marcaje de asistencia que Kaizen ofrece a las empresas que usan sus sistemas. El colaborador marca su entrada y su salida desde el teléfono, con foto y ubicación, y ese registro se usa para calcular la nómina.

Buena parte de esos colaboradores trabaja en obra y en ruta, donde no hay reloj marcador ni cobertura garantizada. El proyecto lleva el punto de marcaje a donde está la persona, en lugar de obligarla a pasar por un lugar fijo.

Problema

Sin sistema, la entrada se anota en un cuaderno o la toma un encargado nombre por nombre. En centros con mucho personal, esa fila consume tiempo productivo cada mañana, antes de que nadie llegue a su puesto.

Ese registro tampoco es fiable por sí solo. La hora es la que alguien apuntó, no hay constancia de dónde estaba la persona y la nómina se calcula sobre datos que otro tiene que confirmar después.

Decisiones técnicas

Sin conexión, dos dispositivos pueden marcar al mismo colaborador sin verse entre sí. Al reconectar, ambos envían una marca válida según lo que cada uno observó. El esquema anterior contaba las marcas del día y después insertaba la nueva: dos pasos sin ninguna garantía entre ellos.

La validación pasó a una transacción de base de datos que bloquea las filas del día antes de decidir. Así, la segunda sincronización espera a que termine la primera.

La marca que pierde el conflicto queda señalada para revisión. Descartarla en silencio dejaría a alguien sin jornada registrada y sin forma de reclamarla.

El registro de la jornada no puede depender de que un servicio de apoyo esté disponible. Por eso cada marca guarda el resultado de la verificación de identidad, y la revisión posterior trabaja sobre ese dato.

Arquitectura

El teléfono escribe primero en su base local y pone la marca en una cola. Una tarea en segundo plano envía la cola a la API cuando hay red. El token se guarda en el almacén seguro del sistema.

Las cuatro reglas que deciden si la marca entra se aplican en el servidor, dentro de la misma transacción.

Marca en el teléfonoCola localAPITransacciónRegistro

La transacción bloquea las marcas del día antes de decidir. Dos sincronizaciones simultáneas ya no pueden pasar ambas la validación, porque la segunda espera a que la primera termine.

La ventana del día se calcula en la zona horaria del país, no en la del proceso. El servidor se ejecuta en UTC, y sin esta regla una marca a las 23:30 locales contaría en el día siguiente.

La marca que pierde no se descarta. Queda registrada y señalada para revisión manual, con su dispositivo y su hora, para que alguien pueda decidir cuál era la buena.

Toda marca guarda el resultado de la verificación de identidad junto a su hora y su ubicación. La revisión posterior trabaja sobre ese dato guardado y no sobre una consulta nueva.

Las cuatro reglas se aplican dentro de la misma transacción, antes de escribir la marca.

Resultado

El colaborador marca en segundos, con foto y ubicación, sin que nadie tome nota y sin depender de la señal. La marca se envía sola en cuanto hay red.

Cada registro llega con su hora, su ubicación y su verificación de identidad, así que la nómina se calcula sobre datos que no hay que confirmar después.

La fórmula de geocerca existe dos veces, en el servidor y en el cliente. Una prueba tiene como único trabajo fallar si las dos versiones dejan de coincidir.

Lo que aprendí

Contar las marcas del día en el cliente no impide un duplicado, porque cada dispositivo lleva su propio recuento y ninguno ve al otro sin red.

En la transacción del servidor el conflicto sigue ocurriendo, pero se detecta y va a revisión en lugar de resolverse por orden de llegada. Con clientes que trabajan sin conexión, la comprobación que decide tiene que estar en el servidor, el único punto que ve a todos los clientes.