package br.com.ec.domain.model;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
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 br.com.ec.core.util.VerificadorUtil;
@
Entity
@Table
(name=
"sec_compra_produto", schema=
"sc_sec")
public class CompraProduto
implements Serializable {
private static final long serialVersionUID = 1L
;
private Long sequencial
;
private Compra compra
;
private Produto produto
;
private Double valorCompra
;
private Integer quantidade
;
private String unidadeComercial
;
private Integer quantidadeUnidadeComercial
;
private Double valorUnidadeComercial
;
private String unidadeTributaria
;
private Integer quantidadeUnidadeTributaria
;
private Double valorUnidadeTributaria
;
private Double valorDesconto
;
private Boolean indicadorValorTotalNota
;
private String informacoesAdicionais
;
private String codigoProdutoNotaFiscal
;
private String descricaoProdutoNotaFiscal
;
private String codigoNCM
;
private Boolean indicadorSolicitarContagem =
false;
private Integer estoqueAtualProduto
;
// MEDICAMENTO
private String lote
;
private Integer quantidadeLote
;
private Date dataFabricacao
;
private Date dataValidade
;
private Double valorPrecoMaximo
;
public CompraProduto
() {
setUnidadeComercial
("UN");
setUnidadeTributaria
("UN");
}
public CompraProduto
(Long sequencial
) {
this.
sequencial = sequencial
;
setUnidadeComercial
("UN");
setUnidadeTributaria
("UN");
}
@Id
@SequenceGenerator
(name =
"sq_compraproduto")
@GeneratedValue
(strategy = GenerationType.
IDENTITY)
@Column
(name=
"seq_compraproduto", nullable=
false)
public Long getSequencial
() {
return sequencial
;
}
public void setSequencial
(Long sequencial
) {
this.
sequencial = sequencial
;
}
@ManyToOne
@ForeignKey
(name =
"fk_compra_compraproduto")
@JoinColumn
(name=
"seq_compra", referencedColumnName=
"seq_compra", insertable=
true, updatable=
false)
public Compra getCompra
() {
return compra
;
}
public void setCompra
(Compra compra
) {
this.
compra = compra
;
}
@ManyToOne
@ForeignKey
(name =
"fk_prooduto_compraproduto")
@JoinColumn
(name=
"seq_produto", referencedColumnName=
"seq_produto", insertable=
true, updatable=
false)
public Produto getProduto
() {
return produto
;
}
public void setProduto
(Produto produto
) {
this.
produto = produto
;
}
@Column
(name=
"val_compra")
public Double getValorCompra
() {
return valorCompra
;
}
public void setValorCompra
(Double valorCompra
) {
this.
valorCompra = valorCompra
;
}
@Column
(name=
"qtd_compra", nullable=
false)
public Integer getQuantidade
() {
return quantidade
;
}
public void setQuantidade
(Integer quantidade
) {
this.
quantidade = quantidade
;
}
@Column
(name=
"dsc_unidade_comercial")
public String getUnidadeComercial
() {
return unidadeComercial
;
}
public void setUnidadeComercial
(String unidadeComercial
) {
this.
unidadeComercial = unidadeComercial
;
}
@Column
(name=
"qtd_unidade_comercial")
public Integer getQuantidadeUnidadeComercial
() {
return quantidadeUnidadeComercial
;
}
public void setQuantidadeUnidadeComercial
(Integer quantidadeUnidadeComercial
) {
this.
quantidadeUnidadeComercial = quantidadeUnidadeComercial
;
}
@Column
(name=
"val_unidade_comercial")
public Double getValorUnidadeComercial
() {
return valorUnidadeComercial
;
}
public void setValorUnidadeComercial
(Double valorUnidadeComercial
) {
this.
valorUnidadeComercial = valorUnidadeComercial
;
}
@Column
(name=
"dsc_unidade_tributaria")
public String getUnidadeTributaria
() {
return unidadeTributaria
;
}
public void setUnidadeTributaria
(String unidadeTributaria
) {
this.
unidadeTributaria = unidadeTributaria
;
}
@Column
(name=
"qtd_unidade_tributaria")
public Integer getQuantidadeUnidadeTributaria
() {
return quantidadeUnidadeTributaria
;
}
public void setQuantidadeUnidadeTributaria
(Integer quantidadeUnidadeTributaria
) {
this.
quantidadeUnidadeTributaria = quantidadeUnidadeTributaria
;
}
@Column
(name=
"val_unidade_tributaria")
public Double getValorUnidadeTributaria
() {
return valorUnidadeTributaria
;
}
public void setValorUnidadeTributaria
(Double valorUnidadeTributaria
) {
this.
valorUnidadeTributaria = valorUnidadeTributaria
;
}
@Column
(name=
"val_desconto")
public Double getValorDesconto
() {
return valorDesconto
;
}
public void setValorDesconto
(Double valorDesconto
) {
this.
valorDesconto = valorDesconto
;
}
@Column
(name=
"ind_valor_total_nota")
public Boolean getIndicadorValorTotalNota
() {
return indicadorValorTotalNota
;
}
public void setIndicadorValorTotalNota
(Boolean indicadorValorTotalNota
) {
this.
indicadorValorTotalNota = indicadorValorTotalNota
;
}
@Column
(name=
"dsc_informacoes_adicionais")
@Size
(max =
250, message =
"Limite de caracteres ultrapassado: Informações Adicionais")
public String getInformacoesAdicionais
() {
return informacoesAdicionais
;
}
public void setInformacoesAdicionais
(String informacoesAdicionais
) {
this.
informacoesAdicionais = informacoesAdicionais
;
}
@Column
(name=
"dsc_lote")
@Size
(max =
20, message =
"Limite de caracteres ultrapassado: Lote")
public String getLote
() {
return lote
;
}
public void setLote
(String lote
) {
this.
lote = lote
;
}
@Column
(name=
"qtd_lote")
public Integer getQuantidadeLote
() {
return quantidadeLote
;
}
public void setQuantidadeLote
(Integer quantidadeLote
) {
this.
quantidadeLote = quantidadeLote
;
}
@Column
(name=
"dat_fabricacao")
public Date getDataFabricacao
() {
return dataFabricacao
;
}
public void setDataFabricacao
(Date dataFabricacao
) {
this.
dataFabricacao = dataFabricacao
;
}
@Column
(name=
"dat_validade")
public Date getDataValidade
() {
return dataValidade
;
}
public void setDataValidade
(Date dataValidade
) {
this.
dataValidade = dataValidade
;
}
@Column
(name=
"val_preco_maximo")
public Double getValorPrecoMaximo
() {
return valorPrecoMaximo
;
}
public void setValorPrecoMaximo
(Double valorPrecoMaximo
) {
this.
valorPrecoMaximo = valorPrecoMaximo
;
}
@Column
(name=
"dsc_codigoproduto_notafiscal")
@Size
(max =
100, message =
"Limite de caracteres ultrapassado: Código do Fornecedor")
public String getCodigoProdutoNotaFiscal
() {
return codigoProdutoNotaFiscal
;
}
public void setCodigoProdutoNotaFiscal
(String codigoProdutoNotaFiscal
) {
this.
codigoProdutoNotaFiscal = codigoProdutoNotaFiscal
;
}
@Column
(name=
"dsc_produto_notafiscal")
@Size
(max =
250, message =
"Limite de caracteres ultrapassado: Descrição do Fornecedor")
public String getDescricaoProdutoNotaFiscal
() {
return descricaoProdutoNotaFiscal
;
}
public void setDescricaoProdutoNotaFiscal
(String descricaoProdutoNotaFiscal
) {
this.
descricaoProdutoNotaFiscal = descricaoProdutoNotaFiscal
;
}
/*********************************************/
@Transient
public String getCodigoNCM
() {
return codigoNCM
;
}
public void setCodigoNCM
(String codigoNCM
) {
this.
codigoNCM = codigoNCM
;
}
@Transient
public Boolean getIndicadorSolicitarContagem
() {
return indicadorSolicitarContagem
;
}
public void setIndicadorSolicitarContagem
(Boolean indicadorSolicitarContagem
) {
this.
indicadorSolicitarContagem = indicadorSolicitarContagem
;
}
@Transient
public Integer getEstoqueAtualProduto
() {
return estoqueAtualProduto
;
}
public void setEstoqueAtualProduto
(Integer estoqueAtualProduto
) {
this.
estoqueAtualProduto = estoqueAtualProduto
;
}
@Transient
public Loja getLojaDaCompra
() {
return VerificadorUtil.
naoEstaNulo(getCompra
())? getCompra
().
getLoja() :
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;
CompraProduto other =
(CompraProduto
) obj
;
if (sequencial ==
null) {
if (other.
sequencial !=
null) {
return false;
} else {return false;}
} else if (!sequencial.
equals(other.
sequencial))
return false;
return true;
}
@Transient
public Tributacao getTributacaoDoProduto
() {
return VerificadorUtil.
naoEstaNulo(getProduto
())? getProduto
().
getTributacao() :
null;
}
@Transient
public Double retornarPercentualLucroBrutoUnidadeComercial
() {
try {
Produto produtoClone = produto.
clone();
if (VerificadorUtil.
naoEstaNulo(getValorUnidadeComercial
()) && VerificadorUtil.
naoEstaNulo(getProduto
().
getValorVarejo())) {
getProduto
().
setValorCompra(getValorUnidadeComercial
());
produtoClone.
setValorCompra(getValorUnidadeComercial
());
produtoClone.
setValorVarejoSimulacao(produtoClone.
getValorVarejo());
}
return produtoClone.
calculoMargemAposCustos();
} catch (CloneNotSupportedException e
) {
e.
printStackTrace();
}
return 0.0;
}
@Transient
public String retornarCorPercentualLucroBrutoUnidadeComercial
() {
try {
Produto produtoClone = produto.
clone();
if (VerificadorUtil.
naoEstaNulo(getValorUnidadeComercial
()) && VerificadorUtil.
naoEstaNulo(getProduto
().
getValorVarejo())) {
getProduto
().
setValorCompra(getValorUnidadeComercial
());
produtoClone.
setValorCompra(getValorUnidadeComercial
());
produtoClone.
setValorVarejoSimulacao(produtoClone.
getValorVarejo());
}
return produtoClone.
retornarCorMargemLucro();
} catch (CloneNotSupportedException e
) {
e.
printStackTrace();
}
return "black";
}
@Transient
public void atualizarDadosNfe
(br.
com.
swconsultoria.
nfe.
schema_4.
enviNFe.
TNFe.
InfNFe.
Det produtoNota
) {
this.
setUnidadeComercial(produtoNota.
getProd().
getUCom());
if (VerificadorUtil.
naoEstaNulo(produtoNota.
getProd().
getQCom())) {
this.
setQuantidade(new Double(produtoNota.
getProd().
getQCom()).
intValue());
}
this.
setUnidadeTributaria(produtoNota.
getProd().
getUTrib());
if (VerificadorUtil.
naoEstaNulo(produtoNota.
getProd().
getQTrib())) {
this.
setQuantidadeUnidadeTributaria(new Double(produtoNota.
getProd().
getQTrib()).
intValue());
}
if (VerificadorUtil.
naoEstaNulo(produtoNota.
getProd().
getVUnTrib())) {
this.
setValorUnidadeTributaria(new Double(produtoNota.
getProd().
getVUnTrib()));
}
if (VerificadorUtil.
naoEstaNulo(produtoNota.
getProd().
getVDesc())) {
this.
setValorDesconto(new Double(produtoNota.
getProd().
getVDesc()));
}
this.
setIndicadorValorTotalNota(produtoNota.
getProd().
getIndTot().
equals("1"));
this.
setInformacoesAdicionais(produtoNota.
getInfAdProd());
this.
setCodigoProdutoNotaFiscal(produtoNota.
getProd().
getCProd());
this.
setDescricaoProdutoNotaFiscal(produtoNota.
getProd().
getXProd());
this.
setCodigoNCM(produtoNota.
getProd().
getNCM());
/*
if (VerificadorUtil.naoEstaNuloOuVazio(produtoNota.getProd().getMed())) {
for (nfce.java.TNFe.InfNFe.Det.Prod.Med medicamento : produtoNota.getProd().getMed()) {
if (VerificadorUtil.naoEstaNuloOuVazio(medicamento.getNLote())) {
this.setLote(medicamento.getNLote());
}
if (VerificadorUtil.naoEstaNuloOuVazio(medicamento.getQLote())) {
this.setQuantidadeLote(new Double(medicamento.getQLote()).intValue());
}
if (VerificadorUtil.naoEstaNuloOuVazio(medicamento.getDFab())) {
this.setDataFabricacao(DataUtil.retornarDataApartirString("yyyy-MM-dd", medicamento.getDFab()));
}
if (VerificadorUtil.naoEstaNuloOuVazio(medicamento.getDVal())) {
this.setDataValidade(DataUtil.retornarDataApartirString("yyyy-MM-dd", medicamento.getDVal()));
}
if (VerificadorUtil.naoEstaNuloOuVazio(medicamento.getVPMC())) {
this.setValorPrecoMaximo(new Double(medicamento.getVPMC()));
}
}
}
*/
}
@Transient
public void atualizarAliquotas
(Fornecedor fornecedor
) {
if (VerificadorUtil.
naoEstaNulo(getProduto
())) {
getProduto
().
atualizarAliquotas(fornecedor
);
}
}
}