Subversion Repositories Integrator Subversion

Rev

Rev 538 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

package br.com.ec.domain.service.impl;

import java.util.HashSet;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.com.ec.core.exception.NegocioException;
import br.com.ec.core.generic.AbstractService;
import br.com.ec.core.generic.GenericRepository;
import br.com.ec.core.util.DataUtils;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.core.validador.Validador;
import br.com.ec.domain.dto.CompraProdutoDTO;
import br.com.ec.domain.dto.LojaDTO;
import br.com.ec.domain.dto.ProdutoDTO;
import br.com.ec.domain.dto.UsuarioDTO;
import br.com.ec.domain.model.EstoqueAuditoria;
import br.com.ec.domain.model.Produto;
import br.com.ec.domain.model.ProdutoLoja;
import br.com.ec.domain.model.ProdutoRelacionado;
import br.com.ec.domain.model.tipos.TipoEstoqueAuditoria;
import br.com.ec.domain.model.tipos.TipoEstoqueAuditoriaVerificacao;
import br.com.ec.domain.service.EstoqueAuditoriaService;
import br.com.ec.domain.service.PerfilService;
import br.com.ec.domain.service.ProdutoLojaService;
import br.com.ec.domain.service.ProdutoService;
import br.com.ec.repository.ProdutoRepository;

@Service
public class ProdutoServiceImpl extends AbstractService<Produto> implements ProdutoService {
       
        private PerfilService perfilService;
        private ProdutoLojaService produtoLojaService;
        private EstoqueAuditoriaService estoqueAuditoriaService;
       
        private ProdutoRepository produtoRepository;
        /*
        private TransferenciaRepository transferenciaRepository;
        private CupomService cupomService;
        private PagamentoService pagamentoService;
        private PedidoService pedidoService;
        private PendenciaService pendenciaService;
        */


        @Autowired
        public ProdutoServiceImpl(Validador validador, PerfilService perfilService,
                        ProdutoLojaService produtoLojaService, EstoqueAuditoriaService estoqueAuditoriaService,
                        ProdutoRepository produtoRepository
                        /*,
                        TransferenciaRepository transferenciaRepository, ProdutoLojaService produtoLojaService,
                        , CupomService cupomService,
                        PagamentoService pagamentoService, PedidoService pedidoService, PendenciaService pendenciaService*/
) {
                super(validador);
                this.perfilService = perfilService;
                this.produtoLojaService = produtoLojaService;
                this.produtoRepository = produtoRepository;
                this.estoqueAuditoriaService = estoqueAuditoriaService;
                /*
                this.transferenciaRepository = transferenciaRepository;
                this.cupomService = cupomService;
                this.pagamentoService = pagamentoService;
                this.pedidoService = pedidoService;
                this.pendenciaService = pendenciaService;
                */

        }

        @Override
        protected GenericRepository<Produto> getRepository() {
                return produtoRepository;
        }
       
        @Override
        public Produto consultarProdutoPorCodigo(String codigoProduto) {
                return produtoRepository.consultarProdutoPorCodigo(codigoProduto.trim());
        }
       
        @Override
        public ProdutoDTO consultarProdutoDTOPorCodigoOuCodigoEAN(String codigoProduto) {
                return produtoRepository.consultarProdutoDTOPorCodigoOuEAN(codigoProduto.trim());
        }
       
        @Override
        public List<CompraProdutoDTO> consultarComprasDoProduto(Long sequencialProduto) {
                return produtoRepository.consultarComprasDoProduto(sequencialProduto);
        }
       
        @Override
        public void realizarProducao(LojaDTO lojaDTO, ProdutoDTO produtoParaProduzir, ProdutoDTO produtoProduzido,
                        Integer quantidadeParaProduzir, UsuarioDTO usuarioDTO) {
                if (VerificadorUtil.estaNulo(quantidadeParaProduzir)) {
                        throw new NegocioException("É preciso informar a quantidade produzida");
                }
               
                if (quantidadeParaProduzir < 1) {
                        throw new NegocioException("É preciso informar a quantidade produzida");
                }
               
                try {
                        // ALTERANDO ESTOQUE
                        ProdutoLoja produtoLojaParaProduzir = produtoLojaService.consultarPorProdutoEeLoja(produtoParaProduzir.getSequencial(), lojaDTO.getSequencial());
                        if (VerificadorUtil.estaNulo(produtoLojaParaProduzir)) {
                                throw new NegocioException("Não há estoque suficiente para produzir");
                        }
                        Integer estoqueAnteriorProdutoParaProduzir = produtoLojaParaProduzir.getQuantidadeEstoque();
                       
                        ProdutoLoja produtoLojaProduzido = produtoLojaService.consultarPorProdutoEeLoja(produtoProduzido.getSequencial(), lojaDTO.getSequencial());
                        if (VerificadorUtil.estaNulo(produtoLojaProduzido)) {
                                produtoLojaProduzido = new ProdutoLoja();
                                produtoLojaProduzido.setDataContagem(DataUtils.getDataAtual());
                                produtoLojaProduzido.setIndicadorContagemSolicitada(false);
                                produtoLojaProduzido.setLocalizacao("");
                                produtoLojaProduzido.setLoja(produtoLojaParaProduzir.getLoja());
                                produtoLojaProduzido.setProduto(consultarPorId(new Produto(produtoProduzido.getSequencial())));
                                produtoLojaProduzido.setQuantidadeEstoque(0);
                                produtoLojaService.cadastrar(produtoLojaProduzido);
                        }
                        Integer estoqueAnteriorProdutoProduzido = produtoLojaProduzido.getQuantidadeEstoque();
                       
                        if (estoqueAnteriorProdutoParaProduzir - quantidadeParaProduzir < 0) {
                                throw new NegocioException("Não há estoque suficiente para produzir");
                        }
                       
                        // VINCULAR
                        ProdutoRelacionado produtoRelacionado = new ProdutoRelacionado();
                        produtoRelacionado.setProduto(produtoLojaProduzido.getProduto());
                        produtoRelacionado.setProdutoRelacionado(produtoLojaParaProduzir.getProduto());
                        if (VerificadorUtil.estaNulo(produtoLojaProduzido.getProduto().getRelacionados())) {
                                produtoLojaProduzido.getProduto().setRelacionados(new HashSet<ProdutoRelacionado>());
                        }
                        produtoLojaProduzido.getProduto().getRelacionados().add(produtoRelacionado);
                        alterar(produtoLojaProduzido.getProduto());
                       
                        produtoLojaService.alterarEstoqueAcrescentandoQuantidadeInformada(quantidadeParaProduzir * -1, produtoParaProduzir.getSequencial(), lojaDTO.getSequencial());
                        produtoLojaService.alterarEstoqueAcrescentandoQuantidadeInformada(quantidadeParaProduzir, produtoProduzido.getSequencial(), lojaDTO.getSequencial());
                       
                        // CADASTRANDO AUDITORIAS
                        cadastrarAuditoria(usuarioDTO.getSequencial(), produtoLojaParaProduzir, TipoEstoqueAuditoria.PRODUCAO.getValor(),
                                        estoqueAnteriorProdutoParaProduzir, produtoLojaParaProduzir.getQuantidadeEstoque(), "",
                                        TipoEstoqueAuditoriaVerificacao.VERIFICADO_SEM_PENDENCIA.getValor());
                        cadastrarAuditoria(usuarioDTO.getSequencial(), produtoLojaProduzido, TipoEstoqueAuditoria.PRODUCAO.getValor(),
                                        estoqueAnteriorProdutoProduzido, produtoLojaProduzido.getQuantidadeEstoque(), "",
                                        TipoEstoqueAuditoriaVerificacao.VERIFICADO_SEM_PENDENCIA.getValor());
                } catch (NegocioException ne) {
                        throw new NegocioException(ne.getMessage());
                }
        }
       
