Class TurnoService

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

@Service public class TurnoService extends Object
Servicio encargado de la gestión integral del catálogo de turnos dentro del sistema GestorRH.

Proporciona la lógica de negocio necesaria para la creación, consulta, actualización y eliminación de los diferentes tipos de turnos que una empresa puede configurar. El catálogo de turnos permite a la empresa definir sus propios horarios operativos (mañana, tarde, noche, etc.) para su posterior asignación a los empleados.

Todos los métodos operan bajo el contexto de la empresa autenticada extraída del SecurityContextHolder para garantizar un aislamiento total de los datos entre diferentes empresas (Seguridad Multi-tenant).

See Also:
  • Field Details

  • Constructor Details

    • TurnoService

      public TurnoService()
  • Method Details

    • crearTurno

      @Transactional public RespuestaTurnoDTO crearTurno(PeticionTurnoDTO peticion)
      Crea un nuevo tipo de turno dentro del catálogo de la empresa actualmente autenticada.

      Antes de proceder con el guardado, se validan las reglas de negocio referentes a la coherencia horaria mediante el método validarHoras(PeticionTurnoDTO). El turno se vincula automáticamente a la entidad Empresa del usuario que ha iniciado sesión.

      Parameters:
      peticion - Objeto de transferencia de datos con la descripción y el rango horario (inicio y fin) del turno.
      Returns:
      RespuestaTurnoDTO con la información del turno recién creado, incluyendo su identificador único generado por la base de datos.
      Throws:
      RuntimeException - Si la hora de inicio no es estrictamente anterior a la hora de fin.
    • obtenerTurnosDeEmpresa

      @Transactional(readOnly=true) public List<RespuestaTurnoDTO> obtenerTurnosDeEmpresa()
      Recupera la lista completa de turnos que han sido definidos por la empresa que realiza la solicitud.

      La búsqueda se filtra automáticamente utilizando el identificador único de la empresa obtenido del contexto de seguridad global. Se garantiza que una empresa no pueda ver los turnos configurados por otra.

      Returns:
      List de RespuestaTurnoDTO que contiene todos los turnos disponibles y configurados para la empresa solicitante.
    • actualizarTurno

      @Transactional public RespuestaTurnoDTO actualizarTurno(Long idTurno, PeticionTurnoDTO peticion)
      Modifica los datos de un turno ya existente en la base de datos.

      El sistema realiza una comprobación de propiedad: verifica que el turno pertenezca efectivamente a la empresa que está realizando la petición. Si el turno existe pero pertenece a otra empresa, se deniega el acceso por motivos de seguridad.

      Parameters:
      idTurno - Identificador único del turno que se desea actualizar.
      peticion - Nuevos datos (descripción, hora de inicio y hora de fin) para el turno.
      Returns:
      RespuestaTurnoDTO con la información actualizada y persistida del turno.
      Throws:
      jakarta.persistence.EntityNotFoundException - Si el turno no se encuentra en la base de datos.
      RuntimeException - Si no pertenece a la empresa autenticada.
    • eliminarTurno

      @Transactional public void eliminarTurno(Long idTurno)
      Realiza el borrado físico de un turno del catálogo del sistema.

      Al igual que en el proceso de actualización, se valida estrictamente que el turno sea propiedad de la empresa autenticada. Es importante tener en cuenta que el borrado puede fallar si existen asignaciones de turnos vinculadas a este registro (Integridad Referencial).

      Parameters:
      idTurno - Identificador único del turno que se pretende eliminar de forma definitiva.
      Throws:
      jakarta.persistence.EntityNotFoundException - Si el turno no se encuentra en la base de datos.
      RuntimeException - El acceso es denegado por falta de permisos de propiedad.
    • obtenerEmpresaAutenticada

      private Empresa obtenerEmpresaAutenticada()
      Recupera la entidad Empresa asociada al usuario que ha iniciado sesión actualmente. Utiliza el email extraído del SecurityContextHolder para realizar la búsqueda en el repositorio.
      Returns:
      Empresa Entidad que representa a la empresa autenticada.
      Throws:
      jakarta.persistence.EntityNotFoundException - Si no se encuentra ninguna empresa con el correo electrónico del contexto de seguridad.
    • validarHoras

      private void validarHoras(PeticionTurnoDTO peticion)
      Realiza la validación de las reglas de negocio horarias para un turno. Comprueba fundamentalmente que la hora de inicio sea anterior a la hora de finalización.
      Parameters:
      peticion - DTO que contiene las horas a validar.
      Throws:
      RuntimeException - Si la hora de inicio no es estrictamente anterior a la hora de fin.
    • mapearARespuesta

      private RespuestaTurnoDTO mapearARespuesta(Turno turno)
      Convierte la entidad de base de datos Turno en un objeto de respuesta DTO. Se utiliza para desacoplar la capa de persistencia de la capa de presentación.
      Parameters:
      turno - Entidad Turno a ser mapeada.
      Returns:
      RespuestaTurnoDTO con los datos formateados para ser devueltos por la API.