Class AsignacionTurnoService

java.lang.Object
com.gestorrh.api.service.AsignacionTurnoService

@Service public class AsignacionTurnoService extends Object
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 Details

  • 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 - Objeto PeticionAsignacionTurnoDTO con los detalles de la planificación propuesta.
      Returns:
      RespuestaAsignacionTurnoDTO con 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 RespuestaAsignacionTurnoDTO con la planificación consultada.
    • obtenerMisAsignaciones

      @Transactional(readOnly=true) public List<RespuestaAsignacionTurnoDTO> obtenerMisAsignaciones()
      Obtiene el calendario de turnos personal del empleado autenticado.
      Returns:
      List de RespuestaAsignacionTurnoDTO con 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:
      RespuestaAsignacionTurnoDTO con 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

      @Transactional public void eliminarAsignacion(Long idAsignacion)
      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 - Turno que se pretende asignar.
    • validarLimiteHorasDiarias

      private void validarLimiteHorasDiarias(Long idEmpleado, LocalDate fecha, Turno nuevoTurno)
      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 - Turno que 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

      private void validarQueNoEsteDeVacaciones(Long idEmpleado, LocalDate fechaTurno)
      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

      private RespuestaAsignacionTurnoDTO mapearARespuesta(AsignacionTurno asig)
      Mapea la entidad AsignacionTurno a su DTO de respuesta detallado.
      Parameters:
      asig - Entidad de base de datos.
      Returns:
      RespuestaAsignacionTurnoDTO con toda la información, incluyendo auditoría.
    • validarSedeConfigurada

      private void validarSedeConfigurada(Empresa empresa)
      Valida que la empresa tenga configurada su sede física para permitir asignaciones de turnos.
      Parameters:
      empresa - Entidad Empresa a validar.