/// <summary> /// Procurar os arquivos XML´s a serem enviados aos web-services ou para ser executado alguma rotina /// </summary> /// <param name="pTipoArq">Mascara dos arquivos as serem pesquisados. Ex: *.xml *-nfe.xml</param> public override void BuscaXML(object parametroThread) { ParametroThread param = (ParametroThread)parametroThread; ServicoNFe oNfe = new ServicoNFe(); //Criar XML de controle de fluxo de envios de Notas Fiscais FluxoNfe oFluxoNfe = new FluxoNfe(); try { oFluxoNfe.CriarXml(true); } catch (Exception ex) { //danasa 27-2-2011 string exMessage = "Ocorreu um erro ao tentar criar o XML para o controle do fuxo do envio dos documentos eletrônicos.\r\n\r\nErro:" + ex.Message; new Auxiliar().GravarArqErroERP(string.Format(InfoApp.NomeArqERRUniNFe, DateTime.Now.ToString("yyyyMMddThhmmss")), exMessage); //MessageBox.Show("Ocorreu um erro ao tentar criar o XML para o controle do fuxo do envio dos documentos eletrônicos.\r\n\r\nErro:" + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error); } while (true) { this.ProcessaXML(oNfe, param.Servico); Thread.Sleep(1000); //Pausa na Thread de 1000 milissegundos ou 1 segundo } }
/// <summary> /// Procurar os arquivos XML´s a serem enviados aos web-services ou para ser executado alguma rotina /// </summary> /// <param name="pTipoArq">Mascara dos arquivos as serem pesquisados. Ex: *.xml *-nfe.xml</param> public override void BuscaXML(object parametroThread) { ParametroThread param = (ParametroThread)parametroThread; ServicoNFe oNfe = new ServicoNFe(); //Criar XML de controle de fluxo de envios de Notas Fiscais FluxoNfe oFluxoNfe = new FluxoNfe(); try { oFluxoNfe.CriarXml(true); } catch (Exception ex) { MessageBox.Show("Ocorreu um erro ao tentar criar o XML para o controle do fuxo do envio dos documentos eletrônicos.\r\n\r\nErro:" + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error); } while (true) { this.ProcessaXML(oNfe, param.Servico); Thread.Sleep(1000); //Pausa na Thread de 1000 milissegundos ou 1 segundo } }
/// <summary> /// Efetua a leitura do XML de retorno do processamento do lote de notas fiscais e /// atualiza o arquivo de fluxo e envio de notas /// </summary> /// <by>Wandrey Mundin Ferreira</by> /// <date>20/04/2009</date> protected override void LerRetornoLote() { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; var oLerXml = new LerXML(); var msXml = Auxiliar.StringXmlToStream(vStrXmlRetorno); var fluxoNFe = new FluxoNfe(); try { var doc = new XmlDocument(); doc.Load(msXml); var retConsReciNFeList = doc.GetElementsByTagName("retConsReciNFe"); foreach (XmlNode retConsReciNFeNode in retConsReciNFeList) { var retConsReciNFeElemento = (XmlElement)retConsReciNFeNode; //Pegar o número do recibo do lote enviado var nRec = string.Empty; if (retConsReciNFeElemento.GetElementsByTagName("nRec")[0] != null) { nRec = retConsReciNFeElemento.GetElementsByTagName("nRec")[0].InnerText; } //Pegar o status de retorno do lote enviado var cStatLote = string.Empty; if (retConsReciNFeElemento.GetElementsByTagName("cStat")[0] != null) { cStatLote = retConsReciNFeElemento.GetElementsByTagName("cStat")[0].InnerText; } switch (cStatLote) { #region Rejeições do XML de consulta do recibo (Não é o lote que foi rejeitado e sim o XML de consulta do recibo) case "280": //A-Certificado transmissor inválido case "281": //A-Validade do certificado case "283": //A-Verifica a cadeia de Certificação case "286": //A-LCR do certificado de Transmissor case "284": //A-Certificado do Transmissor revogado case "285": //A-Certificado Raiz difere da "IPC-Brasil" case "282": //A-Falta a extensão de CNPJ no Certificado case "214": //B-Tamanho do XML de dados superior a 500 Kbytes case "243": //B-XML de dados mal formatado case "108": //B-Verifica se o Serviço está paralisado momentaneamente case "109": //B-Verifica se o serviço está paralisado sem previsão case "242": //C-Elemento nfeCabecMsg inexistente no SOAP Header case "409": //C-Campo cUF inexistente no elemento nfeCabecMsg do SOAP Header case "410": //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP case "411": //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP case "238": //C-Versão dos Dados informada é superior à versão vigente case "239": //C-Versão dos Dados não suportada case "215": //D-Verifica schema XML da área de dados case "516": //D-Em caso de falha de schema, verificar se existe a tag raiz esperada para mensagem case "517": //D-Em caso de falha de Schema, verificar se existe o atributo versão para a tag raiz da mensagem case "545": //D-Em caso de falha de schema, verificar se o conteúdo do atributo versão difere do conteúdo da versaoDados informado no SOAPHeader case "404": //D-Verifica o uso de prefixo no namespace case "402": //D-XML utiliza codificação diferente de UTF-8 case "252": //E-Tipo do ambiente da NF-e difere do ambiente do web service case "248": //E-UF do recibo difere da UF do Web Service case "553": //E-Tipo autorizador do recibo diverge do órgão autorizador case "223": //E-CNPJ do transmissor do lote difere do CNPJ do transmissor da consulta break; #endregion #region Lote ainda está sendo processado case "105": //E-Verifica se o lote não está na fila de resposta, mas está na fila de entrada (Lote em processamento) //Ok vou aguardar o ERP gerar uma nova consulta para encerrar o fluxo da nota break; #endregion #region Lote não foi localizado pelo recibo que está sendo consultado case "106": //E-Verifica se o lote não está na fila de saída, nem na fila de entrada (Lote não encontrado) //No caso do lote não encontrado através do recibo, o ERP vai ter que consultar a situação da NFe para encerrar ela //Vou somente excluir ela do fluxo para não ficar consultando o recibo que não existe if (nRec != string.Empty) { fluxoNFe.ExcluirNfeFluxoRec(nRec.Trim()); } break; #endregion #region Lote foi processado, agora tenho que tratar as notas fiscais dele case "104": //Lote processado var protNFeList = retConsReciNFeElemento.GetElementsByTagName("protNFe"); foreach (XmlNode protNFeNode in protNFeList) { var protNFeElemento = (XmlElement)protNFeNode; var strProtNfe = protNFeElemento.OuterXml; var infProtList = protNFeElemento.GetElementsByTagName("infProt"); foreach (XmlNode infProtNode in infProtList) { var infProtElemento = (XmlElement)infProtNode; var strChaveNFe = string.Empty; var strStat = string.Empty; if (infProtElemento.GetElementsByTagName("chNFe")[0] != null) { strChaveNFe = "NFe" + infProtElemento.GetElementsByTagName("chNFe")[0].InnerText; } if (infProtElemento.GetElementsByTagName("cStat")[0] != null) { strStat = infProtElemento.GetElementsByTagName("cStat")[0].InnerText; } //Definir o nome do arquivo da NFe e seu caminho var strNomeArqNfe = fluxoNFe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe); // danasa 8-2009 // se por algum motivo o XML não existir no "Fluxo", então o arquivo tem que existir // na pasta "EmProcessamento" assinada. if (string.IsNullOrEmpty(strNomeArqNfe)) { if (string.IsNullOrEmpty(strChaveNFe)) throw new Exception("LerRetornoLote(): Não pode obter o nome do arquivo"); strNomeArqNfe = strChaveNFe.Substring(3) + ExtXml.Nfe; } var strArquivoNFe = Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqNfe; //Atualizar a Tag de status da NFe no fluxo para que se ocorrer alguma falha na exclusão eu tenha esta campo para ter uma referencia em futuras consultas fluxoNFe.AtualizarTag(strChaveNFe, FluxoNfe.ElementoEditavel.cStat, strStat); //Atualizar a tag da data e hora da ultima consulta do recibo fluxoNFe.AtualizarDPedRec(nRec, DateTime.Now); switch (strStat) { case "100": //NFe Autorizada if (File.Exists(strArquivoNFe)) { //Juntar o protocolo com a NFE já copiando para a pasta de autorizadas oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe); var strArquivoNFeProc = Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + oAux.ExtrairNomeArq(strNomeArqNfe, ExtXml.Nfe) + ExtXmlRet.ProcNFe; //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados oLerXml.Nfe(strArquivoNFe); //Mover a nfePRoc da pasta de NFE em processamento para a NFe Autorizada //Para envitar falhar, tenho que mover primeiro o XML de distribuição (-procnfe.xml) para //depois mover o da nfe (-nfe.xml), pois se ocorrer algum erro, tenho como reconstruir o senário, //assim sendo não inverta as posições. Wandrey 08/10/2009 oAux.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); //Mover a NFE da pasta de NFE em processamento para NFe Autorizada //Para envitar falhar, tenho que mover primeiro o XML de distribuição (-procnfe.xml) para //depois mover o da nfe (-nfe.xml), pois se ocorrer algum erro, tenho como reconstruir o senário. //assim sendo não inverta as posições. Wandrey 08/10/2009 oAux.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); //Disparar a geração/impressçao do UniDanfe. 03/02/2010 - Wandrey oAux.ExecutaUniDanfe(strNomeArqNfe, oLerXml.oDadosNfe.dEmi); } break; case "301": //NFe Denegada - Problemas com o emitente //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s Denegados oLerXml.Nfe(strArquivoNFe); //Mover a NFE da pasta de NFE em processamento para NFe Denegadas oAux.MoverArquivo(strArquivoNFe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi); break; case "302": //NFe Denegada - Problemas com o destinatário goto case "301"; case "110": //NFe Denegada - Não sei quando ocorre este, mas descobrir ele no manual então estou incluindo. Wandrey 20/10/2009 goto case "301"; default: //NFe foi rejeitada //Mover o XML da NFE a pasta de XML´s com erro oAux.MoveArqErro(strArquivoNFe); break; } //Deletar a NFE do arquivo de controle de fluxo fluxoNFe.ExcluirNfeFluxo(strChaveNFe); break; } } break; #endregion #region Qualquer outro tipo de status que não for os acima relacionados, vai tirar a nota fiscal do fluxo. default: //Qualquer outro tipo de rejeião vou tirar todas as notas do lote do fluxo, pois se o lote foi rejeitado, todas as notas fiscais também foram //De acordo com o manual de integração se o status do lote não for 104, tudo foi rejeitado. Wandrey 20/07/2010 //Vou retirar as notas do fluxo pelo recibo if (nRec != string.Empty) { fluxoNFe.ExcluirNfeFluxoRec(nRec.Trim()); } break; #endregion } } } catch (Exception ex) { throw (ex); } }
/// <summary> /// Ler o retorno da consulta situação da nota fiscal e de acordo com o status ele trata as notas enviadas se ainda não foram tratadas /// </summary> /// <param name="ChaveNFe">Chave da NFe que está sendo consultada</param> /// <remarks> /// Autor: Wandrey Mundin Ferreira /// Data: 16/06/2010 /// </remarks> protected override void LerRetornoSit(string ChaveNFe) { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; LerXML oLerXml = new LerXML(); MemoryStream msXml = Auxiliar.StringXmlToStream(this.vStrXmlRetorno); FluxoNfe oFluxoNfe = new FluxoNfe(); try { XmlDocument doc = new XmlDocument(); doc.Load(msXml); #region Distribuicao de Eventos oGerarXML.XmlDistEvento(emp, this.vStrXmlRetorno); //<<<danasa 6-2011 #endregion XmlNodeList retConsSitList = doc.GetElementsByTagName("retConsSitNFe"); foreach (XmlNode retConsSitNode in retConsSitList) { XmlElement retConsSitElemento = (XmlElement)retConsSitNode; //Definir a chave da NFe a ser pesquisada string strChaveNFe = "NFe" + ChaveNFe; //Definir o nome do arquivo da NFe e seu caminho string strNomeArqNfe = oFluxoNfe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe); if (string.IsNullOrEmpty(strNomeArqNfe)) { if (string.IsNullOrEmpty(strChaveNFe)) throw new Exception("LerRetornoSit(): Não pode obter o nome do arquivo"); strNomeArqNfe = strChaveNFe.Substring(3) + ExtXml.Nfe; } string strArquivoNFe = Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqNfe; //Pegar o status de retorno da NFe que está sendo consultada a situação var cStatCons = string.Empty; if (retConsSitElemento.GetElementsByTagName("cStat")[0] != null) { cStatCons = retConsSitElemento.GetElementsByTagName("cStat")[0].InnerText; } switch (cStatCons) { #region Rejeições do XML de consulta da situação da NFe (Não é a nfe que foi rejeitada e sim o XML de consulta da situação da nfe) case "280": //A-Certificado transmissor inválido case "281": //A-Validade do certificado case "283": //A-Verifica a cadeia de Certificação case "286": //A-LCR do certificado de Transmissor case "284": //A-Certificado do Transmissor revogado case "285": //A-Certificado Raiz difere da "IPC-Brasil" case "282": //A-Falta a extensão de CNPJ no Certificado case "214": //B-Tamanho do XML de dados superior a 500 Kbytes case "243": //B-XML de dados mal formatado case "108": //B-Verifica se o Serviço está paralisado momentaneamente case "109": //B-Verifica se o serviço está paralisado sem previsão case "242": //C-Elemento nfeCabecMsg inexistente no SOAP Header case "409": //C-Campo cUF inexistente no elemento nfeCabecMsg do SOAP Header case "410": //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP case "411": //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP case "238": //C-Versão dos Dados informada é superior à versão vigente case "239": //C-Versão dos Dados não suportada case "215": //D-Verifica schema XML da área de dados case "516": //D-Em caso de falha de schema, verificar se existe a tag raiz esperada para mensagem case "517": //D-Em caso de falha de Schema, verificar se existe o atributo versão para a tag raiz da mensagem case "545": //D-Em caso de falha de schema, verificar se o conteúdo do atributo versão difere do conteúdo da versaoDados informado no SOAPHeader case "404": //D-Verifica o uso de prefixo no namespace case "402": //D-XML utiliza codificação diferente de UTF-8 case "252": //J-Tipo do ambiente da NF-e difere do ambiente do web service case "226": //J-UF da chave de acesso difere da UF do web service break; #endregion #region Nota fiscal rejeitada case "217": //J-NFe não existe na base de dados do SEFAZ goto case "TirarFluxo"; case "562": //J-Verificar se o campo "Código Numérico" informado na chave de acesso é diferente do existente no BD goto case "TirarFluxo"; case "561": //J-Verificar se campo MM (mês) informado na Chave de Acesso é diferente do existente no BD goto case "TirarFluxo"; #endregion #region Nota fiscal autorizada case "100": //Autorizado o uso da NFe XmlNodeList infConsSitList = retConsSitElemento.GetElementsByTagName("infProt"); if (infConsSitList != null) { foreach (XmlNode infConsSitNode in infConsSitList) { XmlElement infConsSitElemento = (XmlElement)infConsSitNode; //Pegar o Status do Retorno da consulta situação string strStat = oAux.LerTag(infConsSitElemento, "cStat").Replace(";", ""); switch (strStat) { case "100": //O retorno da consulta situação a posição das tag´s é diferente do que vem //na consulta do recibo, assim sendo tenho que montar esta parte do XML manualmente //para que fique um XML de distribuição válido. Wandrey 07/10/2009 string atributoId = string.Empty; if (infConsSitElemento.GetAttribute("Id").Length != 0) { atributoId = " Id=\"" + infConsSitElemento.GetAttribute("Id") + "\""; } string strProtNfe = "<protNFe versao=\"" + ConfiguracaoApp.VersaoXMLNFe + "\">" + "<infProt" + atributoId + ">" + "<tpAmb>" + oAux.LerTag(infConsSitElemento, "tpAmb", false) + "</tpAmb>" + "<verAplic>" + oAux.LerTag(infConsSitElemento, "verAplic", false) + "</verAplic>" + "<chNFe>" + oAux.LerTag(infConsSitElemento, "chNFe", false) + "</chNFe>" + "<dhRecbto>" + oAux.LerTag(infConsSitElemento, "dhRecbto", false) + "</dhRecbto>" + "<nProt>" + oAux.LerTag(infConsSitElemento, "nProt", false) + "</nProt>" + "<digVal>" + oAux.LerTag(infConsSitElemento, "digVal", false) + "</digVal>" + "<cStat>" + oAux.LerTag(infConsSitElemento, "cStat", false) + "</cStat>" + "<xMotivo>" + oAux.LerTag(infConsSitElemento, "xMotivo", false) + "</xMotivo>" + "</infProt>" + "</protNFe>"; //Definir o nome do arquivo -procNfe.xml string strArquivoNFeProc = Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + oAux.ExtrairNomeArq(strArquivoNFe, ExtXml.Nfe) + ExtXmlRet.ProcNFe; //Se existir o strArquivoNfe, tem como eu fazer alguma coisa, se ele não existir //Não tenho como fazer mais nada. Wandrey 08/10/2009 if (File.Exists(strArquivoNFe)) { //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados oLerXml.Nfe(strArquivoNFe); //Verificar se a -nfe.xml existe na pasta de autorizados bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, ExtXml.Nfe); //Verificar se o -procNfe.xml existe na past de autorizados bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, ExtXmlRet.ProcNFe); //Se o XML de distribuição não estiver na pasta de autorizados if (!procNFeJaNaAutorizada) { if (!File.Exists(strArquivoNFeProc)) { oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe); } } //Se o XML de distribuição não estiver ainda na pasta de autorizados if (!procNFeJaNaAutorizada) { //Move a nfeProc da pasta de NFE em processamento para a NFe Autorizada oAux.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); } //Se a NFe não existir ainda na pasta de autorizados if (!NFeJaNaAutorizada) { //Mover a NFE da pasta de NFE em processamento para NFe Autorizada oAux.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); } else { //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento oAux.DeletarArquivo(strArquivoNFe); } //Disparar a geração/impressçao do UniDanfe. 03/02/2010 - Wandrey oAux.ExecutaUniDanfe(strNomeArqNfe, oLerXml.oDadosNfe.dEmi); } if (File.Exists(strArquivoNFeProc)) { //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento oAux.DeletarArquivo(strArquivoNFeProc); } break; case "301": //Ler o XML para pegar a data de emissão para criar a psta dos XML´s Denegados oLerXml.Nfe(strArquivoNFe); //Move a NFE da pasta de NFE em processamento para NFe Denegadas if (!oAux.EstaDenegada(strArquivoNFe, oLerXml.oDadosNfe.dEmi)) { oAux.MoverArquivo(strArquivoNFe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi); } break; case "302": goto case "301"; case "110": //Uso Denegado goto case "301"; default: //Mover o XML da NFE a pasta de XML´s com erro oAux.MoveArqErro(strArquivoNFe); break; } //Deletar a NFE do arquivo de controle de fluxo oFluxoNfe.ExcluirNfeFluxo(strChaveNFe); } } break; #endregion #region Nota fiscal cancelada case "101": //Cancelamento Homologado ou Nfe Cancelada goto case "100"; #endregion #region Nota fiscal Denegada case "110": //NFe Denegada goto case "100"; case "301": //NFe Denegada goto case "100"; case "302": //NFe Denegada goto case "100"; #endregion #region Conteúdo para retirar a nota fiscal do fluxo case "TirarFluxo": //Mover o XML da NFE a pasta de XML´s com erro oAux.MoveArqErro(strArquivoNFe); //Deletar a NFE do arquivo de controle de fluxo oFluxoNfe.ExcluirNfeFluxo(strChaveNFe); break; #endregion default: break; } } } catch (Exception ex) { throw (ex); } }
/// <summary> /// Envia o XML de lote de nota fiscal pra o SEFAZ em questão /// </summary> /// <remarks> /// Atualiza a propriedade this.vNfeRetorno da classe com o conteúdo /// XML com o retorno que foi dado do serviço do WebService. /// No caso do Recepcao se tudo estiver correto retorna um XML /// dizendo que a(s) nota(s) foram recebidas com sucesso. /// Se der algum erro ele grava um arquivo txt com o erro em questão. /// </remarks> /// <example> /// oUniNfe.vXmlNfeDadosMsg = "c:\nfe.xml"; /// oUniNfe.Recepcao(); /// this.textBox_xmlretorno.Text = oUniNfe.vNfeRetorno; /// // /// // /// //O conteúdo de retorno vai ser algo mais ou menos assim: /// // /// //<?xml version="1.0" encoding="UTF-8"?> /// // <retEnviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.10"> /// // <tpAmb>2</tpAmb> /// // <verAplic>1.10</verAplic> /// // <cStat>103</cStat> /// // <xMotivo>Lote recebido com sucesso</xMotivo> /// // <cUF>51</cUF> /// // <infRec> /// // <nRec>510000000106704</nRec> /// // <dhRecbto>2008-06-12T10:49:30</dhRecbto> /// // <tMed>2</tMed> /// // </infRec> /// // </retEnviNFe> /// </example> /// <by>Wandrey Mundin Ferreira</by> /// <date>04/06/2008</date> public override void Recepcao() { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; //Definir o serviço que será executado para a classe Servico = Servicos.EnviarLoteNfe; FluxoNfe oFluxoNfe = new FluxoNfe(); LerXML oLer = new LerXML(); try { #region Parte que envia o lote //Ler o XML de Lote para pegar o número do lote que está sendo enviado oLer.Nfe(NomeArquivoXML); var idLote = oLer.oDadosNfe.idLote; //Definir o objeto do WebService WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servicos.EnviarLoteNfe, emp, Convert.ToInt32(oLer.oDadosNfe.cUF), Convert.ToInt32(oLer.oDadosNfe.tpAmb), Convert.ToInt32(oLer.oDadosNfe.tpEmis)); //Criar objetos das classes dos serviços dos webservices do SEFAZ object oRecepcao = oRecepcao = wsProxy.CriarObjeto("NfeRecepcao2"); var oCabecMsg = wsProxy.CriarObjeto("nfeCabecMsg"); //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg wsProxy.SetProp(oCabecMsg, "cUF", oLer.oDadosNfe.cUF); wsProxy.SetProp(oCabecMsg, "versaoDados", ConfiguracaoApp.VersaoXMLNFe); // //XML neste ponto a NFe já está assinada, pois foi assinada, validada e montado o lote para envio por outro serviço. //Fica aqui somente este lembrete. Wandrey 16/03/2010 // //Invocar o método que envia o XML para o SEFAZ oInvocarObj.Invocar(wsProxy, oRecepcao, "nfeRecepcaoLote2", oCabecMsg, this, "-env-lot", "-rec"); #endregion #region Parte que trata o retorno do lote, ou seja, o número do recibo //Ler o XML de retorno com o recibo do lote enviado var oLerRecibo = new LerXML(); oLerRecibo.Recibo(vStrXmlRetorno); if (oLerRecibo.oDadosRec.cStat == "103") //Lote recebido com sucesso { //Atualizar o número do recibo no XML de controle do fluxo de notas enviadas oFluxoNfe.AtualizarTag(oLer.oDadosNfe.chavenfe, FluxoNfe.ElementoEditavel.tMed, oLerRecibo.oDadosRec.tMed.ToString()); oFluxoNfe.AtualizarTagRec(idLote, oLerRecibo.oDadosRec.nRec); } else if (Convert.ToInt32(oLerRecibo.oDadosRec.cStat) > 200) { //Se o status do retorno do lote for maior que 200, //vamos ter que excluir a nota do fluxo, porque ela foi rejeitada pelo SEFAZ //Primeiro vamos mover o xml da nota da pasta EmProcessamento para pasta de XML´s com erro e depois tira ela do fluxo //Wandrey 30/04/2009 oAux.MoveArqErro(Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + oFluxoNfe.LerTag(oLer.oDadosNfe.chavenfe, FluxoNfe.ElementoFixo.ArqNFe)); oFluxoNfe.ExcluirNfeFluxo(oLer.oDadosNfe.chavenfe); } //Deleta o arquivo de lote oAux.DeletarArquivo(NomeArquivoXML); #endregion } catch (ExceptionEnvioXML ex) { //Ocorreu algum erro no exato momento em que tentou enviar o XML para o SEFAZ, vou ter que tratar //para ver se o XML chegou lá ou não, se eu consegui pegar o número do recibo de volta ou não, etc. //E ver se vamos tirar o XML do Fluxo ou finalizar ele com a consulta situação da NFe //TODO: V3.0 - Tratar o problema de não conseguir pegar o recibo exatamente neste ponto try { //Gravar o arquivo de erro de retorno para o ERP, caso ocorra oAux.GravarArqErroServico(NomeArquivoXML, ExtXml.EnvLot, ExtXmlRet.Rec_ERR, ex); } catch { //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada. //Wandrey 16/03/2010 } } catch (ExceptionSemInternet ex) { try { //Gravar o arquivo de erro de retorno para o ERP, caso ocorra oAux.GravarArqErroServico(NomeArquivoXML, ExtXml.EnvLot, ExtXmlRet.Rec_ERR, ex, false); } catch { //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada. //Wandrey 16/03/2010 } } catch (Exception ex) { try { //Gravar o arquivo de erro de retorno para o ERP, caso ocorra oAux.GravarArqErroServico(NomeArquivoXML, ExtXml.EnvLot, ExtXmlRet.Rec_ERR, ex); } catch { //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada. //Wandrey 16/03/2010 } } }