Subversion Repositories Integrator Subversion

Rev

Blame | Last modification | View Log | Download | RSS feed

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;
        }
       
}