@Component
public class ValidadorMedComConsultaMesmoHorario implements Validador{
@Autowired
private ConsultaRepository consultaRepository;
public void validar (DadosAgendamentoConsulta dados) {
var medico = consultaRepository.existsByIdMedicoAndData(dados.idMedico(), dados.data());
if(medico) {
throw new RuntimeException("Médico já possui consulta agendada nesse dia e horário!");
}
}
}
@Component
public class ValidadorHorarioAntecedencia implements Validador{
public void validar(DadosAgendamentoConsulta dados) {
var dataConsulta = dados.data();
var agora = LocalDateTime.now();
var diferencaEmMinutos = Duration.between(agora, dataConsulta). toMinutes();
if(diferencaEmMinutos < 30) {
throw new RuntimeException("Consulta deve ser agendada com antecedência mínima de 30 minutos!");
}
}
}
@Component
public class ValidadorHorarioFuncionamento implements Validador{
public void validar(DadosAgendamentoConsulta dados) {
var dataConsulta = dados.data();
//Checar se é domingo
var domingo = dataConsulta.getDayOfWeek().equals(DayOfWeek.SUNDAY);
//Fora do horário de abertura
var antesDaAbertura = dataConsulta.getHour() < 7;
//Fora do horário de fechamento (levando em consideração que a ultima consulta começa
//as 18 hrs e não pode ser marcada consulta após esse horário:
var depoisDoFechamento = dataConsulta.getHour() > 18;
if(domingo || antesDaAbertura || depoisDoFechamento) {
throw new RuntimeException("Consulta fora do horário de funcionamento da clínica");
}
}
}
@Component
public class ValidadorMedicoAtivo implements Validador{
@Autowired
private MedicoRepository medicoRepository;
public void validar (DadosAgendamentoConsulta dados) {
if(dados.idMedico() == null) {
return;
}
var medicoAtivo = medicoRepository.findAtivoById(dados.idMedico());
if(!medicoAtivo) {
throw new RuntimeException("Consulta não pode ser agendada para médicos inativos");
}
}
}
@Component
public class ValidadorPacienteAtivo implements Validador{
@Autowired
private PacientesRepository pacientesRepository;
public void validar(DadosAgendamentoConsulta dados) {
if(dados.idPaciente() == null) {
return;
}
var pacienteAtivo = pacientesRepository.findAtivoById(dados.idPaciente());
if(!pacienteAtivo) {
throw new RuntimeException("Consulta não pode ser agendada para pacientes inativos!");
}
}
}
@Component
public class ValidadorPacienteSemConsultaMesmoDia implements Validador{
@Autowired
private ConsultaRepository consultaRepository;
public void validar (DadosAgendamentoConsulta dados) {
var primeiroHorario = dados.data().withHour(7);
var ultimoHorario = dados.data().withHour(18);
var paciente = consultaRepository.existsByIdPacienteAndDataBetween(dados.idPaciente(), primeiroHorario, ultimoHorario);
if(paciente) {
throw new RuntimeException("Paciente já possui consulta agendada nessa data!");
}
}
}
public interface Validador {
void validar(DadosAgendamentoConsulta dados);
}