package med.voll.api.domain.medico;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.time.LocalDateTime;
public interface MedicoRepository extends JpaRepository<Medico, Long> {
Page<Medico> findAllByAtivoTrue(Pageable paginacao);
@Query("""
select m from Medico m
where
m.ativo = true
and
m.id not in(
select c.medico.id from Consulta c
where
c.data = :data
)
m.especialidade = :especialidade
order by rand()
limit 1
""")
Medico escolherMedicoAleatorioLivreNaData(Especialidade especialidade, LocalDateTime data);
@Query("""
select m.ativo
from Medico m
where
m.id = :id
""")
Boolean findAtivoById(Long id);
}
package med.voll.api.domain.medico;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import med.voll.api.domain.endereco.Endereco;
@Table(name = "medicos")
@Entity(name = "Medico")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Medico {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
private String email;
private String telefone;
private String crm;
private Boolean ativo;
@Enumerated(EnumType.STRING)
private Especialidade especialidade;
@Embedded
private Endereco endereco;
public Medico(DadosCadastroMedico dados) {
this.ativo = true;
this.nome = dados.nome();
this.email = dados.email();
this.telefone = dados.telefone();
this.crm = dados.crm();
this.especialidade = dados.especialidade();
this.endereco = new Endereco(dados.endereco());
}
public void atualizacaoMedicos(DadosAtualizacaoMedico dados) {
if (dados.nome() != null) {
this.nome = dados.nome();
}
if (dados.Telefone() != null) {
this.telefone = dados.Telefone();
}
if (dados.endereco() != null) {
this.endereco.atualizarInformacoes(dados.endereco());
}
}
public void Excluir() {
this.ativo = false;
}
}