Subversion Repositories Integrator Subversion

Rev

Blame | Last modification | View Log | Download | RSS feed

package br.edu.cesmac.sic.core.domain.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;

import org.hibernate.envers.AuditTable;
import org.hibernate.envers.Audited;
import org.hibernate.envers.RelationTargetAuditMode;

import br.edu.cesmac.core.interfaces.Alterar;
import br.edu.cesmac.core.interfaces.Cadastrar;
import br.edu.cesmac.core.util.StringUtil;
import br.edu.cesmac.core.util.VerificadorUtil;
import br.edu.cesmac.sic.core.domain.model.dto.TopicoQuestaoDTO;
import br.edu.cesmac.sic.core.domain.model.tipo.TipoConceitoGlobal;
import br.edu.cesmac.sic.core.domain.model.tipo.TipoTopico;

@Audited
@AuditTable(value="sic_aud_avaliacao", schema="admsic001")
@Entity
@Table(name="sic_avaliacao", schema="admsic001")
public class Avaliacao implements Serializable {

        private static final long serialVersionUID = 1L;
       
        private AvaliacaoId avaliacaoId = new AvaliacaoId();
        private ProjetoPesquisaAvaliador projetoPesquisaAvaliador;
       
        private Boolean indicadorTecnicoCientificoRelevante;
        private Boolean indicadorComissaoEtica;
        private Boolean indicadorRegistroComiteEtica;
        private String tipoConceitoGlobal;
        private String numeroProcotoloComiteEtica;
        private Boolean indicadorParecerAdequado;
        private String justificativa;
        private Boolean indicadorValidacao = false;
        private Set<Resposta> respostas = new HashSet<Resposta>();
       
        @EmbeddedId
        public AvaliacaoId getAvaliacaoId() {
                return avaliacaoId;
        }
       
        public void setAvaliacaoId(AvaliacaoId avaliacaoId) {
                this.avaliacaoId = avaliacaoId;
        }
       
        @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
        @ManyToOne
        @JoinColumns(value={
                @JoinColumn(name="seq_avaliador", referencedColumnName="seq_avaliador", nullable=false, insertable=false, updatable=false),
                @JoinColumn(name="seq_projeto_pesquisa", referencedColumnName="seq_projeto_pesquisa", nullable=false, insertable=false, updatable=false),
        })
        public ProjetoPesquisaAvaliador getProjetoPesquisaAvaliador() {
                return projetoPesquisaAvaliador;
        }
       
        public void setProjetoPesquisaAvaliador(ProjetoPesquisaAvaliador projetoPesquisaAvaliador) {
                if(VerificadorUtil.naoEstaNulo(projetoPesquisaAvaliador)) {
                        avaliacaoId.setSequencialAvaliador(projetoPesquisaAvaliador.getSequencialDoAvaliador());
                        avaliacaoId.setSequencialProjetoPesquisa(projetoPesquisaAvaliador.getSequencialDoProjetoPesquisa());
                }
                this.projetoPesquisaAvaliador = projetoPesquisaAvaliador;
        }
       
        @NotNull(message="Obrigatório informar o indicador de mérito técnico-científico relevante", groups={Cadastrar.class, Alterar.class})
        @Column(name="ind_merteccienrel", nullable=false)
        public Boolean getIndicadorTecnicoCientificoRelevante() {
                return indicadorTecnicoCientificoRelevante;
        }
       
        public void setIndicadorTecnicoCientificoRelevante(Boolean indicadorTecnicoCientificoRelevante) {
                this.indicadorTecnicoCientificoRelevante = indicadorTecnicoCientificoRelevante;
        }
       
        @NotNull(message="Obrigatório informar o indicador de necessidade de comitê de ética", groups={Cadastrar.class, Alterar.class})
        @Column(name="ind_neccomitetic", nullable=false)
        public Boolean getIndicadorComissaoEtica() {
                return indicadorComissaoEtica;
        }
       
        public void setIndicadorComissaoEtica(Boolean indicadorComissaoEtica) {
                this.indicadorComissaoEtica = indicadorComissaoEtica;
        }
       
        @NotNull(message="Obrigatório informar o indicador de registro de comitê de ética", groups={Cadastrar.class, Alterar.class})
        @Column(name="ind_registro_comitetic", nullable=false)
        public Boolean getIndicadorRegistroComiteEtica() {
                return indicadorRegistroComiteEtica;
        }
       
        public void setIndicadorRegistroComiteEtica(Boolean indicadorRegistroComiteEtica) {
                this.indicadorRegistroComiteEtica = indicadorRegistroComiteEtica;
        }
       
        @NotNull(message="Obrigatório informar o conceito global", groups={Cadastrar.class, Alterar.class})
        @Column(name="tip_conceito_global", nullable=false)
        public String getTipoConceitoGlobal() {
                return tipoConceitoGlobal;
        }
       
        public void setTipoConceitoGlobal(String tipoConceitoGlobal) {
                this.tipoConceitoGlobal = tipoConceitoGlobal;
        }
       
        @Column(name="dsc_protocolo_comitetic")
        public String getNumeroProcotoloComiteEtica() {
                return numeroProcotoloComiteEtica;
        }
       
        public void setNumeroProcotoloComiteEtica(String numeroProcotoloComiteEtica) {
                this.numeroProcotoloComiteEtica = numeroProcotoloComiteEtica;
        }
       
        @NotNull(message="Obrigatório informar o indicador de parecer adequado", groups={Cadastrar.class, Alterar.class})
        @Column(name="ind_parecer_adequado", nullable=false)
        public Boolean getIndicadorParecerAdequado() {
                return indicadorParecerAdequado;
        }
       
