private void ExtraiDFe(XmlNode ret, string tagNameDoc, string folderTerceiros, string fileRetorno2, int emp, string fileRetorno) { for (int n = 0; n < ret.ChildNodes.Count; ++n) { if (ret.ChildNodes[n].Name.Equals(tagNameDoc)) { string FileToFtp = ""; string NSU = ret.ChildNodes[n].Attributes[TpcnResources.NSU.ToString()].Value; /// /// descompacta o conteudo /// string xmlRes = TFunctions.Decompress(ret.ChildNodes[n].InnerText); XmlDocument docXML = new XmlDocument(); docXML.Load(Functions.StringXmlToStreamUTF8(xmlRes)); if (string.IsNullOrEmpty(xmlRes)) { Auxiliar.WriteLog("LeRetornoNFe: Não foi possivel descompactar o conteudo da NSU: " + NSU, false); } else { #region NFe if (ret.ChildNodes[n].Attributes["schema"].InnerText.StartsWith("resEvento")) { FileToFtp = Path.Combine(folderTerceiros, fileRetorno2 + "-" + NSU + Propriedade.Extensao(Propriedade.TipoEnvio.PedEve).RetornoXML); } else if (ret.ChildNodes[n].Attributes["schema"].InnerText.StartsWith("procEventoNFe")) { string chNFe = Functions.LerTag(((XmlElement)((XmlElement)docXML.GetElementsByTagName("evento")[0]).GetElementsByTagName("infEvento")[0]), "chNFe", false); string tpEvento = Functions.LerTag(((XmlElement)((XmlElement)docXML.GetElementsByTagName("evento")[0]).GetElementsByTagName("infEvento")[0]), "tpEvento", false); string nSeqEvento = Functions.LerTag(((XmlElement)((XmlElement)docXML.GetElementsByTagName("evento")[0]).GetElementsByTagName("infEvento")[0]), "nSeqEvento", false); if (Empresas.Configuracoes[emp].ArqNSU) { FileToFtp = Path.Combine(folderTerceiros, fileRetorno2 + "-" + NSU + Propriedade.ExtRetorno.ProcEventoNFe); } else { FileToFtp = Path.Combine(folderTerceiros, chNFe + "_" + tpEvento + "_" + nSeqEvento.PadLeft(2, '0') + Propriedade.ExtRetorno.ProcEventoNFe); } } else if (ret.ChildNodes[n].Attributes["schema"].InnerText.StartsWith("procNFe")) { string chave = ((XmlElement)docXML.GetElementsByTagName("infNFe")[0]).GetAttribute("Id").Substring(3, 44); if (Empresas.Configuracoes[emp].ArqNSU) { FileToFtp = Path.Combine(folderTerceiros, fileRetorno2 + "-" + NSU + Propriedade.ExtRetorno.ProcNFe); } else { FileToFtp = Path.Combine(folderTerceiros, chave + Propriedade.ExtRetorno.ProcNFe); } } else if (ret.ChildNodes[n].Attributes["schema"].InnerText.StartsWith("resNFe")) { FileToFtp = Path.Combine(folderTerceiros, fileRetorno2 + "-" + NSU + Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML); } #endregion NFe #region CTe else if (ret.ChildNodes[n].Attributes["schema"].InnerText.StartsWith("procEventoCTe")) { string chCTe = Functions.LerTag(((XmlElement)((XmlElement)docXML.GetElementsByTagName("eventoCTe")[0]).GetElementsByTagName("infEvento")[0]), "chCTe", false); string tpEvento = Functions.LerTag(((XmlElement)((XmlElement)docXML.GetElementsByTagName("eventoCTe")[0]).GetElementsByTagName("infEvento")[0]), "tpEvento", false); string nSeqEvento = Functions.LerTag(((XmlElement)((XmlElement)docXML.GetElementsByTagName("eventoCTe")[0]).GetElementsByTagName("infEvento")[0]), "nSeqEvento", false); if (Empresas.Configuracoes[emp].ArqNSU) { FileToFtp = Path.Combine(folderTerceiros, fileRetorno2 + "-" + NSU + Propriedade.ExtRetorno.ProcEventoCTe); } else { FileToFtp = Path.Combine(folderTerceiros, chCTe + "_" + tpEvento + "_" + nSeqEvento.PadLeft(2, '0') + Propriedade.ExtRetorno.ProcEventoCTe); } } else if (ret.ChildNodes[n].Attributes["schema"].InnerText.StartsWith("procCTe")) { string chave = ((XmlElement)docXML.GetElementsByTagName("infCte")[0]).GetAttribute("Id").Substring(3, 44); if (Empresas.Configuracoes[emp].ArqNSU) { FileToFtp = Path.Combine(folderTerceiros, fileRetorno2 + "-" + NSU + Propriedade.ExtRetorno.ProcCTe); } else { FileToFtp = Path.Combine(folderTerceiros, chave + Propriedade.ExtRetorno.ProcCTe); } } #endregion CTe else { Auxiliar.WriteLog("LerRetornoDFe: Nao foi possivel ler o schema", false); } if (FileToFtp != "") { if (!File.Exists(FileToFtp)) { File.WriteAllText(FileToFtp, xmlRes); } string vFolder = Empresas.Configuracoes[emp].FTPPastaRetornos; if (!string.IsNullOrEmpty(vFolder)) { try { Empresas.Configuracoes[emp].SendFileToFTP(FileToFtp, vFolder); } catch (Exception ex) { /// /// grava um arquivo de erro com extensao "FTP" para diferenciar dos arquivos de erro oAux.GravarArqErroERP(Path.ChangeExtension(fileRetorno, ".ftp"), ex.Message); } } } } } } }
private void LeRetornoDFe(int emp, XmlDocument doc) { /* * if (string.IsNullOrEmpty(Empresas.Configuracoes[emp].PastaDownloadNFeDest)) * { * /// * /// nao interpreto como erro, já que o ERP pode não querer descompactar os arquivos * /// * Auxiliar.WriteLog("LeRetornoNFe: Pasta de DownloadNFeDest nao definida"); * return; * } */ try { /// /// pega o nome base dos arquivos a serem gravados /// string fileRetorno2 = Functions.ExtrairNomeArq(Path.GetFileName(this.NomeArquivoXML), Propriedade.ExtEnvio.EnvDFe_XML); /// /// pega o nome do arquivo de retorno /// string fileRetorno = Path.Combine(Empresas.Configuracoes[emp].PastaXmlRetorno, fileRetorno2 + Propriedade.ExtRetorno.retEnvDFe_XML); if (!File.Exists(fileRetorno)) { return; } /// /// cria a pasta para comportar as notas e eventos retornados já descompactados /// string folderTerceiros = Path.Combine(Empresas.Configuracoes[emp].PastaXmlRetorno, "dfe"); if (!Directory.Exists(folderTerceiros)) { Directory.CreateDirectory(folderTerceiros); } /// /// exclui todos os arquivos que foram envolvidos no retorno /// foreach (var item in Directory.GetFiles(folderTerceiros, fileRetorno2 + "-*.xml", SearchOption.TopDirectoryOnly)) { if (!Functions.FileInUse(item)) { File.Delete(item); } } doc.Load(fileRetorno); XmlNodeList envEventoList = doc.GetElementsByTagName("retDistDFeInt"); foreach (XmlNode ret1Node in envEventoList) { XmlElement ret1Elemento = (XmlElement)ret1Node; XmlNodeList ret1List = ret1Elemento.GetElementsByTagName("loteDistDFeInt"); foreach (XmlNode ret in ret1List) { for (int n = 0; n < ret.ChildNodes.Count; ++n) { if (ret.ChildNodes[n].Name.Equals("docZip")) { string FileToFtp = ""; string NSU = ret.ChildNodes[n].Attributes[TpcnResources.NSU.ToString()].Value; /// /// descompacta o conteudo /// string xmlRes = TFunctions.Decompress(ret.ChildNodes[n].InnerText); if (string.IsNullOrEmpty(xmlRes)) { Auxiliar.WriteLog("LeRetornoNFe: Não foi possivel descompactar o conteudo da NSU: " + NSU, false); } else { if (ret.ChildNodes[n].Attributes["schema"].InnerText.StartsWith("resEvento")) { FileToFtp = Path.Combine(folderTerceiros, fileRetorno2 + "-" + NSU + Propriedade.ExtRetorno.Eve); } else if (ret.ChildNodes[n].Attributes["schema"].InnerText.StartsWith("procEventoNFe")) { FileToFtp = Path.Combine(folderTerceiros, fileRetorno2 + "-" + NSU + Propriedade.ExtRetorno.ProcEventoNFe); } else if (ret.ChildNodes[n].Attributes["schema"].InnerText.StartsWith("procNFe")) { FileToFtp = Path.Combine(folderTerceiros, fileRetorno2 + "-" + NSU + Propriedade.ExtRetorno.ProcNFe); } else if (ret.ChildNodes[n].Attributes["schema"].InnerText.StartsWith("resNFe")) { FileToFtp = Path.Combine(folderTerceiros, fileRetorno2 + "-" + NSU + Propriedade.ExtEnvio.Nfe); } else { Auxiliar.WriteLog("LerRetornoDFe: Nao foi possivel ler o schema", false); } if (FileToFtp != "") { if (!File.Exists(FileToFtp)) { File.WriteAllText(FileToFtp, xmlRes); } string vFolder = Empresas.Configuracoes[emp].FTPPastaRetornos; if (!string.IsNullOrEmpty(vFolder)) { try { Empresas.Configuracoes[emp].SendFileToFTP(FileToFtp, vFolder); } catch (Exception ex) { /// /// grava um arquivo de erro com extensao "FTP" para diferenciar dos arquivos de erro oAux.GravarArqErroERP(Path.ChangeExtension(fileRetorno, ".ftp"), ex.Message); } } } } } } } } } catch (Exception ex) { Auxiliar.WriteLog("LeRetornoNFe: " + ex.Message, false); /// /// Wandrey. /// Foi tudo processado mas houve algum erro na descompactacao dos retornos /// Se gravar o arquivo com extensao .err, o ERP pode ignorar o XML de retorno, que está correto /// //WriteLogError(ex); } }