protected void btnImportar_Click(object sender, EventArgs e) { try { if (this.txtUpload.PostedFile == null) { ModelState.AddModelError(string.Empty, "Nenhum arquivo informado"); } if (this.txtUpload.PostedFile.ContentLength == 0) { ModelState.AddModelError(string.Empty, "Arquivo inválido"); } var extensao = new FileInfo(this.txtUpload.PostedFile.FileName)?.Extension?.ToUpper() ?? string.Empty; if (string.IsNullOrWhiteSpace(extensao)) { ModelState.AddModelError(string.Empty, "Arquivo inválido"); } if (!extensao.Equals(".XML") && !extensao.Equals(".TXT") && !extensao.Equals(".CSV")) { ModelState.AddModelError(string.Empty, "É permitido apenas importação de arquivos .txt, .csv ou .xml"); } if (!ModelState.IsValid) { return; } if (!UploadArquivo(this.txtUpload)) { throw new Exception("O arquivo não pode ser processado. Certifique-se que já não esteja aberto em outro programa"); } if (extensao == ".XML") { try { var dueBusca = _documentoUnicoExportacaoDAO.ObterDUEPorId(this.txtDueID.Value.ToInt()); if (dueBusca == null) { throw new Exception("DUE não encontrada"); } if (this.txtUpload.HasFiles) { int xmlsImportados = 1; foreach (HttpPostedFile uploadedFile in this.txtUpload.PostedFiles) { string nomeArquivo = Path.Combine(Server.MapPath("Uploads"), uploadedFile.FileName); XmlDocument doc = new XmlDocument(); doc.Load(nomeArquivo); XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); ns.AddNamespace("nfe", "http://www.portalfiscal.inf.br/nfe"); var cnpjEmitente = ""; var razaoSocialEmitente = ""; var enderecoEmitente = ""; var estadoEmitente = ""; var informacoesEmitente = doc.SelectNodes("//nfe:emit", ns); foreach (XmlNode dadoEmit in informacoesEmitente) { foreach (XmlNode childNode in dadoEmit.ChildNodes) { if (childNode.Name == "CNPJ") { cnpjEmitente = childNode.InnerText; } if (childNode.Name == "xNome") { razaoSocialEmitente = childNode.InnerText; } if (childNode.Name == "enderEmit") { foreach (XmlNode emitEndereco in childNode.ChildNodes) { if (emitEndereco.Name == "xLgr") { enderecoEmitente = emitEndereco.InnerText; } if (emitEndereco.Name == "nro") { enderecoEmitente += ", " + emitEndereco.InnerText; } if (emitEndereco.Name == "UF") { estadoEmitente = emitEndereco.InnerText; } } } } } var dadosNfe = doc.SelectNodes("//nfe:ide", ns); var numeroNf = ""; foreach (XmlNode dadoNfe in dadosNfe) { foreach (XmlNode childNode in dadoNfe.ChildNodes) { if (childNode.Name == "nNF") { numeroNf = childNode.InnerText; } } } var paisesDanfe = PaisesDAO.ObterPaisesDanfe(); var nomeDestinatario = string.Empty; var paisDestinatario = string.Empty; var logradouroDestinatario = string.Empty; var logradouroNumeroDestinatario = string.Empty; var dadosDestinatario = doc.SelectNodes("//nfe:dest", ns); foreach (XmlNode dadoDest in dadosDestinatario) { foreach (XmlNode childNode in dadoDest.ChildNodes) { if (childNode.Name == "xNome") { nomeDestinatario = childNode.InnerText; } if (childNode.Name == "enderDest") { foreach (XmlNode childNodeDest in childNode.ChildNodes) { if (childNodeDest.Name == "xLgr") { logradouroDestinatario = childNodeDest.InnerText; } if (childNodeDest.Name == "nro") { logradouroNumeroDestinatario = childNodeDest.InnerText; } if (childNodeDest.Name == "cPais") { var paisSped = paisesDanfe .Where(c => c.CodigoSPED == childNodeDest.InnerText) .FirstOrDefault(); if (paisSped != null) { if (!string.IsNullOrEmpty(paisSped.Sigla1)) { paisDestinatario = paisSped.Sigla1; } } } } } } } var enderecoDestinatario = $"{logradouroDestinatario}, {logradouroNumeroDestinatario}"; var informacoesChaveNfe = doc.SelectSingleNode("//nfe:infProt", ns); var chaveNfe = informacoesChaveNfe.ChildNodes[2].InnerText; var item = doc.SelectSingleNode("//nfe:det", ns)?.FirstChild; var listaProdutos = new List <ProdutoNfe>(); int contaItem = 1; if (item != null) { var produtos = doc.SelectNodes("//nfe:prod", ns); foreach (XmlNode produto in produtos) { var descricaoProduto = ""; var unidadeComercializada = ""; var quantidadeEstatistica = ""; var quantidadeComercializada = ""; var valorProduto = ""; var ncm = ""; foreach (XmlNode childNode in produto.ChildNodes) { if (childNode.Name == "xProd") { descricaoProduto = childNode.InnerText; } if (childNode.Name == "uTrib") { unidadeComercializada = childNode.InnerText; } if (childNode.Name == "qCom") { quantidadeComercializada = childNode.InnerText.Replace(".", ","); } if (childNode.Name == "qTrib") { quantidadeEstatistica = childNode.InnerText.Replace(".", ","); } if (childNode.Name == "vProd") { valorProduto = childNode.InnerText.Replace(".", ","); } if (childNode.Name == "NCM") { ncm = childNode.InnerText; } } var produtoNfe = new ProdutoNfe( contaItem, descricaoProduto, unidadeComercializada, quantidadeComercializada.ToDecimal(), quantidadeEstatistica.ToDecimal(), valorProduto.ToDecimal(), chaveNfe, ncm, cnpjEmitente, razaoSocialEmitente, numeroNf.ToInt()); listaProdutos.Add(produtoNfe); contaItem++; } contaItem = 1; ExcluirItensSemVinculoDeNotaFiscal(dueBusca.Id); if (listaProdutos.Any()) { foreach (var produtoNFE in listaProdutos) { var notaFiscal = new NotaFiscal(); notaFiscal.TipoNF = "EXP"; notaFiscal.Item = produtoNFE.Item; notaFiscal.ChaveNF = chaveNfe; notaFiscal.NumeroNF = numeroNf; notaFiscal.CnpjNF = cnpjEmitente; notaFiscal.QuantidadeNF = produtoNFE.QuantidadeComercializada; notaFiscal.UnidadeNF = produtoNFE.UnidadeComercializada; notaFiscal.NCM = produtoNFE.NCM; notaFiscal.Arquivo = this.txtUpload.FileName; notaFiscal.Usuario = Convert.ToInt32(Session["UsuarioId"].ToString()); notaFiscal.DueId = this.txtDueID.Value.ToInt(); notaFiscal.VMLE = this.txtVMLE.Text.ToDecimal(); notaFiscal.VMCV = this.txtVMCV.Text.ToDecimal(); notaFiscal.Enquadramento = this.cbEnquadramento.SelectedValue.ToInt(); var existeNf = _notaFiscalDAO.ExisteNotaFiscalNaDUEFromXML(notaFiscal); if (existeNf > 0) { _notaFiscalDAO.ExcluirNotaFiscaiDuePorId(existeNf); } _notaFiscalDAO.Cadastrar(notaFiscal); string enquadramento = string.Empty; decimal vmle = notaFiscal.VMLE; decimal vmcv = notaFiscal.VMCV; if (this.cbEnquadramento.SelectedValue.ToInt() > 0) { enquadramento = this.cbEnquadramento.SelectedValue; } else { enquadramento = dueBusca.Enquadramento1_Default.ToString(); } //Para cada item da nota fiscal, criar um item na DUE com a mesma chave var dueId = _documentoUnicoExportacaoDAO.CriarItensDUEFromXML( dueBusca.Id, Convert.ToInt32(Session["UsuarioId"].ToString()), cnpjEmitente, razaoSocialEmitente, enderecoEmitente, estadoEmitente, nomeDestinatario, enderecoDestinatario, paisDestinatario, produtoNFE.ChaveNFE, produtoNFE.Item, produtoNFE.NCM, produtoNFE.DescricaoProduto, produtoNFE.UnidadeComercializada, produtoNFE.QuantidadeEstatistica, produtoNFE.QuantidadeComercializada, vmle, vmcv, enquadramento, dueBusca); _documentoUnicoExportacaoDAO.MarcarComoAutomatica(this.txtDueID.Value.ToInt()); } } } xmlsImportados++; } ViewState["Sucesso"] = true; ViewState["TotalNotasFiscais"] = this.txtUpload.PostedFiles.Count; ViewState["QuantidadeImportada"] = xmlsImportados; } } catch (Exception ex) { throw new Exception("Ocorreu um problema ao processar o XML - Detalhes:" + ex.ToString()); } } else { int quantidadeImportada = 0; var notasFiscais = ProcessarArquivo(this.txtUpload.PostedFile.InputStream, ";"); var dueBusca = _documentoUnicoExportacaoDAO.ObterDUEPorId(this.txtDueID.Value.ToInt()); if (dueBusca != null) { ExcluirItensSemVinculoDeNotaFiscal(dueBusca.Id); var notasValidas = new List <NotaFiscal>(); foreach (var nf in notasFiscais) { nf.Arquivo = this.txtUpload.FileName; nf.Usuario = Convert.ToInt32(Session["UsuarioId"].ToString()); nf.DueId = this.txtDueID.Value.ToInt(); nf.VMCV = this.txtVMCV.Text.ToDecimal(); nf.VMLE = this.txtVMLE.Text.ToDecimal(); nf.Enquadramento = this.cbEnquadramento.SelectedValue.ToInt(); if (nf.TipoNF == "EXP") { } var existeNf = _notaFiscalDAO.ExisteNotaFiscalNaDUE(nf); if (existeNf > 0) { _notaFiscalDAO.ExcluirNotaFiscaiDuePorId(existeNf); } _notaFiscalDAO.Cadastrar(nf); notasValidas.Add(nf); quantidadeImportada++; } var atributosCafe = dueBusca.Attr_Padrao_Qualidade_Default + dueBusca.Attr_Tipo_Default + dueBusca.Attr_Embarque_Em_Default + dueBusca.Attr_Caracteristica_Especial_Default + dueBusca.Attr_Outra_Caracteristica_Especial_Default + dueBusca.Attr_Metodo_Processamento_Default; foreach (var notaNcm in notasFiscais) { if (notaNcm.NCM != "09011110" && notaNcm.NCM != "09011190" && notaNcm.NCM != "09011200" && notaNcm.NCM != "09012100" && notaNcm.NCM != "09012200" && notaNcm.NCM != "21011110" && notaNcm.NCM != "21011190" && notaNcm.NCM != "21011200") { if (!string.IsNullOrEmpty(atributosCafe)) { ModelState.AddModelError(string.Empty, "Você informou atributos de café nas informações default, mas o NCM da nota que está sendo cadastrada é diferente de NCMs para exportação de café."); return; } } } CriarItensDUEAutomaticamente(notasValidas); _documentoUnicoExportacaoDAO.MarcarComoAutomatica(this.txtDueID.Value.ToInt()); ViewState["Sucesso"] = true; ViewState["TotalNotasFiscais"] = notasFiscais.Count; ViewState["QuantidadeImportada"] = quantidadeImportada; } } } catch (Exception ex) { DeletarArquivo(this.txtUpload); LogsService.Logar("CadastrarDUE.aspx", ex.ToString()); ModelState.AddModelError(string.Empty, ex.Message); } }