Class AusenciaService
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 Summary
FieldsModifier and TypeFieldDescriptionprivate final AsignacionTurnoRepositoryprivate final AusenciaRepositoryprivate final EmpleadoRepositoryprivate final EmpresaRepositoryprivate final FileStorageService -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionactualizarMiAusencia(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.crearAusencia(PeticionAusenciaDTO peticion, org.springframework.web.multipart.MultipartFile archivo) Permite a un empleado registrar una nueva solicitud de ausencia.voideliminarMiAusencia(Long idAusencia) Elimina definitivamente una solicitud de ausencia en estado pendiente.private RespuestaAusenciaDTOConvierte la entidad de base de datosAusenciaa su correspondiente DTO de respuesta.private AusenciaobtenerAusenciaPropia(Long idAusencia, Empleado empleadoLogueado) Valida que una ausencia exista y pertenezca efectivamente al empleado que la consulta.obtenerAusenciasPermitidas(EstadoAusencia estadoFiltro) Recupera la lista de ausencias que el usuario autenticado tiene permiso para revisar.private EmpleadoObtiene el empleado autenticado a partir del contexto de seguridad.obtenerMisAusencias(EstadoAusencia estadoFiltro) Recupera el historial de ausencias del empleado autenticado.revisarAusencia(Long idAusencia, PeticionRevisionAusenciaDTO peticion) Procesa la revisión de una solicitud de ausencia (Aprobar o Rechazar).private voidvalidarFechas(LocalDate inicio, LocalDate fin) Comprueba la coherencia cronológica entre la fecha de inicio y la de fin.private voidvalidarPrivilegiosRevision(String emailAuth, boolean esEmpresa, Empleado empleadoDestino) Verifica que el revisor tenga los permisos necesarios para gestionar la ausencia de un empleado.private voidvalidarSolapamientoAusencias(Long idEmpleado, LocalDate inicio, LocalDate fin, Long idAusenciaExcluida) Asegura que no existan solicitudes de ausencia activas (Pendientes o Aprobadas) que colisionen en el tiempo.
-
Field Details
-
ausenciaRepository
-
empleadoRepository
-
empresaRepository
-
asignacionRepository
-
fileStorageService
-
-
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:
RespuestaAusenciaDTOcon 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
RespuestaAusenciaDTOcon 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:
RespuestaAusenciaDTOcon la ausencia actualizada.
-
eliminarMiAusencia
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
RespuestaAusenciaDTOcon 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- ObjetoPeticionRevisionAusenciaDTOcon el nuevo estado y comentarios.- Returns:
RespuestaAusenciaDTOcon 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
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
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:
AusenciaEntidad recuperada.- Throws:
jakarta.persistence.EntityNotFoundException- Si la ausencia especificada no existe en la base de datos.
-
validarFechas
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
Convierte la entidad de base de datosAusenciaa su correspondiente DTO de respuesta.- Parameters:
a- Entidad a mapear.- Returns:
RespuestaAusenciaDTOformateado.
-