package br.com.ec.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.FetchType;
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.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.Size;
import org.hibernate.annotations.ForeignKey;
import org.hibernate.validator.constraints.NotEmpty;
import br.com.ec.core.interfaces.Alterar;
import br.com.ec.core.interfaces.Cadastrar;
import br.com.ec.core.util.StringUtil;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.model.tipos.TipoCategoria;
@
Entity
@Table
(name=
"sec_categoria", schema=
"sc_sec")
public class Categoria
implements Serializable {
private static final long serialVersionUID = 1L
;
private Long sequencial
;
private Categoria categoriaPai
;
private String descricao
;
private String tipo
;
private Set<Categoria
> listaCategoriasFilhas
;
private IndicadorDre indicadorDRE
;
private Boolean ativo
;
private Boolean consultarApenasFilhos
;
public Categoria
() {
listaCategoriasFilhas =
new HashSet<Categoria
>();
}
public Categoria
(Long sequencial
) {
this.
sequencial = sequencial
;
listaCategoriasFilhas =
new HashSet<Categoria
>();
}
@Id
@SequenceGenerator
(name =
"sq_categoria")
@GeneratedValue
(strategy = GenerationType.
IDENTITY)
@Column
(name=
"seq_categoria", nullable=
false)
public Long getSequencial
() {
return sequencial
;
}
public void setSequencial
(Long sequencial
) {
this.
sequencial = sequencial
;
}
@ManyToOne
@ForeignKey
(name =
"fk_categoria_categoriapai")
@JoinColumn
(name=
"seq_categoria_pai", referencedColumnName=
"seq_categoria", insertable=
true, updatable=
true)
public Categoria getCategoriaPai
() {
return categoriaPai
;
}
public void setCategoriaPai
(Categoria categoriaPai
) {
this.
categoriaPai = categoriaPai
;
}
@Column
(name=
"dsc_categoria")
@
NotEmpty(message=
"Obrigatório informar a descrição", groups=
{Cadastrar.
class, Alterar.
class})
@Size
(max =
120, message =
"Limite de caracteres ultrapassado: Descrição")
public String getDescricao
() {
return descricao
;
}
public void setDescricao
(String descricao
) {
this.
descricao = StringUtil.
setarUpperCaseComTrim(descricao
);
}
@
NotEmpty(message=
"Obrigatório informar o tipo da categoria", groups=
{Cadastrar.
class, Alterar.
class})
@Column
(name=
"tip_categoria")
public String getTipo
() {
return tipo
;
}
public void setTipo
(String tipo
) {
this.
tipo = tipo
;
}
@OneToMany
(mappedBy=
"categoriaPai", cascade=CascadeType.
ALL, fetch=FetchType.
LAZY, orphanRemoval=
true)
public Set<Categoria
> getListaCategoriasFilhas
() {
return listaCategoriasFilhas
;
}
public void setListaCategoriasFilhas
(Set<Categoria
> listaCategoriasFilhas
) {
this.
listaCategoriasFilhas = listaCategoriasFilhas
;
}
@ManyToOne
@ForeignKey
(name =
"fk_categoria_dre")
@JoinColumn
(name=
"cod_dre", referencedColumnName=
"cod_dre", insertable=
true, updatable=
true, nullable=
true)
public IndicadorDre getIndicadorDRE
() {
return indicadorDRE
;
}
public void setIndicadorDRE
(IndicadorDre indicadorDRE
) {
this.
indicadorDRE = indicadorDRE
;
}
@Column
(name=
"ind_ativo", nullable=
false)
public Boolean getAtivo
() {
return ativo
;
}
public void setAtivo
(Boolean ativo
) {
this.
ativo = ativo
;
}
@Transient
public Boolean getConsultarApenasFilhos
() {
return consultarApenasFilhos
;
}
public void setConsultarApenasFilhos
(Boolean consultarApenasFilhos
) {
this.
consultarApenasFilhos = consultarApenasFilhos
;
}
@Transient
public String getTipoCategoriaDescricao
() {
return VerificadorUtil.
naoEstaNuloOuVazio(getTipo
())? TipoCategoria.
parse(getTipo
()).
getDescricao() :
null;
}
@Transient
public String getDescricaoDaCategoriaPai
() {
return VerificadorUtil.
naoEstaNulo(getCategoriaPai
())? getCategoriaPai
().
getDescricao() :
null;
}
@
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;
Categoria other =
(Categoria
) obj
;
if (sequencial ==
null) {
if (other.
sequencial !=
null)
return false;
} else if (!sequencial.
equals(other.
sequencial))
return false;
return true;
}
}