Turnos de trabajo¶
Turnos de trabajo mantiene un histórico completo y detallado de todos los turnos realizados por los empleados, registrando tanto el horario programado como el real ejecutado. Esta sección refleja ausencias, retrasos, horas extras, horas complementarias y permite documentar las razones mediante motivos específicos. El sistema registra automáticamente información de fichajes cuando están disponibles, pero también permite intervención manual del supervisor para ajustar horarios de entrada y salida cuando sea necesario. Cada turno almacena múltiples dimensiones de información: horarios planificados versus realizados, tipo de turno (ordinario, descanso, horas extras, horas complementarias), estado del turno (programado, en curso, presente, ausente, cancelado), duración en minutos, retrasos calculados automáticamente y estadísticas de actividad del empleado durante el turno. La sección gestiona el cálculo de saldos positivos y negativos considerando si las ausencias afectan al saldo según su motivo, si los descansos son retribuidos, y aplicando lógicas específicas para festivos. Esta información es fundamental para nóminas, informes de asistencia, gestión de presencia y cumplimiento de convenios colectivos.
Información General¶
| Propiedad | Valor |
|---|---|
| ID | 4709d046-d1c5-49bd-a76b-768c9acc1ceb |
| Tabla PostgreSQL | tpr_63e63f9xd |
| Etiqueta Plural | Turnos de trabajo |
| Texto principal automatico | Sí |
| Sección Base | Base - Realizaciones de turno (f37b92fc-5a3d-4d1e-ace9-30404c40a5f3) |
Campos¶
Total de campos: 70 (10 del sistema, 60 personalizados)
Campos del Sistema¶
| Campo | Tipo | Rol | Columna PostgreSQL | Relación | Atributos |
|---|---|---|---|---|---|
| ID | Relación |
- | id |
Turnos de trabajo | - |
| Referencia | Texto |
- | nombre |
- | - |
| Fecha Alta Dato | Fecha Y Hora |
- | fecha |
- | - |
| Editado | Fecha Y Hora |
- | fecham |
- | - |
| Eliminado | Sí/No |
- | eliminado |
- | - |
| Usuario Creador del dato | Relación |
- | usuarioid |
Base - Entidades | - |
| Sección (Relación Sistema) | Relación |
- | plantillapid |
- | 🔴 Obligatorio |
| Posición (Orden) | Decimal |
- | posicion |
- | - |
| Modificado | Sí/No |
- | modificado |
- | - |
| Fecha Indice Actividad | Fecha Y Hora |
- | fechaia |
- | - |
Campos Personalizados¶
| Campo | Tipo | Pestaña | Columna | Atributos | Notas |
|---|---|---|---|---|---|
| Minutos retraso salida | Entero |
Realización | pr_1863ea67cbx217wd |
🔒 Bloqueado, 👁 Oculto, 📊 Cualquier valor numérico | - |
| Destinador | Relación |
General | pr_1863b69bc5x86wd |
🔒 Bloqueado, 👁 Oculto | - |
| Ubicación Principal | Relación |
Registro | pr_1863c96f56x31dwd |
🔒 Bloqueado, 👁 Oculto | Autorrellenado (Siempre): Campo (Sesión): Ubicación Principal |
| Sesiones iniciadas | Entero |
Estadísticas | pr_1864145b2axeawd |
🔒 Bloqueado, 👁 Oculto, 📊 Cualquier valor numérico | - |
| Minutos retraso entrada | Entero |
Realización | pr_1863e9ef8dx221wd |
🔒 Bloqueado, 👁 Oculto, 📊 Cualquier valor numérico | - |
| Realización concluida | Sí/No |
Realización | pr_40040209613 |
👁 Oculto | - |
| Realización en minutos | Entero |
Realización | pr_1863e95bdfx236wd |
🔒 Bloqueado, 👁 Oculto, 📊 Cualquier valor numérico | - |
| Minutos extras trabajados | Entero |
Realización | pr_1864ee2a65xfawd |
🔒 Bloqueado, 👁 Oculto, 📊 Cualquier valor numérico | - |
| Duración turno en minutos | Entero |
Realización | pr_1863e88aa5x128wd |
🔒 Bloqueado, 👁 Oculto, 📊 Cualquier valor numérico | - |
| Observaciones | Texto |
Observaciones | pr_20040138403 |
- | - |
| Fecha de realización | Fecha |
General | pr_10040139141 |
🔒 Bloqueado, 👁 Oculto | - |
| Fecha mínima de inicio de turno | Fecha Y Hora |
Parámetros | pr_60040210382 |
🔒 Bloqueado, 👁 Oculto | - |
| Primer inicio de sesión | Relación |
General | pr_10040243741 |
👁 Oculto | - |
| Último cierre de sesión | Relación |
General | pr_30040243742 |
👁 Oculto | - |
| Información sistema | Texto |
Registro | pr_30715251001 |
- | - |
| Horario (Asiganción Jornada) | Relación |
General | pr_1863d18f7bx1e7wd |
🔒 Bloqueado, 👁 Oculto | - |
| Fecha Alta del registro | Fecha Y Hora |
Registro | pr_1863b69b89x23ewd |
🔴 Obligatorio, 🔒 Bloqueado | Autorrellenado (Siempre): Fecha y Hora actual |
| Hora local | Hora |
Registro | pr_776ae16wd |
🔒 Bloqueado, 👁 Oculto | - |
| Fecha Dato | Fecha Y Hora |
Registro | pr_1863c96f6bx340wd |
🔴 Obligatorio | Autorrellenado (Siempre): Fecha y Hora actual |
| Autor del alta | Relación |
Registro | pr_1863b69b6ex213wd |
🔴 Obligatorio, 🔒 Bloqueado | Autorrellenado (Siempre): Campo (Sesión): La Entidad ( ID* ) |
| Empleado | Relación |
General | pr_1863c96f39x2awd |
🔴 Obligatorio | - |
| Fecha de turno | Fecha |
General | pr_50700141001 |
🔴 Obligatorio | - |
| Minutos con sesión activa | Entero |
Estadísticas | pr_1873d23d48x3e4wd |
🔒 Bloqueado, 👁 Oculto, 📊 Cualquier valor numérico | - |
| Informes visualizados | Entero |
Estadísticas | pr_186410cfabx328wd |
🔒 Bloqueado, 👁 Oculto, 📊 Cualquier valor numérico | - |
| Registros agregados | Entero |
Estadísticas | pr_186411ab2dx4dwd |
🔒 Bloqueado, 👁 Oculto, 📊 Cualquier valor numérico | - |
| Registros visitados | Entero |
Estadísticas | pr_1864133a72x194wd |
🔒 Bloqueado, 👁 Oculto, 📊 Cualquier valor numérico | - |
| Registros modificados | Entero |
Estadísticas | pr_186412b750x102wd |
🔒 Bloqueado, 👁 Oculto, 📊 Cualquier valor numérico | - |
| Registros restaurados | Entero |
Estadísticas | pr_1864168675x2a5wd |
🔒 Bloqueado, 👁 Oculto, 📊 Cualquier valor numérico | - |
| Registros eliminados | Entero |
Estadísticas | pr_186415d176xccwd |
🔒 Bloqueado, 👁 Oculto, 📊 Cualquier valor numérico | - |
| Hora Salida (Fichaje) | Hora |
Supervisor | pr_40700224 |
🔒 Bloqueado | - |
| Hora Salida (Supervisor) | Hora |
Supervisor | pr_40700222 |
- | - |
| Estado (Fichaje) | Entero |
Supervisor | pr_40701401001 |
🔒 Bloqueado, 📊 Positivos o 0 | - |
| Estado (Supervisor) | Entero |
Supervisor | pr_40701401002 |
📊 Positivos o 0 | - |
| Zona horaria | Relación |
Registro | pr_10700143 |
🔴 Obligatorio | Autorrellenado (Cadena_Rellenada): Campo : Empleado / Zona horaría · Autorrellenado (Siempre): Campo (Empresa Actual): Zona horaria principal · Autorrellenado (Siempre): Referencia dato: (UTC+01:00) Bruselas, Copenhague, Madrid, París |
| Hora Entrada (Fichaje) | Hora |
Supervisor | pr_40700221 |
🔒 Bloqueado | - |
| Hora Entrada (Supervisor) | Hora |
Supervisor | pr_40700223 |
- | - |
| Motivo Horas extra | Relación |
General | pr_30040212245 |
- | - |
| Motivo Ausencia | Relación |
General | pr_30040212244 |
- | - |
| Entrada automática | Sí/No |
General | pr_40715293 |
- | - |
| Hora Entrada | Hora |
General | pr_20700143 |
🔒 Bloqueado | - |
| Descripción corta | Texto |
General | pr_10040256424 |
- | - |
| Tipo de turno | Entero |
General | pr_40040210832 |
🔴 Obligatorio, 📊 Mayores que 0 | - |
| Turno Inicio | Hora |
General | pr_20700141 |
- | - |
| Tipo de Jornada | Relación |
General | pr_30040103153 |
🔒 Bloqueado | - |
| Tipo de Descanso | Relación |
General | pr_10782481 |
- | - |
| Es Festivo | Sí/No |
General | pr_60726063 |
- | - |
| Realización agregada automáticamente | Sí/No |
General | pr_18756c9ac6x85wd |
- | - |
| Horario | Relación |
General | pr_1863d10038x3ccwd |
🔒 Bloqueado | - |
| Salida automática | Sí/No |
General | pr_40715294 |
- | - |
| Turno | Relación |
General | pr_30040103154 |
🔒 Bloqueado | - |
| Turno Fin | Hora |
General | pr_20700142 |
- | - |
| Estado | Entero |
General | pr_30040103561 |
🔒 Bloqueado, 📊 Positivos o 0 | Autorrellenado (Siempre): Número entero: 4 |
| Hora Salida | Hora |
General | pr_20700144 |
🔒 Bloqueado | - |
| Saldo negativo | Decimal |
Registro | pr_20782751 |
🔒 Bloqueado, 📊 Cualquier valor numérico | - |
| Saldo neto | Decimal |
Registro | pr_20782754 |
🔒 Bloqueado, 📊 Cualquier valor numérico | - |
| Total horas extras | Decimal |
Registro | pr_20782753 |
🔒 Bloqueado, 📊 Cualquier valor numérico | - |
| Saldo positivo | Decimal |
Registro | pr_10782752 |
🔒 Bloqueado, 📊 Cualquier valor numérico | - |
| Total horas complementarias | Decimal |
Registro | pr_20782752 |
🔒 Bloqueado, 📊 Cualquier valor numérico | - |
| Ausencia afecta a saldo | Sí/No |
Registro | pr_30782751 |
- | Autorrellenado (Siempre): Campo : Motivo Ausencia / Afecta a Saldo |
| Es descanso retribuido | Sí/No |
Registro | pr_60787021 |
🔒 Bloqueado | Autorrellenado (Siempre): Campo : Tipo de Descanso / Retribuido |
Scripts¶
Total de scripts: 25
Código de Scripts¶
Lógica de negocio ejecutada en los formularios automáticamente
Campo_Cambiado¶
if C.ReferenciaMotivoAusencia <> ''
if C.Estado = S.Enums.tiporealizaciondeturno.presente
C.Estado = 0
end if
if C.Estado = S.Enums.tiporealizaciondeturno.programada
C.Estado = 0
end if
if C.Estado = S.Enums.tiporealizaciondeturno.esperandoinicio
C.Estado = 0
end if
end if
Campos utilizados:
- Turnos de trabajo > Motivo Ausencia
Campo_Click¶
C.EstadoSupervisor =2
C.HoraEntradaSupervisor = C.TurnoInicio
C.HoraSalidaSupervisor = C.TurnoFin
Campos utilizados: - Botón
Campo_ComboAplicarFiltro¶
F.CampoDesplegableAplicarFiltro(S.Fields.Empleados.EmpleadoActivo.ID,'=',1)
Campos utilizados:
- Turnos de trabajo > Empleado
Campo_ComboAplicarFiltro¶
F.CampoDesplegableAplicarFiltro(S.Fields.MotivosDeHorasExtrasBase.TipoDeTurno.ID,'=',C.TipoDeTurno)
Campos utilizados:
- Turnos de trabajo > Motivo Horas extra
Formulario_TickRecalculo¶
if C.EstadoSupervisor <> S.Enums.tiporealizaciondeturno.ausencia
if C.EstadoSupervisor <> S.Enums.tiporealizaciondeturno.presente
if C.EstadoSupervisor <> S.Enums.tiporealizaciondeturno.cancelada
C.EstadoSupervisor = 0
end if
end if
end if
Formulario_TickRecalculo¶
num ausenciaAfectaAsaldoBloqueado
if C.ReferenciaMotivoAusencia = ''
if C.EsFestivo = 0
if C.Estado = S.Enums.tiporealizaciondeturno.ausencia
V.ausenciaAfectaAsaldoBloqueado = 1
C.AusenciaAfectaASaldo = 1
end if
end if
end if
F.CampoBloqueadoMotivo(S.Fields.TurnosDeTrabajo.AusenciaAfectaASaldo.ID,'Siempre afecta si no tiene motivo de ausencia.',v.ausenciaAfectaAsaldoBloqueado)
if C.Estado = S.Enums.tiporealizaciondeturno.ausencia y C.AusenciaAfectaASaldo = 0
C.SaldoNegativo = 0
C.SaldoPositivo = 0
elseif C.TipoDeTurno = S.Enums.tipodeturno.descanso y C.EsDescansoRetribuido = 0
C.SaldoNegativo = 0
C.SaldoPositivo = 0
elseif C.TipoDeTurno = S.Enums.tipodeturno.hcomplementarias
C.SaldoNegativo = 0
C.SaldoPositivo = 0
C.TotalHorasComplementarias = C.RealizacionEnMinutos
elseif C.TipoDeTurno = S.Enums.tipodeturno.hextra
C.SaldoNegativo = 0
C.SaldoPositivo = 0
C.TotalHorasExtras = C.RealizacionEnMinutos
else
if C.EsFestivo
C.SaldoNegativo = 0
C.SaldoPositivo = C.RealizacionEnMinutos
else
C.SaldoNegativo = C.DuracionTurnoEnMinutos
C.SaldoPositivo = C.RealizacionEnMinutos
end if
end if
Formulario_TickRecalculo¶
num tipoDescansoBloqueado = 1
num motivoAusenciaBloqueado = 1
num motivoHoraExtraBloquedo = 1
if C.Estado = S.Enums.tiporealizaciondeturno.ausencia
V.motivoAusenciaBloqueado = 0
end if
if C.TipoDeTurno = S.Enums.tipodeturno.hextra o C.TipoDeTurno = S.Enums.tipodeturno.hcomplementarias
V.motivoHoraExtraBloquedo = 0
else
C.ReferenciaMotivoHorasExtra = ''
end if
if C.TipoDeTurno = S.Enums.tipodeturno.descanso
V.tipoDescansoBloqueado = 0
end if
F.CampoBloqueadoMotivo(S.Fields.TurnosDeTrabajo.ReferenciaTipoDeDescanso.ID,'Únicamente disponible en Descansos',v.tipoDescansoBloqueado)
F.CampoBloqueadoMotivo(S.Fields.TurnosDeTrabajo.ReferenciaMotivoHorasExtra.ID,'Únicamente disponible en Horas extra',v.motivoHoraExtraBloquedo)
F.CampoBloqueadoMotivo(S.Fields.TurnosDeTrabajo.ReferenciaMotivoAusencia.ID,'Únicamente disponible en Ausencias',v.motivoAusenciaBloqueado)
if C.ReferenciaTurno <> ''
txt FechaProgramadaEsAutomatica_Motivo = 'La programación del turno se genera automáticamente en base al horario, puede cancelarlo y crear uno nuevo manulmente.'
F.CampoBloqueadoMotivo(S.Fields.TurnosDeTrabajo.TurnoInicio.ID,v.FechaProgramadaEsAutomatica_Motivo,1)
F.CampoBloqueadoMotivo(S.Fields.TurnosDeTrabajo.TurnoFin.ID,v.FechaProgramadaEsAutomatica_Motivo,1)
F.CampoBloqueadoMotivo(S.Fields.TurnosDeTrabajo.TipoDeTurno.ID,v.FechaProgramadaEsAutomatica_Motivo,1)
end if
F.CampoBloqueadoMotivo(S.Fields.TurnosDeTrabajo.ReferenciaEmpleadoPrincipal.ID,'Automático',C.RealizacionAgregadaAutomaticamente)
F.CampoBloqueadoMotivo(S.Fields.TurnosDeTrabajo.FechaDeTurno.ID,'Automático',C.RealizacionAgregadaAutomaticamente)
F.CampoBloqueadoMotivo(S.Fields.TurnosDeTrabajo.ReferenciaZonaHoraria.ID,'Automático',C.RealizacionAgregadaAutomaticamente)
txt motivoBloqueoEntradaYSalida = 'Cuando un turno es una ausencia, no se puede configurar rango de horas, debe corresponder al total del turno.'
if C.ReferenciaMotivoAusencia <> '' o C.Estado = S.Enums.tiporealizaciondeturno.ausencia
F.CampoBloqueadoMotivo(S.Fields.TurnosDeTrabajo.HoraEntradaSupervisor.ID,v.motivoBloqueoEntradaYSalida,1)
F.CampoBloqueadoMotivo(S.Fields.TurnosDeTrabajo.HoraSalidaSupervisor.ID,v.motivoBloqueoEntradaYSalida,1)
else
F.CampoBloqueadoMotivo(S.Fields.TurnosDeTrabajo.HoraEntradaSupervisor.ID,v.motivoBloqueoEntradaYSalida,0)
F.CampoBloqueadoMotivo(S.Fields.TurnosDeTrabajo.HoraSalidaSupervisor.ID,v.motivoBloqueoEntradaYSalida,0)
end if
Formulario_TickRecalculo¶
if C.TipoDeTurno <> S.Enums.tipodeturno.descanso
if C.ReferenciaTipoDeDescanso <> ''
C.ReferenciaTipoDeDescanso = ''
end if
end if
@ La máxima priopridad si se selecciona motivo de ausencia siempre es ausente
if C.EstadoSupervisor <> S.Enums.tiporealizaciondeturno.ausencia
if C.ReferenciaMotivoAusencia <> ''
C.EstadoSupervisor = S.Enums.tiporealizaciondeturno.ausencia
end if
end if
if C.EstadoSupervisor <> 0
@ Estado acutal ausente pero el supervisor pj la marca como cancelada
C.Estado = C.EstadoSupervisor
end if
C.DuracionTurnoEnMinutos = F.MinutesDifferenceBetweenTimes(C.TurnoInicio,C.TurnoFin)
if C.ReferenciaMotivoAusencia <> '' o C.Estado = S.Enums.tiporealizaciondeturno.ausencia
C.Estado = S.Enums.tiporealizaciondeturno.ausencia
C.HoraEntrada = ''
C.HoraSalida = ''
C.HoraEntradaSupervisor = ''
C.HoraSalidaSupervisor = ''
C.RealizacionEnMinutos = 0
C.MinutosRetrasoSalida = 0
C.MinutosRetrasoEntrada = 0
C.MinutosExtrasTrabajados = 0
else
if C.EstadoSupervisor <> 0
C.Estado = C.EstadoSupervisor
else
C.Estado = C.EstadoFichaje
end if
if C.HoraEntradaSupervisor <> ''
C.HoraEntrada = C.HoraEntradaSupervisor
else
C.HoraEntrada = C.HoraEntradaFichaje
end if
if C.HoraSalidaSupervisor <> ''
C.HoraSalida = C.HoraSalidaSupervisor
else
C.HoraSalida = C.HoraSalidaFichaje
end if
C.RealizacionEnMinutos = F.MinutesDifferenceBetweenTimes(C.HoraEntrada,C.HoraSalida)
if C.TurnoInicio <> '' y C.TurnoFin <> ''
C.MinutosRetrasoSalida = F.MinutesDifferenceBetweenTimes(C.TurnoFin,C.HoraSalida)
C.MinutosRetrasoEntrada = F.MinutesDifferenceBetweenTimes(C.TurnoInicio,C.HoraEntrada)
C.MinutosExtrasTrabajados = C.RealizacionEnMinutos - C.DuracionTurnoEnMinutos
else
C.MinutosRetrasoSalida = 0
C.MinutosRetrasoEntrada = 0
C.MinutosExtrasTrabajados = 0
end if
end if
if F.CampoHaSidoModificado(S.Fields.TurnosDeTrabajo.TurnoInicio.ID) or F.CampoHaSidoModificado(S.Fields.TurnosDeTrabajo.TurnoFin.ID)
if C.Estado = S.Enums.tiporealizaciondeturno.encurso
C.RealizacionConcluida = 0
elseif C.Estado = S.Enums.tiporealizaciondeturno.programada
C.RealizacionConcluida = 0
elseif C.Estado = S.Enums.tiporealizaciondeturno.esperandoinicio
C.RealizacionConcluida = 0
elseif C.Estado = S.Enums.tiporealizaciondeturno.ausencia
C.RealizacionConcluida = 1
elseif C.Estado = S.Enums.tiporealizaciondeturno.presente
C.RealizacionConcluida = 1
elseif C.Estado = S.Enums.tiporealizaciondeturno.cancelada
C.RealizacionConcluida = 1
elseif C.Estado = S.Enums.tiporealizaciondeturno.indefinido
C.RealizacionConcluida = 0
else
C.RealizacionConcluida = 0
end if
end if