/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package br.edu.ifnmg.GerenciamentoEventos.DomainModel; import br.edu.ifnmg.DomainModel.AreaConhecimento; import br.edu.ifnmg.DomainModel.Arquivo; import br.edu.ifnmg.DomainModel.Entidade; import br.edu.ifnmg.DomainModel.Pessoa; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; import javax.persistence.Cacheable; import javax.persistence.CascadeType; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.Lob; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; import javax.persistence.Version; /** * * @author petronio */ @Cacheable(false) @Entity @Table(name="submissoes") public class Submissao implements Entidade, Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @ManyToOne(fetch = FetchType.EAGER) private Inscricao inscricao; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) QuestionarioResposta resposta; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Arquivo arquivo1; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Arquivo arquivo2; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Arquivo arquivo3; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Arquivo arquivo4; @Column(nullable = false) private String titulo; @Lob() private String resumo; @ElementCollection @CollectionTable(name = "submissoes_palavraschave", joinColumns = @JoinColumn(name = "submissao")) @Column(name = "palavrachave") private List<String> palavraschave; @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) private List<SubmissaoAvaliacao> avaliacoes; @Column(nullable = false) private String autor1; @Column(nullable = true) private String autor2; @Column(nullable = true) private String autor3; @Column(nullable = true) private String autor4; @Column(nullable = true) private String autor5; private double total; @Enumerated() private SubmissaoStatus status; @ManyToMany(fetch = FetchType.EAGER, targetEntity = AreaConhecimento.class) private List<AreaConhecimento> areasConhecimento; @ManyToMany(targetEntity = Pessoa.class) private List<Pessoa> avaliadores; public Submissao() { this.palavraschave = new ArrayList<>(); this.avaliacoes = new ArrayList<>(); this.areasConhecimento = new ArrayList<>(); this.avaliadores = new ArrayList<>(); this.status = SubmissaoStatus.EmEdicao; this.autor3 = ""; this.autor4 = ""; this.autor5 = ""; } public void add(Pessoa avaliador) { if(avaliador == null) return; if (!avaliadores.contains(avaliador)) { avaliadores.add(avaliador); } } public void remove(Pessoa avaliador) { if(avaliador == null) return; if (avaliadores.contains(avaliador)) { avaliadores.remove(avaliador); } } public void add(SubmissaoAvaliacao avaliacao) { if(getStatus() != SubmissaoStatus.Atribuido && getStatus() != SubmissaoStatus.Avaliado) return; if (!avaliacoes.contains(avaliacao)) { avaliacao.setSubmissao(this); avaliacoes.add(avaliacao); if(getStatus() == SubmissaoStatus.Atribuido) setStatus(SubmissaoStatus.Avaliado); } } public void remove(SubmissaoAvaliacao avaliacao) { if(getStatus() != SubmissaoStatus.Avaliado) return; if (avaliacoes.contains(avaliacao)) { avaliacoes.remove(avaliacao); } if(avaliacoes.isEmpty()) setStatus(SubmissaoStatus.Pendente); } public void add(AreaConhecimento a) { if(a == null) return; if (!areasConhecimento.contains(a)) { areasConhecimento.add(a); } } public void remove(AreaConhecimento a) { if(a == null) return; if (areasConhecimento.contains(a)) { areasConhecimento.remove(a); } } public void add(String a) { if(a == null) return; if (!palavraschave.contains(a)) { palavraschave.add(a); } } public void remove(String a) { if(a == null) return; if (palavraschave.contains(a)) { palavraschave.remove(a); } } public boolean hasPalavrasChave() { return ! this.palavraschave.isEmpty(); } public boolean hasAreaConhecimento() { return ! this.areasConhecimento.isEmpty(); } public boolean hasMinimoDeAutores() { return countAutores() >= ((InscricaoItem)getInscricao()).getAtividade().getQuantidadeAutores(); } public boolean hasMinimoDeArquivos() { return countArquivos()>= ((InscricaoItem)getInscricao()).getAtividade().getQuantidadeArquivos(); } public boolean pendente() { if(getStatus() == SubmissaoStatus.EmEdicao && hasPalavrasChave() && hasAreaConhecimento() && hasMinimoDeAutores() && hasMinimoDeArquivos()){ setStatus(SubmissaoStatus.Pendente); return true; } else { return false; } } public boolean isEmEdicao() { return getStatus() == SubmissaoStatus.EmEdicao; } public boolean isEmAvaliacao() { return getStatus() == SubmissaoStatus.Atribuido; } public boolean isProntoParaCertificado() { return getStatus() == SubmissaoStatus.Aprovado; } public int countAutores() { int tmp = 0; if(autor1 != null && !autor1.isEmpty()) tmp++; if(autor2 != null && !autor2.isEmpty()) tmp++; if(autor3 != null && !autor3.isEmpty()) tmp++; if(autor4 != null && !autor4.isEmpty()) tmp++; if(autor5 != null && !autor5.isEmpty()) tmp++; return tmp; } public int countArquivos() { int tmp = 0; if(arquivo1 != null ) tmp++; if(arquivo2 != null ) tmp++; if(arquivo3 != null ) tmp++; if(arquivo4 != null ) tmp++; return tmp; } @Override public Long getId() { return id; } @Override public void setId(Long id) { this.id = id; } public List<SubmissaoAvaliacao> getAvaliacoes() { return avaliacoes; } public void setAvaliacoes(List<SubmissaoAvaliacao> avaliacoes) { this.avaliacoes = avaliacoes; } public List<AreaConhecimento> getAreasConhecimento() { return areasConhecimento; } public void setAreasConhecimento(List<AreaConhecimento> areasConhecimento) { this.areasConhecimento = areasConhecimento; } public Inscricao getInscricao() { return inscricao; } public void setInscricao(Inscricao inscricao) { this.inscricao = inscricao; } public QuestionarioResposta getResposta() { return resposta; } public void setResposta(QuestionarioResposta resposta) { this.resposta = resposta; } public Arquivo getArquivo1() { return arquivo1; } public void setArquivo1(Arquivo arquivo1) { this.arquivo1 = arquivo1; } public Arquivo getArquivo2() { return arquivo2; } public void setArquivo2(Arquivo arquivo2) { this.arquivo2 = arquivo2; } public Arquivo getArquivo3() { return arquivo3; } public void setArquivo3(Arquivo arquivo3) { this.arquivo3 = arquivo3; } public Arquivo getArquivo4() { return arquivo4; } public void setArquivo4(Arquivo arquivo4) { this.arquivo4 = arquivo4; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public String getResumo() { return resumo; } public void setResumo(String descricao) { this.resumo = descricao; } public List<String> getPalavraschave() { return palavraschave; } public void setPalavraschave(List<String> palavraschave) { this.palavraschave = palavraschave; } public String getAutor1() { return autor1; } public void setAutor1(String autor1) { this.autor1 = autor1; } public String getAutor2() { return autor2; } public void setAutor2(String autor2) { this.autor2 = autor2; } public String getAutor3() { return autor3; } public void setAutor3(String autor3) { this.autor3 = autor3; } public String getAutor4() { return autor4; } public void setAutor4(String autor4) { this.autor4 = autor4; } public String getAutor5() { return autor5; } public void setAutor5(String autor5) { this.autor5 = autor5; } public SubmissaoStatus getStatus() { return status; } public void setStatus(SubmissaoStatus status) { this.status = status; } public List<Pessoa> getAvaliadores() { return avaliadores; } public void setAvaliadores(List<Pessoa> avaliadores) { this.avaliadores = avaliadores; } public double getTotal() { return total; } public void setTotal(double total) { this.total = total; } public void verificarStatus(){ switch(getStatus()){ case EmEdicao: if(!((InscricaoItem)getInscricao()).getAtividade().isInscricaoAberto()) setStatus(SubmissaoStatus.Cancelado); break; case Avaliado: concluirAvaliacao(); break; } } private void concluirAvaliacao() { boolean aprovado = false; boolean reprovado = false; boolean desclassificado = false; int valores = 0; int count = 0; for(SubmissaoAvaliacao aval : getAvaliacoes()){ if(aval.getStatus() == SubmissaoStatus.Aprovado){ aprovado = true; } else if(aval.getStatus() == SubmissaoStatus.Reprovado) reprovado = true; else if(aval.getStatus() == SubmissaoStatus.Desclassificado) desclassificado = true; if(getResposta() != null){ count = count + 1; valores = valores + getResposta().getTotal(); } } if(aprovado && !reprovado && !desclassificado){ setStatus(SubmissaoStatus.Aprovado); getInscricao().setStatus(InscricaoStatus.Confirmada); } else if(!aprovado && reprovado && !desclassificado){ setStatus(SubmissaoStatus.Reprovado); getInscricao().setStatus(InscricaoStatus.Recusada); } else if(!aprovado && !reprovado && desclassificado){ setStatus(SubmissaoStatus.Desclassificado); getInscricao().setStatus(InscricaoStatus.Cancelada); } else { setStatus(SubmissaoStatus.Divergencia); } if(count>0) setTotal(valores/count); } @Override public int hashCode() { int hash = 7; hash = 73 * hash + Objects.hashCode(this.id); hash = 73 * hash + Objects.hashCode(this.inscricao); hash = 73 * hash + Objects.hashCode(this.titulo); hash = 73 * hash + Objects.hashCode(this.autor1); return hash; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Submissao other = (Submissao) obj; if (!Objects.equals(this.id, other.id)) { return false; } if (!Objects.equals(this.inscricao, other.inscricao)) { return false; } if (!Objects.equals(this.titulo, other.titulo)) { return false; } if (!Objects.equals(this.autor1, other.autor1)) { return false; } return true; } @Transient String pl = null; public String palavrasChave(){ if(pl == null){ pl = ""; for(String p : getPalavraschave()){ if(!pl.isEmpty()) pl = pl + ","; pl = pl + p; } } return pl; } @Transient String ac = null; public String areasConhecimento(){ if(ac == null){ ac = ""; for(AreaConhecimento a : getAreasConhecimento()){ if(!ac.isEmpty()) ac = ac + ","; ac = ac + a.toString(); } } return ac; } @Transient String au = null; public String autores(){ if(au == null){ au = ""; if(this.autor1 != null && !this.autor1.isEmpty()) au = this.autor1; if(this.autor2 != null && !this.autor2.isEmpty()) au = au + "," + this.autor2; if(this.autor3 != null && !this.autor3.isEmpty()) au = au + "," + this.autor3; if(this.autor4 != null && !this.autor4.isEmpty()) au = au + "," + this.autor4; if(this.autor5 != null && !this.autor4.isEmpty()) au = au + "," + this.autor5; } return au; } public String getAutores() { return this.autores(); } @Override public String toString() { return (titulo != null ? titulo + "(": "(") + id.toString() + ")"; } @ManyToOne(fetch = FetchType.LAZY) private Pessoa criador; @Temporal(TemporalType.TIMESTAMP) private Date dataCriacao; @ManyToOne(fetch = FetchType.LAZY) private Pessoa ultimoAlterador; @Temporal(TemporalType.TIMESTAMP) private Date dataUltimaAlteracao; @Version private Long versao; @Override public Pessoa getCriador() { return criador; } @Override public void setCriador(Pessoa criador) { this.criador = criador; } @Override public Date getDataCriacao() { return dataCriacao; } @Override public void setDataCriacao(Date dataCriacao) { this.dataCriacao = dataCriacao; } @Override public Pessoa getUltimoAlterador() { return ultimoAlterador; } @Override public void setUltimoAlterador(Pessoa ultimoAlterador) { this.ultimoAlterador = ultimoAlterador; } @Override public Date getDataUltimaAlteracao() { return dataUltimaAlteracao; } @Override public void setDataUltimaAlteracao(Date dataUltimaAlteracao) { this.dataUltimaAlteracao = dataUltimaAlteracao; } @Override public Long getVersao() { return versao; } public void setVersao(Long versao) { this.versao = versao; } }