@Transactional public Consulta agendarConsulta(DadosAgendamentoConsulta agendamentoConsulta) {
Paciente paciente = pacienteRepository.findById(agendamentoConsulta.pacienteId())
.orElseThrow(() -> new PacienteNaoEncontradoException(agendamentoConsulta.pacienteId()));
if(!paciente.isAtivo()) {
throw new PacienteInativoException(paciente.getId());
}
if(agendamentoConsulta.medicoId() != null && !medicoRepository.existsById(agendamentoConsulta.medicoId())) {
throw new MedicoNaoEncontradoException(agendamentoConsulta.medicoId());
}
Medico medico = selecionarMedico(agendamentoConsulta);
DadosAgendamentoConsulta dadosAtualizados = new DadosAgendamentoConsulta(
agendamentoConsulta.pacienteId(),
medico.getId(), // Atualiza com o ID do médico selecionado
agendamentoConsulta.dataConsulta(),
agendamentoConsulta.especialidadeMedica()
);
//Validações de consulta.
validacoesAgendamentoConsulta.forEach(v -> v.validar(dadosAtualizados));
// Criar e salvar a consulta
Consulta consulta = new Consulta(dadosAtualizados, medico, paciente);
return consultaRepository.save(consulta);
}
private Medico selecionarMedico(DadosAgendamentoConsulta agendamentoConsulta) {
if (agendamentoConsulta.medicoId() == null) {
if (agendamentoConsulta.especialidadeMedica() == null){
throw new EspecialidadeNulaException();
}
Optional<Medico> medicoAleatorio = medicoRepository.medicoAletorio(Especialidade.fromEspecialidade(agendamentoConsulta.especialidadeMedica()));
return medicoAleatorio.orElseThrow(() -> new MedicoNaoEncontradoException(Especialidade.fromEspecialidade(agendamentoConsulta.especialidadeMedica())));
}
Medico medico = medicoRepository.findById(agendamentoConsulta.medicoId())
.orElseThrow(() -> new MedicoNaoEncontradoException(agendamentoConsulta.medicoId()));
if (!medico.isAtivo()) {
throw new MedicoInativoException(medico.getId());
}
return medico;
} Ao gerar um médico aleatoriamente, a validação de conflito de horário com o médico gerado é desconsiderado se não atualizarmos o Dto com o id do médico que o método selecionarMedico(No meu caso, seu método pode ser diferente), uma vez que validando antes de gerar o médico aleatório, estamos validando um dto sem médico, logo a validação não ocorre, apenas se o médico não estiver nulo.