Package com.gestorrh.api.service
Class AsignacionTurnoService
java.lang.Object
com.gestorrh.api.service.AsignacionTurnoService
Servicio encargado de la planificación operativa y gestión de turnos de trabajo.
Este servicio centraliza el calendario laboral de los empleados, permitiendo la asignación de turnos (mañana, tarde, etc.) bajo diferentes modalidades (presencial o teletrabajo).
Implementa un motor de reglas de negocio avanzado para garantizar:
- Jornada Máxima: Impide exceder los límites diarios de tiempo de trabajo permitidos.
- Consistencia: Valida la configuración de la sede física de la empresa.
- Disponibilidad: Previene el solapamiento con periodos de vacaciones o ausencias aprobadas.
- Trazabilidad: Registra metadatos de auditoría para cada modificación manual de la planificación.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final AsignacionTurnoRepositoryprivate final AusenciaRepositoryprivate final EmpleadoRepositoryprivate final EmpresaRepositoryprivate static final longprivate final TurnoRepository -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionactualizarAsignacion(Long idAsignacion, PeticionAsignacionTurnoDTO peticion) Actualiza una asignación de turno existente.crearAsignacion(PeticionAsignacionTurnoDTO peticion) Crea y persiste una nueva asignación de turno en el sistema.voideliminarAsignacion(Long idAsignacion) Elimina permanentemente una asignación de turno del sistema.private RespuestaAsignacionTurnoDTOMapea la entidadAsignacionTurnoa su DTO de respuesta detallado.Recupera todas las asignaciones de turnos que el usuario autenticado tiene permiso para visualizar.Obtiene el calendario de turnos personal del empleado autenticado.private voidvalidarLimiteHorasDiarias(Long idEmpleado, LocalDate fecha, Turno nuevoTurno) Asegura que el empleado no supere el máximo de minutos permitidos por jornada diaria (ej.private voidvalidarLimiteHorasDiariasConDescuento(Long idEmpleado, LocalDate fecha, Turno nuevoTurno, long minutosADescontar) Variante de validación de jornada que tiene en cuenta el reemplazo de un turno existente.private voidvalidarPrivilegiosAsignacion(String emailAuth, boolean esEmpresa, Empleado empleadoDestino, Turno turno) Verifica que el usuario tenga permisos legales para gestionar la jornada de un empleado y turno.private voidvalidarQueNoEsteDeVacaciones(Long idEmpleado, LocalDate fechaTurno) Comprueba si el empleado tiene una ausencia ya aprobada para la fecha en la que se le intenta asignar trabajo.private voidvalidarSedeConfigurada(Empresa empresa) Valida que la empresa tenga configurada su sede física para permitir asignaciones de turnos.
-
Field Details
-
asignacionRepository
-
empleadoRepository
-
turnoRepository
-
empresaRepository
-
ausenciaRepository
-
MAX_MINUTOS_JORNADA
private static final long MAX_MINUTOS_JORNADA- See Also:
-
-
Constructor Details
-
AsignacionTurnoService
public AsignacionTurnoService()
-
-
Method Details
-
crearAsignacion
@Transactional public RespuestaAsignacionTurnoDTO crearAsignacion(PeticionAsignacionTurnoDTO peticion) Crea y persiste una nueva asignación de turno en el sistema.El flujo de creación incluye verificaciones de seguridad multi-tenant (para asegurar que el responsable, el empleado y el turno pertenecen a la misma empresa) y validaciones de negocio contra el límite de horas diarias y periodos de vacaciones.
- Parameters:
peticion- ObjetoPeticionAsignacionTurnoDTOcon los detalles de la planificación propuesta.- Returns:
RespuestaAsignacionTurnoDTOcon los datos de la asignación confirmada satisfactoriamente.- Throws:
jakarta.persistence.EntityNotFoundException- Si el empleado o el turno especificados no existen en la base de datos.
-
obtenerAsignacionesPermitidas
@Transactional(readOnly=true) public List<RespuestaAsignacionTurnoDTO> obtenerAsignacionesPermitidas()Recupera todas las asignaciones de turnos que el usuario autenticado tiene permiso para visualizar. - EMPRESA: Acceso total a las asignaciones de su plantilla. - SUPERVISOR: Acceso limitado a los empleados de su propio departamento.- Returns:
- List de
RespuestaAsignacionTurnoDTOcon la planificación consultada.
-
obtenerMisAsignaciones
Obtiene el calendario de turnos personal del empleado autenticado.- Returns:
- List de
RespuestaAsignacionTurnoDTOcon las asignaciones propias. - Throws:
jakarta.persistence.EntityNotFoundException- Si el empleado o el turno especificados no existen en la base de datos.
-
actualizarAsignacion
@Transactional public RespuestaAsignacionTurnoDTO actualizarAsignacion(Long idAsignacion, PeticionAsignacionTurnoDTO peticion) Actualiza una asignación de turno existente. Es obligatorio registrar el motivo del cambio para mantener la trazabilidad de la auditoría. Se vuelven a validar las restricciones de jornada máxima y ausencias.- Parameters:
idAsignacion- Identificador único de la asignación a modificar.peticion- DTO con los nuevos parámetros del turno y el motivo del cambio.- Returns:
RespuestaAsignacionTurnoDTOcon los datos actualizados y metadatos de auditoría.- Throws:
jakarta.persistence.EntityNotFoundException- Si el empleado o el turno especificados no existen en la base de datos.RuntimeException- Si se violan los límites de jornada, hay solapamiento de vacaciones o faltan permisos de seguridad.
-
eliminarAsignacion
Elimina permanentemente una asignación de turno del sistema.- Parameters:
idAsignacion- Identificador de la asignación a borrar.- Throws:
jakarta.persistence.EntityNotFoundException- Si la asignación especificada no existe en la base de datos.
-
validarPrivilegiosAsignacion
private void validarPrivilegiosAsignacion(String emailAuth, boolean esEmpresa, Empleado empleadoDestino, Turno turno) Verifica que el usuario tenga permisos legales para gestionar la jornada de un empleado y turno. Implementa lógica multi-tenant y de supervisión por departamento.- Parameters:
emailAuth- Email del usuario que realiza la operación.esEmpresa- Indica si es un perfil de empresa.empleadoDestino- Empleado cuya jornada se gestiona.turno-Turnoque se pretende asignar.
-
validarLimiteHorasDiarias
Asegura que el empleado no supere el máximo de minutos permitidos por jornada diaria (ej. 8 horas).- Parameters:
idEmpleado- ID del trabajador.fecha- Día de la jornada.nuevoTurno-Turnoque se desea añadir.
-
validarLimiteHorasDiariasConDescuento
private void validarLimiteHorasDiariasConDescuento(Long idEmpleado, LocalDate fecha, Turno nuevoTurno, long minutosADescontar) Variante de validación de jornada que tiene en cuenta el reemplazo de un turno existente.- Parameters:
idEmpleado- ID del trabajador.fecha- Día de la jornada.nuevoTurno- Nuevo turno propuesto.minutosADescontar- Minutos del turno que será reemplazado.
-
validarQueNoEsteDeVacaciones
Comprueba si el empleado tiene una ausencia ya aprobada para la fecha en la que se le intenta asignar trabajo.- Parameters:
idEmpleado- ID del trabajador.fechaTurno- Fecha de la asignación.
-
mapearARespuesta
Mapea la entidadAsignacionTurnoa su DTO de respuesta detallado.- Parameters:
asig- Entidad de base de datos.- Returns:
RespuestaAsignacionTurnoDTOcon toda la información, incluyendo auditoría.
-
validarSedeConfigurada
Valida que la empresa tenga configurada su sede física para permitir asignaciones de turnos.- Parameters:
empresa- EntidadEmpresaa validar.
-