        public void setIndicadorParecerAdequado(Boolean indicadorParecerAdequado) {
                this.indicadorParecerAdequado = indicadorParecerAdequado;
        }
       
        @Column(name="dsc_justificativa")
        public String getJustificativa() {
                return justificativa;
        }
       
        public void setJustificativa(String justificativa) {
                this.justificativa = StringUtil.setarUpperCase(justificativa);
        }
       
        @Column(name="ind_validado")
        public Boolean getIndicadorValidacao() {
                return indicadorValidacao;
        }
       
        public void setIndicadorValidacao(Boolean indicadorValidacao) {
                this.indicadorValidacao = indicadorValidacao;
        }
       
        @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
        @Valid
        @OneToMany(mappedBy="avaliacao", cascade=CascadeType.ALL, orphanRemoval=true)
        public Set<Resposta> getRespostas() {
                return respostas;
        }
       
        public void setRespostas(Set<Resposta> respostas) {
                this.respostas = respostas;
        }

        @Override
        public int hashCode() {
                final int prime = 31;
                int result = 1;
                result = prime * result + ((avaliacaoId == null) ? 0 : avaliacaoId.hashCode());
                return result;
        }

        @Override
        public boolean equals(Object obj) {
                if (this == obj)
                        return true;
                if (obj == null)
                        return false;
                if (getClass() != obj.getClass())
                        return false;
                Avaliacao other = (Avaliacao) obj;
                if (avaliacaoId == null) {
                        if (other.avaliacaoId != null)
                                return false;
                } else if (!avaliacaoId.equals(other.avaliacaoId))
                        return false;
                return true;
        }
       
        @Transient
        public Long getSequencialDoAvaliador() {
                return VerificadorUtil.naoEstaNulo(getAvaliacaoId())? getAvaliacaoId().getSequencialAvaliador() : null;
        }
       
        @Transient
        public Long getSequencialDoProjetoPesquisa() {
                return VerificadorUtil.naoEstaNulo(getAvaliacaoId())? getAvaliacaoId().getSequencialProjetoPesquisa() : null;
        }
       
        @Transient
        public String getDescricaoDoTipoConceitoGlobal() {
                return VerificadorUtil.naoEstaNulo(getTipoConceitoGlobal())? TipoConceitoGlobal.parse(getTipoConceitoGlobal()).getDescricao() : null;
        }
       
        @Transient
        public Double getValorPontuacaoTotal() {
                Double valorTotal = new Double(0.0);
                if (VerificadorUtil.naoEstaNulo(getRespostas())) {
                        for (Resposta resposta : getRespostas()) {
                                valorTotal = valorTotal + resposta.getValorPontuacao();
                        }
                }
                return valorTotal;
        }
       
        @Transient
        public String getNomeDoAvaliador() {
                return VerificadorUtil.naoEstaNulo(getProjetoPesquisaAvaliador())? getProjetoPesquisaAvaliador().getNomeDoAvaliador() : null;
        }
       
        @Transient
        public List<TopicoQuestaoDTO> getTopicosOrdenados() {
                List<TopicoQuestaoDTO> topicos = new ArrayList<TopicoQuestaoDTO>();
                List<Resposta> respostasDTO = new ArrayList<Resposta>(respostas);
                if (VerificadorUtil.naoEstaNulo(respostasDTO)) {
                        adicionarRespostasDoTopico(topicos, null, respostasDTO);
                        adicionarRespostasDoTopico(topicos, TipoTopico.INTRODUCAO.getValue(), respostasDTO);
                        adicionarRespostasDoTopico(topicos, TipoTopico.OBJETIVOS.getValue(), respostasDTO);
                        adicionarRespostasDoTopico(topicos, TipoTopico.METODOLOGIA.getValue(), respostasDTO);
                        adicionarRespostasDoTopico(topicos, TipoTopico.REFERENCIAS.getValue(), respostasDTO);
                        adicionarRespostasDoTopico(topicos, TipoTopico.PLANO_ATIVIDADES_CRONOGRAMA.getValue(), respostasDTO);
                }
                return topicos;
        }
       
        private void adicionarRespostasDoTopico(List<TopicoQuestaoDTO> topicos, String tipoTopico, List<Resposta> respostas) {
                TopicoQuestaoDTO topico = new TopicoQuestaoDTO(tipoTopico);
                for (Resposta resposta : getRespostasOrdenadas(respostas)) {
                        if (VerificadorUtil.naoEstaNulo(resposta.getQuestao().getTipoTopico())) {
                                if (resposta.getQuestao().getTipoTopico().equals(tipoTopico)) {
                                        topico.getRespostas().add(resposta);
                                }
                        } else if (VerificadorUtil.estaNulo(tipoTopico)) {
                                topico.getRespostas().add(resposta);
                        }
                }
                topicos.add(topico);
        }

        @Transient
        public List<Resposta> getRespostasOrdenadas(List<Resposta> respostas) {
                List<Resposta> respostasOrdenadas = null;
                if (VerificadorUtil.naoEstaNulo(respostas)) {
                        respostasOrdenadas = new ArrayList<Resposta>(respostas);
                        Collections.sort(respostasOrdenadas, new Comparator<Resposta>() {
                                public int compare(Resposta r1, Resposta r2) {
                                        return r1.getQuestao().getNumeroQuestao().compareTo(r2.getQuestao().getNumeroQuestao());
                                };
                        });
                }
                return respostasOrdenadas;
        }
       
}