package br.gov.al.saude.srv.model;
import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.NotEmpty;
import br.gov.al.saude.framework.core.generic.identidade.Identidade;
import br.gov.al.saude.framework.core.interfaces.Alterar;
import br.gov.al.saude.framework.core.interfaces.Cadastrar;
import br.gov.al.saude.framework.core.util.DocumentoUtils;
import br.gov.al.saude.framework.core.util.VerificadorUtil;
import br.gov.al.saude.framework.model.PessoaDocumentoView;
import br.gov.al.saude.framework.model.PessoaFisicaView;
import br.gov.al.saude.framework.model.UsuarioView;
import br.gov.al.saude.srv.model.enums.TipoSituacaoCadastral;
@
Entity
@Table
(name =
"srv_servidor", schema =
"sc_srv")
public class Servidor
implements Serializable, Identidade
{
private static final long serialVersionUID = 1L
;
private PessoaFisicaView pessoa =
new PessoaFisicaView
();
private String observacao
;
private String tipoSituacaoCadastral
;
private GrauInstrucao grauInstrucao
;
private Deficiencia deficiencia
;
private UsuarioView usuario =
new UsuarioView
();
private UsuarioView usuarioAlteraSituacaoCadastral
;
private Nacionalidade nacionalidade
;
private Date dataHoraCadastro
;
private Date dataHoraAlteracao
;
private byte[] foto
;
private ServidorLocalizacaoArquivo servidorLocalizacaoArquivo
;
private Set<ServidorDadoFuncional
> listaServidorDadoFuncional
;
private Set<ServidorQualificacao
> listaServidorQualificacao
;
private Set<ServidorDependente
> listaServidorDependente
;
private Set<ServidorContaBancaria
> listaServidorContaBancaria
;
public Servidor
(){
tipoSituacaoCadastral = TipoSituacaoCadastral.
PENDENTE.
getValue();
listaServidorDadoFuncional =
new HashSet<ServidorDadoFuncional
>();
listaServidorQualificacao =
new HashSet<ServidorQualificacao
>();
listaServidorDependente =
new HashSet<ServidorDependente
>();
listaServidorContaBancaria =
new HashSet<ServidorContaBancaria
>();
}
@Id
@OneToOne
@JoinColumn
(name=
"seq_pessoa_servidor", referencedColumnName=
"seq_pessoa")
public PessoaFisicaView getPessoa
() {
return pessoa
;
}
public void setPessoa
(PessoaFisicaView pessoa
) {
this.
pessoa = pessoa
;
}
@Column
(name=
"dsc_observacao")
public String getObservacao
() {
return observacao
;
}
public void setObservacao
(String observacao
) {
this.
observacao = observacao
;
}
@Column
(name=
"tip_situacao_cadastral", length=
1, nullable=
false)
public String getTipoSituacaoCadastral
() {
return tipoSituacaoCadastral
;
}
public void setTipoSituacaoCadastral
(String tipoSituacaoCadastral
) {
this.
tipoSituacaoCadastral = tipoSituacaoCadastral
;
}
public void setTipoSituacaoCadastral
(TipoSituacaoCadastral tipoSituacaoCadastral
) {
this.
tipoSituacaoCadastral = tipoSituacaoCadastral.
getValue();
}
@Transient
public TipoSituacaoCadastral getSituacaoCadastral
() {
if(VerificadorUtil.
naoEstaNulo(tipoSituacaoCadastral
)) {
return TipoSituacaoCadastral.
parse(tipoSituacaoCadastral
);
}
return null;
}
@Transient
public String getDescricaoTipoSituacaoCadastral
() {
return VerificadorUtil.
estaNulo(this.
getTipoSituacaoCadastral())?null:TipoSituacaoCadastral.
parse(this.
getTipoSituacaoCadastral()).
getDescricao();
}
@ManyToOne
@JoinColumn
(name=
"cod_grau_instrucao", referencedColumnName=
"cod_grau_instrucao")
@NotNull
(message=
"Obrigatório informar o grau de instrução.", groups=
{Cadastrar.
class, Alterar.
class})
public GrauInstrucao getGrauInstrucao
() {
return grauInstrucao
;
}
public void setGrauInstrucao
(GrauInstrucao grauInstrucao
) {
this.
grauInstrucao = grauInstrucao
;
}
@ManyToOne
@JoinColumn
(name=
"cod_deficiencia", referencedColumnName=
"cod_deficiencia")
public Deficiencia getDeficiencia
() {
return deficiencia
;
}
public void setDeficiencia
(Deficiencia deficiencia
) {
this.
deficiencia = deficiencia
;
}
@ManyToOne
@JoinColumn
(name=
"seq_pessoa_usuario", referencedColumnName=
"seq_pessoa")
public UsuarioView getUsuario
() {
return usuario
;
}
public void setUsuario
(UsuarioView usuario
) {
this.
usuario = usuario
;
}
@ManyToOne
@JoinColumn
(name=
"seq_pessoa_alterasitocadast", referencedColumnName=
"seq_pessoa")
public UsuarioView getUsuarioAlteracaoSituacaoCadastral
() {
return usuarioAlteraSituacaoCadastral
;
}
public void setUsuarioAlteracaoSituacaoCadastral
(UsuarioView usuarioAlteraSituacaoCadastral
) {
this.
usuarioAlteraSituacaoCadastral = usuarioAlteraSituacaoCadastral
;
}
@ManyToOne
@JoinColumn
(name=
"cod_nacionalidade", referencedColumnName=
"cod_nacionalidade")
@NotNull
(message=
"Obrigatório informar a nacionalidade.", groups=
{Cadastrar.
class, Alterar.
class})
public Nacionalidade getNacionalidade
() {
return nacionalidade
;
}
public void setNacionalidade
(Nacionalidade nacionalidade
) {
this.
nacionalidade = nacionalidade
;
}
@Temporal
(TemporalType.
TIMESTAMP)
@Column
(name=
"dth_cadastro")
public Date getDataHoraCadastro
() {
return dataHoraCadastro
;
}
public void setDataHoraCadastro
(Date dataHoraCadastro
) {
this.
dataHoraCadastro = dataHoraCadastro
;
}
@Temporal
(TemporalType.
TIMESTAMP)
@Column
(name=
"dth_alteracao")
public Date getDataHoraAlteracao
() {
return dataHoraAlteracao
;
}
public void setDataHoraAlteracao
(Date dataHoraAlteracao
) {
this.
dataHoraAlteracao = dataHoraAlteracao
;
}
@Column
(name=
"obj_foto")
public byte[] getFoto
() {
return foto
;
}
public void setFoto
(byte[] foto
) {
this.
foto = foto
;
}
@OneToOne
(mappedBy=
"servidor", cascade=CascadeType.
ALL, orphanRemoval =
true)
public ServidorLocalizacaoArquivo getServidorLocalizacaoArquivo
() {
return servidorLocalizacaoArquivo
;
}
public void setServidorLocalizacaoArquivo
(ServidorLocalizacaoArquivo servidorLocalizacaoArquivo
) {
this.
servidorLocalizacaoArquivo = servidorLocalizacaoArquivo
;
}
@Valid
@
NotEmpty(message=
"Obrigatório informar dado funcional.", groups=
{Cadastrar.
class, Alterar.
class})
@OneToMany
(mappedBy=
"servidor", cascade=CascadeType.
ALL, orphanRemoval =
true)
public Set<ServidorDadoFuncional
> getListaServidorDadoFuncional
() {
return listaServidorDadoFuncional
;
}
public void setListaServidorDadoFuncional
(Set<ServidorDadoFuncional
> listaServidorDadoFuncional
) {
this.
listaServidorDadoFuncional = listaServidorDadoFuncional
;
}
@Valid
@OneToMany
(mappedBy=
"servidor", cascade=CascadeType.
ALL, orphanRemoval =
true)
public Set<ServidorQualificacao
> getListaServidorQualificacao
() {
return listaServidorQualificacao
;
}
public void setListaServidorQualificacao
(Set<ServidorQualificacao
> listaServidorQualificacao
) {
this.
listaServidorQualificacao = listaServidorQualificacao
;
}
@Valid
@OneToMany
(mappedBy=
"servidor", cascade=CascadeType.
ALL, orphanRemoval =
true)
public Set<ServidorDependente
> getListaServidorDependente
() {
return listaServidorDependente
;
}
public void setListaServidorDependente
(Set<ServidorDependente
> listaServidorDependente
) {
this.
listaServidorDependente = listaServidorDependente
;
}
@Valid
@OneToMany
(mappedBy=
"servidor", cascade=CascadeType.
ALL, orphanRemoval =
true)
public Set<ServidorContaBancaria
> getListaServidorContaBancaria
() {
return listaServidorContaBancaria
;
}
public void setListaServidorContaBancaria
(Set<ServidorContaBancaria
> listaServidorContaBancaria
) {
this.
listaServidorContaBancaria = listaServidorContaBancaria
;
}
@Transient
public boolean isSituacaoCadastralHomologado
(){
return getTipoSituacaoCadastral
().
equals(TipoSituacaoCadastral.
HOMOLOGADO.
getValue());
}
@Transient
public boolean isSituacaoCadastralPendente
(){
return getTipoSituacaoCadastral
().
equals(TipoSituacaoCadastral.
PENDENTE.
getValue());
}
@Transient
public boolean isSituacaoCadastralValidado
(){
return getTipoSituacaoCadastral
().
equals(TipoSituacaoCadastral.
VALIDADO.
getValue());
}
@Transient
@
Override
public Object getId
() {
return this.
pessoa.
getSequencialPessoa();
}
@
Override
public void setId
(Object id
) {
this.
pessoa.
setSequencialPessoa((Long) id
);
}
@Transient
public Set<PessoaDocumentoView
> getListaDocumentosDePessoa
() {
return (VerificadorUtil.
naoEstaNulo(getPessoa
())? getPessoa
().
getDocumentos():
null);
}
@Transient
public Long getSequencialDaPessoa
() {
return (VerificadorUtil.
naoEstaNulo(getPessoa
())? getPessoa
().
getSequencialPessoa() :
null);
}
@Transient
public String getNomeDaPessoa
() {
return (VerificadorUtil.
naoEstaNulo(getPessoa
())? getPessoa
().
getNomePessoa():
null);
}
@Transient
public String getNumeroCpfFormatado
(){
try {
return DocumentoUtils.
adicionarMascaraCpf(getPessoa
().
getNumeroDocumento());
} catch (Exception e
) {
return null;
}
}
@
Override
public int hashCode
() {
final int prime =
31;
int result =
1;
result = prime
* result +
((pessoa ==
null) ? 0 : pessoa.
hashCode());
return result
;
}
@
Override
public boolean equals
(Object obj
) {
if (this == obj
)
return true;
if (obj ==
null)
return false;
if (!(obj
instanceof Servidor
))
return false;
Servidor other =
(Servidor
) obj
;
if (pessoa ==
null) {
if (other.
pessoa !=
null)
return false;
} else if (!pessoa.
equals(other.
pessoa))
return false;
return true;
}
}