        private EstoqueAuditoria cadastrarAuditoria(Long sequencialUsuario, ProdutoLoja produtoLoja, String tipoEstoqueAuditoria, Integer quantidadeEstoqueAnterior, Integer quantidadeEstoqueNovo, /*Cliente cliente, */String observacao, String tipoVerificacao) {
                return estoqueAuditoriaService.cadastrarAuditoria(sequencialUsuario, produtoLoja, quantidadeEstoqueAnterior, quantidadeEstoqueNovo, DataUtils.getDataAtual(), tipoEstoqueAuditoria, /*cliente, */observacao, tipoVerificacao);
        }
       
        /*
        @Override
        public void cadastrar(Produto produto) {
                setarNovoCodigoDoProduto(produto);
                super.cadastrar(produto);
        }
       
        private void setarNovoCodigoDoProduto(Produto produto) {
                Long novoCodigo = consultarUltimoCodigo();
                if (VerificadorUtil.naoEstaNulo(novoCodigo)) {
                        novoCodigo = novoCodigo + 1;
                        produto.setCodigo(String.format("%06d", novoCodigo));
                } else {
                        produto.setCodigo(String.format("%06d", new Long(1)));
                }
        }
       
        @Override
        protected void regrasNegocioCadastrar(Produto produto) {
                verificarObrigatoriedades(produto);
                verificarSeCodigoRapidoJaExiste(produto);
                verificarSeCodigoEANJaExiste(produto);
                setarFalsoParaIndicadores(produto);
                produto.setAtivo(true);
        }

        @Override
        protected void regrasNegocioAlterar(Produto produto) {
                verificarObrigatoriedades(produto);
                verificarSeCodigoRapidoJaExiste(produto);
                verificarSeCodigoEANJaExiste(produto);
                setarFalsoParaIndicadores(produto);
        }
       
        private void verificarObrigatoriedades(Produto produto) {
                StringBuilder excecoes = new StringBuilder();
                if (VerificadorUtil.estaNuloOuVazio(produto.getCodigoEAN()) &&
                                VerificadorUtil.naoEstaNuloOuVazio(produto.getCodigoEANTributado())) {
                        excecoes.append("Código de Barras Tributado; ");
                }
                if (produto.getTipo().equals(TipoProduto.CAPA.getValor())) {
                        if (VerificadorUtil.estaNuloOuVazio(produto.getModelo())) {
                                excecoes.append("Modelo do produto; ");
                        }
                        if (VerificadorUtil.estaNuloOuVazio(produto.getEstilo())) {
                                excecoes.append("Estilo do produto; ");
                        }
                }
                if (produto.tipoProdutoTributado()) {
                        if (VerificadorUtil.estaNulo(produto.getTributacao())) {
                                excecoes.append("Tributação do produto; ");
                        }
                }
                if (VerificadorUtil.naoEstaNuloOuVazio(excecoes)) {
                        throw new NegocioException("Obrigatório informar: " + excecoes.toString());
                }
        }
       
        private void verificarSeCodigoRapidoJaExiste(Produto produto) {
                if (VerificadorUtil.naoEstaNuloOuVazio(produto.getCodigoRapido())) {
                        Produto produtoConsultado = produtoRepository.consultarProdutoPorCodigoRapido(produto.getCodigoRapido());
                        if (VerificadorUtil.naoEstaNulo(produtoConsultado)) {
                                if (!produtoConsultado.getSequencial().equals(produto.getSequencial())) {
                                        throw new NegocioException("Código rápido do produto já existente");
                                }
                        }
                }
        }
       
        private void verificarSeCodigoEANJaExiste(Produto produto) {
                if (VerificadorUtil.naoEstaNuloOuVazio(produto.getCodigoEAN())) {
                        Produto produtoConsultado = produtoRepository.consultarProdutoPorCodigoEAN(produto.getCodigoEAN());
                        if (VerificadorUtil.naoEstaNulo(produtoConsultado)) {
                                if (!produtoConsultado.getSequencial().equals(produto.getSequencial())) {
                                        throw new NegocioException("Código de Barras já existente.");
                                }
                        }
                }
        }
       
        private void setarFalsoParaIndicadores(Produto produto) {
                if (VerificadorUtil.estaNulo(produto.getIndicadorFavorito())) {
                        produto.setIndicadorFavorito(false);
                }
                if (VerificadorUtil.estaNulo(produto.getIndicadorPersonalizavel())) {
                        produto.setIndicadorPersonalizavel(false);
                }
        }
       
        @Override
        public List<Produto> consultarProdutoPorParametros(ParametrosConsultaProdutoDTO parametrosConsultaProduto) {
                return produtoRepository.consultarProdutoPorParametros(parametrosConsultaProduto);
        }
       
        @Override
        public List<Produto> consultarCompativeis(Produto produto) {
                return produtoRepository.consultarCompativeis(produto);
        }

        @Override
        public Produto detalharProduto(Produto produto) {
                Produto produtoDetalhado = produtoRepository.detalharProduto(produto);
                produtoDetalhado.setTransferenciasAbertas(transferenciaRepository.consultarTransferenciasAbertas(produtoDetalhado));
                produtoDetalhado.setPedidosPendentes(pedidoService.consultarPedidosNaoAtendidos(produtoDetalhado));
                return produtoDetalhado;
        }
       
        @Override
        public Produto consultarProdutoPorCodigoRapidoOuCodigoEAN(String codigoRapidoOuCodigoEAN) {
                Produto produtoSelecionado = null;
                if (VerificadorUtil.naoEstaNuloOuVazio(codigoRapidoOuCodigoEAN)) {
                        codigoRapidoOuCodigoEAN = codigoRapidoOuCodigoEAN.trim();
                        if (codigoRapidoOuCodigoEAN.length() < 7) {
                                produtoSelecionado = this.consultarProdutoPorCodigoRapido(codigoRapidoOuCodigoEAN);
                        } else {
                                produtoSelecionado = this.consultarProdutoPorCodigoEAN(codigoRapidoOuCodigoEAN);
                        }
                }
                if (VerificadorUtil.estaNulo(produtoSelecionado)) {
                        return this.consultarProdutoPorCodigo("000000");
                }
                return produtoSelecionado;
        }
*/
     
       
       
