Dirty Log — Jornadas Sucias

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

Disponibles a partir de la versión 9.0.0.1 



Mecanismo de invalidación de cálculos en jornadas validadas. Cuando datos externos cambian retroactivamente, el sistema marca las jornadas afectadas para revisión y recálculo sin alterar su estado de validación.

?

Concepto Fundamental

El estado "dirty" (sucio) NO indica un error. Su significado real es: "La información de esta jornada está obsoleta debido a cambios externos y necesita ser recalculada para reflejar la realidad actual."

El sistema no rastrea qué cambió ni busca reparar nada específico; simplemente invalida los cálculos previos y genera unos nuevos desde cero.

Ciclo de Vida de una Jornada Sucia

?
1. El Disparo — ¿Cómo se ensucia?

Un evento externo altera las premisas bajo las cuales fue calculada la jornada: modificación de turno, vacación añadida/borrada, baja médica registrada, festivo de calendario modificado, o fichaje insertado en día validado.

Reacción: Los triggers de base de datos detectan el cambio y marcan la jornada afectada con DirtyFlag = 1. No se realiza ninguna comprobación de lógica en este momento — solo se "levanta la mano".
⚙️
2. La Limpieza — El Recálculo

El Cron (pCron_Incidences_Recalc) o un proceso manual detecta las jornadas con DirtyFlag=1 y ejecuta un recálculo "stateless" (sin memoria):

  1. Ignora los valores anteriores
  2. Toma la foto actual de Fichajes + Configuración de Turno + Calendarios + Vacaciones
  3. Genera nuevos valores para WorkedMinutes, PlannedMinutes, TheoryMinutes, etc.
  4. Al terminar, limpia: DirtyFlag = 0
3. Resultado — Auto-corrección
Caso A (Nuevas Reglas):
Si añadiste una vacación, el recálculo la ve y pone los minutos trabajados a 0. Dato correcto.
Caso B (Reversión):
Si cometiste un error y lo deshiciste, el último recálculo deja los valores exactamente como estaban al principio.

Comportamiento por Estado de Jornada

Estado (StatusId)Comportamiento al ensuciarse
0 — GeneradaRecálculo inmediato y síncrono vía pEmployees_Assistence_RecalcMetrics. El DirtyFlag nunca llega a quedar en 1 — los datos se actualizan en el acto.
>0 — Validada / ConsolidadaSolo marca DirtyFlag = 1. No se recalcula solo — requiere acción del Cron asíncrono o proceso manual. Mientras tanto, los datos SON ERRÓNEOS y la jornada aparece como "En revisión".
Nota crítica: El DirtyFlag solo puede existir en jornadas validadas (StatusId > 0) de forma persistente. En jornadas generadas (StatusId = 0), el recálculo síncrono lo limpia antes de que quede registrado.

Puntos de Disparo (¿Qué ensucia una jornada?)

Origen del cambioChangeTypeAfecta a
Festivos de CalendarioBANKHOLIDAY_INSERT/UPDATE/DELETEEmpleados con ese CalendarId en la fecha
Vacaciones / Ausencias aprobadasVACATION_INSERT/DELETE, ABSENCE_INSERT/DELETESolo las con StatusId = 1 (aprobadas). Las no remuneradas no generan dirty.
Bajas Médicas (IT)LEAVE_INSERT/UPDATE/DELETETodas las jornadas del rango de la baja
Parámetros de turnoSHIFT_UPDATECambios en tolerancias, redondeos, BreakSigned, WorkOnFestive
Horario de líneas del turnoSHIFT_SCHEDULE_UPDATESolo los días de semana que coincidan con StartDay–EndDay de la línea
Descansos / Días especiales del turnoSHIFT_BREAK_* / SHIFT_SPECIALDAY_*Jornadas afectadas por el turno en la ventana de fechas configurada
Fichaje en día validadoMARKING_INSERTInserción manual en jornada con StatusId > 0
Cambio masivo de planificaciónSCHEDULE_CHANGE_BULKProceso masivo de cambio de grupos

Flujo de Resolución

Cuando una jornada validada tiene DirtyFlag = 1, el responsable debe elegir entre dos caminos:

?

Camino A — Recálculo Directo

Cuándo usarlo: El cambio externo no invalida el criterio de validación — simplemente los minutos calculados han quedado desfasados.

SP: pEmployees_Assistence_RecalcMetrics_RecalcDirty
  • No cambia StatusId
  • Actualiza métricas con la configuración actual
  • Limpia DirtyFlag → 0
  • Registra evento RECALC en DirtyLog
↩️

Camino B — Reapertura + Re-validación

Cuándo usarlo: El cambio es relevante (vacación/baja retroactiva) y el responsable debe revisar y dar el visto bueno de nuevo.

Paso 1: Verificar bloqueos (counters cerrados, bolsas liquidadas)
Paso 2: pDateEmployee_Validate_Undo_Batch
Paso 3: Re-validar desde la UI
  • StatusId: 1 → 0
  • DirtyFlag: limpiado
  • Fichajes base liberados (Closed = 0)

La Tabla DirtyLog

Cada vez que una jornada se ensucia, se registra un evento de auditoría en la tabla Employees_Assistence_DirtyLog. Este log es la trazabilidad histórica completa de todos los cambios retroactivos.

CampoDescripción
EmployeeIdEmpleado afectado
DateFecha de la jornada afectada
ChangeTypeCausa del ensuciado (ej: VACATION_INSERT, SHIFT_UPDATE, MARKING_INSERT…)
ChangeDetailDetalle adicional del cambio
CreatedAtTimestamp exacto del evento (UTC)
Consulta rápida de diagnóstico:
SELECT EA.EmployeeId, E.Name + ' ' + E.Surname AS Empleado,
       EA.[Date], EA.DirtyReason
FROM Employees_Assistence EA
JOIN Employees E ON EA.EmployeeId = E.EmployeeId
WHERE EA.DirtyFlag = 1 AND EA.StatusId > 0
ORDER BY EA.[Date] DESC;

Ventana Temporal de Ensuciado

Cada tipo de trigger tiene configurado un parámetro de ventana hacia atrás que limita hasta cuántos días en el pasado puede generar jornadas sucias. Si el cambio afecta a fechas más antiguas que la ventana, la operación es rechazada con un error de bloqueo.

Tipo de cambioParámetro de ventana
Festivos de calendarioDirtyDaysBack_Festivos
VacacionesDirtyDaysBack_Vacaciones
AusenciasDirtyDaysBack_Ausencias
Bajas médicasDirtyDaysBack_Bajas
Cambios de turnoDirtyDaysBack_Turnos

Resumen Ejecutivo

?
DirtyFlag = 1
Jornada con datos obsoletos. Requiere recálculo antes de considerar válidos.
?
En proceso
Cron asíncrono en cola o proceso manual pendiente de ejecución.

¿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