예제 #1
0
        public List <string> Importar(System.IO.Stream arquivo)
        {
            var retorno = new List <string>();

            try
            {
                ValidarImportar(arquivo);

                var produtosDao = LerXLSX(arquivo);

                if (produtosDao == null || produtosDao.Count() <= 0)
                {
                    retorno.Add("Planilha XLSX não possui produtos / Os produtos não estão na formatação correta / A loja não foi encontrada");
                    retorno.Add("Coluna A = Número do Produto, B = Descrição do Produto, C = Categoria do Produto, D = Medida do Produto, E = Quantidade do Produto na Loja, F = Preço de Compra do Produto");
                    return(retorno);
                }

                using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions()
                {
                    Timeout = TimeSpan.FromMinutes(10)
                }))
                {
                    // busca todos os produtos da planilha na base de dados
                    // caso exista, atualiza somente a quantidade
                    // caso não exista, cadastra na base de dados
                    foreach (var produtoDao in produtosDao)
                    {
                        if (produtoDao.Numero.GetValueOrDefault() == 52528)
                        {
                        }

                        var produto = produtoRepository.Listar(0, produtoDao.Numero.GetValueOrDefault());

                        // caso o produto não exista na base de dados
                        if (produto == null)
                        {
                            // busca se a medida da planilha já existe na base de dados
                            // caso não exista, cadastra-a na base de dados
                            // caso exista, substitui a medida da planilha pela da base de dados por conta do MedidaID
                            if (produtoDao.MedidaDao == null || (string.IsNullOrEmpty(produtoDao.MedidaDao.Descricao)))
                            {
                                retorno.Add(string.Format("Produto {0} não possui Medida associada", produtoDao.Numero));
                                continue;
                            }

                            var medidaDao = medidaRepository.Listar(produtoDao.MedidaDao.ToBd()).FirstOrDefault();
                            if (medidaDao == null)
                            {
                                int medidaId = medidaBusiness.Incluir(produtoDao.MedidaDao);

                                produtoDao.MedidaDao.MedidaID = medidaId;
                                produtoDao.MedidaDao.Ativo    = true;
                            }
                            else
                            {
                                produtoDao.MedidaDao = medidaDao.ToApp();
                            }

                            // busca se a categoria da planilha já existe na base de dados
                            // caso não exista, cadastra-a na base de dados
                            // caso exista, substitui a linha da planilha pela da base de dados por conta do MedidaID
                            var categoria = produtoDao.CategoriaDao.FirstOrDefault();
                            if (categoria == null || (string.IsNullOrEmpty(produtoDao.CategoriaDao.FirstOrDefault().Descricao)))
                            {
                                retorno.Add(string.Format("Produto {0} não possui Categoria associada", produtoDao.Numero));
                                continue;
                            }

                            var categoriaDao = categoriaRepository.Listar(categoria.ToBd()).FirstOrDefault();
                            if (categoriaDao == null)
                            {
                                var categoriaId = categoriaBusiness.Incluir(produtoDao.CategoriaDao.FirstOrDefault());

                                produtoDao.CategoriaDao.FirstOrDefault().CategoriaID = categoriaId;
                                produtoDao.CategoriaDao.FirstOrDefault().Ativo       = true;
                            }
                            else
                            {
                                produtoDao.CategoriaDao.Clear();
                                produtoDao.CategoriaDao.Add(categoriaDao.ToApp());
                            }

                            // cadastra o produto
                            produtoRepository.Incluir(produtoDao.ToBd());
                        }
                        else
                        {
                            var lojaProdutoDao = produtoDao.LojaProdutoDao.FirstOrDefault();

                            if (lojaProdutoDao != null)
                            {
                                var lojaProduto = lojaProdutoBusiness.Listar(new LojaProdutoDao()
                                {
                                    LojaID = lojaProdutoDao.LojaID, ProdutoID = produto.ProdutoID
                                }).FirstOrDefault();

                                // inclui/atualiza a quantidade do produto na loja
                                if (lojaProduto == null)
                                {
                                    lojaProdutoBusiness.Incluir(new LojaProdutoDao()
                                    {
                                        LojaID = lojaProdutoDao.LojaID, ProdutoID = produto.ProdutoID, Quantidade = lojaProdutoDao.Quantidade, Ativo = true
                                    });
                                }
                                else
                                {
                                    lojaProdutoBusiness.Atualizar(new LojaProdutoDao()
                                    {
                                        LojaProdutoID = lojaProduto.LojaProdutoID, Quantidade = lojaProdutoDao.Quantidade, Ativo = true
                                    });
                                }

                                // atualiza o preço do produto
                                produtoRepository.Atualizar(new Produto()
                                {
                                    Numero = produtoDao.Numero.GetValueOrDefault(), Preco = produtoDao.Preco
                                });

                                // ativa o produto
                                if (!produto.Ativo)
                                {
                                    produtoRepository.Ativar(0, produtoDao.Numero.GetValueOrDefault());
                                }
                            }
                        }
                    }

                    // se não houveram erros, commit no banco de dados
                    if (retorno == null || retorno.Count() <= 0)
                    {
                        scope.Complete();
                    }
                }
            }
            catch (BusinessException ex)
            {
                retorno.Add(ex.Message);
            }
            catch (Exception ex)
            {
                logRepository.Incluir(new Log()
                {
                    Descricao = ex.ToString(), DataHora = DateTime.Now
                });
                throw ex;
            }

            return(retorno);
        }
