Zonas Horarias en Fichajes

Creado por Marta Paniagua, Modificado el Jue, 30 Abr a 4:24 P. M. por Marta Paniagua

Disponibles a partir de la versión 9.0.0.1 


Sistema multi-zona horaria que permite registrar y mostrar fichajes correctamente independientemente de dónde esté el empleado en el mundo, manteniendo una hora oficial coherente para el cálculo de nóminas y jornadas.

¿Por qué zonas horarias?

❌ Antes (sin zonas horarias)
CheckTime = GETDATE() del servidor

Un empleado en Canarias y otro en Madrid que fichan "a las 8:00" producen la misma hora UTC aunque son momentos distintos. No hay forma de saber desde dónde fichó cada uno.

✅ Ahora (con zonas horarias)

El sistema captura la hora local del dispositivo y la convierte a UTC. Luego aplica una política configurable por empleado para mostrar la hora "oficial" en la zona horaria correcta según la empresa.

Los 4 Campos de Hora

DeviceLocalTime

La hora que marca el reloj del dispositivo del empleado cuando ficha. "Mi móvil dice las 8:00".

CheckTimeUtc

La misma hora convertida a UTC (referencia universal inmutable). "En Greenwich son las 7:00".

CheckTime ⭐

La hora final oficial mostrada al usuario, en la zona horaria destino. Esta es la que se usa para calcular jornadas y nóminas.

Inserted

Cuándo se grabó el registro en la base de datos (siempre UTC). Usado para detección de fraude horario.

La Fórmula de Conversión

CheckTimeUtc
=
DeviceLocalTime
DeviceUtcOffsetMin
CheckTime
=
CheckTimeUtc
+
TargetUtcOffsetMin
TargetUtcOffsetMin depende del TimeZoneMode del empleado (ver sección siguiente).

Modos de Zona Horaria (TimeZoneMode)

0
Modo Oficina
Hora de la oficina base del empleado

La hora final siempre se muestra en la zona horaria de la oficina asignada al empleado, independientemente de dónde esté.

Ejemplo: Empleado de Madrid viaja a Canarias y ficha a las 8:00 hora canaria. En el sistema se mostrará como 09:00 (hora Madrid).
1
Modo Localización
Hora de donde está fichando

Usa la zona horaria de la localización de fichaje si tiene TZ asignada. Si no, usa la del dispositivo. Último fallback: zona de la oficina.

Ideal para: Empresas con empleados que trabajan habitualmente en centros de distintas zonas horarias.
2
Modo Dispositivo
Hora tal como la ve el empleado

Usa siempre la zona horaria del dispositivo del empleado, ignorando la localización aunque la tenga. CheckTime ≈ DeviceLocalTime.

Ideal para: Empleados en movilidad permanente donde lo que importa es la hora local de trabajo.

Ejemplos Prácticos

Escenario 1 — Empleado en Madrid, oficina en Madrid (Modo 0)
Entrada del sistema:
DeviceLocalTime: 08:00
DeviceTimeZoneId: Romance Standard Time
DeviceUtcOffsetMin: 60 (Madrid invierno = UTC+1)
Cálculo:
CheckTimeUtc: 08:00 − 60 = 07:00 UTC
TargetOffset (Oficina Madrid): +60
CheckTime: 07:00 + 60 = 08:00 ✅
El empleado ficha a las 8:00 y el sistema registra 08:00 — todo coincide porque la TZ origen y destino son la misma.
Escenario 2 — Empleado de Madrid de viaje en Canarias (Modo 0)
Entrada del sistema:
DeviceLocalTime: 08:00 (hora canaria)
DeviceTimeZoneId: GMT Standard Time
DeviceUtcOffsetMin: 0 (Canarias = UTC+0)
OfficeUtcOffsetMin: 60 (Madrid = UTC+1)
Cálculo:
CheckTimeUtc: 08:00 − 0 = 08:00 UTC
TargetOffset (Oficina Madrid): +60
CheckTime: 08:00 + 60 = 09:00 ⚠️
El empleado fichó a las 8:00 en Canarias, pero en Madrid eran las 9:00. El sistema muestra 09:00 porque la empresa usa Modo 0 (todo en hora de Madrid).

Campos en la Tabla Markings

CampoTipoDescripción
DeviceLocalTimeDATETIME2Hora del reloj del dispositivo del empleado
CheckTimeUtcDATETIME2Hora en UTC — instante real e inmutable
CheckTimeDATETIMEHora oficial para jornadas y nóminas. Resultado de aplicar la política TZ al empleado
TimeZoneModeINTModo configurado: 0=Oficina, 1=Localización, 2=Dispositivo
DeviceTimeZoneIdNVARCHARTZ del dispositivo (IANA o Windows ID, normalizado a Windows)
OfficeTimeZoneIdNVARCHARTZ de la oficina del empleado. Fallback universal de todos los modos
LocationTimeZoneIdNVARCHARTZ de la localización de fichaje (solo si tiene LocId y TZ asignada)
DeviceUtcOffsetMinSMALLINTOffset en minutos del dispositivo respecto a UTC (DST-aware) en el instante exacto
OfficeUtcOffsetMinSMALLINTOffset en minutos de la oficina respecto a UTC (DST-aware)
LocationUtcOffsetMinSMALLINTOffset en minutos de la localización respecto a UTC (DST-aware)
Los campos *UtcOffsetMin son DST-aware — calculados con AT TIME ZONE en el instante exacto del fichaje. No usar la tabla time_zones.OffsetMinutes para UI (offset fijo de invierno, no DST-aware).

Detección de Fraude Horario

El sistema implementa un mecanismo anti-fraude en 2 fases para detectar cuando el reloj del dispositivo del empleado está manipulado:

⚡ Fase 1 — Inmediata (al insertar)

pMarkings_InsertOneTZ compara CheckTimeUtc vs SYSUTCDATETIME(). Si la diferencia supera el umbral (8 min por defecto):

MarkingIncidentTypeId = 19 (marcador transitorio)
? Fase 2 — Asíncrona (cron)

pCron_Incidences_Fast (cada 5-10 min) migra el tipo 19 a una incidencia formal de tipo 16 (Fraude Horario) en Employees_Assistence_Incidences.

Incidencia tipo 16 — Fraude Horario

Indicadores Visuales en la Interfaz

?
Icono de Viaje / Deslocalización

Cuándo aparece: El dispositivo del empleado está en una zona horaria diferente a la zona de destino usada para calcular CheckTime.

Significado: Puramente informativo. El empleado fichó desde un bloque horario distinto al de referencia.

⚠️
Icono de Advertencia de Fraude

Cuándo aparece: Incidencia de tipo 19 (fase inmediata) o tipo 16 (fraude confirmado por cron).

Significado: Desfase detectado entre el reloj del dispositivo y el servidor superior al umbral configurado.

ℹ️
Modal de Trazabilidad Horaria

Cuándo aparece: Al hacer click en la hora del fichaje.

Muestra: El "viaje" del fichaje en 3 pasos: Dispositivo (origen) → UTC (audit) → Destino aplicado (CheckTime).

Sebastián HR · Documentación técnica v2026 · Zonas Horarias en Fichajes (v3.3)

¿Le ha sido útil este artículo?

¡Qué bien!

Gracias por sus comentarios

¡Sentimos mucho no haber sido de ayuda!

Gracias por sus comentarios

¡Háganos saber cómo podemos mejorar este artículo!

Seleccione al menos una de las razones
Se requiere la verificación del CAPTCHA.

Sus comentarios se han enviado

Agradecemos su esfuerzo e intentaremos corregir el artículo