¿Cómo valida Trax que el fichaje ocurrió en el sitio?
Cada sitio tiene una geocerca: un punto y un radio en metros. Cuando el trabajador ficha, la app lee las coordenadas del GPS y la precisión que reporta el propio teléfono (por ejemplo, ±12 m). Con la fórmula de haversine calcula la distancia real al centro del sitio y la compara con el radio más esa precisión. Si cabe, el fichaje se acepta en el teléfono.
La parte que hace la diferencia es la revalidación server-side. El servidor no confía en el resultado que envía la app: vuelve a calcular la distancia con las mismas coordenadas y la misma precisión, y decide por su cuenta. Si el teléfono dijo «dentro» y el servidor dice «fuera», el fichaje no se sella: queda en estado REVIEW y un manager lo aprueba o lo rechaza con un motivo que se guarda en la auditoría. Ni el trabajador ni el administrador pueden saltarse ese paso ni editar el resultado después.