Class AusenciaService

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

@Service public class AusenciaService extends Object
Servicio encargado de gestionar el flujo completo de ausencias y vacaciones de los empleados.

Cubre el ciclo de vida de la ausencia: desde la solicitud inicial por parte del empleado (incluyendo la gestión de justificantes en el sistema de ficheros), hasta la revisión, aprobación o rechazo por parte de los responsables correspondientes.

El sistema integra validaciones automáticas de solapamientos temporales y gestiona la limpieza automática del calendario laboral al aprobar periodos de descanso.

  • Field Details

  • Constructor Details

    • AusenciaService

      public AusenciaService()
  • Method Details

    • crearAusencia

      @Transactional public RespuestaAusenciaDTO crearAusencia(PeticionAusenciaDTO peticion, org.springframework.web.multipart.MultipartFile archivo)
      Permite a un empleado registrar una nueva solicitud de ausencia. Valida que no existan solapamientos con otras ausencias activas y almacena el archivo justificante si se adjunta.
      Parameters:
      peticion - DTO con las fechas y el tipo de ausencia.
      archivo - Archivo opcional (justificante médico, etc.) en formato Multipart.
      Returns:
      RespuestaAusenciaDTO con la solicitud recién creada en estado PENDIENTE.
    • obtenerMisAusencias

      @Transactional(readOnly=true) public List<RespuestaAusenciaDTO> obtenerMisAusencias(EstadoAusencia estadoFiltro)
      Recupera el historial de ausencias del empleado autenticado. Permite el filtrado por estado de la solicitud.
      Parameters:
      estadoFiltro - Estado opcional (SOLICITADA, APROBADA, RECHAZADA) para filtrar la búsqueda.
      Returns:
      List de RespuestaAusenciaDTO con las solicitudes propias del empleado.
    • actualizarMiAusencia

      @Transactional public RespuestaAusenciaDTO actualizarMiAusencia(Long idAusencia, PeticionAusenciaDTO peticion, org.springframework.web.multipart.MultipartFile archivoNuevo)
      Permite al empleado modificar una solicitud de ausencia que todavía no ha sido procesada. Si la solicitud ya ha sido aprobada o rechazada, la modificación queda prohibida.
      Parameters:
      idAusencia - Identificador de la ausencia a editar.
      peticion - Nuevos datos para la solicitud.
      archivoNuevo - Nuevo archivo justificante (reemplaza al anterior si existe).
      Returns:
      RespuestaAusenciaDTO con la ausencia actualizada.
    • eliminarMiAusencia

      @Transactional public void eliminarMiAusencia(Long idAusencia)
      Elimina definitivamente una solicitud de ausencia en estado pendiente.
      Parameters:
      idAusencia - Identificador de la solicitud a cancelar.
    • obtenerAusenciasPermitidas

      @Transactional(readOnly=true) public List<RespuestaAusenciaDTO> obtenerAusenciasPermitidas(EstadoAusencia estadoFiltro)
      Recupera la lista de ausencias que el usuario autenticado tiene permiso para revisar. - EMPRESA: Ve todas las ausencias de sus empleados. - SUPERVISOR: Ve ausencias de los empleados de su mismo departamento (exceptuando la suya).
      Parameters:
      estadoFiltro - Estado opcional para la consulta.
      Returns:
      List de RespuestaAusenciaDTO con las solicitudes pendientes de gestión.
    • revisarAusencia

      @Transactional public RespuestaAusenciaDTO revisarAusencia(Long idAusencia, PeticionRevisionAusenciaDTO peticion)
      Procesa la revisión de una solicitud de ausencia (Aprobar o Rechazar).

      Lógica de Negocio al Aprobar: Si la ausencia es aprobada, el sistema localiza y elimina automáticamente cualquier asignación de turno que el empleado tuviera planificada en el rango de fechas de la ausencia, garantizando la coherencia del calendario operativo.

      Requisito de Rechazo: Si el responsable decide rechazar la solicitud, es obligatorio proporcionar una descripción en el campo de observaciones con los motivos de la denegación.

      Parameters:
      idAusencia - Identificador único de la solicitud de ausencia a gestionar.
      peticion - Objeto PeticionRevisionAusenciaDTO con el nuevo estado y comentarios.
      Returns:
      RespuestaAusenciaDTO con el resultado final de la revisión persistido.
      Throws:
      RuntimeException - Si falta justificación en un rechazo o si el revisor no tiene autoridad suficiente.
      jakarta.persistence.EntityNotFoundException - Si la ausencia especificada no existe en la base de datos.
    • obtenerEmpleadoAutenticado

      private Empleado obtenerEmpleadoAutenticado()
      Obtiene el empleado autenticado a partir del contexto de seguridad.
      Returns:
      Empleado que realiza la acción.
      Throws:
      jakarta.persistence.EntityNotFoundException - Si el empleado especificado no existe en la base de datos.
    • obtenerAusenciaPropia

      private Ausencia obtenerAusenciaPropia(Long idAusencia, Empleado empleadoLogueado)
      Valida que una ausencia exista y pertenezca efectivamente al empleado que la consulta.
      Parameters:
      idAusencia - Identificador de la ausencia.
      empleadoLogueado - Empleado que realiza la consulta.
      Returns:
      Ausencia Entidad recuperada.
      Throws:
      jakarta.persistence.EntityNotFoundException - Si la ausencia especificada no existe en la base de datos.
    • validarFechas

      private void validarFechas(LocalDate inicio, LocalDate fin)
      Comprueba la coherencia cronológica entre la fecha de inicio y la de fin.
      Parameters:
      inicio - Fecha inicial.
      fin - Fecha final.
    • validarPrivilegiosRevision

      private void validarPrivilegiosRevision(String emailAuth, boolean esEmpresa, Empleado empleadoDestino)
      Verifica que el revisor tenga los permisos necesarios para gestionar la ausencia de un empleado. Controla la jurisdicción multi-empresa y multi-departamento.
      Parameters:
      emailAuth - Email del revisor.
      esEmpresa - Booleano indicando si el revisor tiene rol de empresa.
      empleadoDestino - Empleado cuya ausencia se está revisando.
    • validarSolapamientoAusencias

      private void validarSolapamientoAusencias(Long idEmpleado, LocalDate inicio, LocalDate fin, Long idAusenciaExcluida)
      Asegura que no existan solicitudes de ausencia activas (Pendientes o Aprobadas) que colisionen en el tiempo.
      Parameters:
      idEmpleado - ID del trabajador.
      inicio - Fecha de inicio de la nueva solicitud.
      fin - Fecha de fin de la nueva solicitud.
      idAusenciaExcluida - ID para excluir de la validación (usado en actualizaciones).
    • mapearARespuesta

      private RespuestaAusenciaDTO mapearARespuesta(Ausencia a)
      Convierte la entidad de base de datos Ausencia a su correspondiente DTO de respuesta.
      Parameters:
      a - Entidad a mapear.
      Returns:
      RespuestaAusenciaDTO formateado.