package br.edu.cesmac.sic.core.domain.model;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
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 org.hibernate.validator.constraints.NotEmpty;
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.sac.shared.views.CursoView;
import br.edu.cesmac.sca.shared.views.UsuarioView;
import br.edu.cesmac.sic.core.domain.model.tipo.TipoDocumentoProjeto;
import br.edu.cesmac.sic.core.domain.model.tipo.TipoSituacaoInscricao;
@Audited
@AuditTable
(value=
"sic_aud_projeto_pesquisa", schema=
"admsic001")
@
Entity
@Table
(name=
"sic_projeto_pesquisa", schema=
"admsic001")
public class ProjetoPesquisa
implements Serializable {
private static final long serialVersionUID = 1L
;
private Long sequencial
;
private ProcessoSeletivo processoSeletivo
;
private String titulo
;
private CursoView curso
;
private Area area
;
private Set<ProjetoPesquisaAluno
> discentes =
new HashSet<ProjetoPesquisaAluno
>();
private Set<ProjetoPesquisaOrientador
> orientadores =
new HashSet<ProjetoPesquisaOrientador
>();
private Set<ProjetoPesquisaAvaliador
> avaliadores =
new HashSet<ProjetoPesquisaAvaliador
>();
private Set<ArquivoProjeto
> arquivos =
new HashSet<ArquivoProjeto
>();
private String emailContato
;
private String observacao
;
private String tipoSituacaoInscricao
;
private Boolean indicadorProjetoCienciaTecnologia
;
private Boolean indicadorAprovado
;
@Id
@GeneratedValue
(strategy=GenerationType.
AUTO)
@Column
(name=
"seq_projeto_pesquisa", nullable=
false)
public Long getSequencial
() {
return sequencial
;
}
public void setSequencial
(Long sequencial
) {
this.
sequencial = sequencial
;
}
@Audited
(targetAuditMode = RelationTargetAuditMode.
NOT_AUDITED)
@ManyToOne
@NotNull
(message=
"Obrigatório informar o processo seletivo", groups=
{Cadastrar.
class, Alterar.
class})
@JoinColumn
(name=
"seq_processo_seletivo", referencedColumnName=
"seq_processo_seletivo", nullable=
false)
public ProcessoSeletivo getProcessoSeletivo
() {
return processoSeletivo
;
}
public void setProcessoSeletivo
(ProcessoSeletivo processoSeletivo
) {
this.
processoSeletivo = processoSeletivo
;
}
@NotNull
(message=
"Obrigatório informar o título", groups=
{Cadastrar.
class, Alterar.
class})
@
NotEmpty(message=
"Obrigatório informar o título", groups=
{Cadastrar.
class, Alterar.
class})
@Column
(name=
"dsc_titulo", nullable=
false)
public String getTitulo
() {
return titulo
;
}
public void setTitulo
(String titulo
) {
this.
titulo = StringUtil.
setarUpperCase(titulo
);
}
@Audited
(targetAuditMode = RelationTargetAuditMode.
NOT_AUDITED)
@ManyToOne
@NotNull
(message=
"Obrigatório informar o curso", groups=
{Cadastrar.
class, Alterar.
class})
@JoinColumn
(name=
"seq_curso", referencedColumnName=
"seq_curso")
public CursoView getCurso
() {
return curso
;
}
public void setCurso
(CursoView curso
) {
this.
curso = curso
;
}
@Audited
(targetAuditMode = RelationTargetAuditMode.
NOT_AUDITED)
@ManyToOne
@NotNull
(message=
"Obrigatório informar a área", groups=
{Cadastrar.
class, Alterar.
class})
@JoinColumn
(name=
"cod_area", referencedColumnName=
"cod_area")
public Area getArea
() {
return area
;
}
public void setArea
(Area area
) {
this.
area = area
;
}
@Audited
(targetAuditMode = RelationTargetAuditMode.
NOT_AUDITED)
@Valid
@OneToMany
(mappedBy=
"projetoPesquisa", cascade=CascadeType.
ALL, orphanRemoval=
true)
public Set<ProjetoPesquisaAluno
> getDiscentes
() {
return discentes
;
}
public void setDiscentes
(Set<ProjetoPesquisaAluno
> discentes
) {
this.
discentes = discentes
;
}
@Audited
(targetAuditMode = RelationTargetAuditMode.
NOT_AUDITED)
@Valid
@OneToMany
(mappedBy=
"projetoPesquisa", cascade=CascadeType.
ALL, orphanRemoval=
true)
public Set<ProjetoPesquisaOrientador
> getOrientadores
() {
return orientadores
;
}
public void setOrientadores
(Set<ProjetoPesquisaOrientador
> orientadores
) {
this.
orientadores = orientadores
;
}
@Audited
(targetAuditMode = RelationTargetAuditMode.
NOT_AUDITED)
@Valid
@OneToMany
(mappedBy=
"projetoPesquisa", cascade=CascadeType.
ALL, orphanRemoval=
true)
public Set<ProjetoPesquisaAvaliador
> getAvaliadores
() {
return avaliadores
;
}
public void setAvaliadores
(Set<ProjetoPesquisaAvaliador
> avaliadores
) {
this.
avaliadores = avaliadores
;
}
@Audited
(targetAuditMode = RelationTargetAuditMode.
NOT_AUDITED)
@Valid
@OneToMany
(mappedBy=
"projetoPesquisa", cascade=CascadeType.
ALL, orphanRemoval=
true)
public Set<ArquivoProjeto
> getArquivos
() {
return arquivos
;
}
public void setArquivos
(Set<ArquivoProjeto
> arquivos
) {
this.
arquivos = arquivos
;
}
@NotNull
(message=
"Obrigatório informar o email para contato", groups=
{Cadastrar.
class, Alterar.
class})
@
NotEmpty(message=
"Obrigatório informar o email para contato", groups=
{Cadastrar.
class, Alterar.
class})
@Column
(name=
"dsc_email_contato", nullable=
false)
public String getEmailContato
() {
return emailContato
;
}
public void setEmailContato
(String emailContato
) {
this.
emailContato = emailContato
;
}
@Column
(name=
"dsc_observacao")
public String getObservacao
() {
return observacao
;
}
public void setObservacao
(String observacao
) {
this.
observacao = StringUtil.
setarUpperCase(observacao
);
}
@NotNull
(message=
"Obrigatório informar a situação da inscrição", groups=
{Cadastrar.
class, Alterar.
class})
@
NotEmpty(message=
"Obrigatório informar a situação da inscrição", groups=
{Cadastrar.
class, Alterar.
class})
@Column
(name=
"tip_situacao_inscricao")
public String getTipoSituacaoInscricao
() {
return tipoSituacaoInscricao
;
}
public void setTipoSituacaoInscricao
(String tipoSituacaoInscricao
) {
this.
tipoSituacaoInscricao = tipoSituacaoInscricao
;
}
@NotNull
(message=
"Obrigatório informar o indicador de Projeto de Ciência e Tecnologia", groups=
{Cadastrar.
class, Alterar.
class})
@Column
(name=
"ind_projcienciastec", nullable=
false)
public Boolean getIndicadorProjetoCienciaTecnologia
() {
return indicadorProjetoCienciaTecnologia
;
}
public void setIndicadorProjetoCienciaTecnologia
(Boolean indicadorProjetoCienciaTecnologia
) {
this.
indicadorProjetoCienciaTecnologia = indicadorProjetoCienciaTecnologia
;
}
@Column
(name=
"ind_aprovado")
public Boolean getIndicadorAprovado
() {
return indicadorAprovado
;
}
public void setIndicadorAprovado
(Boolean indicadorAprovado
) {
this.
indicadorAprovado = indicadorAprovado
;
}
@
Override
public int hashCode
() {
final int prime =
31;
int result =
1;
result = prime
* result +
((sequencial ==
null) ? 0 : sequencial.
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;
ProjetoPesquisa other =
(ProjetoPesquisa
) obj
;
if (sequencial ==
null) {
if (other.
sequencial !=
null)
return false;
} else if (!sequencial.
equals(other.
sequencial))
return false;
return true;
}
@Transient
public Long getSequencialDoProcessoSeletivo
() {
return VerificadorUtil.
naoEstaNulo(processoSeletivo
)? getProcessoSeletivo
().
getSequencial() :
null;
}
@Transient
public String getDescricaoDoProcessoSeletivo
() {
return VerificadorUtil.
naoEstaNulo(processoSeletivo
)? getProcessoSeletivo
().
getDescricao() :
null;
}
@Transient
public ArquivoProjeto getArquivoProjeto
() {
if (VerificadorUtil.
naoEstaNuloOuVazio(getArquivos
())) {
for(ArquivoProjeto arquivo : getArquivos
()) {
if (arquivo.
getTipoDocumentoProjeto().
equals(TipoDocumentoProjeto.
PROJETO.
getValue())) {
return arquivo
;
}
}
}
return null;
}
@Transient
public ArquivoProjeto getArquivoProjetoParaAvaliador
() {
if (VerificadorUtil.
naoEstaNuloOuVazio(getArquivos
())) {
for(ArquivoProjeto arquivo : getArquivos
()) {
if (arquivo.
getTipoDocumentoProjeto().
equals(TipoDocumentoProjeto.
PROJETO_AVALIACAO.
getValue())) {
return arquivo
;
}
}
}
return null;
}
@Transient
public ProjetoPesquisaOrientador getOrientador
() {
if (VerificadorUtil.
naoEstaNuloOuVazio(getOrientadores
())) {
for (ProjetoPesquisaOrientador orientador : getOrientadores
()) {
if (!orientador.
getIndicadorCoorientador()) {
return orientador
;
}
}
}
return null;
}
@Transient
public ProjetoPesquisaOrientador getCoorientador
() {
if (VerificadorUtil.
naoEstaNuloOuVazio(getOrientadores
())) {
for (ProjetoPesquisaOrientador orientador : getOrientadores
()) {
if (orientador.
getIndicadorCoorientador()) {
return orientador
;
}
}
}
return null;
}
@Transient
public ProjetoPesquisaAluno getDiscenteBolsista
() {
if (VerificadorUtil.
naoEstaNuloOuVazio(getDiscentes
())) {
for (ProjetoPesquisaAluno discente : getDiscentes
()) {
if (discente.
getIndicadorBolsista()) {
return discente
;
}
}
}
return null;
}
@Transient
public String getDescricaoDoCurso
() {
return VerificadorUtil.
naoEstaNulo(getCurso
())? getCurso
().
getDescricao():
null;
}
@Transient
public Boolean tipoSituacaoInscricaoEmAnalise
() {
return getTipoSituacaoInscricao
().
equals(TipoSituacaoInscricao.
ANALISE.
getValue());
}
@Transient
public Boolean tipoSituacaoInscricaoConfirmada
() {
return getTipoSituacaoInscricao
().
equals(TipoSituacaoInscricao.
CONFIRMADA.
getValue());
}
@Transient
public Boolean tipoSituacaoInscricaoComPendencia
() {
return getTipoSituacaoInscricao
().
equals(TipoSituacaoInscricao.
PENDENCIA.
getValue());
}
@Transient
public String getDescricaoDoTipoSituacaoInscricao
() {
return TipoSituacaoInscricao.
parse(getTipoSituacaoInscricao
()).
getDescricao();
}
@Transient
public Boolean usuarioEhAvaliador
(UsuarioView usuario
) {
for (ProjetoPesquisaAvaliador avaliador : getAvaliadores
()) {
if (avaliador.
getSequencialDoAvaliador().
equals(usuario.
getPessoa().
getSequencial())) {
return true;
}
}
return false;
}
@Transient
public Boolean aprovador
() {
return VerificadorUtil.
naoEstaNulo(getIndicadorAprovado
())? getIndicadorAprovado
() :
false;
}
@Transient
public String getDescricaoDaArea
() {
return VerificadorUtil.
naoEstaNulo(getArea
())? getArea
().
getDescricao() :
null;
}
}