예제 #2
0
        public void ImportarXML(NotaFiscalDao notaFiscalDao, out List <string> mensagemErro, out List <string> mensagemSucesso, out int qtdNFeImportada)
        {
            try
            {
                qtdNFeImportada = 0;
                mensagemErro    = new List <string>();
                mensagemSucesso = new List <string>();

                var lojaDepositoDao = lojaRepository.Listar(new Loja()
                {
                    Deposito = true, Ativo = true
                }).FirstOrDefault();

                // se não houver loja depósito, retorna
                if (lojaDepositoDao == null)
                {
                    mensagemErro.Add("Loja de depósito não cadastrada");
                    qtdNFeImportada = 0;
                    return;
                }

                using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions()
                {
                    Timeout = TimeSpan.FromMinutes(10)
                }))
                {
                    XNamespace nsNFe = "http://www.portalfiscal.inf.br/nfe";

                    foreach (Stream item in notaFiscalDao.Arquivo)
                    {
                        var    todosProdutoAtualizados = true;
                        string xmlString = string.Empty;

                        using (StreamReader sr = new StreamReader(item))
                            xmlString = sr.ReadToEnd();

                        if (string.IsNullOrEmpty(xmlString))
                        {
                            mensagemErro.Add("XML está vazio");
                            continue;
                        }

                        XDocument xml = XDocument.Parse(xmlString, LoadOptions.None);

                        IEnumerable <XElement> noNFe = xml.Descendants(nsNFe + "NFe");

                        if (!noNFe.Any())
                        {
                            mensagemErro.Add("XML não é uma NFe (NFe)");
                            continue;
                        }

                        IEnumerable <XElement> NFe            = xml.Descendants(nsNFe + "NFe");
                        IEnumerable <XElement> NFe_infNFe     = NFe.Elements(nsNFe + "infNFe");
                        IEnumerable <XElement> NFe_infNFe_det = NFe_infNFe.Elements(nsNFe + "det");
                        IEnumerable <XElement> NFe_infNFe_ide = NFe_infNFe.Elements(nsNFe + "ide");

                        if (NFe_infNFe_det == null || NFe_infNFe_det.Count() <= 0)
                        {
                            mensagemErro.Add("XML não tem produtos (det)");
                            continue;
                        }

                        if (NFe_infNFe_ide == null)
                        {
                            mensagemErro.Add("XML não tem identificação (ide)");
                            continue;
                        }

                        var NFe_infNFe_nNF = NFe_infNFe_ide.Elements(nsNFe + "nNF").FirstOrDefault();
                        if (NFe_infNFe_nNF == null)
                        {
                            mensagemErro.Add("XML não tem número (nNF)");
                            continue;
                        }

                        int numeroNfe;
                        int.TryParse(NFe_infNFe_nNF.Value, out numeroNfe);

                        if (numeroNfe <= 0)
                        {
                            mensagemErro.Add("XML tem número inválido (nNF)");
                            continue;
                        }

                        var NFe_infNFe_dhEmi = NFe_infNFe_ide.Elements(nsNFe + "dhEmi").FirstOrDefault();
                        if (NFe_infNFe_dhEmi == null)
                        {
                            mensagemErro.Add("XML não tem data de emissão (dhEmi)");
                            continue;
                        }

                        DateTime dataEmissaoNfe;
                        DateTime.TryParse(NFe_infNFe_dhEmi.Value, out dataEmissaoNfe);

                        if (dataEmissaoNfe == DateTime.MinValue)
                        {
                            mensagemErro.Add("XML tem data de emissão inválida (dhEmi)");
                            continue;
                        }

                        var notafiscalDao = new NotaFiscalDao()
                        {
                            Numero = numeroNfe, LojaDao = new LojaDao()
                            {
                                LojaID = lojaDepositoDao.LojaID
                            }, DataEmissao = dataEmissaoNfe, DataCadastro = DateTime.Now
                        };
                        var notaFiscalId = Incluir(notafiscalDao);

                        foreach (XElement det in NFe_infNFe_det)
                        {
                            XElement NFe_infNFe_det_prod = det.Elements(nsNFe + "prod").FirstOrDefault();

                            if (NFe_infNFe_det_prod == null)
                            {
                                mensagemErro.Add("Produto não encontrado no XML (prod)");
                                continue;
                            }

                            XElement NFe_infNFe_det_prod_cProd = NFe_infNFe_det_prod.Elements(nsNFe + "cProd").FirstOrDefault();
                            XElement NFe_infNFe_det_prod_qCom  = NFe_infNFe_det_prod.Elements(nsNFe + "qCom").FirstOrDefault();
                            XElement NFe_infNFe_det_prod_xProd = NFe_infNFe_det_prod.Elements(nsNFe + "xProd").FirstOrDefault();
                            XElement NFe_infNFe_det_prod_vProd = NFe_infNFe_det_prod.Elements(nsNFe + "vProd").FirstOrDefault();

                            long   cProd = 0;
                            short  qCom  = 0;
                            double vProd = 0;

                            if (NFe_infNFe_det_prod_cProd != null)
                            {
                                cProd = Convert.ToInt64(NFe_infNFe_det_prod_cProd.Value);
                            }

                            if (NFe_infNFe_det_prod_qCom != null)
                            {
                                qCom = Convert.ToInt16(Math.Floor(Convert.ToDecimal(NFe_infNFe_det_prod_qCom.Value, new CultureInfo("en-US").NumberFormat)));
                            }

                            if (NFe_infNFe_det_prod_vProd != null)
                            {
                                vProd = Convert.ToDouble(NFe_infNFe_det_prod_vProd.Value, new CultureInfo("en-US").NumberFormat);
                            }

                            if (cProd <= 0)
                            {
                                mensagemErro.Add("Código do produto não encontrado no XML");
                            }

                            if (qCom <= 0)
                            {
                                mensagemErro.Add("Quantidade do produto não encontrado no XML");
                            }

                            if (cProd <= 0 || qCom <= 0)
                            {
                                continue;
                            }

                            var produtoExisteNaLojaDeposito = produtoRepository.ListarEmLoja(0, cProd, 0, lojaDepositoDao.LojaID);
                            var atualizado = false;

                            if (produtoExisteNaLojaDeposito != null && produtoExisteNaLojaDeposito.ProdutoID > 0)
                            {
                                atualizado = produtoRepository.Atualizar(lojaDepositoDao.LojaID, cProd, qCom);

                                if (atualizado)
                                {
                                    mensagemSucesso.Add(string.Format("Produto {0}: Atualizado a quantidade do estoque do depósito em {1}", cProd, qCom));
                                }
                            }
                            else
                            {
                                var produtoDao = new ProdutoDao()
                                {
                                    Numero = cProd, Quantidade = qCom, Ativo = true, Preco = vProd
                                };

                                // encontra a medida dentro do campo xProd
                                var regexMedida = Regex.Match(NFe_infNFe_det_prod_xProd.Value, @"[0-9]?[0-9]?[0-9]?\s[X-x]?\s[0-9]?[0-9]?[0-9]?\s[X-x]?\s[0-9]?[0-9]?[0-9]");
                                var medidaDao   = new MedidaDao()
                                {
                                    Descricao = regexMedida.Value.Replace(" ", "")
                                };

                                // se encontrar a medida na base de dados, associa ao produto. Caso contrário, cadastra-a
                                var medida = medidaBusiness.Listar(medidaDao).FirstOrDefault();
                                if (medida == null)
                                {
                                    int medidaId = medidaBusiness.Incluir(medidaDao);

                                    produtoDao.MedidaDao.MedidaID = medidaId;
                                    produtoDao.MedidaDao.Ativo    = true;
                                }
                                else
                                {
                                    produtoDao.MedidaDao = medida;
                                }

                                // encontra a categoria dentro do campo xProd
                                var regexCategoria     = Regex.Match(NFe_infNFe_det_prod_xProd.Value, @"^[^\s]+");
                                var descricaoCategoria = regexCategoria.Value;

                                if (descricaoCategoria == "BAU")
                                {
                                    descricaoCategoria = "BAÚ";
                                }
                                else if (descricaoCategoria == "COLCHAO")
                                {
                                    descricaoCategoria = "COLCHÃO";
                                }
                                else if (descricaoCategoria == "ORTOPEDICO")
                                {
                                    descricaoCategoria = "ORTOPÉDICO";
                                }
                                else if (descricaoCategoria == "SOFA")
                                {
                                    descricaoCategoria = "SOFÁ";
                                }
                                else if (descricaoCategoria == "COLCHAO")
                                {
                                    descricaoCategoria = "COLCHÃO";
                                }

                                var categoriaDao = categoriaBusiness.Listar(new CategoriaDao()
                                {
                                    Descricao = descricaoCategoria
                                }).FirstOrDefault();

                                // se encontrar a categoria na base de dados, associa ao produto. Caso contrário, cadastra-a
                                if (categoriaDao == null)
                                {
                                    var categoriaId = categoriaBusiness.Incluir(categoriaDao);

                                    produtoDao.CategoriaDao.FirstOrDefault().CategoriaID = categoriaId;
                                    produtoDao.CategoriaDao.FirstOrDefault().Ativo       = true;
                                }
                                else
                                {
                                    produtoDao.CategoriaDao.Clear();
                                    produtoDao.CategoriaDao.Add(categoriaDao);
                                }

                                produtoDao.Descricao = NFe_infNFe_det_prod_xProd.Value.Substring(0, regexMedida.Index).Trim();

                                // cadastra o produto
                                var produtoId = produtoRepository.Incluir(produtoDao.ToBd());

                                // atualiza a quantidade desse produto na loja do depósito
                                produtoRepository.Atualizar(lojaDepositoDao.LojaID, cProd, qCom);

                                notaFiscalProdutoBusiness.Incluir(new NotaFiscalProdutoDao()
                                {
                                    NotaFiscalID = notaFiscalId, ProdutoDao = new ProdutoDao()
                                    {
                                        ProdutoID = produtoId
                                    }, Quantidade = qCom
                                });

                                mensagemSucesso.Add(string.Format("Produto {0}: Cadastrado em todas as lojas e atualizado a quantidade do estoque do depósito em {1}", cProd, qCom));
                            }
                        }

                        if (todosProdutoAtualizados)
                        {
                            qtdNFeImportada++;
                        }
                    }

                    scope.Complete();
                }

                mensagemSucesso.Add(string.Format("{0} notas fiscais importadas com sucesso", qtdNFeImportada));
            }
            catch (BusinessException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                logRepository.Incluir(new Log()
                {
                    Descricao = ex.ToString(), DataHora = DateTime.Now
                });

                throw ex;
            }
        }