        /*
        @Override
        public Produto consultarProdutoPorCodigoEAN(String codigoEAN) {
                codigoEAN = StringUtil.retornarApenasNumeros(codigoEAN);
                if (VerificadorUtil.naoEstaNuloOuVazio(codigoEAN)) {
                        return produtoRepository.consultarProdutoPorCodigoEAN(codigoEAN.trim());
                }
                return null;
        }
       
        @Override
        public Produto consultarProdutoPorCodigoOuCodigoEAN(String codigoProduto) {
                Produto produtoSelecionado = null;
                if (VerificadorUtil.naoEstaNuloOuVazio(codigoProduto)) {
                        codigoProduto = codigoProduto.trim();
                        if (codigoProduto.length() < 7) {
                                produtoSelecionado = this.consultarProdutoPorCodigo(UtilBean.padraoCodigoProduto(codigoProduto));
                        } else {
                                produtoSelecionado = this.consultarProdutoPorCodigoEAN(codigoProduto);
                        }
                }
                if (VerificadorUtil.estaNulo(produtoSelecionado)) {
                        return this.consultarProdutoPorCodigo("000000");
                }
                return produtoSelecionado;
        }
        */

       
/*     
       
        @Override
        public Produto consultarProdutoPorCodigoRapido(String codigoRapido) {
                return produtoRepository.consultarProdutoPorCodigoRapido(codigoRapido.trim());
        }
       
        @Override
        public Long consultarUltimoCodigo() {
                return produtoRepository.consultarUltimoCodigo();
        }

        @Override
        public Produto consultarProdutoPorCodigoParaContagem(String codigoProduto, Loja loja, Usuario usuarioParaContagem) {
                Produto produto = this.consultarProdutoPorCodigoOuCodigoEAN(codigoProduto);
                verificarSeProdutoConstaNaContagem(produto, loja, usuarioParaContagem);
                return produto;
        }
       
        private void verificarSeProdutoConstaNaContagem(Produto produto, Loja loja, Usuario usuarioParaContagem) {
                ParametrosConsultaProdutoDTO parametrosConsulta = new ParametrosConsultaProdutoDTO();
                ((ParametrosConsultaProdutoDTO)parametrosConsulta).setProduto(produto);
                ((ParametrosConsultaProdutoDTO)parametrosConsulta).setLojaSelecionadaParaContagem(loja);
                ((ParametrosConsultaProdutoDTO)parametrosConsulta).setConsultarAtivo(1);
                ((ParametrosConsultaProdutoDTO)parametrosConsulta).setUsuarioParaContagem(usuarioParaContagem);
                if (this.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta) == 0) {
                        throw new NegocioException("PRODUTO NÃO CONSTA PARA CONTAGEM NA LOJA");
                }
        }

        @Override
        public void lancarAvaria(EstoqueAuditoria estoqueAuditoria, Loja loja, Produto produto, Usuario usuario) {
                lancarMudancaEstoque(estoqueAuditoria, loja, produto, usuario, TipoEstoqueAuditoria.AVARIA.getValor());
        }
       
        @Override
        public void lancarTroca(EstoqueAuditoria estoqueAuditoria, Loja loja, Produto produto, Usuario usuario) {
                if (estoqueAuditoria.getEhDevolucaoMesmoProduto()) {
                        estoqueAuditoria.setSequencial(lancarMudancaEstoque(estoqueAuditoria, loja, produto, usuario, TipoEstoqueAuditoria.TROCA.getValor()).getSequencial());
                } else {
                        estoqueAuditoria.setSequencial(lancarDevolucao(estoqueAuditoria, loja, produto, usuario, TipoEstoqueAuditoria.DEVOLUCAO.getValor()).getSequencial());
                }
                vincularPedidoComTroca(estoqueAuditoria);
        }
       
        private void vincularPedidoComTroca(EstoqueAuditoria estoqueAuditoria) {
                if (VerificadorUtil.naoEstaNulo(estoqueAuditoria.getPedidoParaVincular())) {
                        PedidoHistorico pedidoHistorico = new PedidoHistorico();
                        pedidoHistorico.setDataHistorico(DataUtils.getDataAtual());
                        pedidoHistorico.setObservacao("TROCA REALIZADA: " + estoqueAuditoria.getSequencial());
                        pedidoHistorico.setTipoSituacao(TipoSituacaoPedido.FINALIZADO.getValor());
                        pedidoHistorico.setUsuario(estoqueAuditoria.getUsuario());
                        pedidoHistorico.setPedido(estoqueAuditoria.getPedidoParaVincular());
                        if (VerificadorUtil.estaNulo(estoqueAuditoria.getPedidoParaVincular().getHistorico())) {
                                estoqueAuditoria.getPedidoParaVincular().setHistorico(new ArrayList<PedidoHistorico>());
                        }
                        estoqueAuditoria.getPedidoParaVincular().getHistorico().add(pedidoHistorico);
                        estoqueAuditoria.getPedidoParaVincular().setTipoSituacao(TipoSituacaoPedido.FINALIZADO.getValor());
                        estoqueAuditoria.getPedidoParaVincular().setDataUltimaAlteracaoSituacao(DataUtils.getDataAtual());
                        pedidoService.alterar(estoqueAuditoria.getPedidoParaVincular());
                }
        }

        private EstoqueAuditoria lancarMudancaEstoque(EstoqueAuditoria estoqueAuditoria, Loja loja, Produto produto, Usuario usuario, String tipoEstoqueAuditoria) {
                ProdutoLoja produtoLoja = produtoLojaService.consultarProdutoLoja(produto, loja);
                if (VerificadorUtil.naoEstaNulo(produtoLoja)) {
                        if (VerificadorUtil.estaNulo(produtoLoja.getQuantidadeEstoque())) {
                                produtoLoja.setQuantidadeEstoque(0);
                        }
                        String observacao = estoqueAuditoria.getObservacao();
                        if (VerificadorUtil.naoEstaNuloOuVazio(estoqueAuditoria.getNumeroLote())) {
                                observacao = "LOTE [" + estoqueAuditoria.getNumeroLote() + "] : " + observacao;
                        }
                        estoqueAuditoria = cadastrarAuditoria(usuario, produtoLoja, tipoEstoqueAuditoria, produtoLoja.getQuantidadeEstoque(), produtoLoja.getQuantidadeEstoque() - 1, estoqueAuditoria.getCliente(), observacao, TipoEstoqueAuditoriaVerificacao.NAO_VERIFICADO.getValor());
                        produtoLoja.setQuantidadeEstoque(produtoLoja.getQuantidadeEstoque() - 1);
                        produtoLojaService.alterar(produtoLoja);
                }
                return estoqueAuditoria;
        }
       
        private EstoqueAuditoria lancarDevolucao(EstoqueAuditoria estoqueAuditoria, Loja loja, Produto produto, Usuario usuario, String tipoEstoqueAuditoria) {
                verificarDadosPreenchidos(estoqueAuditoria);
               
                ProdutoLoja produtoLoja = produtoLojaService.consultarProdutoLoja(produto, loja);
                if (VerificadorUtil.naoEstaNulo(produtoLoja)) {
                        if (VerificadorUtil.estaNulo(produtoLoja.getQuantidadeEstoque())) {
                                produtoLoja.setQuantidadeEstoque(0);
                        }
                        Cupom cupomGerado = null;
                        if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.CUPOM.getValor())) {
                                cupomGerado = new Cupom();
                                cupomGerado.setCodigo(cupomService.gerarCodigoValido());
                                cupomGerado.setDataHoraEmissao(DataUtils.getDataAtual());
                                cupomGerado.setPublico(false);
                                cupomGerado.setAtivo(true);
                                cupomGerado.setTipoCupom(TipoCupom.REEMBOLSO.getValor());
                                cupomGerado.setCliente(estoqueAuditoria.getCliente());
                                cupomGerado.setValor(estoqueAuditoria.getValorDevolvido());
                                cupomGerado.setLimiteUtilizacao(true);
                                cupomGerado.setObservacao("CUPOM: " + cupomGerado.getCodigo() + "\nREEMBOLSO DO PRODUTO: " + estoqueAuditoria.getProduto().getDescricaoCompletaCapa());
                                cupomService.cadastrar(cupomGerado);
                                estoqueAuditoria.setObservacao("CUPOM GERADO: " + cupomGerado.getCodigo() + "\n" + estoqueAuditoria.getObservacao());
                        }
                        Pagamento pagamentoGerado = null;
                        if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.DINHEIRO.getValor())) {
                                pagamentoGerado = new Pagamento();
                                pagamentoGerado.setLoja(loja);
                                pagamentoGerado.setData(DataUtils.getDataAtual());
                                pagamentoGerado.setDescricao("DEVOLUÇÃO DO PRODUTO: " + estoqueAuditoria.getProduto().getCodigoProdutoPadrao());
                                pagamentoGerado.setValor(estoqueAuditoria.getValorDevolvido());
                                pagamentoGerado.setUsuario(usuario);
                                pagamentoGerado.setLancado(false);
                                pagamentoService.cadastrar(pagamentoGerado);
                                estoqueAuditoria.setObservacao("DEVOLUÇÃO EM DINHEIRO: " + estoqueAuditoria.getValorDevolvido() + "\n" + estoqueAuditoria.getObservacao());
                        }
                        if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.ESTORNO_CARTAO.getValor()) ||
                                        estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.TRANSFERENCIA.getValor())) {
                                String diaAtual = DataUtils.converterDataComHorarioParaString(DataUtils.getDataAtual());
                                StringBuilder conteudo = new StringBuilder();
                                conteudo.append("OPERAÇÃO REALIZADA POR: " + usuario.getNome() + "\n");
                                conteudo.append("VALOR PARA DEVOLVER: R$" + StringUtil.formatarValor(estoqueAuditoria.getValorDevolvido()) + "\n");
                                if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.TRANSFERENCIA.getValor())) {
                                        conteudo.append("DADOS BANCÁRIOS: " + estoqueAuditoria.getDadosBancarios() + "\n");
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(estoqueAuditoria.getSequencialVenda())) {
                                        conteudo.append("ID DA VENDA: " + estoqueAuditoria.getSequencialVenda() + "\n");
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(estoqueAuditoria.getNumeroNotaFiscal())) {
                                        conteudo.append("Nº DA NOTA FISCAL: " + estoqueAuditoria.getNumeroNotaFiscal() + "\n");
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(estoqueAuditoria.getDataVenda())) {
                                        conteudo.append("DATA DA VENDA: " + DataUtils.converterDataComHorarioParaString(estoqueAuditoria.getDataVenda()) + "\n");
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(estoqueAuditoria.getDescricaoDaLoja())) {
                                        conteudo.append("LOJA: " + estoqueAuditoria.getDescricaoDaLoja() + "\n");
                                }
                                conteudo.append("OBSERVAÇÕES: " + estoqueAuditoria.getObservacao() + "\n\n");
                                if (VerificadorUtil.naoEstaNulo(estoqueAuditoria.getCliente())) {
                                        conteudo.append("DADOS DO CLIENTE:\n");
                                        conteudo.append("NOME: " + estoqueAuditoria.getCliente().getNome() + "\n");
                                        conteudo.append("CPF/CNPJ: " + estoqueAuditoria.getCliente().getCpfCnpjFormatado() + "\n");
                                        conteudo.append("EMAIL: " + estoqueAuditoria.getCliente().getEmail() + "\n");
                                        conteudo.append("TELEFONE: " + estoqueAuditoria.getCliente().getTelefone() + "\n");
                                        conteudo.append("CONTATO: " + estoqueAuditoria.getCliente().getContato() + "\n\n");
                                }
                                conteudo.append("DATA DA SOLICITAÇÃO: " + diaAtual + "\n");
                                conteudo.append("__________________________________________________\n\n");
                               
                                if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.ESTORNO_CARTAO.getValor())) {
                                        new GerenciadorEmailImpl()
                                                .comEmailsDestino(ConstantesSEC.DESTINATARIOS_EMAIL_DIRECAO)
                                                .comAssunto("ESPAÇO CASE - ESTORNO VIA CARTÃO: " + diaAtual)
                                                .comConteudo(conteudo.toString())
                                                .enviar();
                                }
                                if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.TRANSFERENCIA.getValor())) {
                                        new GerenciadorEmailImpl()
                                                .comEmailsDestino(ConstantesSEC.DESTINATARIOS_EMAIL_DIRECAO)
                                                .comAssunto("ESPAÇO CASE - ESTORNO VIA TRANSFERÊNCIA: " + diaAtual)
                                                .comConteudo(conteudo.toString())
                                                .enviar();
                                }
                                try {
                                        Pendencia pendencia = new Pendencia();
                                        pendencia.setDescricao("SOLICITAÇÃO DE " + TipoDevolucao.parse(estoqueAuditoria.getTipoDevolucao()).getDescricao() + ": " + diaAtual + ". VENDA ID: " + estoqueAuditoria.getSequencialVenda());
                                        pendencia.setUsuario(usuario);
                                        pendencia.setData(DataUtils.getDataAtual());
                                        pendencia.setLoja(loja);
                                        Perfil perfilRh = new Perfil();
                                        perfilRh.setCodigo(ConstantesSEC.SETOR_FINANCEIRO_2);
                                        pendencia.setPerfil(perfilRh);
                                        pendenciaService.cadastrar(pendencia);
                                } catch (Exception e) {}
                        }
                       
                        estoqueAuditoria = cadastrarAuditoria(usuario, produtoLoja, tipoEstoqueAuditoria, produtoLoja.getQuantidadeEstoque(), produtoLoja.getQuantidadeEstoque(), estoqueAuditoria.getCliente(), estoqueAuditoria.getObservacao(), TipoEstoqueAuditoriaVerificacao.NAO_VERIFICADO.getValor());
                        if (VerificadorUtil.naoEstaNulo(cupomGerado)) {
                                cupomGerado.setObservacao("AUDITORIA: " + estoqueAuditoria.getSequencial() + "\n" + cupomGerado.getObservacao());
                                cupomService.alterar(cupomGerado);
                        }
                        if (VerificadorUtil.naoEstaNulo(pagamentoGerado)) {
                                pagamentoGerado.setDescricao("AUDITORIA: " + estoqueAuditoria.getSequencial() + "\n" + pagamentoGerado.getDescricao());
                                pagamentoService.alterar(pagamentoGerado);
                        }
                }
                return estoqueAuditoria;
        }
       
        private void verificarDadosPreenchidos(EstoqueAuditoria estoqueAuditoria) {
                if (VerificadorUtil.estaNuloOuVazio(estoqueAuditoria.getObservacao())) {
                        throw new NegocioException("Informe os motivos da devolução (OBSERVAÇÔES)");
                }
               
                if (VerificadorUtil.estaNuloOuVazio(estoqueAuditoria.getValorDevolvido()) ||
                                (estoqueAuditoria.getValorDevolvido() <= 0.0)) {
                        throw new NegocioException("Informe o valor devolvido");
                }
                if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.TRANSFERENCIA.getValor()) ||
                                estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.ESTORNO_CARTAO.getValor())) {
                        if (VerificadorUtil.estaNuloOuVazio(estoqueAuditoria.getCliente())) {
                                throw new NegocioException("Informe o cliente com o contato e/ou email");
                        }
                        if (VerificadorUtil.estaNuloOuVazio(estoqueAuditoria.getCliente().getContato()) &&
                                        VerificadorUtil.estaNuloOuVazio(estoqueAuditoria.getCliente().getEmail())) {
                                throw new NegocioException("Informe o contato ou email do cliente");
                        }
                        if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.TRANSFERENCIA.getValor())) {
                                if (VerificadorUtil.estaNuloOuVazio(estoqueAuditoria.getDadosBancarios())) {
                                        throw new NegocioException("Informe os dados bancários do cliente");
                                }
                        }
                }
        }

        @Override
        public void desativarProduto(Produto produto) {
                produto.setAtivo(false);
                this.alterar(produto);
        }
       
        @Override
        public void ativarProduto(Produto produto) {
                produto.setAtivo(true);
                this.alterar(produto);
        }
       
        @Override
        public void realizarContagem(ProdutoLoja produtoLoja, Integer quantidadeEstoque, String localizacao, Usuario usuario, Boolean indicadorAvaria) {
                if (VerificadorUtil.estaNulo(quantidadeEstoque)) {
                        throw new NegocioException("É preciso informar o estoque");
                }
                verificarSeUsuarioLogadoEhVendedorOuSuperior(usuario);
                produtoLoja.setLocalizacao(localizacao);
                if (VerificadorUtil.naoEstaNulo(produtoLoja.getDataContagemPreparacao())) {
                        if (diferencaMaiorEmDias(ConstantesSEC.StatusContagem.CONTAGEM_AMARELO_30_DIAS, produtoLoja.getDataContagemPreparacao(), DataUtils.getDataAtual())) {
                                produtoLoja.setDataContagemPreparacao(null);
                        }
                }
                if (VerificadorUtil.estaNulo(produtoLoja.getDataContagemPreparacao())) {
                        produtoLoja.setDataContagemPreparacao(DataUtils.getDataAtual());
                        produtoLoja.setQuantidadeEstoqueContagem(quantidadeEstoque);
                        produtoLoja.setUsuarioUltimaContagemPreparacao(usuario);
                        produtoLojaService.alterar(produtoLoja);
                } else if (VerificadorUtil.estaNulo(produtoLoja.getDataContagem()) ||
                                        produtoLoja.getDataContagem().before(produtoLoja.getDataContagemPreparacao()) ||
                                        produtoLoja.getIndicadorContagemSolicitada() ||
                                        produtoLoja.getUsuarioUltimaContagem().equals(produtoLoja.getUsuarioUltimaContagemPreparacao())) {
                        verificarSeUsuarioDePreparacaoDiferente(produtoLoja, usuario);
                        verificarSeProdutoPossuiTransferenciasAbertas(produtoLoja);
                        Integer quantidadeEstoqueAnterior = produtoLoja.getQuantidadeEstoque();
                        Integer quantidadeEstoqueNovo = quantidadeEstoque;
                       
                        if (temDivergenciaContagem(produtoLoja, quantidadeEstoqueNovo)) {
                                solicitarContagemCasoDivergentes(produtoLoja, quantidadeEstoqueNovo, usuario);
                        } else {
                                produtoLoja.setDataContagem(DataUtils.getDataAtual());
                                produtoLoja.setUsuarioUltimaContagem(usuario);
                                produtoLoja.setQuantidadeEstoque(quantidadeEstoqueNovo);
                                produtoLoja.setIndicadorContagemSolicitada(false);
                                produtoLojaService.alterar(produtoLoja);
                                if (quantidadeEstoqueAnterior != quantidadeEstoqueNovo) {
                                        cadastrarAuditoria(usuario, produtoLoja, TipoEstoqueAuditoria.CONTAGEM.getValor(), quantidadeEstoqueAnterior, quantidadeEstoqueNovo, null, "", TipoEstoqueAuditoriaVerificacao.NAO_VERIFICADO.getValor());
                                }
                                if (quantidadeEstoqueNovo > 0) {
                                        solicitarEntrarEmContatoCasoExistaPedidoParaLojaSolicitante(produtoLoja.getLoja(), usuario, produtoLoja.getProduto());
                                }
                        }
                } else {
                        throw new NegocioException("Contagem indisponível, informe à gestão");
                }
        }

        private Boolean diferencaMaiorEmDias(Integer quantidadeDias, Date dataAnterior, Date dataPosterior) {
                Date dataComDias = DataUtils.acrescentarDias(dataAnterior, quantidadeDias);
                return dataComDias.before(dataPosterior);
        }

        private boolean temDivergenciaContagem(ProdutoLoja produtoLoja, Integer quantidadeEstoqueNovo) {
                ProdutoHistoricoDTO produtoHistorico = new ProdutoHistoricoDTO();
                produtoHistorico.setProduto(produtoLoja.getProduto());
                Integer quantidadeEntradas = 0;
                List<ProdutoHistoricoDTO> entradas = produtoRepository.consultarHistoricoDeEntradas(produtoLoja.getProduto(), produtoLoja.getLoja(),
                                produtoLoja.getDataContagemPreparacao(), DataUtils.getDataAtual());
                for (ProdutoHistoricoDTO entrada : entradas) {
                        quantidadeEntradas = quantidadeEntradas + entrada.getQuantidadeLancamentos().intValue();
                }
                Integer quantidadeSaidas = 0;
                List<ProdutoHistoricoDTO> saidas = produtoRepository.consultarHistoricoDeSaidas(produtoLoja.getProduto(), produtoLoja.getLoja(),
                                produtoLoja.getDataContagemPreparacao(), DataUtils.getDataAtual());
                for (ProdutoHistoricoDTO saida : saidas) {
                        quantidadeSaidas = quantidadeSaidas + saida.getQuantidadeLancamentos().intValue();
                }
                if (VerificadorUtil.estaNulo(produtoLoja.getQuantidadeEstoqueContagem())) {
                        produtoLoja.setQuantidadeEstoqueContagem(produtoLoja.getQuantidadeEstoque());
                }
                return !(produtoLoja.getQuantidadeEstoqueContagem() + quantidadeEntradas - quantidadeSaidas == quantidadeEstoqueNovo);
        }

        private void verificarSeUsuarioDePreparacaoDiferente(ProdutoLoja produtoLoja, Usuario usuario) {
                if (produtoLoja.getUsuarioUltimaContagemPreparacao().equals(usuario)) {
                        throw new NegocioException("Usuário já realizou a preparação da contagem");
                }
        }

        @Override
        public void realizarContagemDireta(ProdutoLoja produtoLoja, Integer quantidadeEstoque, String localizacao, Usuario usuario, Boolean indicadorAvaria) {
                if (VerificadorUtil.estaNulo(quantidadeEstoque)) {
                        throw new NegocioException("É preciso informar o estoque");
                }
//              verificarSeUsuarioLogadoEhVendedorOuSuperior(usuario);
//              verificarSeProdutoPossuiTransferenciasAbertas(produtoLoja);
                Integer quantidadeEstoqueAnterior = produtoLoja.getQuantidadeEstoque();
                Integer quantidadeEstoqueNovo = quantidadeEstoque;
                produtoLoja.setLocalizacao(localizacao);
                produtoLoja.setDataContagemPreparacao(DataUtils.getDataAtual());
                produtoLoja.setDataContagem(DataUtils.getDataAtual());
                produtoLoja.setUsuarioUltimaContagem(usuario);
                produtoLoja.setUsuarioUltimaContagemPreparacao(usuario);
                produtoLoja.setQuantidadeEstoqueContagem(quantidadeEstoqueNovo);
                produtoLoja.setQuantidadeEstoque(quantidadeEstoqueNovo);
                produtoLoja.setIndicadorContagemSolicitada(false);
                produtoLojaService.alterar(produtoLoja);
                if (quantidadeEstoqueAnterior != quantidadeEstoqueNovo) {
                        cadastrarAuditoria(usuario, produtoLoja, TipoEstoqueAuditoria.CONTAGEM.getValor(), quantidadeEstoqueAnterior, quantidadeEstoqueNovo, null, "", TipoEstoqueAuditoriaVerificacao.VERIFICADO_SEM_PENDENCIA.getValor());
                }
                if (quantidadeEstoqueNovo > 0) {
                        solicitarEntrarEmContatoCasoExistaPedidoParaLojaSolicitante(produtoLoja.getLoja(), usuario, produtoLoja.getProduto());
                }
        }
       
        private void solicitarContagemCasoDivergentes(ProdutoLoja produtoLoja, Integer quantidadeEstoqueNovo, Usuario usuarioContagem) {
                produtoLoja.setDataContagemPreparacao(DataUtils.getDataAtual());
                produtoLoja.setQuantidadeEstoqueContagem(quantidadeEstoqueNovo);
                produtoLoja.setUsuarioUltimaContagemPreparacao(usuarioContagem);
                produtoLojaService.alterar(produtoLoja);
        }

        private void verificarSeProdutoPossuiTransferenciasAbertas(ProdutoLoja produtoLoja) {
                if (transferenciaRepository.verificarSeProdutoPossuiTransferenciasAbertas(produtoLoja)) {
                        throw new NegocioException("Não é permitido contar produto em transferência");
                }
        }
       
        private void verificarSeUsuarioLogadoEhVendedorOuSuperior(Usuario usuario) {
                if (!perfilService.temPerfilVendedor(usuario) &&
                        !perfilService.temPerfilLojistica(usuario) &&
                        !perfilService.temPerfilCompras(usuario) &&
                        !perfilService.temPerfilRecursosHumanos(usuario)) {
                        throw new NegocioException("Sem permissão para esta operação");
                }
        }
       
        @Override
        public void realizarContagem(Produto produto, Loja loja) {
                ProdutoLoja produtoLoja = new ProdutoLoja();
                produtoLoja.setProduto(produto);
                produtoLoja.setLoja(loja);
                produtoLoja.setDataContagem(DataUtils.getDataAtual());
                produtoLoja.setIndicadorContagemSolicitada(false);
                produtoLojaService.alterar(produtoLoja);
        }
       
        @Override
        public void transferirEstoque(Loja lojaEntrada, Loja lojaSaida, Usuario usuario, Produto produto, Integer quantidadeEstoque) {
                verificarParametrosParaTransferencia(lojaEntrada, lojaSaida, produto, quantidadeEstoque);
               
                Integer quantidadeEstoqueAnteriorEntrada = produtoLojaService.consultarEstoqueProdutoEeLoja(produto, lojaEntrada);
                Integer quantidadeEstoqueAnteriorSaida = produtoLojaService.consultarEstoqueProdutoEeLoja(produto, lojaSaida);
               
                produtoLojaService.alterarEstoqueAcrescentandoQuantidadeInformada(quantidadeEstoque, produto, lojaEntrada);
                produtoLojaService.alterarEstoqueAcrescentandoQuantidadeInformada(-quantidadeEstoque, produto, lojaSaida);
               
                cadastrarAuditoria(usuario, new ProdutoLoja(produto, lojaEntrada), TipoEstoqueAuditoria.TRANSFERENCIA.getValor(),
                                quantidadeEstoqueAnteriorEntrada, quantidadeEstoqueAnteriorEntrada + quantidadeEstoque, null, "", TipoEstoqueAuditoriaVerificacao.VERIFICADO_SEM_PENDENCIA.getValor());
               
                cadastrarAuditoria(usuario, new ProdutoLoja(produto, lojaSaida), TipoEstoqueAuditoria.TRANSFERENCIA.getValor(),
                                quantidadeEstoqueAnteriorSaida, quantidadeEstoqueAnteriorSaida - quantidadeEstoque, null, "", TipoEstoqueAuditoriaVerificacao.VERIFICADO_SEM_PENDENCIA.getValor());
               
                solicitarEntrarEmContatoCasoExistaPedidoParaLojaSolicitante(lojaEntrada, usuario, produto);
               
                Usuario usuarioPadrao = new Usuario();
                usuarioPadrao.setSequencial(ConstantesSEC.SEQUENCIAL_USUARIO_MATRIZ_60);
                realizarContagemComZeroEstoqueNaLojaEntrada(lojaEntrada, usuarioPadrao, produto, quantidadeEstoqueAnteriorEntrada, quantidadeEstoqueAnteriorSaida);
        }

        private void realizarContagemComZeroEstoqueNaLojaEntrada(Loja lojaEntrada, Usuario usuario, Produto produto, Integer quantidadeEstoqueAnteriorEntrada, Integer quantidadeEstoque) {
                if (quantidadeEstoqueAnteriorEntrada == 0) {
                        ProdutoLoja produtoLoja = produtoLojaService.consultarProdutoLoja(produto, lojaEntrada);
                        produtoLoja.setQuantidadeEstoqueContagem(quantidadeEstoque);
                        produtoLoja.setDataContagem(DataUtils.getDataAtual());
                        produtoLoja.setDataContagemPreparacao(DataUtils.getDataAtual());
                        produtoLoja.setUsuarioUltimaContagem(usuario);
                        produtoLoja.setUsuarioUltimaContagemPreparacao(usuario);
                        produtoLoja.setIndicadorContagemSolicitada(false);
                        produtoLojaService.alterar(produtoLoja);
                }
        }
       
        private void solicitarEntrarEmContatoCasoExistaPedidoParaLojaSolicitante(Loja lojaEntrada, Usuario usuario, Produto produto) {
                pedidoService.solicitarEntrarEmContatoCasoExistaPedidoParaLojaSolicitante(lojaEntrada, produto);
        }
       
        private void verificarParametrosParaTransferencia(Loja lojaEntrada, Loja lojaSaida, Produto produto, Integer quantidade) {
                if (VerificadorUtil.estaNulo(lojaEntrada) || VerificadorUtil.estaNulo(lojaSaida) || VerificadorUtil.estaNulo(produto)) {
                        throw new NegocioException("Obrigatório informar as lojas para transferência");
                } else {
                        if (lojaEntrada.getSequencial().equals(lojaSaida.getSequencial())) {
                                throw new NegocioException("Não é permitido transferir para uma mesma loja.");
                        }
                        if (quantidade == 0) {
                                throw new NegocioException("Obrigatório informar a quantidade.");
                        }
                }
        }
       
        @Override
        public Integer quantidadeTotalEstoque(Loja loja) {
                return produtoRepository.quantidadeTotalEstoque(loja);
        }
       
        @Override
        public Double valorTotalEstoque(Loja loja, Modelo modelo) {
                return produtoRepository.valorTotalEstoque(loja, modelo);
        }
       
        @Override
        public Integer quantidadeEstoque(ParametrosConsultaProdutoDTO parametrosConsulta) {
                return produtoRepository.quantidadeEstoque(parametrosConsulta);
        }
       
        @Override
        public Integer quantidadeEstoque(ParametrosConsultaProdutoDTO parametrosConsulta, Long sequencialLoja) {
                return produtoRepository.quantidadeEstoque(parametrosConsulta, sequencialLoja);
        }
       
        @Override
        public Integer quantidadeParaContagem(Loja loja) {
                ParametrosConsultaProdutoDTO parametrosConsulta = new ParametrosConsultaProdutoDTO();
                ((ParametrosConsultaProdutoDTO)parametrosConsulta).setLojaSelecionadaParaContagem(loja);
                ((ParametrosConsultaProdutoDTO)parametrosConsulta).setConsultarAtivo(1);
                return this.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta);
        }
       
        @Override
        public Integer solicitarContagem(ParametrosConsultaProdutoDTO parametrosConsulta) {
                List<Produto> produtos = produtoRepository.consultarPassandoParametrosConsulta(parametrosConsulta, 0, produtoRepository.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta), null, null, new HashMap<String, Object>());
                for (Produto produto : produtos) {
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getLojaSelecionadaParaContagem())) {
                                produtoLojaService.solicitarContagem(produto, parametrosConsulta.getLojaSelecionadaParaContagem(), true);
                        } else {
                                produtoLojaService.solicitarContagem(produto, null, true);
                        }
                }
                return produtos.size();
        }
       
        @Override
        public void cancelarContagem(ParametrosConsultaProdutoDTO parametrosConsulta) {
                List<Produto> produtos = produtoRepository.consultarPassandoParametrosConsulta(parametrosConsulta, 0, produtoRepository.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta), null, null, new HashMap<String, Object>());
                for (Produto produto : produtos) {
                        produtoLojaService.cancelarContagem(produto, parametrosConsulta.getLojaSelecionadaParaContagem());
                }
        }
       
        @Override
        public void zerarEstoque(ParametrosConsultaProdutoDTO parametrosConsulta, Usuario usuario) {
                List<Produto> produtos = produtoRepository.consultarPassandoParametrosConsulta(parametrosConsulta, 0, produtoRepository.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta), null, null, new HashMap<String, Object>());
                for (Produto produto : produtos) {
                        List<ProdutoLoja> lista = produtoLojaService.consultar(new ProdutoLoja(produto, parametrosConsulta.getLojaSelecionadaParaContagem()), 0, produtoLojaService.obterQuantidadeDeRegistrosPassandoEntidade(new ProdutoLoja(produto, parametrosConsulta.getLojaSelecionadaParaContagem())));
                        for (ProdutoLoja produtoLoja : lista) {
                                produtoLoja.setIndicadorContagemSolicitada(false);
                                produtoLojaService.alterar(produtoLoja);
                                if (produtoLoja.getQuantidadeEstoque() > 0 ) {
                                        cadastrarAuditoria(usuario, produtoLoja, TipoEstoqueAuditoria.CONTAGEM.getValor(), produtoLoja.getQuantidadeEstoque(), 0, null, "", TipoEstoqueAuditoriaVerificacao.VERIFICADO_SEM_PENDENCIA.getValor());
                                        produtoLojaService.alterarEstoqueAcrescentandoQuantidadeInformada(-produtoLoja.getQuantidadeEstoque(), produtoLoja.getProduto(), produtoLoja.getLoja());
                                }
                        }
                }
        }
       
        @Override
        public List<ProdutoHistoricoDTO> consultarHistorico(Produto produto, Integer ultimosMeses) {
                List<ProdutoHistoricoDTO> historico = new ArrayList<ProdutoHistoricoDTO>();
                for (int mes = 0; mes <= ultimosMeses; mes++) {
                        Calendar calendarData = new GregorianCalendar();
                        calendarData.setTime(DataUtils.acrescentarMeses(DataUtils.getDataAtual(), mes * -1));
                        historico.addAll(produtoRepository.consultarHistorico(produto,
                                DataUtils.getPrimeiroDiaDoMes(calendarData.get(Calendar.MONTH)+1, calendarData.get(Calendar.YEAR)),
                                DataUtils.getUltimoDiaDoMes(calendarData.get(Calendar.MONTH)+1, calendarData.get(Calendar.YEAR))));
                }
                return historico;
        }
       
        @Override
        public List<ProdutoHistoricoDetalhesDTO> detalharHistorico(ProdutoHistoricoDTO produtoHistorico) {
                return produtoRepository.detalharHistorico(produtoHistorico,
                                DataUtils.getPrimeiroDiaDoMes(new Integer(produtoHistorico.getMes()), new Integer(produtoHistorico.getAno())),
                                DataUtils.getUltimoDiaDoMes(new Integer(produtoHistorico.getMes()), new Integer(produtoHistorico.getAno())));
        }
       
        @Override
        public Integer quantidadeProdutosParaRetirarDoOnline(Loja loja) {
                ParametrosConsultaProdutoDTO parametrosConsulta = new ParametrosConsultaProdutoDTO();
                parametrosConsulta.setLojaSelecionada(loja.getSequencial());
                parametrosConsulta.setTipoRelatorioProduto(TipoRelatorio.RETIRAR_SITE.getValor());
                return produtoRepository.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta);
        }
       
        @Override
        public Integer quantidadeProdutosParaRetirarDoOnlineMatriz() {
                ParametrosConsultaProdutoDTO parametrosConsulta = new ParametrosConsultaProdutoDTO();
                parametrosConsulta.setLojaSelecionada(ConstantesSEC.SEQUENCIAL_MATRIZ_ESTOQUE_9);
                parametrosConsulta.setTipoRelatorioProduto(TipoRelatorio.RETIRAR_SITE.getValor());
                return produtoRepository.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta);
        }
       
        @Override
        public Integer quantidadeProdutosParaRetirarDoOnlineShoplog() {
                ParametrosConsultaProdutoDTO parametrosConsulta = new ParametrosConsultaProdutoDTO();
                parametrosConsulta.setLojaSelecionada(ConstantesSEC.SEQUENCIAL_LOJA_PATIO_14);
                parametrosConsulta.setTipoRelatorioProduto(TipoRelatorio.RETIRAR_SHOPLOG.getValor());
                return produtoRepository.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta);
        }
       
        @Override
        public Date dataUltimaVenda(Produto produto) {
                return produtoRepository.dataUltimaVenda(produto);
        }
       
        @Override
        public Integer quantidadeProdutosAdicionadosSite(Date dataInicial, Date dataFinal) {
                return produtoRepository.quantidadeProdutosAdicionadosSite(dataInicial, dataFinal);
        }
       
        @Override
        public Integer quantidadeProdutosOnline() {
                return produtoRepository.quantidadeProdutosOnline();
        }
       
        @Override
        public Integer quantidadeProdutosFavoritosOffline(Loja loja) {
                return produtoRepository.quantidadeProdutosFavoritosOffline(loja);
        }
       
        @Override
        public void verificarPedidosProdutoParaEntrarEmContato(Produto produto, Long sequencialCompra) {
                if (!produto.tipoProdutoEhServico()) {
                        List<Pedido> pedidosProduto = new ArrayList<Pedido>();
                        List<Produto> compativeis = consultarCompativeis(produto);
                        for (Produto produtoCompatival : compativeis) {
                                pedidosProduto.addAll(pedidoService.consultarPedidosDoProdutoOuModeloPendentes(produtoCompatival));
                        }
                       
                        for (Pedido pedidoConsultado : pedidosProduto) {
                                Boolean atualizarPedido = false;
                                Boolean atualizarPedidoCompativel = false;
                                for (Produto produtoCompatival : compativeis) {
                                        if (VerificadorUtil.naoEstaNuloOuVazio(pedidoConsultado.getProdutos())) {
                                                for (PedidoProduto pedidoProduto : pedidoConsultado.getProdutos()) {
                                                        if (pedidoProduto.getProduto().getSequencial().equals(produtoCompatival.getSequencial())) {
                                                                if (!produto.getSequencial().equals(produtoCompatival.getSequencial())) {
                                                                        atualizarPedidoCompativel = true;
                                                                }
                                                                atualizarPedido = true;
                                                                break;
                                                        }
                                                }
                                        } else if (VerificadorUtil.estaNulo(pedidoConsultado.getTipoProduto())) {
                                                atualizarPedido = true;
                                        } else if (VerificadorUtil.estaNulo(pedidoConsultado.getGenero())) {
                                                if (pedidoConsultado.getTipoProduto().equals(produtoCompatival.getTipo())) {
                                                        atualizarPedido = true;
                                                }
                                        } else if (pedidoConsultado.getTipoProduto().equals(produtoCompatival.getTipo()) &&
                                                        (produtoCompatival.getGenero().equals(TipoGenero.UNISSEX.getValor()) ||
                                                         pedidoConsultado.getGenero().equals(TipoGenero.UNISSEX.getValor()) ||
                                                         pedidoConsultado.getGenero().equals(produtoCompatival.getGenero()))) {
                                                if (VerificadorUtil.naoEstaNulo(pedidoConsultado.getEstiloProduto()) &&
                                                        VerificadorUtil.estaNulo(pedidoConsultado.getCorProduto())) {
                                                        if (pedidoConsultado.getEstiloProduto().equals(produtoCompatival.getEstilo())) {
                                                                atualizarPedido = true;
                                                        }
                                                } else if (VerificadorUtil.estaNulo(pedidoConsultado.getEstiloProduto()) &&
                                                                   VerificadorUtil.naoEstaNulo(pedidoConsultado.getCorProduto())) {
                                                        if (VerificadorUtil.naoEstaNulo(produtoCompatival.getCor())) {
                                                                if (pedidoConsultado.getCorProduto().equals(produtoCompatival.getCor())) {
                                                                        atualizarPedido = true;
                                                                }
                                                        }
                                                } else if (VerificadorUtil.naoEstaNulo(pedidoConsultado.getEstiloProduto()) &&
                                                                   VerificadorUtil.naoEstaNulo(pedidoConsultado.getCorProduto())) {
                                                        if (pedidoConsultado.getEstiloProduto().equals(produtoCompatival.getEstilo())) {
                                                                if (VerificadorUtil.naoEstaNulo(produtoCompatival.getCor())) {
                                                                        if (pedidoConsultado.getCorProduto().equals(produtoCompatival.getCor())) {
                                                                                atualizarPedido = true;
                                                                        }
                                                                }
                                                        }
                                                } else if (VerificadorUtil.estaNulo(pedidoConsultado.getEstiloProduto()) &&
                                                                   VerificadorUtil.estaNulo(pedidoConsultado.getCorProduto())) {
                                                        atualizarPedido = true;
                                                }
                                        }
                                }
                                if (atualizarPedido) {
                                        pedidoConsultado = pedidoService.consultarPedidoCompleto(pedidoConsultado);
                                        PedidoHistorico pedidoHistorico = new PedidoHistorico();
                                        pedidoHistorico.setPedido(pedidoConsultado);
                                        pedidoHistorico.setTipoSituacao(TipoSituacaoPedido.ENTRAR_EM_CONTATO.getValor());
                                        pedidoHistorico.setDataHistorico(DataUtils.getDataAtual());
                                        if (atualizarPedidoCompativel) {
                                                pedidoHistorico.setObservacao("PRODUTO COMPATÍVEL DISPONÍVEL PELA COMPRA ID " + sequencialCompra);
                                        } else {
                                                pedidoHistorico.setObservacao("PRODUTO DISPONÍVEL PELA COMPRA ID " + sequencialCompra);
                                        }
                                        if (VerificadorUtil.estaNulo(pedidoConsultado.getHistorico())) {
                                                pedidoConsultado.setHistorico(new ArrayList<PedidoHistorico>());
                                        }
                                        pedidoConsultado.setTipoSituacao(TipoSituacaoPedido.ENTRAR_EM_CONTATO.getValor());
                                        pedidoConsultado.setDataUltimaAlteracaoSituacao(DataUtils.getDataAtual());
                                        pedidoConsultado.setUsuarioAtendimento(null);
                                        pedidoConsultado.getHistorico().add(pedidoHistorico);
                                        pedidoService.alterar(pedidoConsultado);
                                }
                        }
                }
        }
        */

}