public record DatosCancelacionConsulta(
@NotNull
Long idConsulta,
@NotNull
MotivoCancelacion motivo
) {
}
public enum MotivoCancelacion {
PACIENTE_NO_QUISO_CONTINUAR,
CANCELACION_MEDICO,
OTROS
}
public interface ValidadorCancelacionDeConsultas {
void validar(DatosCancelacionConsulta datos);
}
@Component
public class ValidadorCancelacionConAnticipacion implements ValidadorCancelacionDeConsultas {
@Autowired
private ConsultaRepository consultaRepository;
@Override
public void validar(DatosCancelacionConsulta datos) {
var consulta = consultaRepository.getReferenceById(datos.idConsulta());
var ahora = LocalDateTime.now();
if (consulta.getFecha().isBefore(ahora.plusHours(24))) {
throw new ValidacionException(
"La consulta solo puede cancelarse con al menos 24 horas de anticipación."
);
}
}
}
@Service
public class ReservaDeConsultas {
@Autowired
private ConsultaRepository consultaRepository;
@Autowired
private List<ValidadorCancelacionDeConsultas> validadoresCancelacion;
@Transactional
public void cancelar(DatosCancelacionConsulta datos) {
if (!consultaRepository.existsById(datos.idConsulta())) {
throw new ValidacionException("El id de la consulta informado no existe.");
}
validadoresCancelacion.forEach(v -> v.validar(datos));
var consulta = consultaRepository.getReferenceById(datos.idConsulta());
consulta.cancelar(datos.motivo());
}
alter table consultas add column motivo_cancelacion varchar(100);