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