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
;
}
}