Saltar a contenido

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
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

← Volver al índice