package br.com.ec.domain.model;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.annotations.ForeignKey;
import br.com.ec.core.generic.identidade.Identidade;
import br.com.ec.core.interfaces.Alterar;
import br.com.ec.core.interfaces.Cadastrar;
import br.com.ec.core.util.DataUtils;
import br.com.ec.core.util.StringUtil;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.dto.ProdutoHistoricoDTO;
import br.com.ec.domain.model.tipos.TipoStatusPedidoCompra;
import br.com.ec.domain.shared.ConstantesSEC;
@
Entity
@Table
(name=
"sec_produto_pedidocompra", schema=
"sc_sec")
public class ProdutoPedidoCompra
implements Serializable, Identidade
{
private static final long serialVersionUID = 1L
;
private ProdutoPedidoCompraId produtoPedidoCompraId
;
private Produto produto
;
private Loja loja
;
private Fornecedor fornecedorParaComprar
;
private Integer quantidadeParaComprar
;
private Integer quantidadeVendida
;
private Double valorOrcado
;
private String observacao
;
private String status
;
private Date dataPedido
;
private Usuario usuarioPedido
;
private Date dataUltimaAtualizacao
;
private Usuario usuarioUltimaAtualizacao
;
private Integer quantidadeEstoque
;
private Integer tempoEstoque
;
private List<ProdutoHistoricoDTO
> produtosHistorico
;
public ProdutoPedidoCompra
() {
this.
produtoPedidoCompraId =
new ProdutoPedidoCompraId
();
this.
loja =
new Loja
(ConstantesSEC.
Loja.
SEQUENCIAL_MATRIZ_ESTOQUE_9);
}
public ProdutoPedidoCompra
(ProdutoPedidoCompraId produtoLojaId
) {
this.
produtoPedidoCompraId = produtoLojaId
;
this.
loja =
new Loja
(ConstantesSEC.
Loja.
SEQUENCIAL_MATRIZ_ESTOQUE_9);
}
public ProdutoPedidoCompra
(Produto produto, Loja loja
) {
produtoPedidoCompraId =
new ProdutoPedidoCompraId
();
setProduto
(produto
);
setLoja
(loja
);
}
public ProdutoPedidoCompra
(Produto produto, Loja loja, Fornecedor fornecedorParaComprar,
Integer quantidadeParaComprar,
Integer quantidadeVendida,
Double valorOrcado,
String observacao,
String status,
Date dataPedido, Usuario usuarioPedido
) {
super();
this.
produto = produto
;
this.
loja = loja
;
this.
fornecedorParaComprar = fornecedorParaComprar
;
this.
quantidadeParaComprar = quantidadeParaComprar
;
this.
quantidadeVendida = quantidadeVendida
;
this.
valorOrcado = valorOrcado
;
this.
observacao = observacao
;
this.
status = status
;
this.
dataPedido = dataPedido
;
this.
usuarioPedido = usuarioPedido
;
}
public ProdutoPedidoCompra
(String status,
Integer quantidadeParaComprar
) {
this.
status = status
;
this.
quantidadeParaComprar = quantidadeParaComprar
;
}
@
Override
@Transient
public Object getId
() {
return getProdutoPedidoCompraId
();
}
@
Override
public void setId
(Object id
) {
this.
produtoPedidoCompraId =
(ProdutoPedidoCompraId
) id
;
}
@EmbeddedId
public ProdutoPedidoCompraId getProdutoPedidoCompraId
() {
return produtoPedidoCompraId
;
}
public void setProdutoPedidoCompraId
(ProdutoPedidoCompraId produtoLojaId
) {
this.
produtoPedidoCompraId = produtoLojaId
;
}
@ManyToOne
@ForeignKey
(name=
"fk_produtopedidocompra_produto")
@JoinColumn
(name =
"seq_produto", insertable=
false, updatable=
false, nullable =
false)
@NotNull
(message=
"Obrigatório informar o produto", groups=
{Cadastrar.
class, Alterar.
class})
public Produto getProduto
() {
return produto
;
}
public void setProduto
(Produto produto
) {
if (VerificadorUtil.
naoEstaNulo(produto
)) {
produtoPedidoCompraId.
setSequencialProduto(produto.
getSequencial());
}
this.
produto = produto
;
}
@ManyToOne
@ForeignKey
(name=
"fk_produtopedidocompra_loja")
@JoinColumn
(name =
"seq_loja", insertable=
false, updatable=
false, nullable =
false)
@NotNull
(message=
"Obrigatório informar a loja", groups=
{Cadastrar.
class, Alterar.
class})
public Loja getLoja
() {
return loja
;
}
public void setLoja
(Loja loja
) {
if (VerificadorUtil.
naoEstaNulo(loja
)) {
produtoPedidoCompraId.
setSequencialLoja(loja.
getSequencial());
}
this.
loja = loja
;
}
@ManyToOne
@ForeignKey
(name=
"fk_produtopedidocompra_fornecedor")
@JoinColumn
(name =
"seq_fornecedor", referencedColumnName=
"seq_fornecedor", nullable=
true)
public Fornecedor getFornecedorParaComprar
() {
return fornecedorParaComprar
;
}
public void setFornecedorParaComprar
(Fornecedor fornecedorParaComprar
) {
this.
fornecedorParaComprar = fornecedorParaComprar
;
}
@Column
(name=
"qtd_paracomprar")
public Integer getQuantidadeParaComprar
() {
return quantidadeParaComprar
;
}
public void setQuantidadeParaComprar
(Integer quantidadeParaComprar
) {
this.
quantidadeParaComprar = quantidadeParaComprar
;
}
@Column
(name=
"qnt_vendas")
public Integer getQuantidadeVendida
() {
return quantidadeVendida
;
}
public void setQuantidadeVendida
(Integer quantidadeVendida
) {
this.
quantidadeVendida = quantidadeVendida
;
}
@Column
(name=
"val_orcado")
public Double getValorOrcado
() {
return valorOrcado
;
}
public void setValorOrcado
(Double valorOrcado
) {
this.
valorOrcado = valorOrcado
;
}
@Column
(name=
"dsc_observacao")
@Size
(max =
250, message =
"Limite de caracteres ultrapassado: Observação")
public String getObservacao
() {
return observacao
;
}
public void setObservacao
(String observacao
) {
this.
observacao = StringUtil.
setarUpperCaseComTrim(observacao
);
}
@Column
(name=
"tip_status_pedidocompra")
@NotNull
(message=
"Obrigatório informar o status do pedido", groups=
{Cadastrar.
class, Alterar.
class})
public String getStatus
() {
return status
;
}
public void setStatus
(String status
) {
this.
status = status
;
}
@Transient
public String getDescricaoStatus
() {
return VerificadorUtil.
naoEstaNulo(getStatus
())? TipoStatusPedidoCompra.
parse(getStatus
()).
getDescricao() :
null;
}
@Column
(name=
"dat_pedido")
public Date getDataPedido
() {
return dataPedido
;
}
public void setDataPedido
(Date dataPedido
) {
this.
dataPedido = dataPedido
;
}
@Column
(name=
"dat_pedidoatualizacao")
public Date getDataUltimaAtualizacao
() {
return dataUltimaAtualizacao
;
}
public void setDataUltimaAtualizacao
(Date dataUltimaAtualizacao
) {
this.
dataUltimaAtualizacao = dataUltimaAtualizacao
;
}
@ManyToOne
@ForeignKey
(name=
"fk_produtopedidocompra_usuario")
@JoinColumn
(name =
"seq_usuario", nullable =
false)
public Usuario getUsuarioPedido
() {
return usuarioPedido
;
}
public void setUsuarioPedido
(Usuario usuarioPedido
) {
this.
usuarioPedido = usuarioPedido
;
}
@ManyToOne
@ForeignKey
(name=
"fk_produtopedidocompra_usuarioatualizacao")
@JoinColumn
(name =
"seq_usuarioatualizacao")
public Usuario getUsuarioUltimaAtualizacao
() {
return usuarioUltimaAtualizacao
;
}
public void setUsuarioUltimaAtualizacao
(Usuario usuarioUltimaAtualizacao
) {
this.
usuarioUltimaAtualizacao = usuarioUltimaAtualizacao
;
}
@Transient
public Integer getQuantidadeEstoque
() {
return quantidadeEstoque
;
}
public void setQuantidadeEstoque
(Integer quantidadeEstoque
) {
this.
quantidadeEstoque = quantidadeEstoque
;
}
@Transient
public Integer getTempoEstoque
() {
return tempoEstoque
;
}
public void setTempoEstoque
(Integer tempoEstoque
) {
this.
tempoEstoque = tempoEstoque
;
}
@Transient
public List<ProdutoHistoricoDTO
> getProdutosHistorico
() {
return produtosHistorico
;
}
public void setProdutosHistorico
(List<ProdutoHistoricoDTO
> produtosHistorico
) {
this.
produtosHistorico = produtosHistorico
;
}
@Transient
public Long getSequencialDoProduto
() {
return VerificadorUtil.
naoEstaNulo(produto
)? produto.
getSequencial() :
null;
}
@Transient
public Long getSequencialDaLoja
() {
return VerificadorUtil.
naoEstaNulo(loja
)? loja.
getSequencial() :
null;
}
@Transient
public Modelo getModeloDoProduto
() {
return VerificadorUtil.
naoEstaNulo(produto
)? VerificadorUtil.
naoEstaNulo(produto.
getModelo())? produto.
getModelo() :
null :
null;
}
@Transient
public String getNomeDoUsuario
() {
return VerificadorUtil.
naoEstaNulo(getUsuarioPedido
())? getUsuarioPedido
().
getNomeDaPessoa() :
null;
}
@Transient
public String getNomeDoUsuarioAtualizacao
() {
return VerificadorUtil.
naoEstaNulo(getUsuarioUltimaAtualizacao
())? getUsuarioUltimaAtualizacao
().
getNomeDaPessoa() :
null;
}
@Transient
public String getNomeDoFornecedorParaComprar
() {
return VerificadorUtil.
naoEstaNulo(getFornecedorParaComprar
())? getFornecedorParaComprar
().
getNomeDaPessoa() :
null;
}
@Transient
public String getCodigoDoFornecedorParaComprar
(Produto produto
) {
String codigo =
null;
if (VerificadorUtil.
naoEstaNulo(getFornecedorParaComprar
())) {
for (FornecedorProduto fornecedorProduto : produto.
getFornecedores()) {
if (fornecedorProduto.
getSequencialDoFornecedor().
equals(getFornecedorParaComprar
().
getSequencial())) {
codigo = fornecedorProduto.
getIdentificador();
}
}
}
return VerificadorUtil.
naoEstaNulo(codigo
)? codigo :
null;
}
@Transient
public Integer mediaVendas
(Integer quantidadeMeses
) {
Integer vendas =
0;
Integer quantidadeMesesVendas =
0;
if (VerificadorUtil.
naoEstaNulo(getProdutosHistorico
())) {
for (ProdutoHistoricoDTO produtoHistorico : getProdutosHistorico
()) {
if (produtoHistorico.
ehTipoLancamentoHistoricoVendas()) {
vendas = vendas + produtoHistorico.
getQuantidadeLancamentos().
intValue();
quantidadeMesesVendas++
;
}
if (quantidadeMesesVendas == quantidadeMeses
) {
break;
}
}
}
if (quantidadeMeses
> quantidadeMesesVendas
) {
quantidadeMeses = quantidadeMesesVendas
;
}
return vendas
> 0? vendas/quantidadeMeses :
0;
}
@Transient
public String getDescricaoTipoStatus
() {
if (VerificadorUtil.
naoEstaNulo(getStatus
())) {
return TipoStatusPedidoCompra.
parse(getStatus
()).
getDescricao();
}
return null;
}
@Transient
public String getCorTipoStatus
() {
if (VerificadorUtil.
naoEstaNulo(getStatus
())) {
return TipoStatusPedidoCompra.
parse(getStatus
()).
getCor();
}
return "black";
}
@Transient
public String getCorTempoPedido
() {
if (VerificadorUtil.
naoEstaNulo(getDataPedido
())) {
Integer quantidadeDias = DataUtils.
calcularDiferenceEmDiasEntreDuasDatas(DataUtils.
getDataAtual(), getDataPedido
());
if (quantidadeDias
< 16) {
return "black";
} else if (quantidadeDias
< 31) {
return "orange";
}
return "red";
}
return "black";
}
@Transient
public String getCorTempoPedidoAtualizacao
() {
if (VerificadorUtil.
naoEstaNulo(getDataUltimaAtualizacao
())) {
Integer quantidadeDias = DataUtils.
calcularDiferenceEmDiasEntreDuasDatas(DataUtils.
getDataAtual(), getDataUltimaAtualizacao
());
if (quantidadeDias
< 16) {
return "black";
} else if (quantidadeDias
< 31) {
return "orange";
}
return "red";
}
return "black";
}
@Transient
public String getValorOrcadoFormatado
() {
if (VerificadorUtil.
naoEstaNulo(getValorOrcado
())) {
return StringUtil.
formatarValor(getValorOrcado
());
}
return StringUtil.
formatarValor(0.0);
}
@
Override
public int hashCode
() {
final int prime =
31;
int result =
1;
result = prime
* result +
((produtoPedidoCompraId ==
null) ? 0 : produtoPedidoCompraId.
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;
ProdutoPedidoCompra other =
(ProdutoPedidoCompra
) obj
;
if (produtoPedidoCompraId ==
null) {
if (other.
produtoPedidoCompraId !=
null)
return false;
} else if (!produtoPedidoCompraId.
equals(other.
produtoPedidoCompraId))
return false;
return true;
}
}