package br.com.compreender.entender.ler.escola.api_rest.domain.aulas;
import br.com.compreender.entender.ler.escola.api_rest.domain.alunos.AlunoEntity;
import br.com.compreender.entender.ler.escola.api_rest.domain.professor.ProfessorEntity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Getter
@Table(name = "aulas")
@Entity(name = "AulaEntity")
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class AulaEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "professor_id")
private ProfessorEntity professor;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "aluno_id")
private AlunoEntity aluno;
private LocalDateTime data;
@Column(name = "motivo_cancelamento")
@Enumerated(EnumType.STRING)
private MotivoDoCancelamento motivoDoCancelamento;
public void cancelar(MotivoDoCancelamento motivo) {
this.motivoDoCancelamento = motivo;
}
}
package br.com.compreender.entender.ler.escola.api_rest.domain.professor;
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 ProfessorRepository extends JpaRepository<ProfessorEntity, Long> {
Page findAllByAtivoTrue(Pageable paginacao);
@Query("""
select m from ProfessorEntity p
where
p.ativo = true
and
p.especialidade = :especialidade
and
p.id not in(
select a.professor.id from AulaEntity a
where
a.data = :data
)
order by rand()
limit 1
""")
ProfessorEntity escolherProfessorEntityAleatorioLivreNaData(Especialidade especialidade, LocalDateTime data);
}
package br.com.compreender.entender.ler.escola.api_rest.domain.professor;
import br.com.compreender.entender.ler.escola.api_rest.domain.endereco.Endereco;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@Table(name = "professores")
@Entity(name = "ProfessorEntity")
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class ProfessorEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Boolean ativo;
private String nome;
private String email;
private String telefone;
private String celular;
private String matricula;
@Enumerated(EnumType.STRING)
private Especialidade especialidade;
private String rg;
private String cpf;
@Embedded
private Endereco endereco;
public ProfessorEntity(DadosDeCadastroDoProfessor dados) {
this.ativo = true;
this.nome = dados.nome();
this.email = dados.email();
this.telefone = dados.telefone();
this.celular = dados.celular();
this.matricula = dados.matricula();
this.especialidade = dados.especialidade();
this.rg = dados.rg();
this.cpf = dados.cpf();
this.endereco = new Endereco(dados.endereco());
}
public void atualizarInformacoes(DadosDeAtualizacaoDoProfessor dados) {
if (dados.nome() != null) {
this.nome = dados.nome();
}
if (dados.email() != null) {
this.email = dados.email();
}
if (dados.telefone() != null) {
this.telefone = dados.telefone();
}
if (dados.rg() != null) {
this.rg = dados.rg();
}
if (dados.dados() != null) {
this.endereco.atualizarInformacoes(dados.dados());
}
}
public void inativarCadastro() {
this.ativo = false;
}
public void ativarCadastro() {
if (this.ativo == false) {
this.ativo = true;
}
}
}