public override void Execute() { try { int emp = Empresas.FindEmpresaByThread(); //AssinarValidarNFe(this, this.NomeArquivoXML, Empresas.Configuracoes[emp].PastaEnvio); this.AssinarValidarXMLNFe(Empresas.Configuracoes[emp].PastaXmlEnvio); //Definir o nome do arquivo assinado FileInfo arq = new FileInfo(this.NomeArquivoXML); string arquivoAssinado = arq.DirectoryName.Substring(0, arq.DirectoryName.Length - 5) + Propriedade.NomePastaXMLAssinado + "\\" + arq.Name; //Montar lote de nfe FluxoNfe oFluxoNfe = new FluxoNfe(); string cError = ""; try { DadosNFeClass oDadosNfe = this.LerXMLNFe(arquivoAssinado); if (!oFluxoNfe.NFeComLote(oDadosNfe.chavenfe)) { //Gerar lote this.NomeArquivoXML = arquivoAssinado; this.LoteNfe(arquivoAssinado, oDadosNfe.versao); } } catch (IOException ex) { cError = (ex.InnerException != null ? ex.InnerException.Message : ex.Message); } catch (Exception ex) { cError = (ex.InnerException != null ? ex.InnerException.Message : ex.Message); } if (!string.IsNullOrEmpty(cError)) { try { // grava o arquivo de erro oAux.GravarArqErroERP(Path.GetFileNameWithoutExtension(arquivoAssinado) + ".err", cError); // move o arquivo para a pasta de erro oAux.MoveArqErro(arquivoAssinado); } catch { // A principio não vou fazer nada Wandrey 24/04/2011 } } } catch { } }
/// <summary> /// Finalizar a NFe no processo Síncrono /// </summary> /// <param name="xmlRetorno">Conteúdo do XML retornado da SEFAZ</param> /// <param name="emp">Código da empresa para buscar as configurações</param> private void FinalizarNFeSincrono(string xmlRetorno, int emp) { XmlDocument xml = new XmlDocument(); xml.Load(Functions.StringXmlToStream(xmlRetorno)); XmlNodeList protNFe = xml.GetElementsByTagName("protNFe"); FluxoNfe fluxoNFe = new FluxoNfe(); TaskNFeRetRecepcao retRecepcao = new TaskNFeRetRecepcao(); retRecepcao.FinalizarNFe(protNFe, fluxoNFe, emp, ConteudoXML); }
public override void Execute() { try { int emp = Empresas.FindEmpresaByThread(); DadosNFeClass oDadosNfe = LerXMLNFe(ConteudoXML); AssinarValidarXMLNFe(ConteudoXML); //Montar lote de nfe FluxoNfe oFluxoNfe = new FluxoNfe(); string cError = ""; try { if (!oFluxoNfe.NFeComLote(oDadosNfe.chavenfe)) { XmlDocument xmlLote = LoteNfe(ConteudoXML, NomeArquivoXML, oDadosNfe.versao); TaskNFeRecepcao nfeRecepcao = new TaskNFeRecepcao(xmlLote); nfeRecepcao.Execute(); } } catch (IOException ex) { cError = (ex.InnerException != null ? ex.InnerException.Message : ex.Message); } catch (Exception ex) { cError = (ex.InnerException != null ? ex.InnerException.Message : ex.Message); } if (!string.IsNullOrEmpty(cError)) { try { // grava o arquivo de erro oAux.GravarArqErroERP(Path.GetFileNameWithoutExtension(NomeArquivoXML) + ".err", cError); // move o arquivo para a pasta de erro oAux.MoveArqErro(NomeArquivoXML); } catch { // A principio não vou fazer nada Wandrey 24/04/2011 } } } catch { } }
/// <summary> /// Finalizar a NFe no processo Síncrono /// </summary> /// <param name="conteudoXml">Conteúdo do XML retornado da SEFAZ</param> /// <param name="emp">Código da empresa para buscar as configurações</param> private void FinalizarNFeSincrono(string conteudoXml, int emp) { MemoryStream memoryStream = Functions.StringXmlToStream(conteudoXml); XmlDocument xml = new XmlDocument(); xml.Load(memoryStream); XmlNodeList protNFe = xml.GetElementsByTagName("protNFe"); FluxoNfe fluxoNFe = new FluxoNfe(); TaskNFeRetRecepcao retRecepcao = new TaskNFeRetRecepcao(); retRecepcao.FinalizarNFe(protNFe, fluxoNFe, emp); }
/// <summary> /// Assinar e validar o XML da Nota Fiscal Eletrônica e move para a pasta de assinados /// </summary> /// <param name="pasta">Nome da pasta onde está o XML a ser validado e assinado</param> /// <returns>true = Conseguiu assinar e validar</returns> /// <remarks> /// Autor: Wandrey Mundin Ferreira /// Data: 03/04/2009 /// </remarks> public void AssinarValidarXMLNFe(string pasta) { int emp = Empresas.FindEmpresaByThread(); //Criar Pasta dos XML´s a ser enviado em Lote já assinados string pastaLoteAssinado = pasta + Propriedade.NomePastaXMLAssinado; //Se o arquivo XML já existir na pasta de assinados, vou avisar o ERP que já tem um em andamento string arqDestino = pastaLoteAssinado + "\\" + Functions.ExtrairNomeArq(NomeArquivoXML, ".xml") + ".xml"; try { //Fazer uma leitura de algumas tags do XML DadosNFeClass dadosNFe = this.LerXMLNFe(NomeArquivoXML); string ChaveNfe = dadosNFe.chavenfe; string TpEmis = dadosNFe.tpEmis; //Inserir NFe no XML de controle do fluxo FluxoNfe oFluxoNfe = new FluxoNfe(); if (oFluxoNfe.NfeExiste(ChaveNfe)) { //Mover o arquivo da pasta em processamento para a pasta de XML´s com erro oAux.MoveArqErro(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions.ExtrairNomeArq(NomeArquivoXML, ".xml") + ".xml"); //Deletar a NFE do arquivo de controle de fluxo oFluxoNfe.ExcluirNfeFluxo(ChaveNfe); //Vou forçar uma exceção, e o ERP através do inicio da mensagem de erro pode tratar e já gerar uma consulta //situação para finalizar o processo. Assim envito perder os XML´s que estão na pasta EmProcessamento //tendo assim a possibilidade de gerar o -procNfe.XML através da consulta situação. //Wandrey 08/10/2009 //throw new Exception("NFE NO FLUXO: Esta nota fiscal já está na pasta de Notas Fiscais em processo de envio, desta forma não é possível envia-la novamente. Se a nota fiscal estiver presa no fluxo de envio sem conseguir finalizar o processo, gere um consulta situação da NFe para forçar a finalização.\r\n" + NomeArquivoXML); } else { //Deletar o arquivo XML da pasta de temporários de XML´s com erros se o mesmo existir Functions.DeletarArquivo(Empresas.Configuracoes[emp].PastaXmlErro + "\\" + Functions.ExtrairNomeArq(NomeArquivoXML, ".xml") + ".xml"); } //Validações gerais ValidacoesGeraisXMLNFe(NomeArquivoXML, dadosNFe); //Assinar o arquivo XML AssinaturaDigital assDig = new AssinaturaDigital(); assDig.Assinar(NomeArquivoXML, emp, Convert.ToInt32(dadosNFe.cUF)); //Adicionar a tag do QRCode if (!String.IsNullOrEmpty(Empresas.Configuracoes[emp].IndentificadorCSC) && dadosNFe.mod == "65") { QRCode qrCode = new QRCode(Empresas.Configuracoes[emp].IndentificadorCSC, Empresas.Configuracoes[emp].TokenCSC, NomeArquivoXML); if (qrCode.CalcularLink()) { string url = Empresas.Configuracoes[emp].AmbienteCodigo == (int)NFe.Components.TipoAmbiente.taHomologacao ? Empresas.Configuracoes[emp].URLConsultaDFe.UrlNFCeH : Empresas.Configuracoes[emp].URLConsultaDFe.UrlNFCe; qrCode.GerarLinkConsulta(url); qrCode.AddLinkQRCode(); } } // Validar o Arquivo XML da NFe com os Schemas se estiver assinado ValidarXML validar = new ValidarXML(NomeArquivoXML, Convert.ToInt32(dadosNFe.cUF)); string cResultadoValidacao = validar.ValidarArqXML(NomeArquivoXML); if (cResultadoValidacao != "") { //Registrar o erro da validação do schema para o sistema ERP throw new Exception(cResultadoValidacao); } //Mover o arquivo XML da pasta de lote para a pasta de XML´s assinados //Se a pasta de assinados não existir, vamos criar if (!Directory.Exists(pastaLoteAssinado)) { Directory.CreateDirectory(pastaLoteAssinado); } FileInfo fiDestino = new FileInfo(arqDestino); if (!File.Exists(arqDestino) || (long)DateTime.Now.Subtract(fiDestino.LastWriteTime).TotalMilliseconds >= 60000) //60.000 ms que corresponde á 60 segundos que corresponde a 1 minuto { //Mover o arquivo para a pasta de XML´s assinados Functions.Move(NomeArquivoXML, arqDestino); oFluxoNfe.InserirNfeFluxo(ChaveNfe, dadosNFe.mod, arqDestino); } else { oFluxoNfe.InserirNfeFluxo(ChaveNfe, dadosNFe.mod, arqDestino); throw new IOException("Esta nota fiscal já está na pasta de Notas Fiscais assinadas e em processo de envio, desta forma não é possível enviar a mesma novamente.\r\n" + NomeArquivoXML); } } catch (Exception ex) { try { string extFinal = Propriedade.ExtEnvio.Nfe; string extErro = Propriedade.ExtRetorno.Nfe_ERR; switch (Servico) { case Servicos.MDFeAssinarValidarEnvioEmLote: case Servicos.MDFeMontarLoteUm: extFinal = Propriedade.ExtEnvio.MDFe; extErro = Propriedade.ExtRetorno.MDFe_ERR; break; case Servicos.CTeAssinarValidarEnvioEmLote: case Servicos.CTeMontarLoteUm: extFinal = Propriedade.ExtEnvio.Cte; extErro = Propriedade.ExtRetorno.Cte_ERR; break; } TFunctions.GravarArqErroServico(NomeArquivoXML, extFinal, extErro, ex); //Se já foi movido o XML da Nota Fiscal para a pasta em Processamento, vou ter que //forçar mover para a pasta de XML com erro neste ponto. oAux.MoveArqErro(arqDestino); } catch (Exception exx) { Auxiliar.WriteLog(exx.Message, true); //Se ocorrer algum erro na hora de tentar gravar o XML de erro para o ERP ou mover o arquivo XML para a pasta de XML com erro, não //vou poder fazer nada, pq foi algum erro de rede, permissão de acesso a pasta ou arquivo, etc. //Wandey 13/03/2010 } throw; } }
/// <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 LerRetornoSitCTe(string ChaveNFe) { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; LerXML oLerXml = new LerXML(); MemoryStream msXml = Functions.StringXmlToStream(this.vStrXmlRetorno); FluxoNfe oFluxoNfe = new FluxoNfe(); try { XmlDocument doc = new XmlDocument(); doc.Load(msXml); XmlNodeList retConsSitList = doc.GetElementsByTagName("retConsSitCTe"); foreach (XmlNode retConsSitNode in retConsSitList) { XmlElement retConsSitElemento = (XmlElement)retConsSitNode; //Definir a chave da NFe a ser pesquisada string strChaveNFe = "CTe" + 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("LerRetornoSitCTe(): Não pode obter o nome do arquivo"); strNomeArqNfe = strChaveNFe.Substring(3) + Propriedade.ExtEnvio.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 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 "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 "226": //E-UF da Chave de Acesso difere da UF do Web Service case "236": //E-Valida DV da Chave de Acesso case "216": //E-Verificar se campo "Codigo Numerico" break; #endregion #region Nota fiscal rejeitada case "217": //J-NFe não existe na base de dados do SEFAZ 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 = Functions.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 = "<protCTe versao=\"" + ConfiguracaoApp.VersaoXMLNFe + "\">" + "<infProt" + atributoId + ">" + "<tpAmb>" + Functions.LerTag(infConsSitElemento, "tpAmb", false) + "</tpAmb>" + "<verAplic>" + Functions.LerTag(infConsSitElemento, "verAplic", false) + "</verAplic>" + "<chCTe>" + Functions.LerTag(infConsSitElemento, "chCTe", false) + "</chCTe>" + "<dhRecbto>" + Functions.LerTag(infConsSitElemento, "dhRecbto", false) + "</dhRecbto>" + "<nProt>" + Functions.LerTag(infConsSitElemento, "nProt", false) + "</nProt>" + "<digVal>" + Functions.LerTag(infConsSitElemento, "digVal", false) + "</digVal>" + "<cStat>" + Functions.LerTag(infConsSitElemento, "cStat", false) + "</cStat>" + "<xMotivo>" + Functions.LerTag(infConsSitElemento, "xMotivo", false) + "</xMotivo>" + "</infProt>" + "</protCTe>"; //Definir o nome do arquivo -procNfe.xml string strArquivoNFeProc = Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions/*oAux*/.ExtrairNomeArq(strArquivoNFe, Propriedade.ExtEnvio.Nfe) + Propriedade.ExtRetorno.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, Propriedade.ExtEnvio.Nfe); //Verificar se o -procNfe.xml existe na past de autorizados bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtRetorno.ProcNFe); //Se o XML de distribuição não estiver na pasta de autorizados if (!procNFeJaNaAutorizada) { if (!File.Exists(strArquivoNFeProc)) { oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcNFe); } } //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 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 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 Functions.DeletarArquivo(strArquivoNFe); } //Disparar a geração/impressçao do UniDanfe. 03/02/2010 - Wandrey //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 Functions.DeletarArquivo(strArquivoNFeProc); } break; case "301": //Ler o XML para pegar a data de emissão para criar a psta dos XML´s Denegados if (File.Exists(strArquivoNFe)) { oLerXml.Nfe(strArquivoNFe); //Move a NFE da pasta de NFE em processamento para NFe Denegadas if (!oAux.EstaDenegada(strArquivoNFe, oLerXml.oDadosNfe.dEmi)) { MoverArquivo(strArquivoNFe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi); } } break; case "302": goto case "301"; case "303": goto case "301"; case "304": goto case "301"; case "305": goto case "301"; case "306": 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"; case "303": //NFe Denegada goto case "100"; case "304": //NFe Denegada goto case "100"; case "305": //NFe Denegada goto case "100"; case "306": //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> /// 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> /// #if notused protected override void LerRetornoLoteNFe() { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; var oLerXml = new LerXML(); var msXml = Functions.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) #region Validação do certificado de transmissão case "280": case "281": case "282": case "283": case "284": case "285": case "286": #endregion #region Validação inicial da mensagem no webservice case "214": case "243": case "108": case "109": #endregion #region Validação das informações de controle da chamada ao webservice case "242": case "409": case "410": case "411": case "238": case "239": #endregion #region Validação da forma da área de dados case "215": case "516": case "517": case "545": case "587": case "588": case "404": case "402": #endregion #region Validação das regras de negócio da consulta recibo case "252": case "248": case "553": case "105": case "223": #endregion break; #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 #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) { bool tirarFluxo = true; 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("LerRetornoLoteNFe(): Não pode obter o nome do arquivo"); strNomeArqNfe = strChaveNFe.Substring(3) + Propriedade.ExtEnvio.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 var strArquivoNFeProc = Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions.ExtrairNomeArq(strNomeArqNfe, Propriedade.ExtEnvio.Nfe) + Propriedade.ExtRetorno.ProcNFe; //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, Propriedade.ExtEnvio.Nfe); //Verificar se o -procNfe.xml existe na past de autorizados bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtRetorno.ProcNFe); //Se o XML de distribuição não estiver na pasta de autorizados if (!procNFeJaNaAutorizada) { if (!File.Exists(strArquivoNFeProc)) { oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcNFe); } } if (!procNFeJaNaAutorizada) { //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 MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente. //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtRetorno.ProcNFe); } if (!NFeJaNaAutorizada && procNFeJaNaAutorizada) { //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 MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); } //Disparar a geração/impressçao do UniDanfe. 03/02/2010 - Wandrey if (procNFeJaNaAutorizada) ExecutaUniDanfe(strNomeArqNfe, oLerXml.oDadosNfe.dEmi); //Vou verificar se estão os dois arquivos na pasta Autorizados, se tiver eu tiro do fluxo caso contrário não. Wandrey 13/02/2012 NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe); procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtRetorno.ProcNFe); if (!procNFeJaNaAutorizada || !NFeJaNaAutorizada) { tirarFluxo = false; } } break; case "110": case "205": case "301": case "302": ProcessaNotaDenegada(emp, oLerXml, strArquivoNFe, infProtElemento); /* if (File.Exists(strArquivoNFe)) { //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 //O Status da NFe tem que ser maior que 1 ou deu algum erro na hora de ler o XML de retorno da consulta do recibo, sendo assim, vou mantar a nota no fluxo para consultar novamente. if (Convert.ToInt32(strStat) >= 1) { //Mover o XML da NFE a pasta de XML´s com erro oAux.MoveArqErro(strArquivoNFe); } else tirarFluxo = false; break; } //Deletar a NFE do arquivo de controle de fluxo if (tirarFluxo) 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 if (Convert.ToInt32(cStatLote) >= 1) { //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="ChaveCTe">Chave da NFe que está sendo consultada</param> /// <remarks> /// Autor: Wandrey Mundin Ferreira /// Data: 16/06/2010 /// </remarks> private void LerRetornoSitCTe(string ChaveCTe) { int emp = Empresas.FindEmpresaByThread(); oGerarXML.XmlDistEventoCTe(emp, vStrXmlRetorno); LerXML oLerXml = new LerXML(); FluxoNfe oFluxoNfe = new FluxoNfe(); XmlDocument doc = new XmlDocument(); doc.Load(Functions.StringXmlToStreamUTF8(vStrXmlRetorno)); XmlNodeList retConsSitList = doc.GetElementsByTagName("retConsSitCTe"); foreach (XmlNode retConsSitNode in retConsSitList) { XmlElement retConsSitElemento = (XmlElement)retConsSitNode; //Definir a chave da NFe a ser pesquisada string strChaveCTe = "CTe" + ChaveCTe; //Definir o nome do arquivo da NFe e seu caminho string strNomeArqCTe = oFluxoNfe.LerTag(strChaveCTe, FluxoNfe.ElementoFixo.ArqNFe); if (string.IsNullOrEmpty(strNomeArqCTe)) { strNomeArqCTe = strChaveCTe.Substring(3) + Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML; } string strArquivoCTe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqCTe; #region CNPJ da chave não é de uma empresa Uninfe bool notDaEmpresa = (ChaveCTe.Substring(6, 14) != Empresas.Configuracoes[emp].CNPJ || ChaveCTe.Substring(0, 2) != Empresas.Configuracoes[emp].UnidadeFederativaCodigo.ToString()); if (!File.Exists(strArquivoCTe)) { if (notDaEmpresa) { return; } } #endregion CNPJ da chave não é de uma empresa Uninfe //Pegar o status de retorno da NFe que está sendo consultada a situação var cStatCons = string.Empty; if (retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null) { cStatCons = retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0].InnerText; } switch (cStatCons) { #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 "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 "226": //E-UF da Chave de Acesso difere da UF do Web Service case "236": //E-Valida DV da Chave de Acesso case "216": //E-Verificar se campo "Codigo Numerico" break; #endregion Rejeições do XML de consulta do recibo (Não é o lote que foi rejeitado e sim o XML de consulta do recibo) #region Nota fiscal rejeitada case "217": //J-NFe não existe na base de dados do SEFAZ goto case "TirarFluxo"; #endregion Nota fiscal rejeitada #region Nota fiscal autorizada case "100": //Autorizado o uso da NFe case "150": 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 = Functions.LerTag(infConsSitElemento, TpcnResources.cStat.ToString()).Replace(";", ""); switch (strStat) { case "100": case "150": var strProtNfe = retConsSitElemento.GetElementsByTagName("protCTe")[0].OuterXml; //Definir o nome do arquivo -procNfe.xml string strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions.ExtrairNomeArq(strArquivoCTe, Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML) + Propriedade.ExtRetorno.ProcCTe; //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(strArquivoCTe)) { //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados XmlDocument conteudoXML = new XmlDocument(); conteudoXML.Load(strArquivoCTe); oLerXml.Cte(conteudoXML); //Verificar se a -nfe.xml existe na pasta de autorizados bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML); //Verificar se o -procNfe.xml existe na past de autorizados bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML, Propriedade.ExtRetorno.ProcCTe); //Se o XML de distribuição não estiver na pasta em processamento if (!procNFeJaNaAutorizada && !File.Exists(strArquivoNFeProc)) { oGerarXML.XmlDistCTe(strArquivoCTe, strProtNfe, oLerXml.oDadosNfe.versao); } //Se o XML de distribuição não estiver ainda na pasta de autorizados if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML, Propriedade.ExtRetorno.ProcCTe))) { //Move a nfeProc da pasta de NFE em processamento para a NFe Autorizada TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); } //Se a NFe não existir ainda na pasta de autorizados if (!(NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML))) { //Mover a NFE da pasta de NFE em processamento para NFe Autorizada TFunctions.MoverArquivo(strArquivoCTe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); } else { //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento Functions.DeletarArquivo(strArquivoCTe); } //Disparar a geração/impressao do UniDanfe. 03/02/2010 - Wandrey if (procNFeJaNaAutorizada) { try { var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.Autorizados.ToString() + "\\" + Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) + Path.GetFileName(strArquivoNFeProc); TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]); } catch (Exception ex) { Auxiliar.WriteLog("TaskCTeConsultaSituacao: " + ex.Message, false); } } } if (File.Exists(strArquivoNFeProc)) { //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento Functions.DeletarArquivo(strArquivoNFeProc); } break; case "301": //Ler o XML para pegar a data de emissão para criar a psta dos XML´s Denegados if (File.Exists(strArquivoCTe)) { //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados XmlDocument conteudoXML = new XmlDocument(); conteudoXML.Load(strArquivoCTe); oLerXml.Cte(conteudoXML); //Move a NFE da pasta de NFE em processamento para NFe Denegadas if (!oAux.EstaDenegada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML, Propriedade.ExtRetorno.Den)) { TFunctions.MoverArquivo(strArquivoCTe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi); /// /// existe DACTE de CTe denegado??? /// try { var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.Denegados.ToString() + "\\" + Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) + Functions.ExtrairNomeArq(strArquivoCTe, Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML) + Propriedade.ExtRetorno.Den; TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]); } catch (Exception ex) { Auxiliar.WriteLog("TaskCTeConsultaSituacao: " + ex.Message, false); } } } break; case "302": goto case "301"; case "303": goto case "301"; case "304": goto case "301"; case "305": goto case "301"; case "306": 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(strArquivoCTe); break; } //Deletar a NFE do arquivo de controle de fluxo oFluxoNfe.ExcluirNfeFluxo(strChaveCTe); } } break; #endregion Nota fiscal autorizada #region Nota fiscal cancelada case "101": //Cancelamento Homologado ou Nfe Cancelada goto case "100"; #endregion Nota fiscal cancelada #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"; case "303": //NFe Denegada goto case "100"; case "304": //NFe Denegada goto case "100"; case "305": //NFe Denegada goto case "100"; case "306": //NFe Denegada goto case "100"; #endregion Nota fiscal Denegada #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(strArquivoCTe); //Deletar a NFE do arquivo de controle de fluxo oFluxoNfe.ExcluirNfeFluxo(strChaveCTe); break; #endregion Conteúdo para retirar a nota fiscal do fluxo default: break; } } }
public override void Execute() { int emp = Empresas.FindEmpresaByThread(); List<string> arquivosNFe = new List<string>(); //Aguardar a assinatura de todos os arquivos da pasta de lotes arquivosNFe = oAux.ArquivosPasta(Empresas.Configuracoes[emp].PastaXmlEmLote, "*" + Propriedade.ExtEnvio.Cte); if (arquivosNFe.Count == 0) { List<string> notas = new List<string>(); FileStream fsArquivo = null; FluxoNfe fluxoNfe = new FluxoNfe(); try { try { XmlDocument doc = new XmlDocument(); //Criar instância do XmlDocument Class fsArquivo = new FileStream(NomeArquivoXML, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); //Abrir um arquivo XML usando FileStream doc.Load(fsArquivo); //Carregar o arquivo aberto no XmlDocument string versaoXml = string.Empty; XmlNodeList documentoList = doc.GetElementsByTagName("MontarLoteCTe"); //Pesquisar o elemento Documento no arquivo XML foreach (XmlNode documentoNode in documentoList) { XmlElement documentoElemento = (XmlElement)documentoNode; int QtdeArquivo = documentoElemento.GetElementsByTagName("ArquivoCTe").Count; for (int d = 0; d < QtdeArquivo; d++) { string arquivoNFe = Empresas.Configuracoes[emp].PastaXmlEmLote + Propriedade.NomePastaXMLAssinado + "\\" + documentoElemento.GetElementsByTagName("ArquivoCTe")[d].InnerText; if (File.Exists(arquivoNFe)) { DadosNFeClass oDadosNfe = this.LerXMLNFe(arquivoNFe); if (string.IsNullOrEmpty(versaoXml)) versaoXml = oDadosNfe.versao; if (!fluxoNfe.NFeComLote(oDadosNfe.chavenfe)) { notas.Add(arquivoNFe); } else { throw new Exception("Arquivo: " + arquivoNFe + " já está no fluxo de envio e não será incluido em novo lote."); } } else { throw new Exception("Arquivo: " + arquivoNFe + " não existe e não será incluido no lote!"); } } } fsArquivo.Close(); //Fecha o arquivo XML this.LoteNfe(notas, versaoXml); } catch { if (fsArquivo != null) { fsArquivo.Close(); } } //Deletar o arquivo de solicitão de montagem do lote de NFe FileInfo oArquivo = new FileInfo(this.NomeArquivoXML); oArquivo.Delete(); } catch (Exception ex) { try { TFunctions.GravarArqErroServico(this.NomeArquivoXML, Propriedade.ExtEnvio.MontarLote, Propriedade.ExtRetorno.MontarLote_ERR, ex); } catch { //Se deu algum erro na hora de gravar o arquivo de erro de retorno para o ERP, infelizmente não poderemos fazer nada //pois deve estar ocorrendo alguma falha de rede, hd, permissão de acesso a pasta ou arquivos, etc. Wandrey 22/03/2010 //TODO: Não poderia gravar algum LOG para análise? Erro de rede normalmente é erro de IO } } } }
/// <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> private void LerRetornoSitNFe(string ChaveNFe) { int emp = Empresas.FindEmpresaByThread(); oGerarXML.XmlDistEvento(emp, vStrXmlRetorno); LerXML oLerXml = new LerXML(); FluxoNfe oFluxoNfe = new FluxoNfe(); XmlDocument doc = new XmlDocument(); doc.Load(Functions.StringXmlToStreamUTF8(vStrXmlRetorno)); 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)) { strNomeArqNfe = strChaveNFe.Substring(3) + Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML; } string strArquivoNFe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqNfe; #region CNPJ da chave não é de uma empresa Uninfe bool notDaEmpresa = (ChaveNFe.Substring(6, 14) != Empresas.Configuracoes[emp].CNPJ || ChaveNFe.Substring(0, 2) != Empresas.Configuracoes[emp].UnidadeFederativaCodigo.ToString()); if (!File.Exists(strArquivoNFe)) { if (notDaEmpresa) { return; } } #endregion CNPJ da chave não é de uma empresa Uninfe //Pegar o status de retorno da NFe que está sendo consultada a situação var cStatCons = string.Empty; if (retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null) { cStatCons = retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[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) #region Validação do Certificado de Transmissão case "280": case "281": case "283": case "286": case "284": case "285": case "282": #endregion Validação do Certificado de Transmissão #region Validação Inicial da Mensagem no WebService case "214": case "243": case "108": case "109": #endregion Validação Inicial da Mensagem no WebService #region Validação das informações de controle da chamada ao WebService case "242": case "409": case "410": case "411": case "238": case "239": #endregion Validação das informações de controle da chamada ao WebService #region Validação da forma da área de dados case "215": case "516": case "517": case "545": case "587": case "588": case "404": case "402": #endregion Validação da forma da área de dados #region Validação das regras de negócios da consulta a NF-e case "252": case "226": case "236": case "614": case "615": case "616": case "617": case "618": case "619": case "620": break; #endregion Validação das regras de negócios da consulta a NF-e #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 Nota fiscal rejeitada #endregion 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) #region Nota fiscal autorizada case "100": //Autorizado o uso da NFe case "150": //Autorizado o uso da NFe fora do prazo 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 = Functions.LerTag(infConsSitElemento, TpcnResources.cStat.ToString(), false); //Pegar a versão do XML var protNFeElemento = (XmlElement)retConsSitElemento.GetElementsByTagName("protNFe")[0]; string versao = protNFeElemento.GetAttribute(TpcnResources.versao.ToString()); switch (strStat) { case "100": //NFe Autorizada case "150": //NFe Autorizada fora do prazo string strProtNfe = retConsSitElemento.GetElementsByTagName("protNFe")[0].OuterXml; //Definir o nome do arquivo -procNfe.xml string strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions.ExtrairNomeArq(strArquivoNFe, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML) + Propriedade.ExtRetorno.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 XmlDocument conteudoXML = new XmlDocument(); conteudoXML.Load(strArquivoNFe); oLerXml.Nfe(conteudoXML); //Verificar se a -nfe.xml existe na pasta de autorizados bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML); //Verificar se o -procNfe.xml existe na past de autorizados bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML, Propriedade.ExtRetorno.ProcNFe); //Se o XML de distribuição não estiver na pasta de autorizados if (!procNFeJaNaAutorizada) { if (!File.Exists(strArquivoNFeProc)) { Auxiliar.WriteLog("TaskNFeConsultaSituacao: Gerou o arquivo de distribuição através da consulta situação da NFe.", false); oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcNFe, versao); } } //Se o XML de distribuição não estiver ainda na pasta de autorizados if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML, Propriedade.ExtRetorno.ProcNFe))) { //Move a nfeProc da pasta de NFE em processamento para a NFe Autorizada TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente. //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML, Propriedade.ExtRetorno.ProcNFe); } //Se a NFe não existir ainda na pasta de autorizados if (!(NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML))) { //1-Mover a NFE da pasta de NFE em processamento para NFe Autorizada //2-Só vou mover o -nfe.xml para a pasta autorizados se já existir a -procnfe.xml, caso contrário vou manter na pasta EmProcessamento // para tentar gerar novamente o -procnfe.xml // Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 if (procNFeJaNaAutorizada) { TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); } } else { //1-Se já estiver na pasta de autorizados, vou somente mover ela da pasta de XML´s em processamento //2-Só vou mover o -nfe.xml da pasta EmProcessamento se também existir a -procnfe.xml na pasta autorizados, caso contrário vou manter na pasta EmProcessamento // para tentar gerar novamente o -procnfe.xml // Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 if (procNFeJaNaAutorizada) { oAux.MoveArqErro(strArquivoNFe); } //oAux.DeletarArquivo(strArquivoNFe); } //Disparar a geração/impressão do UniDanfe. 03/02/2010 - Wandrey if (procNFeJaNaAutorizada) { try { string strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.Autorizados.ToString() + "\\" + Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) + Path.GetFileName(strArquivoNFe); TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]); } catch (Exception ex) { Auxiliar.WriteLog("TaskNFeConsultaSituacao: (Falha na execução do UniDANFe) " + ex.Message, false); } } } if (File.Exists(strArquivoNFeProc)) { //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento Functions.DeletarArquivo(strArquivoNFeProc); } break; //danasa 11-4-2012 case "110": //Uso Denegado case "301": case "302": case "303": if (File.Exists(strArquivoNFe)) { /// /// se o ERP copiou o arquivo da NFe para a pasta em Processamento, o Uninfe irá montar o XML de distribuicao, caso nao exista, /// e imprimir o DANFE /// ProcessaNFeDenegada(emp, oLerXml, strArquivoNFe, null, protNFeElemento.OuterXml, versao); } //ProcessaNFeDenegada(emp, oLerXml, strArquivoNFe, retConsSitElemento.GetElementsByTagName("protNFe")[0].OuterXml, versao); break; 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 Nota fiscal autorizada #region Nota fiscal cancelada case "101": //Cancelamento Homologado ou Nfe Cancelada goto case "100"; #endregion Nota fiscal cancelada #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"; case "205": //Nfe já está denegada na base do SEFAZ goto case "100"; #endregion Nota fiscal Denegada #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 Conteúdo para retirar a nota fiscal do fluxo default: goto case "TirarFluxo"; } } }
public override void Execute() { int emp = Empresas.FindEmpresaByThread(); try { dadosRec = new DadosRecClass(); FluxoNfe fluxoNfe = new FluxoNfe(); LerXML lerXml = new LerXML(); //Ler o XML de Lote para pegar o número do lote que está sendo enviado lerXml.Mdfe(ConteudoXML); var idLote = lerXml.oDadosNfe.idLote; //Definir o objeto do WebService WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servico, emp, Convert.ToInt32(lerXml.oDadosNfe.cUF), Convert.ToInt32(lerXml.oDadosNfe.tpAmb), Convert.ToInt32(lerXml.oDadosNfe.tpEmis), 0); System.Net.SecurityProtocolType securityProtocolType = WebServiceProxy.DefinirProtocoloSeguranca(Convert.ToInt32(lerXml.oDadosNfe.cUF), Convert.ToInt32(lerXml.oDadosNfe.tpAmb), Convert.ToInt32(lerXml.oDadosNfe.tpEmis), Servico); //Criar objetos das classes dos serviços dos webservices do SEFAZ object oRecepcao = wsProxy.CriarObjeto(wsProxy.NomeClasseWS); var oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS(Convert.ToInt32(lerXml.oDadosNfe.cUF), Servico)); //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg wsProxy.SetProp(oCabecMsg, TpcnResources.cUF.ToString(), lerXml.oDadosNfe.cUF); wsProxy.SetProp(oCabecMsg, TpcnResources.versaoDados.ToString(), lerXml.oDadosNfe.versao); // //XML neste ponto o MDFe já está assinado, pois foi assinado, validado 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, wsProxy.NomeMetodoWS[0], oCabecMsg, this, Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.ExtRetorno.Rec, true, securityProtocolType); #region Parte que trata o retorno do lote, ou seja, o número do recibo Recibo(vStrXmlRetorno, emp); if (dadosRec.cStat == "103") //Lote recebido com sucesso { if (dadosRec.tMed > 0) { Thread.Sleep(dadosRec.tMed * 1000); } //Atualizar o número do recibo no XML de controle do fluxo de notas enviadas fluxoNfe.AtualizarTag(lerXml.oDadosNfe.chavenfe, FluxoNfe.ElementoEditavel.tMed, (dadosRec.tMed + 2).ToString()); fluxoNfe.AtualizarTagRec(idLote, dadosRec.nRec); XmlDocument xmlPedRec = oGerarXML.XmlPedRecMDFe(dadosRec.nRec, dadosRec.versao, emp); TaskMDFeRetRecepcao mdfeRetRecepcao = new TaskMDFeRetRecepcao(xmlPedRec); mdfeRetRecepcao.Execute(); } else if (Convert.ToInt32(dadosRec.cStat) > 200 || Convert.ToInt32(dadosRec.cStat) == 108 || //Verifica se o servidor de processamento está paralisado momentaneamente. Wandrey 13/04/2012 Convert.ToInt32(dadosRec.cStat) == 109) //Verifica se o servidor de processamento está paralisado sem previsão. Wandrey 13/04/2012 { //Se o status do retorno do lote for maior que 200 ou for igual a 108 ou 109, //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(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + fluxoNfe.LerTag(lerXml.oDadosNfe.chavenfe, FluxoNfe.ElementoFixo.ArqNFe)); fluxoNfe.ExcluirNfeFluxo(lerXml.oDadosNfe.chavenfe); } //Deleta o arquivo de lote Functions.DeletarArquivo(NomeArquivoXML); #endregion Parte que trata o retorno do lote, ou seja, o número do recibo } 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 try { //Gravar o arquivo de erro de retorno para o ERP, caso ocorra TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.ExtRetorno.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 TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.ExtRetorno.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 TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.ExtRetorno.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 } } }
public override void Execute() { int emp = Empresas.FindEmpresaByThread(); try { dadosRec = new DadosRecClass(); FluxoNfe oFluxoNfe = new FluxoNfe(); LerXML oLer = new LerXML(); //Ler o XML de Lote para pegar o número do lote que está sendo enviado oLer.Nfe(NomeArquivoXML); if (oLer.oDadosNfe.versao != "2.00") { Servico = Servicos.NFeEnviarLote2; } var idLote = oLer.oDadosNfe.idLote; //Definir o objeto do WebService WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servico, emp, Convert.ToInt32(oLer.oDadosNfe.cUF), Convert.ToInt32(oLer.oDadosNfe.tpAmb), Convert.ToInt32(oLer.oDadosNfe.tpEmis), oLer.oDadosNfe.versao, oLer.oDadosNfe.mod); if (Empresas.Configuracoes[emp].CompactarNfe && oLer.oDadosNfe.versao != "2.00" && wsProxy.NomeMetodoWS.Length == 2) { Servico = Servicos.NFeEnviarLoteZip2; } //Criar objetos das classes dos serviços dos webservices do SEFAZ object oRecepcao = wsProxy.CriarObjeto(wsProxy.NomeClasseWS);// NomeClasseWS(Servico, Convert.ToInt32(oLer.oDadosNfe.cUF))); var oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS(Convert.ToInt32(oLer.oDadosNfe.cUF), Servico)); //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.cUF.ToString(), oLer.oDadosNfe.cUF); wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.versaoDados.ToString(), oLer.oDadosNfe.versao); //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 // Envio de NFe Compactada - Renan 29/04/2014 if (Servico == Servicos.NFeEnviarLoteZip2)//Empresas.Configuracoes[emp].CompactarNfe && oLer.oDadosNfe.versao != "2.00") { FileInfo dadosArquivo = new FileInfo(NomeArquivoXML); TFunctions.CompressXML(dadosArquivo); } string nOperacao = wsProxy.NomeMetodoWS[(Servico == Servicos.NFeEnviarLoteZip2) ? 1 : 0]; //Invocar o método que envia o XML para o SEFAZ if (Empresas.Configuracoes[emp].IndSinc && oLer.oDadosNfe.versao != "2.00") { oInvocarObj.Invocar(wsProxy, oRecepcao, nOperacao,//NomeMetodoWS(Servico, Convert.ToInt32(oLer.oDadosNfe.cUF), oLer.oDadosNfe.versao), oCabecMsg, this); Protocolo(vStrXmlRetorno); } else { oInvocarObj.Invocar(wsProxy, oRecepcao, nOperacao,//NomeMetodoWS(Servico, Convert.ToInt32(oLer.oDadosNfe.cUF), oLer.oDadosNfe.versao), oCabecMsg, this, "-env-lot", "-rec"); Recibo(vStrXmlRetorno); } if (dadosRec.cStat == "104") //Lote processado - Processo da NFe Síncrono - Wandrey 13/03/2014 { FinalizarNFeSincrono(vStrXmlRetorno, emp); oGerarXML.XmlRetorno(Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.ProRec_XML, vStrXmlRetorno); } else if (dadosRec.cStat == "103") //Lote recebido com sucesso - Processo da NFe Assíncrono { //Atualizar o número do recibo no XML de controle do fluxo de notas enviadas oFluxoNfe.AtualizarTag(oLer.oDadosNfe.chavenfe, FluxoNfe.ElementoEditavel.tMed, /*oLerRecibo.*/ dadosRec.tMed.ToString()); oFluxoNfe.AtualizarTagRec(idLote, /*oLerRecibo.*/ dadosRec.nRec); } else if (Convert.ToInt32(dadosRec.cStat) > 200 || Convert.ToInt32(dadosRec.cStat) == 108 || //Verifica se o servidor de processamento está paralisado momentaneamente. Wandrey 13/04/2012 Convert.ToInt32(dadosRec.cStat) == 109) //Verifica se o servidor de processamento está paralisado sem previsão. Wandrey 13/04/2012 { //Se o status do retorno do lote for maior que 200 ou for igual a 108 ou 109, //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(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + oFluxoNfe.LerTag(oLer.oDadosNfe.chavenfe, FluxoNfe.ElementoFixo.ArqNFe)); oFluxoNfe.ExcluirNfeFluxo(oLer.oDadosNfe.chavenfe); } //Deleta o arquivo de lote Functions.DeletarArquivo(NomeArquivoXML); // Envio de NFe Compactada - Renan 29/04/2014 if (Servico == Servicos.NFeEnviarLoteZip2)//Empresas.Configuracoes[emp].CompactarNfe && oLer.oDadosNfe.versao != "2.00") { Functions.DeletarArquivo(NomeArquivoXML + ".gz"); } } 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 TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.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 TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.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 TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.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 } } }
/// <summary> /// Faz a leitura do XML de pedido de consulta da situação da NFe /// </summary> /// <param name="arquivoXML">Nome do XML a ser lido</param> /// <param name="emp">Código da empresa</param> /*private void PedSit(int emp, string arquivoXML) { this.dadosPedSit.tpAmb = Empresas.Configuracoes[emp].AmbienteCodigo; this.dadosPedSit.chNFe = string.Empty; XmlDocument doc = new XmlDocument(); doc.Load(arquivoXML); XmlNodeList consSitNFeList = doc.GetElementsByTagName("consSitCTe"); foreach (XmlNode consSitNFeNode in consSitNFeList) { XmlElement consSitNFeElemento = (XmlElement)consSitNFeNode; dadosPedSit.tpAmb = Convert.ToInt32("0" + consSitNFeElemento.GetElementsByTagName(TpcnResources.tpAmb.ToString())[0].InnerText); dadosPedSit.chNFe = consSitNFeElemento.GetElementsByTagName(TpcnResources.chCTe.ToString())[0].InnerText; if (consSitNFeElemento.GetElementsByTagName(TpcnResources.tpEmis.ToString()).Count != 0) { this.dadosPedSit.tpEmis = Convert.ToInt16(consSitNFeElemento.GetElementsByTagName(TpcnResources.tpEmis.ToString())[0].InnerText); /// para que o validador não rejeite, excluo a tag <tpEmis> doc.DocumentElement.RemoveChild(consSitNFeElemento.GetElementsByTagName(TpcnResources.tpEmis.ToString())[0]); /// salvo o arquivo modificado doc.Save(arquivoXML); } } }*/ #endregion #region LerRetornoSitCTe() /// <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="ChaveCTe">Chave da NFe que está sendo consultada</param> /// <remarks> /// Autor: Wandrey Mundin Ferreira /// Data: 16/06/2010 /// </remarks> private void LerRetornoSitCTe(string ChaveCTe) { int emp = Empresas.FindEmpresaByThread(); oGerarXML.XmlDistEventoCTe(emp, this.vStrXmlRetorno); //<<<danasa 6-2011 LerXML oLerXml = new LerXML(); MemoryStream msXml = Functions.StringXmlToStream(vStrXmlRetorno); FluxoNfe oFluxoNfe = new FluxoNfe(); XmlDocument doc = new XmlDocument(); doc.Load(msXml); XmlNodeList retConsSitList = doc.GetElementsByTagName("retConsSitCTe"); foreach (XmlNode retConsSitNode in retConsSitList) { XmlElement retConsSitElemento = (XmlElement)retConsSitNode; //Definir a chave da NFe a ser pesquisada string strChaveCTe = "CTe" + ChaveCTe; //Definir o nome do arquivo da NFe e seu caminho string strNomeArqCTe = oFluxoNfe.LerTag(strChaveCTe, FluxoNfe.ElementoFixo.ArqNFe); if (string.IsNullOrEmpty(strNomeArqCTe)) { strNomeArqCTe = strChaveCTe.Substring(3) + Propriedade.ExtEnvio.Cte; } string strArquivoCTe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqCTe; #region CNPJ da chave não é de uma empresa Uninfe bool notDaEmpresa = (ChaveCTe.Substring(6, 14) != Empresas.Configuracoes[emp].CNPJ || ChaveCTe.Substring(0, 2) != Empresas.Configuracoes[emp].UnidadeFederativaCodigo.ToString()); if (!File.Exists(strArquivoCTe) && notDaEmpresa) return; #endregion //Pegar o status de retorno da NFe que está sendo consultada a situação var cStatCons = string.Empty; if (retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null) { cStatCons = retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0].InnerText; } switch (cStatCons) { #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 "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 "226": //E-UF da Chave de Acesso difere da UF do Web Service case "236": //E-Valida DV da Chave de Acesso case "216": //E-Verificar se campo "Codigo Numerico" break; #endregion #region Nota fiscal rejeitada case "217": //J-NFe não existe na base de dados do SEFAZ goto case "TirarFluxo"; #endregion #region Nota fiscal autorizada case "100": //Autorizado o uso da NFe case "150": 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 = Functions.LerTag(infConsSitElemento, TpcnResources.cStat.ToString()).Replace(";", ""); switch (strStat) { case "100": case "150": var strProtNfe = retConsSitElemento.GetElementsByTagName("protCTe")[0].OuterXml; //Definir o nome do arquivo -procNfe.xml string strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions.ExtrairNomeArq(strArquivoCTe, Propriedade.ExtEnvio.Cte) + Propriedade.ExtRetorno.ProcCTe; //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(strArquivoCTe)) { //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados oLerXml.Cte(strArquivoCTe); //Verificar se a -nfe.xml existe na pasta de autorizados bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Cte, Propriedade.ExtEnvio.Cte); //Verificar se o -procNfe.xml existe na past de autorizados bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Cte, Propriedade.ExtRetorno.ProcCTe); //Se o XML de distribuição não estiver na pasta em processamento if (!procNFeJaNaAutorizada && !File.Exists(strArquivoNFeProc)) { oGerarXML.XmlDistCTe(strArquivoCTe, strProtNfe); } //Se o XML de distribuição não estiver ainda na pasta de autorizados if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Cte, Propriedade.ExtRetorno.ProcCTe))) { //Move a nfeProc da pasta de NFE em processamento para a NFe Autorizada TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); } //Se a NFe não existir ainda na pasta de autorizados if (!(NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Cte, Propriedade.ExtEnvio.Cte))) { //Mover a NFE da pasta de NFE em processamento para NFe Autorizada TFunctions.MoverArquivo(strArquivoCTe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); } else { //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento Functions.DeletarArquivo(strArquivoCTe); } //Disparar a geração/impressao do UniDanfe. 03/02/2010 - Wandrey if (procNFeJaNaAutorizada) try { var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.Autorizados.ToString() + "\\" + Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) + Path.GetFileName(strArquivoNFeProc); TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]); } catch (Exception ex) { Auxiliar.WriteLog("TaskCTeConsultaSituacao: " + ex.Message, false); } } if (File.Exists(strArquivoNFeProc)) { //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento Functions.DeletarArquivo(strArquivoNFeProc); } break; case "301": //Ler o XML para pegar a data de emissão para criar a psta dos XML´s Denegados if (File.Exists(strArquivoCTe)) { oLerXml.Cte(strArquivoCTe); //Move a NFE da pasta de NFE em processamento para NFe Denegadas if (!oAux.EstaDenegada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Cte, Propriedade.ExtRetorno.Den)) { TFunctions.MoverArquivo(strArquivoCTe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi); /// /// existe DACTE de CTe denegado??? /// try { var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.Denegados.ToString() + "\\" + Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) + Functions.ExtrairNomeArq(strArquivoCTe, Propriedade.ExtEnvio.Cte) + Propriedade.ExtRetorno.Den; TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]); } catch (Exception ex) { Auxiliar.WriteLog("TaskCTeConsultaSituacao: " + ex.Message, false); } } } break; case "302": goto case "301"; case "303": goto case "301"; case "304": goto case "301"; case "305": goto case "301"; case "306": 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(strArquivoCTe); break; } //Deletar a NFE do arquivo de controle de fluxo oFluxoNfe.ExcluirNfeFluxo(strChaveCTe); } } 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"; case "303": //NFe Denegada goto case "100"; case "304": //NFe Denegada goto case "100"; case "305": //NFe Denegada goto case "100"; case "306": //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(strArquivoCTe); //Deletar a NFE do arquivo de controle de fluxo oFluxoNfe.ExcluirNfeFluxo(strChaveCTe); break; #endregion default: break; } } }
private const int _Minutos = 12; //12 minutos para atender o consumo indevido da SEFAZ public void Analisar(int emp) { this.oAux = new Auxiliar(); try { // le todos os arquivos que estão na pasta em processamento // string[] files = Directory.GetFiles(Empresas.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString(), // "*" + Propriedade.ExtEnvio.Nfe, // SearchOption.TopDirectoryOnly); string[] files = Directory.GetFiles(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString()).Where(w => w.EndsWith(Propriedade.ExtEnvio.Nfe, StringComparison.InvariantCultureIgnoreCase) || w.EndsWith(Propriedade.ExtEnvio.Cte, StringComparison.InvariantCultureIgnoreCase) || w.EndsWith(Propriedade.ExtEnvio.MDFe, StringComparison.InvariantCultureIgnoreCase)).ToArray<string>(); // considera os arquivos em que a data do ultimo acesso é superior a 5 minutos DateTime UltimaData = DateTime.Now.AddMinutes(-_Minutos); foreach (string file in files) { if (!Functions.FileInUse(file)) { FileInfo fi = new FileInfo(file); //usar a última data de acesso, e não a data de criação if (fi.LastWriteTime <= UltimaData) { if (this.oLerXml == null) { this.oLerXml = new LerXML(); this.oGerarXml = new GerarXML(emp); this.fluxo = new FluxoNfe(emp); } try { XmlDocument doc = new XmlDocument(); doc.Load(file); TipoAplicativo tipoArquivo = TipoAplicativo.Nfe; string extNFe = Propriedade.ExtEnvio.Nfe; string extProcNFe = Propriedade.ExtRetorno.ProcNFe; string arquivoSit = string.Empty; string chNFe = string.Empty; switch (doc.DocumentElement.Name) { case "MDFe": tipoArquivo = TipoAplicativo.MDFe; extNFe = Propriedade.ExtEnvio.MDFe; extProcNFe = Propriedade.ExtRetorno.ProcMDFe; oLerXml.Mdfe(file); arquivoSit = oLerXml.oDadosNfe.chavenfe.Substring(4); chNFe = oLerXml.oDadosNfe.chavenfe.Substring(4); break; case "NFe": tipoArquivo = TipoAplicativo.Nfe; extNFe = Propriedade.ExtEnvio.Nfe; extProcNFe = Propriedade.ExtRetorno.ProcNFe; oLerXml.Nfe(file); arquivoSit = oLerXml.oDadosNfe.chavenfe.Substring(3); chNFe = oLerXml.oDadosNfe.chavenfe.Substring(3); break; case "CTe": tipoArquivo = TipoAplicativo.Cte; extNFe = Propriedade.ExtEnvio.Cte; extProcNFe = Propriedade.ExtRetorno.ProcCTe; oLerXml.Cte(file); arquivoSit = oLerXml.oDadosNfe.chavenfe.Substring(3); chNFe = oLerXml.oDadosNfe.chavenfe.Substring(3); break; } //Ler a NFe //Verificar se o -nfe.xml existe na pasta de autorizados bool NFeJaNaAutorizada = oAux.EstaAutorizada(file, oLerXml.oDadosNfe.dEmi, extNFe, extNFe); //Verificar se o -procNfe.xml existe na past de autorizados bool procNFeJaNaAutorizada = oAux.EstaAutorizada(file, oLerXml.oDadosNfe.dEmi, extNFe, extProcNFe); //Se um dos XML´s não estiver na pasta de autorizadas ele força finalizar o processo da NFe. if (!NFeJaNaAutorizada || !procNFeJaNaAutorizada) { //Verificar se a NFe está no fluxo, se não estiver vamos incluir ela para que funcione //a rotina de gerar o -procNFe.xml corretamente. Wandrey 21/10/2009 if (!fluxo.NfeExiste(oLerXml.oDadosNfe.chavenfe)) { fluxo.InserirNfeFluxo(oLerXml.oDadosNfe.chavenfe, oLerXml.oDadosNfe.mod, file); } //gera um -ped-sit.xml mesmo sendo autorizada ou denegada, pois assim sendo, o ERP precisaria dele oGerarXml.Consulta(tipoArquivo, arquivoSit + Propriedade.ExtEnvio.PedSit_XML, Convert.ToInt32(oLerXml.oDadosNfe.tpAmb), Convert.ToInt32(oLerXml.oDadosNfe.tpEmis), chNFe, oLerXml.oDadosNfe.versao); } else { //Move o XML da pasta em processamento para a pasta de XML´s com erro (-nfe.xml) oAux.MoveArqErro(file); //Move o XML da pasta em processamento para a pasta de XML´s com erro (-procNFe.xml) oAux.MoveArqErro(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions.ExtrairNomeArq(file, extNFe) + extProcNFe); //Tirar a nota fiscal do fluxo fluxo.ExcluirNfeFluxo(oLerXml.oDadosNfe.chavenfe); } } catch (Exception ex) { try { // grava o arquivo com extensao .ERR oAux.GravarArqErroERP(Path.GetFileNameWithoutExtension(file) + ".err", ex.Message); } catch { //Se deu erro na hora de gravar o erro para o ERP, infelizmente não posso fazer mais nada. Wandrey 28/04/2011 } } } } } } catch (Exception ex) { try { // grava o arquivo generico oAux.GravarArqErroERP(string.Format(Propriedade.NomeArqERRUniNFe, DateTime.Now.ToString("yyyyMMddTHHmmss")), ex.Message); } catch { //Se deu erro na hora de gravar o erro para o ERP, infelizmente não posso fazer mais nada. Wandrey 28/04/2011 } } }
public override void Execute() { int emp = Empresas.FindEmpresaByThread(); List <string> arquivosNFe = new List <string>(); //Aguardar a assinatura de todos os arquivos da pasta de lotes arquivosNFe = oAux.ArquivosPasta(Empresas.Configuracoes[emp].PastaXmlEmLote, "*" + Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML); if (arquivosNFe.Count == 0) { List <ArquivoXMLDFe> notas = new List <ArquivoXMLDFe>(); FileStream fsArquivo = null; FluxoNfe fluxoNfe = new FluxoNfe(); try { try { XmlDocument doc = new XmlDocument(); //Criar instância do XmlDocument Class fsArquivo = new FileStream(NomeArquivoXML, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); //Abrir um arquivo XML usando FileStream doc.Load(fsArquivo); //Carregar o arquivo aberto no XmlDocument string versaoXml = string.Empty; XmlNodeList documentoList = doc.GetElementsByTagName("MontarLoteCTe"); //Pesquisar o elemento Documento no arquivo XML foreach (XmlNode documentoNode in documentoList) { XmlElement documentoElemento = (XmlElement)documentoNode; int QtdeArquivo = documentoElemento.GetElementsByTagName("ArquivoCTe").Count; for (int d = 0; d < QtdeArquivo; d++) { string arquivoNFe = Empresas.Configuracoes[emp].PastaXmlEmLote + "\\temp\\" + documentoElemento.GetElementsByTagName("ArquivoCTe")[d].InnerText; if (File.Exists(arquivoNFe)) { XmlDocument conteudoXMLCTe = new XmlDocument(); conteudoXMLCTe.Load(arquivoNFe); DadosNFeClass oDadosNfe = LerXMLNFe(conteudoXMLCTe); if (string.IsNullOrEmpty(versaoXml)) { versaoXml = oDadosNfe.versao; } if (!fluxoNfe.NFeComLote(oDadosNfe.chavenfe)) { notas.Add(new ArquivoXMLDFe() { NomeArquivoXML = arquivoNFe, ConteudoXML = conteudoXMLCTe }); } else { throw new Exception("Arquivo: " + arquivoNFe + " já está no fluxo de envio e não será incluido em novo lote."); } } else { throw new Exception("Arquivo: " + arquivoNFe + " não existe e não será incluido no lote!"); } } } fsArquivo.Close(); XmlDocument xmlLote = LoteNfe(notas, versaoXml); TaskCTeRecepcao cteRecepcao = new TaskCTeRecepcao(xmlLote); cteRecepcao.Execute(); } catch { if (fsArquivo != null) { fsArquivo.Close(); } } //Deletar o arquivo de solicitão de montagem do lote de NFe FileInfo oArquivo = new FileInfo(NomeArquivoXML); oArquivo.Delete(); } catch (Exception ex) { try { TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.Extensao(Propriedade.TipoEnvio.MontarLote).EnvioXML, Propriedade.ExtRetorno.MontarLote_ERR, ex); } catch { //Se deu algum erro na hora de gravar o arquivo de erro de retorno para o ERP, infelizmente não poderemos fazer nada //pois deve estar ocorrendo alguma falha de rede, hd, permissão de acesso a pasta ou arquivos, etc. Wandrey 22/03/2010 //TODO: Não poderia gravar algum LOG para análise? Erro de rede normalmente é erro de IO } } } }
public override void Execute() { int emp = Empresas.FindEmpresaByThread(); try { dadosRec = new DadosRecClass(); FluxoNfe oFluxoNfe = new FluxoNfe(); LerXML oLer = new LerXML(); //Ler o XML de Lote para pegar o número do lote que está sendo enviado oLer.Nfe(NomeArquivoXML); if (oLer.oDadosNfe.versao != "2.00") { Servico = Servicos.NFeEnviarLote2; } var idLote = oLer.oDadosNfe.idLote; //Definir o objeto do WebService WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servico, emp, Convert.ToInt32(oLer.oDadosNfe.cUF), Convert.ToInt32(oLer.oDadosNfe.tpAmb), Convert.ToInt32(oLer.oDadosNfe.tpEmis), oLer.oDadosNfe.versao, oLer.oDadosNfe.mod); if (Empresas.Configuracoes[emp].CompactarNfe && oLer.oDadosNfe.versao != "2.00" && wsProxy.NomeMetodoWS.Length == 2) Servico = Servicos.NFeEnviarLoteZip2; //Criar objetos das classes dos serviços dos webservices do SEFAZ object oRecepcao = wsProxy.CriarObjeto(wsProxy.NomeClasseWS); var oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS(Convert.ToInt32(oLer.oDadosNfe.cUF), Servico)); //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.cUF.ToString(), oLer.oDadosNfe.cUF); wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.versaoDados.ToString(), oLer.oDadosNfe.versao); //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 // Envio de NFe Compactada - Renan 29/04/2014 if (Servico == Servicos.NFeEnviarLoteZip2) { FileInfo dadosArquivo = new FileInfo(NomeArquivoXML); TFunctions.CompressXML(dadosArquivo); } string nOperacao = wsProxy.NomeMetodoWS[(Servico == Servicos.NFeEnviarLoteZip2) ? 1 : 0]; //Invocar o método que envia o XML para o SEFAZ if (Empresas.Configuracoes[emp].IndSinc && oLer.oDadosNfe.versao != "2.00") { //Não posso gerar o arquivo na pasta de retorno através do método Invocar, por isso não estou colocando os dois ultimos parâmetros com a definição dos prefixos dos arquivos. O arquivo de retorno no processo síncrono deve acontecer somente depois de finalizado o processo da nota, ou gera problemas. Wandrey 11/06/2015 oInvocarObj.Invocar(wsProxy, oRecepcao, nOperacao, oCabecMsg, this); Protocolo(vStrXmlRetorno); } else { oInvocarObj.Invocar(wsProxy, oRecepcao, nOperacao, oCabecMsg, this, "-env-lot", "-rec"); Recibo(vStrXmlRetorno); } if (dadosRec.cStat == "104") //Lote processado - Processo da NFe Síncrono - Wandrey 13/03/2014 { FinalizarNFeSincrono(vStrXmlRetorno, emp); oGerarXML.XmlRetorno(Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.ProRec_XML, vStrXmlRetorno); } else if (dadosRec.cStat == "103") //Lote recebido com sucesso - Processo da NFe Assíncrono { //Atualizar o número do recibo no XML de controle do fluxo de notas enviadas oFluxoNfe.AtualizarTag(oLer.oDadosNfe.chavenfe, FluxoNfe.ElementoEditavel.tMed, dadosRec.tMed.ToString()); oFluxoNfe.AtualizarTagRec(idLote, dadosRec.nRec); } else if (Convert.ToInt32(dadosRec.cStat) > 200 || Convert.ToInt32(dadosRec.cStat) == 108 || //Verifica se o servidor de processamento está paralisado momentaneamente. Wandrey 13/04/2012 Convert.ToInt32(dadosRec.cStat) == 109) //Verifica se o servidor de processamento está paralisado sem previsão. Wandrey 13/04/2012 { if (Empresas.Configuracoes[emp].IndSinc && oLer.oDadosNfe.versao != "2.00") { // OPS!!! Processo sincrono rejeição da SEFAZ, temos que gravar o XML para o ERP, pois no processo síncrono isso não pode ser feito dentro do método Invocar oGerarXML.XmlRetorno(Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.ProRec_XML, vStrXmlRetorno); } //Se o status do retorno do lote for maior que 200 ou for igual a 108 ou 109, //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 a tira do fluxo //Wandrey 30/04/2009 oAux.MoveArqErro(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + oFluxoNfe.LerTag(oLer.oDadosNfe.chavenfe, FluxoNfe.ElementoFixo.ArqNFe)); oFluxoNfe.ExcluirNfeFluxo(oLer.oDadosNfe.chavenfe); } //Deleta o arquivo de lote Functions.DeletarArquivo(NomeArquivoXML); // Envio de NFe Compactada - Renan 29/04/2014 if (Servico == Servicos.NFeEnviarLoteZip2) Functions.DeletarArquivo(NomeArquivoXML + ".gz"); } 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 TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.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 TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.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 TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.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 } } }
/// <summary> /// Gera o XML de consulta do recibo do lote de notas enviadas /// </summary> /// <param name="empresa">Index da empresa que é para gerar os pedidos de consulta do recibo do lote da nfe</param> /// <param name="nfe">Objeto da classe ServicoNfe</param> /// <by>Wandrey Mundin Ferreira</by> private void GerarXMLPedRec(int empresa, object nfe) { //Criar a lista dos recibos a serem consultados no SEFAZ List<ReciboCons> recibos = new List<ReciboCons>(); FluxoNfe fluxoNfe = new FluxoNfe(empresa); try { recibos = fluxoNfe.CriarListaRec(); } catch { //Não precisa fazer nada se não conseguiu criar a lista, somente con } Type tipoServico = nfe.GetType(); for (int i = 0; i < recibos.Count; i++) { ReciboCons reciboCons = recibos[i]; var tempoConsulta = reciboCons.tMed; if (tempoConsulta > 15) tempoConsulta = 15; //Tempo previsto no manual da SEFAZ, isso foi feito pq o ambiente SVAN está retornando na consulta recibo, tempo superior a 160, mas não está com problema, é erro no calculo deste tempo. Wandrey if (tempoConsulta < Empresas.Configuracoes[empresa].TempoConsulta) tempoConsulta = Empresas.Configuracoes[empresa].TempoConsulta; //Vou dar no mínimo 3 segundos para efetuar a consulta do recibo. Wandrey 21/11/2014 if (tempoConsulta < 3) tempoConsulta = 3; if (DateTime.Now.Subtract(reciboCons.dPedRec).Seconds >= tempoConsulta) { //Atualizar a tag da data e hora da ultima consulta do recibo aumentando 10 segundos fluxoNfe.AtualizarDPedRec(reciboCons.nRec, DateTime.Now.AddSeconds(10)); tipoServico.InvokeMember("XmlPedRec", System.Reflection.BindingFlags.InvokeMethod, null, nfe, new object[] { empresa, reciboCons.nRec, reciboCons.versao, reciboCons.mod }); } } }
/// <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> private void LerRetornoLoteNFe() { /* * vStrXmlRetorno = "<?xml version=\"1.0\" encoding=\"windows-1250\"?>" + * "<retConsReciNFe xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\"2.00\">" + * "<tpAmb>2</tpAmb>" + * "<verAplic>0582</verAplic>" + * "<nRec>310000008211450</nRec>" + * "<cStat>104</cStat>" + * "<xMotivo>Rejeicao: UF informada no campo cUF nao e atendida pelo Web Service</xMotivo>" + * "<cUF>31</cUF>" + * "<protNFe versao=\"2.00\" xmlns=\"http://www.portalfiscal.inf.br/nfe\">" + * "<infProt Id=\"ID31100371139034000100550000009999201000000005\">" + * "<tpAmb>2</tpAmb>" + * "<verAplic>2.00</verAplic>" + * "<chNFe>31100371139034000100550000009999201000000005</chNFe>" + * "<dhRecbto>2010-03-17T17:07:34</dhRecbto>" + * "<nProt>131100015665325</nProt>" + * "<digVal>ajBuZFhtT3JyT0VFVHIzdDJvZTc3RHhURElnPQ==</digVal>" + * "<cStat>100</cStat>" + * "<xMotivo>AUTORIZADA</xMotivo>" + * "</infProt>" + * "</protNFe>" + * "</retConsReciNFe>"; */ int emp = Empresas.FindEmpresaByThread(); var msXml = Functions.StringXmlToStreamUTF8(vStrXmlRetorno); var fluxoNFe = new FluxoNfe(); 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(TpcnResources.nRec.ToString())[0] != null) { nRec = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.nRec.ToString())[0].InnerText; } //Pegar o status de retorno do lote enviado var cStatLote = string.Empty; if (retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null) { cStatLote = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[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) #region Validação do certificado de transmissão case "280": case "281": case "282": case "283": case "284": case "285": case "286": #endregion #region Validação inicial da mensagem no webservice case "214": case "243": case "108": case "109": #endregion #region Validação das informações de controle da chamada ao webservice case "242": case "409": case "410": case "411": case "238": case "239": #endregion #region Validação da forma da área de dados case "215": case "516": case "517": case "545": case "587": case "588": case "404": case "402": #endregion #region Validação das regras de negócio da consulta recibo case "252": case "248": case "553": case "105": case "223": #endregion break; #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 #endregion #region Lote foi processado, agora tenho que tratar as notas fiscais dele case "104": //Lote processado //Atualizar a tag da data e hora da ultima consulta do recibo fluxoNFe.AtualizarDPedRec(nRec, DateTime.Now); FinalizarNFe(retConsReciNFeElemento.GetElementsByTagName("protNFe"), fluxoNFe, emp); 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 if (Convert.ToInt32(cStatLote) >= 1) { //Vou retirar as notas do fluxo pelo recibo if (nRec != string.Empty) { fluxoNFe.ExcluirNfeFluxoRec(nRec.Trim()); } } break; #endregion } } }
public override void Execute() { int emp = Empresas.FindEmpresaByThread(); try { dadosRec = new DadosRecClass(); FluxoNfe oFluxoNfe = new FluxoNfe(); LerXML oLer = new LerXML(); //Ler o XML de Lote para pegar o número do lote que está sendo enviado oLer.Nfe(NomeArquivoXML); if (oLer.oDadosNfe.versao != "2.00") { Servico = Servicos.NFeEnviarLote2; } var idLote = oLer.oDadosNfe.idLote; //Definir o objeto do WebService WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servico, emp, Convert.ToInt32(oLer.oDadosNfe.cUF), Convert.ToInt32(oLer.oDadosNfe.tpAmb), Convert.ToInt32(oLer.oDadosNfe.tpEmis), oLer.oDadosNfe.versao, oLer.oDadosNfe.mod); System.Net.SecurityProtocolType securityProtocolType = WebServiceProxy.DefinirProtocoloSeguranca(Convert.ToInt32(oLer.oDadosNfe.cUF), Convert.ToInt32(oLer.oDadosNfe.tpAmb), Convert.ToInt32(oLer.oDadosNfe.tpEmis), PadroesNFSe.NaoIdentificado, Servico); if (Empresas.Configuracoes[emp].CompactarNfe && oLer.oDadosNfe.versao != "2.00" && wsProxy.NomeMetodoWS.Length == 2) { Servico = Servicos.NFeEnviarLoteZip2; } //Criar objetos das classes dos serviços dos webservices do SEFAZ object oRecepcao = wsProxy.CriarObjeto(wsProxy.NomeClasseWS); var oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS(Convert.ToInt32(oLer.oDadosNfe.cUF), Servico)); //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.cUF.ToString(), oLer.oDadosNfe.cUF); wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.versaoDados.ToString(), oLer.oDadosNfe.versao); //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 // Envio de NFe Compactada - Renan 29/04/2014 if (Servico == Servicos.NFeEnviarLoteZip2) { FileInfo dadosArquivo = new FileInfo(NomeArquivoXML); TFunctions.CompressXML(dadosArquivo); } string nOperacao = wsProxy.NomeMetodoWS[(Servico == Servicos.NFeEnviarLoteZip2) ? 1 : 0]; //Invocar o método que envia o XML para o SEFAZ if (Empresas.Configuracoes[emp].IndSinc && oLer.oDadosNfe.versao != "2.00" && oLer.oDadosNfe.indSinc) { //Não posso gerar o arquivo na pasta de retorno através do método Invocar, por isso não estou colocando os dois ultimos parâmetros com a definição dos prefixos dos arquivos. O arquivo de retorno no processo síncrono deve acontecer somente depois de finalizado o processo da nota, ou gera problemas. Wandrey 11/06/2015 oInvocarObj.Invocar(wsProxy, oRecepcao, nOperacao, oCabecMsg, this, Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.PedRec).RetornoXML, false, securityProtocolType); Protocolo(vStrXmlRetorno); } else { oInvocarObj.Invocar(wsProxy, oRecepcao, nOperacao, oCabecMsg, this, Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.ExtRetorno.Rec, true, securityProtocolType); Recibo(vStrXmlRetorno); } if (dadosRec.cStat == "104") //Lote processado - Processo da NFe Síncrono - Wandrey 13/03/2014 { FinalizarNFeSincrono(vStrXmlRetorno, emp); oGerarXML.XmlRetorno(Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.PedRec).RetornoXML, vStrXmlRetorno); } else if (dadosRec.cStat == "103") //Lote recebido com sucesso - Processo da NFe Assíncrono { //Atualizar o número do recibo no XML de controle do fluxo de notas enviadas oFluxoNfe.AtualizarTag(oLer.oDadosNfe.chavenfe, FluxoNfe.ElementoEditavel.tMed, dadosRec.tMed.ToString()); oFluxoNfe.AtualizarTagRec(idLote, dadosRec.nRec); } else if (Convert.ToInt32(dadosRec.cStat) > 200 || Convert.ToInt32(dadosRec.cStat) == 108 || //Verifica se o servidor de processamento está paralisado momentaneamente. Wandrey 13/04/2012 Convert.ToInt32(dadosRec.cStat) == 109) //Verifica se o servidor de processamento está paralisado sem previsão. Wandrey 13/04/2012 { if (Empresas.Configuracoes[emp].IndSinc && oLer.oDadosNfe.versao != "2.00" && oLer.oDadosNfe.indSinc) { // OPS!!! Processo sincrono rejeição da SEFAZ, temos que gravar o XML para o ERP, pois no processo síncrono isso não pode ser feito dentro do método Invocar oGerarXML.XmlRetorno(Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.PedRec).RetornoXML /*.ExtRetorno.ProRec_XML*/, vStrXmlRetorno); } //Se o status do retorno do lote for maior que 200 ou for igual a 108 ou 109, //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 a tira do fluxo //Wandrey 30/04/2009 oAux.MoveArqErro(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + oFluxoNfe.LerTag(oLer.oDadosNfe.chavenfe, FluxoNfe.ElementoFixo.ArqNFe)); oFluxoNfe.ExcluirNfeFluxo(oLer.oDadosNfe.chavenfe); } //Deleta o arquivo de lote Functions.DeletarArquivo(NomeArquivoXML); // Envio de NFe Compactada - Renan 29/04/2014 if (Servico == Servicos.NFeEnviarLoteZip2) { Functions.DeletarArquivo(NomeArquivoXML + ".gz"); } } catch (ExceptionEnvioXML ex) { TrataException(emp, ex); } catch (ExceptionSemInternet ex) { TrataException(emp, ex); } catch (Exception ex) { TrataException(emp, ex); } }
/// <summary> /// Finalizar o envio da NFe /// </summary> public void FinalizarNFe(XmlNodeList protNFeList, FluxoNfe fluxoNFe, int emp) { var oLerXml = new LerXML(); foreach (XmlNode protNFeNode in protNFeList) { var protNFeElemento = (XmlElement)protNFeNode; string versao = protNFeElemento.GetAttribute(NFe.Components.TpcnResources.versao.ToString()); var strProtNfe = protNFeElemento.OuterXml; var infProtList = protNFeElemento.GetElementsByTagName("infProt"); foreach (XmlNode infProtNode in infProtList) { bool tirarFluxo = true; var infProtElemento = (XmlElement)infProtNode; var strChaveNFe = string.Empty; var strStat = string.Empty; if (infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.chNFe.ToString())[0] != null) { strChaveNFe = "NFe" + infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.chNFe.ToString())[0].InnerText; } if (infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.cStat.ToString())[0] != null) { strStat = infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.cStat.ToString())[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("LerRetornoLoteNFe(): Não pode obter o nome do arquivo"); } strNomeArqNfe = strChaveNFe.Substring(3) + Propriedade.ExtEnvio.Nfe; } var strArquivoNFe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + 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); switch (strStat) { case "100": //NFe Autorizada case "150": //NFe Autorizada fora do prazo if (File.Exists(strArquivoNFe)) { //Juntar o protocolo com a NFE já copiando para a pasta de autorizadas var strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions.ExtrairNomeArq(strNomeArqNfe, Propriedade.ExtEnvio.Nfe) + Propriedade.ExtRetorno.ProcNFe; //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, Propriedade.ExtEnvio.Nfe, Propriedade.ExtEnvio.Nfe); //Verificar se o -procNfe.xml existe na pasta de autorizados bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtRetorno.ProcNFe); //Se o XML de distribuição não estiver na pasta de autorizados if (!procNFeJaNaAutorizada) { if (!File.Exists(strArquivoNFeProc)) { Auxiliar.WriteLog("TaskNFeRetRecepcao: Gerou o arquivo de distribuição através da consulta recibo.", false); oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcNFe, versao); } } if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtRetorno.ProcNFe))) { //Mover a nfePRoc da pasta de NFE em processamento para a NFe Autorizada //Para enviar 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 TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente. //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtRetorno.ProcNFe); } if (!NFeJaNaAutorizada && procNFeJaNaAutorizada) { //Mover a NFE da pasta de NFE em processamento para NFe Autorizada //Para enviar 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 TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); } //Disparar a geração/impressão do UniDanfe. 03/02/2010 - Wandrey if (procNFeJaNaAutorizada) { /// /// tem que passar o arquivo de distribuicao da nfe /// string strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.Autorizados.ToString() + "\\" + Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) + Path.GetFileName(strArquivoNFeProc); try { TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]); } catch (Exception ex) { Auxiliar.WriteLog("TaskRecepcao: (Falha na execução do UniDANFe) " + ex.Message, false); } } //Vou verificar se estão os dois arquivos na pasta Autorizados, se tiver eu tiro do fluxo caso contrário não. Wandrey 13/02/2012 NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtEnvio.Nfe); procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtRetorno.ProcNFe); if (!procNFeJaNaAutorizada || !NFeJaNaAutorizada) { tirarFluxo = false; } /// /// se o -nfe.xml já existe na pasta de autorizados e ele está na pasta em processamento, /// o exclui da pasta em processamento if (NFeJaNaAutorizada && File.Exists(strArquivoNFe)) { File.Delete(strArquivoNFe); } } else { Auxiliar.WriteLog("TaskRetRecepcao: (Foi efetuada uma consulta recibo e não foi localizado o arquivo da NFe ( " + strNomeArqNfe + ") na pasta EmProcessamento) ", false); } break; case "110": case "205": case "301": case "302": case "303": ProcessaNFeDenegada(emp, oLerXml, strArquivoNFe, protNFeElemento.OuterXml, versao); break; default: //NFe foi rejeitada //O Status da NFe tem que ser maior que 1 ou deu algum erro na hora de ler o XML de retorno da consulta do recibo, sendo assim, vou mantar a nota no fluxo para consultar novamente. if (Convert.ToInt32(strStat) >= 1) { Auxiliar.WriteLog("Arquivo: " + strNomeArqNfe + " codigo de retorno: " + strStat, false); //Mover o XML da NFE a pasta de XML´s com erro oAux.MoveArqErro(strArquivoNFe); } else { tirarFluxo = false; } break; } //Deletar a NFE do arquivo de controle de fluxo if (tirarFluxo) { fluxoNFe.ExcluirNfeFluxo(strChaveNFe); } break; } } }
/// <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> private void LerRetornoLoteMDFe(int emp) { var oLerXml = new LerXML(); var fluxoNFe = new FluxoNfe(); var doc = new XmlDocument(); doc.Load(Functions.StringXmlToStreamUTF8(vStrXmlRetorno)); var retConsReciNFeList = doc.GetElementsByTagName("retConsReciMDFe"); 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(TpcnResources.nRec.ToString())[0] != null) { nRec = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.nRec.ToString())[0].InnerText; } //Pegar o status de retorno do lote enviado var cStatLote = string.Empty; if (retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null) { cStatLote = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[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) #region Validação do certificado de transmissão case "280": case "281": case "282": case "283": case "284": case "285": case "286": #endregion Validação do certificado de transmissão #region Validação inicial da mensagem no webservice case "214": case "243": case "108": case "109": #endregion Validação inicial da mensagem no webservice #region Validação das informações de controle da chamada ao webservice case "242": case "409": case "410": case "411": case "238": case "239": #endregion Validação das informações de controle da chamada ao webservice #region Validação da forma da área de dados case "215": case "598": case "599": case "404": case "402": #endregion Validação da forma da área de dados #region Validação das regras de negócio da consulta recibo case "252": case "226": case "247": case "494": case "227": case "253": #endregion Validação das regras de negócio da consulta recibo break; #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 Lote não foi localizado pelo recibo que está sendo consultado #endregion Rejeições do XML de consulta do recibo (Não é o lote que foi rejeitado e sim o XML de consulta do recibo) #region Lote foi processado, agora tenho que tratar as notas fiscais dele case "104": //Lote processado var protNFeList = retConsReciNFeElemento.GetElementsByTagName("protMDFe"); foreach (XmlNode protNFeNode in protNFeList) { var protNFeElemento = (XmlElement)protNFeNode; var strProtNfe = protNFeElemento.OuterXml; var infProtList = protNFeElemento.GetElementsByTagName("infProt"); foreach (XmlNode infProtNode in infProtList) { bool tirarFluxo = true; var infProtElemento = (XmlElement)infProtNode; var strChaveNFe = string.Empty; var strStat = string.Empty; if (infProtElemento.GetElementsByTagName(TpcnResources.chMDFe.ToString())[0] != null) { strChaveNFe = "MDFe" + infProtElemento.GetElementsByTagName(TpcnResources.chMDFe.ToString())[0].InnerText; } if (infProtElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null) { strStat = infProtElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0].InnerText; } //Definir o nome do arquivo da NFe e seu caminho var strNomeArqNfe = fluxoNFe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe); // 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("LerRetornoLoteMDFe(): Não pode obter o nome do arquivo"); } strNomeArqNfe = strChaveNFe.Substring(4) + Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML; } var strArquivoNFe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + 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": //MDFe Autorizado if (File.Exists(strArquivoNFe)) { //Juntar o protocolo com a NFE já copiando para a pasta de autorizadas var strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions.ExtrairNomeArq(strNomeArqNfe, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML) + Propriedade.ExtRetorno.ProcMDFe; //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados XmlDocument conteudoXMLMDFe = new XmlDocument(); conteudoXMLMDFe.Load(strArquivoNFe); oLerXml.Mdfe(conteudoXMLMDFe); //Verificar se a -nfe.xml existe na pasta de autorizados bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML); //Verificar se o -procNfe.xml existe na past de autorizados bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML, Propriedade.ExtRetorno.ProcMDFe); //Se o XML de distribuição não estiver na pasta de autorizados if (!procNFeJaNaAutorizada) { if (!File.Exists(strArquivoNFeProc)) { oGerarXML.XmlDistMDFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcMDFe, oLerXml.oDadosNfe.versao); } } if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML, Propriedade.ExtRetorno.ProcMDFe))) { //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 TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente. //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML, Propriedade.ExtRetorno.ProcMDFe); } if (!NFeJaNaAutorizada && procNFeJaNaAutorizada) { //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 TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); } //Disparar a geração/impressao do UniDanfe. 03/02/2010 - Wandrey if (procNFeJaNaAutorizada) { try { var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.Autorizados.ToString() + "\\" + Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) + Path.GetFileName(strArquivoNFeProc); TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]); } catch (Exception ex) { Auxiliar.WriteLog("TaskMDFeRetRecepcao: " + ex.Message, false); } } //Vou verificar se estão os dois arquivos na pasta Autorizados, se tiver eu tiro do fluxo caso contrário não. Wandrey 13/02/2012 NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML); procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML, Propriedade.ExtRetorno.ProcMDFe); if (!procNFeJaNaAutorizada || !NFeJaNaAutorizada) { tirarFluxo = false; } } break; default: //NFe foi rejeitada //O Status da NFe tem que ser maior que 1 ou deu algum erro na hora de ler o XML de retorno da consulta do recibo, sendo assim, vou mantar a nota no fluxo para consultar novamente. if (Convert.ToInt32(strStat) >= 1) { //Mover o XML da NFE a pasta de XML´s com erro oAux.MoveArqErro(strArquivoNFe); } else { tirarFluxo = false; } break; } //Deletar a NFE do arquivo de controle de fluxo if (tirarFluxo) { fluxoNFe.ExcluirNfeFluxo(strChaveNFe); } break; } } break; #endregion Lote foi processado, agora tenho que tratar as notas fiscais dele #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 if (Convert.ToInt32(cStatLote) >= 1) { //Vou retirar as notas do fluxo pelo recibo if (nRec != string.Empty) { fluxoNFe.ExcluirNfeFluxoRec(nRec.Trim()); } } break; #endregion Qualquer outro tipo de status que não for os acima relacionados, vai tirar a nota fiscal do fluxo. } } }
public override void Execute() { int emp = Empresas.FindEmpresaByThread(); try { dadosRec = new DadosRecClass(); FluxoNfe fluxoNfe = new FluxoNfe(); LerXML lerXml = new LerXML(); #region Parte que envia o lote //Ler o XML de Lote para pegar o número do lote que está sendo enviado lerXml.Cte(NomeArquivoXML); string idLote = lerXml.oDadosNfe.idLote; //Definir o objeto do WebService WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servico, emp, Convert.ToInt32(lerXml.oDadosNfe.cUF), Convert.ToInt32(lerXml.oDadosNfe.tpAmb), Convert.ToInt32(lerXml.oDadosNfe.tpEmis)); //Criar objetos das classes dos serviços dos webservices do SEFAZ object oRecepcao = wsProxy.CriarObjeto(wsProxy.NomeClasseWS);//(Servico, Convert.ToInt32(lerXml.oDadosNfe.cUF))); var oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS(Convert.ToInt32(lerXml.oDadosNfe.cUF), Servico)); //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.cUF.ToString(), lerXml.oDadosNfe.cUF); wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.versaoDados.ToString(), NFe.ConvertTxt.versoes.VersaoXMLCTe); // //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, wsProxy.NomeMetodoWS[0],//NomeMetodoWS(Servico, Convert.ToInt32(lerXml.oDadosNfe.cUF)), oCabecMsg, this, "-env-lot", "-rec"); #endregion #region Parte que trata o retorno do lote, ou seja, o número do recibo Recibo(vStrXmlRetorno); if (dadosRec.cStat == "103") //Lote recebido com sucesso { //Atualizar o número do recibo no XML de controle do fluxo de notas enviadas fluxoNfe.AtualizarTag(lerXml.oDadosNfe.chavenfe, FluxoNfe.ElementoEditavel.tMed, dadosRec.tMed.ToString()); fluxoNfe.AtualizarTagRec(idLote, dadosRec.nRec); } else if (Convert.ToInt32(dadosRec.cStat) > 200 || Convert.ToInt32(dadosRec.cStat) == 108 || //Verifica se o servidor de processamento está paralisado momentaneamente. Wandrey 13/04/2012 Convert.ToInt32(dadosRec.cStat) == 109) //Verifica se o servidor de processamento está paralisado sem previsão. Wandrey 13/04/2012 { //Se o status do retorno do lote for maior que 200 ou for igual a 108 ou 109, //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(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + fluxoNfe.LerTag(lerXml.oDadosNfe.chavenfe, FluxoNfe.ElementoFixo.ArqNFe)); fluxoNfe.ExcluirNfeFluxo(lerXml.oDadosNfe.chavenfe); } //Deleta o arquivo de lote Functions.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 TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.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 TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.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 TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.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 } } }
/// <summary> /// Finalizar o envio da NFe /// </summary> public void FinalizarNFe(XmlNodeList protNFeList, FluxoNfe fluxoNFe, int emp) { var oLerXml = new LerXML(); foreach (XmlNode protNFeNode in protNFeList) { var protNFeElemento = (XmlElement)protNFeNode; string versao = protNFeElemento.GetAttribute(NFe.Components.TpcnResources.versao.ToString()); var strProtNfe = protNFeElemento.OuterXml; var infProtList = protNFeElemento.GetElementsByTagName("infProt"); foreach (XmlNode infProtNode in infProtList) { bool tirarFluxo = true; var infProtElemento = (XmlElement)infProtNode; var strChaveNFe = string.Empty; var strStat = string.Empty; if (infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.chNFe.ToString())[0] != null) { strChaveNFe = "NFe" + infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.chNFe.ToString())[0].InnerText; } if (infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.cStat.ToString())[0] != null) { strStat = infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.cStat.ToString())[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("LerRetornoLoteNFe(): Não pode obter o nome do arquivo"); strNomeArqNfe = strChaveNFe.Substring(3) + Propriedade.ExtEnvio.Nfe; } var strArquivoNFe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + 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); switch (strStat) { case "100": //NFe Autorizada case "150": //NFe Autorizada fora do prazo if (File.Exists(strArquivoNFe)) { //Juntar o protocolo com a NFE já copiando para a pasta de autorizadas var strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions.ExtrairNomeArq(strNomeArqNfe, Propriedade.ExtEnvio.Nfe) + Propriedade.ExtRetorno.ProcNFe; //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, Propriedade.ExtEnvio.Nfe, Propriedade.ExtEnvio.Nfe); //Verificar se o -procNfe.xml existe na pasta de autorizados bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtRetorno.ProcNFe); //Se o XML de distribuição não estiver na pasta de autorizados if (!procNFeJaNaAutorizada) { if (!File.Exists(strArquivoNFeProc)) { Auxiliar.WriteLog("TaskNFeRetRecepcao: Gerou o arquivo de distribuição através da consulta recibo.", false); oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcNFe, versao); } } if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtRetorno.ProcNFe))) { //Mover a nfePRoc da pasta de NFE em processamento para a NFe Autorizada //Para enviar 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 TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente. //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtRetorno.ProcNFe); } if (!NFeJaNaAutorizada && procNFeJaNaAutorizada) { //Mover a NFE da pasta de NFE em processamento para NFe Autorizada //Para enviar 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 TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); } //Disparar a geração/impressão do UniDanfe. 03/02/2010 - Wandrey if (procNFeJaNaAutorizada) { /// /// tem que passar o arquivo de distribuicao da nfe /// string strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.Autorizados.ToString() + "\\" + Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) + Path.GetFileName(strArquivoNFeProc); try { TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]); } catch (Exception ex) { Auxiliar.WriteLog("TaskRecepcao: (Falha na execução do UniDANFe) " + ex.Message, false); } } //Vou verificar se estão os dois arquivos na pasta Autorizados, se tiver eu tiro do fluxo caso contrário não. Wandrey 13/02/2012 NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtEnvio.Nfe); procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtRetorno.ProcNFe); if (!procNFeJaNaAutorizada || !NFeJaNaAutorizada) { tirarFluxo = false; } /// /// se o -nfe.xml já existe na pasta de autorizados e ele está na pasta em processamento, /// o exclui da pasta em processamento if (NFeJaNaAutorizada && File.Exists(strArquivoNFe)) File.Delete(strArquivoNFe); } else Auxiliar.WriteLog("TaskRetRecepcao: (Foi efetuada uma consulta recibo e não foi localizado o arquivo da NFe ( " + strNomeArqNfe + ") na pasta EmProcessamento) ", false); break; case "110": case "205": case "301": case "302": case "303": ProcessaNFeDenegada(emp, oLerXml, strArquivoNFe, protNFeElemento.OuterXml, versao); break; default: //NFe foi rejeitada //O Status da NFe tem que ser maior que 1 ou deu algum erro na hora de ler o XML de retorno da consulta do recibo, sendo assim, vou mantar a nota no fluxo para consultar novamente. if (Convert.ToInt32(strStat) >= 1) { Auxiliar.WriteLog("Arquivo: " + strNomeArqNfe + " codigo de retorno: " + strStat, false); //Mover o XML da NFE a pasta de XML´s com erro oAux.MoveArqErro(strArquivoNFe); } else tirarFluxo = false; break; } //Deletar a NFE do arquivo de controle de fluxo if (tirarFluxo) fluxoNFe.ExcluirNfeFluxo(strChaveNFe); break; } } }
public override void Execute() { int emp = Empresas.FindEmpresaByThread(); List <string> arquivosNFe = new List <string>(); //Aguardar a assinatura de todos os arquivos da pasta de lotes arquivosNFe = oAux.ArquivosPasta(Empresas.Configuracoes[emp].PastaXmlEmLote, "*" + Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML); if (arquivosNFe.Count == 0) { if (this.NomeArquivoXML.IndexOf(Propriedade.Extensao(Propriedade.TipoEnvio.MontarLote).EnvioTXT) >= 0) { try { StringBuilder xml = new StringBuilder(); xml.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); xml.Append("<MontarLoteNFe>"); foreach (var filename in File.ReadAllLines(this.NomeArquivoXML, Encoding.Default)) { xml.AppendFormat("<ArquivoNFe>{0}</ArquivoNFe>", filename + (filename.ToLower().EndsWith(Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML) ? "" : Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML)); } xml.Append("</MontarLoteNFe>"); File.WriteAllText(Path.Combine(Empresas.Configuracoes[emp].PastaXmlEmLote, Path.GetFileName(this.NomeArquivoXML.Replace(Propriedade.Extensao(Propriedade.TipoEnvio.MontarLote).EnvioTXT, Propriedade.Extensao(Propriedade.TipoEnvio.MontarLote).EnvioXML))), xml.ToString()); //Deletar o arquivo de solicitação de montagem do lote de NFe FileInfo oArquivo = new FileInfo(this.NomeArquivoXML); oArquivo.Delete(); } catch (Exception ex) { try { TFunctions.GravarArqErroServico(this.NomeArquivoXML, Propriedade.Extensao(Propriedade.TipoEnvio.MontarLote).EnvioTXT, Propriedade.ExtRetorno.MontarLote_ERR, ex); } catch { //Se deu algum erro na hora de gravar o arquivo de erro de retorno para o ERP, infelizmente não poderemos fazer nada //pois deve estar ocorrendo alguma falha de rede, hd, permissão de acesso a pasta ou arquivos, etc. Wandrey 22/03/2010 //TODO: Não poderia gravar algum LOG para análise? Erro de rede normalmente é erro de IO } } } else { List <string> notas = new List <string>(); FileStream fsArquivo = null; FluxoNfe fluxoNfe = new FluxoNfe(); try { try { XmlDocument doc = new XmlDocument(); //Criar instância do XmlDocument Class fsArquivo = new FileStream(this.NomeArquivoXML, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); //Abrir um arquivo XML usando FileStream doc.Load(fsArquivo); //Carregar o arquivo aberto no XmlDocument string versaoXml = string.Empty; XmlNodeList documentoList = doc.GetElementsByTagName("MontarLoteNFe"); //Pesquisar o elemento Documento no arquivo XML foreach (XmlNode documentoNode in documentoList) { XmlElement documentoElemento = (XmlElement)documentoNode; int QtdeArquivo = documentoElemento.GetElementsByTagName("ArquivoNFe").Count; for (int d = 0; d < QtdeArquivo; d++) { string arquivoNFe = Empresas.Configuracoes[emp].PastaXmlEmLote + Propriedade.NomePastaXMLAssinado + "\\" + documentoElemento.GetElementsByTagName("ArquivoNFe")[d].InnerText; if (File.Exists(arquivoNFe)) { DadosNFeClass oDadosNfe = this.LerXMLNFe(arquivoNFe); if (string.IsNullOrEmpty(versaoXml)) { versaoXml = oDadosNfe.versao; } if (!fluxoNfe.NFeComLote(oDadosNfe.chavenfe)) { notas.Add(arquivoNFe); } else { throw new Exception("Arquivo: " + arquivoNFe + " já está no fluxo de envio e não será incluido em novo lote."); } } else { throw new Exception("Arquivo: " + arquivoNFe + " não existe e não será incluido no lote!"); } } } fsArquivo.Close(); //Fecha o arquivo XML this.LoteNfe(notas, versaoXml); } catch { if (fsArquivo != null) { fsArquivo.Close(); } } //Deletar o arquivo de solicitão de montagem do lote de NFe FileInfo oArquivo = new FileInfo(this.NomeArquivoXML); oArquivo.Delete(); } catch (Exception ex) { try { TFunctions.GravarArqErroServico(this.NomeArquivoXML, Propriedade.Extensao(Propriedade.TipoEnvio.MontarLote).EnvioXML, Propriedade.ExtRetorno.MontarLote_ERR, ex); } catch { //Se deu algum erro na hora de gravar o arquivo de erro de retorno para o ERP, infelizmente não poderemos fazer nada //pois deve estar ocorrendo alguma falha de rede, hd, permissão de acesso a pasta ou arquivos, etc. Wandrey 22/03/2010 //TODO: Não poderia gravar algum LOG para análise? Erro de rede normalmente é erro de IO } } } } }
public override void Execute() { int emp = Empresas.FindEmpresaByThread(); try { dadosRec = new DadosRecClass(); FluxoNfe fluxoNfe = new FluxoNfe(); LerXML lerXml = new LerXML(); //Ler o XML de Lote para pegar o número do lote que está sendo enviado lerXml.Cte(ConteudoXML); var idLote = lerXml.oDadosNfe.idLote; //Definir o objeto do WebService WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS( Servico, emp, Convert.ToInt32(lerXml.oDadosNfe.cUF), Convert.ToInt32(lerXml.oDadosNfe.tpAmb), Convert.ToInt32(lerXml.oDadosNfe.tpEmis), 0); System.Net.SecurityProtocolType securityProtocolType = WebServiceProxy.DefinirProtocoloSeguranca(Convert.ToInt32(lerXml.oDadosNfe.cUF), Convert.ToInt32(lerXml.oDadosNfe.tpAmb), Convert.ToInt32(lerXml.oDadosNfe.tpEmis), Servico); //Criar objetos das classes dos serviços dos webservices do SEFAZ object oRecepcao = wsProxy.CriarObjeto(wsProxy.NomeClasseWS); var oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS(Convert.ToInt32(lerXml.oDadosNfe.cUF), Servico)); //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg wsProxy.SetProp(oCabecMsg, TpcnResources.cUF.ToString(), lerXml.oDadosNfe.cUF); wsProxy.SetProp(oCabecMsg, TpcnResources.versaoDados.ToString(), lerXml.oDadosNfe.versao); //Criar objeto da classe de assinatura digita AssinaturaDigital oAD = new AssinaturaDigital(); //Assinar o XML oAD.Assinar(ConteudoXML, emp, Convert.ToInt32(lerXml.oDadosNfe.cUF)); //Mover o arquivo para a pasta em processamento Empresas.Configuracoes[emp].CriarSubPastaEnviado(); string arqEmProcessamento = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Path.GetFileName(NomeArquivoXML); StreamWriter sw = File.CreateText(arqEmProcessamento); sw.Write(ConteudoXML.OuterXml); sw.Close(); if (File.Exists(arqEmProcessamento)) { File.Delete(NomeArquivoXML); NomeArquivoXML = arqEmProcessamento; } NumeroLote = oGerarXML.GerarLoteCTeOS(NomeArquivoXML); //Invocar o método que envia o XML para o SEFAZ oInvocarObj.Invocar(wsProxy, oRecepcao, wsProxy.NomeMetodoWS[0], oCabecMsg, this, Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.PedRec).RetornoXML, false, securityProtocolType); #region Parte que trata o retorno do lote, ou seja, o número do recibo LerRetorno(emp); //Gravar o XML retornado pelo WebService do SEFAZ na pasta de retorno para o ERP //Tem que ser feito neste ponto, pois somente aqui terminamos todo o processo oGerarXML.XmlRetorno(Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.PedRec).RetornoXML, vStrXmlRetorno, Empresas.Configuracoes[emp].PastaXmlRetorno, NumeroLote.ToString("000000000000000") + Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML); #endregion Parte que trata o retorno do lote, ou seja, o número do recibo } 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 try { //Gravar o arquivo de erro de retorno para o ERP, caso ocorra TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML, Propriedade.ExtRetorno.ProRec_ERR, ex, NumeroLote.ToString("000000000000000") + Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML); } 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 TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML, Propriedade.ExtRetorno.ProRec_ERR, ex, NumeroLote.ToString("000000000000000") + Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML); } 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 TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML, Propriedade.ExtRetorno.ProRec_ERR, ex, NumeroLote.ToString("000000000000000") + Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML); } 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 } } }
/// <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> private void LerRetornoLoteMDFe(int emp) { LerXML oLerXml = new LerXML(); FluxoNfe fluxoNFe = new FluxoNfe(); XmlDocument doc = new XmlDocument(); doc.Load(Functions.StringXmlToStreamUTF8(vStrXmlRetorno)); XmlNodeList retConsReciNFeList = doc.GetElementsByTagName("retConsReciMDFe"); foreach (XmlNode retConsReciNFeNode in retConsReciNFeList) { XmlElement retConsReciNFeElemento = (XmlElement)retConsReciNFeNode; //Pegar o número do recibo do lote enviado string nRec = string.Empty; if (retConsReciNFeElemento.GetElementsByTagName(TpcnResources.nRec.ToString())[0] != null) { nRec = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.nRec.ToString())[0].InnerText; } //Pegar o status de retorno do lote enviado string cStatLote = string.Empty; if (retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null) { cStatLote = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[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) #region Validação do certificado de transmissão case "280": case "281": case "282": case "283": case "284": case "285": case "286": #endregion Validação do certificado de transmissão #region Validação inicial da mensagem no webservice case "214": case "243": #endregion Validação inicial da mensagem no webservice #region Validação das informações de controle da chamada ao webservice case "242": case "409": case "410": case "411": case "238": case "239": #endregion Validação das informações de controle da chamada ao webservice #region Validação da forma da área de dados case "215": case "598": case "599": case "404": case "402": #endregion Validação da forma da área de dados #region Validação das regras de negócio da consulta recibo case "252": case "226": case "247": case "494": case "227": case "253": #endregion Validação das regras de negócio da consulta recibo break; #region Serviço paralisado case "108": case "109": //Se o serviço estiver paralisado momentaneamente ou sem previsão de retorno, vamos tentar consultar somente a cada 3 minutos pra evitar consumo indevido. if (nRec != string.Empty) { fluxoNFe.AtualizarDPedRec(nRec, DateTime.Now.AddSeconds(180)); } break; #endregion Serviço paralisado #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 Lote não foi localizado pelo recibo que está sendo consultado #endregion Rejeições do XML de consulta do recibo (Não é o lote que foi rejeitado e sim o XML de consulta do recibo) #region Lote foi processado, agora tenho que tratar as notas fiscais dele case "104": //Lote processado // Atualizar a tag da data e hora da ultima consulta do recibo fluxoNFe.AtualizarDPedRec(nRec, DateTime.Now); FinalizarMDFe(retConsReciNFeElemento.GetElementsByTagName("protMDFe"), fluxoNFe, emp, null); break; #endregion Lote foi processado, agora tenho que tratar as notas fiscais dele #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 if (Convert.ToInt32(cStatLote) >= 1) { //Vou retirar as notas do fluxo pelo recibo if (nRec != string.Empty) { fluxoNFe.ExcluirNfeFluxoRec(nRec.Trim()); } } break; #endregion Qualquer outro tipo de status que não for os acima relacionados, vai tirar a nota fiscal do fluxo. } } }
/// <summary> /// Faz a leitura do XML de pedido de consulta da situação da NFe /// </summary> /// <param name="arquivoXML">Nome do XML a ser lido</param> /// <param name="emp">Código da empresa</param> /* private void PedSit(int emp, string arquivoXML) { this.dadosPedSit.tpAmb = Empresas.Configuracoes[emp].AmbienteCodigo; this.dadosPedSit.chNFe = string.Empty; XmlDocument doc = new XmlDocument(); doc.Load(arquivoXML); XmlNodeList consSitNFeList = doc.GetElementsByTagName("consSitMDFe"); foreach (XmlNode consSitNFeNode in consSitNFeList) { XmlElement consSitNFeElemento = (XmlElement)consSitNFeNode; dadosPedSit.tpAmb = Convert.ToInt32("0" + consSitNFeElemento.GetElementsByTagName(NFe.Components.TpcnResources.tpAmb.ToString())[0].InnerText); dadosPedSit.chNFe = consSitNFeElemento.GetElementsByTagName(TpcnResources.chMDFe.ToString())[0].InnerText; if (consSitNFeElemento.GetElementsByTagName(NFe.Components.TpcnResources.tpEmis.ToString()).Count != 0) { this.dadosPedSit.tpEmis = Convert.ToInt16(consSitNFeElemento.GetElementsByTagName(NFe.Components.TpcnResources.tpEmis.ToString())[0].InnerText); /// para que o validador não rejeite, excluo a tag <tpEmis> doc.DocumentElement.RemoveChild(consSitNFeElemento.GetElementsByTagName(NFe.Components.TpcnResources.tpEmis.ToString())[0]); /// salvo o arquivo modificado doc.Save(arquivoXML); } } }*/ #endregion #region LerRetornoSitMDFe() /// <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="ChaveMDFe">Chave da NFe que está sendo consultada</param> /// <remarks> /// Autor: Wandrey Mundin Ferreira /// Data: 16/06/2010 /// </remarks> private void LerRetornoSitMDFe(string ChaveMDFe) { int emp = Empresas.FindEmpresaByThread(); oGerarXML.XmlDistEventoMDFe(emp, this.vStrXmlRetorno); LerXML oLerXml = new LerXML(); MemoryStream msXml = Functions.StringXmlToStreamUTF8(this.vStrXmlRetorno); FluxoNfe oFluxoNfe = new FluxoNfe(); XmlDocument doc = new XmlDocument(); doc.Load(msXml); XmlNodeList retConsSitList = doc.GetElementsByTagName("retConsSitMDFe"); foreach (XmlNode retConsSitNode in retConsSitList) { XmlElement retConsSitElemento = (XmlElement)retConsSitNode; //Definir a chave da NFe a ser pesquisada string strChaveNFe = "MDFe" + ChaveMDFe; //Definir o nome do arquivo da NFe e seu caminho string strNomeArqNfe = oFluxoNfe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe); if (string.IsNullOrEmpty(strNomeArqNfe)) { strNomeArqNfe = strChaveNFe.Substring(4) + Propriedade.ExtEnvio.MDFe; } string strArquivoNFe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqNfe; #region CNPJ da chave não é de uma empresa Uninfe bool notDaEmpresa = (ChaveMDFe.Substring(6, 14) != Empresas.Configuracoes[emp].CNPJ || ChaveMDFe.Substring(0, 2) != Empresas.Configuracoes[emp].UnidadeFederativaCodigo.ToString()); if (!File.Exists(strArquivoNFe) && notDaEmpresa) return; #endregion //Pegar o status de retorno da NFe que está sendo consultada a situação var cStatCons = string.Empty; if (retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null) { cStatCons = retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[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) #region Validação do Certificado de Transmissão case "280": case "281": case "283": case "286": case "284": case "285": case "282": #endregion #region Validação Inicial da Mensagem no WebService case "214": case "243": case "108": case "109": #endregion #region Validação das informações de controle da chamada ao WebService case "242": case "409": case "410": case "411": case "238": case "239": #endregion #region Validação da forma da área de dados case "215": case "598": case "599": case "404": case "402": #endregion #region Validação das regras de negócios da consulta a NF-e case "252": case "226": case "494": case "227": case "253": break; #endregion #region Nota fiscal rejeitada case "217": //J-NFe não existe na base de dados do SEFAZ goto case "TirarFluxo"; #endregion #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 = Functions.LerTag(infConsSitElemento, NFe.Components.TpcnResources.cStat.ToString()).Replace(";", ""); switch (strStat) { case "100": var strProtNfe = retConsSitElemento.GetElementsByTagName("protMDFe")[0].OuterXml; //Definir o nome do arquivo -procNfe.xml string strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions.ExtrairNomeArq(strArquivoNFe, Propriedade.ExtEnvio.MDFe) + Propriedade.ExtRetorno.ProcMDFe; //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.Mdfe(strArquivoNFe); //Verificar se a -nfe.xml existe na pasta de autorizados bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtEnvio.MDFe); //Verificar se o -procNfe.xml existe na past de autorizados bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtRetorno.ProcMDFe); //Se o XML de distribuição não estiver na pasta de autorizados if (!procNFeJaNaAutorizada) { if (!File.Exists(strArquivoNFeProc)) { oGerarXML.XmlDistMDFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcMDFe); } } //Se o XML de distribuição não estiver ainda na pasta de autorizados if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtRetorno.ProcMDFe))) { //Move a nfeProc da pasta de NFE em processamento para a NFe Autorizada TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente. //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtRetorno.ProcMDFe); } //Se a NFe não existir ainda na pasta de autorizados if (!(NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtEnvio.MDFe))) { //1-Mover a NFE da pasta de NFE em processamento para NFe Autorizada //2-Só vou mover o -nfe.xml para a pasta autorizados se já existir a -procnfe.xml, caso contrário vou manter na pasta EmProcessamento // para tentar gerar novamente o -procnfe.xml // Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 if (procNFeJaNaAutorizada) TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); } else { //1-Se já estiver na pasta de autorizados, vou somente mover ela da pasta de XML´s em processamento //2-Só vou mover o -nfe.xml da pasta EmProcessamento se também existir a -procnfe.xml na pasta autorizados, caso contrário vou manter na pasta EmProcessamento // para tentar gerar novamente o -procnfe.xml // Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 if (procNFeJaNaAutorizada) oAux.MoveArqErro(strArquivoNFe); //oAux.DeletarArquivo(strArquivoNFe); } //Disparar a geração/impressão do UniDanfe. 03/02/2010 - Wandrey if (procNFeJaNaAutorizada) { string strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.Autorizados.ToString() + "\\" + Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) + Functions.ExtrairNomeArq(strArquivoNFe, Propriedade.ExtEnvio.MDFe) + Propriedade.ExtRetorno.ProcMDFe; try { TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]); } catch (Exception ex) { Auxiliar.WriteLog("TaskMDFeConsultaSituacao: " + ex.Message, false); } } } if (File.Exists(strArquivoNFeProc)) { //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento Functions.DeletarArquivo(strArquivoNFeProc); } break; 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 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; } } }
private const int _Minutos = 12; //12 minutos para atender o consumo indevido da SEFAZ public void Analisar(int emp) { oAux = new Auxiliar(); try { if (string.IsNullOrEmpty(Empresas.Configuracoes[emp].PastaXmlEnviado) || !Directory.Exists(Empresas.Configuracoes[emp].PastaXmlEnviado)) { return; } // le todos os arquivos que estão na pasta em processamento string[] files = Directory.GetFiles(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString()).Where(w => w.EndsWith(Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML, StringComparison.InvariantCultureIgnoreCase) || w.EndsWith(Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML, StringComparison.InvariantCultureIgnoreCase) || w.EndsWith(Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML, StringComparison.InvariantCultureIgnoreCase)).ToArray <string>(); // considera os arquivos em que a data do ultimo acesso é superior a 5 minutos DateTime UltimaData = DateTime.Now.AddMinutes(-_Minutos); foreach (string file in files) { if (!Functions.FileInUse(file)) { FileInfo fi = new FileInfo(file); //usar a última data de acesso, e não a data de criação if (fi.LastWriteTime <= UltimaData) { if (oLerXml == null) { oLerXml = new LerXML(); oGerarXml = new GerarXML(emp); fluxo = new FluxoNfe(emp); } try { XmlDocument doc = new XmlDocument(); doc.Load(file); TipoAplicativo tipoArquivo = TipoAplicativo.Nfe; string extNFe = Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML; string extProcNFe = Propriedade.ExtRetorno.ProcNFe; string arquivoSit = string.Empty; string chNFe = string.Empty; switch (doc.DocumentElement.Name) { case "MDFe": tipoArquivo = TipoAplicativo.MDFe; extNFe = Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML; extProcNFe = Propriedade.ExtRetorno.ProcMDFe; oLerXml.Mdfe(doc); arquivoSit = oLerXml.oDadosNfe.chavenfe.Substring(4); chNFe = oLerXml.oDadosNfe.chavenfe.Substring(4); break; case "NFe": tipoArquivo = TipoAplicativo.Nfe; extNFe = Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML; extProcNFe = Propriedade.ExtRetorno.ProcNFe; oLerXml.Nfe(doc); arquivoSit = oLerXml.oDadosNfe.chavenfe.Substring(3); chNFe = oLerXml.oDadosNfe.chavenfe.Substring(3); break; case "CTe": tipoArquivo = TipoAplicativo.Cte; extNFe = Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML; extProcNFe = Propriedade.ExtRetorno.ProcCTe; oLerXml.Cte(doc); arquivoSit = oLerXml.oDadosNfe.chavenfe.Substring(3); chNFe = oLerXml.oDadosNfe.chavenfe.Substring(3); break; } //Ler a NFe //Verificar se o -nfe.xml existe na pasta de autorizados bool NFeJaNaAutorizada = oAux.EstaAutorizada(file, oLerXml.oDadosNfe.dEmi, extNFe, extNFe); //Verificar se o -procNfe.xml existe na past de autorizados bool procNFeJaNaAutorizada = oAux.EstaAutorizada(file, oLerXml.oDadosNfe.dEmi, extNFe, extProcNFe); //Se um dos XML´s não estiver na pasta de autorizadas ele força finalizar o processo da NFe. if (!NFeJaNaAutorizada || !procNFeJaNaAutorizada) { //Verificar se a NFe está no fluxo, se não estiver vamos incluir ela para que funcione //a rotina de gerar o -procNFe.xml corretamente. Wandrey 21/10/2009 if (!fluxo.NfeExiste(oLerXml.oDadosNfe.chavenfe)) { fluxo.InserirNfeFluxo(oLerXml.oDadosNfe.chavenfe, oLerXml.oDadosNfe.mod, file); } //gera um -ped-sit.xml mesmo sendo autorizada ou denegada, pois assim sendo, o ERP precisaria dele oGerarXml.Consulta(tipoArquivo, arquivoSit + Propriedade.Extensao(Propriedade.TipoEnvio.PedSit).EnvioXML, Convert.ToInt32(oLerXml.oDadosNfe.tpAmb), Convert.ToInt32(oLerXml.oDadosNfe.tpEmis), chNFe, oLerXml.oDadosNfe.versao); } else { //Move o XML da pasta em processamento para a pasta de XML´s com erro (-nfe.xml) oAux.MoveArqErro(file); //Move o XML da pasta em processamento para a pasta de XML´s com erro (-procNFe.xml) oAux.MoveArqErro(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions.ExtrairNomeArq(file, extNFe) + extProcNFe); //Tirar a nota fiscal do fluxo fluxo.ExcluirNfeFluxo(oLerXml.oDadosNfe.chavenfe); } } catch (Exception ex) { try { // grava o arquivo com extensao .ERR oAux.GravarArqErroERP(Path.GetFileNameWithoutExtension(file) + ".err", ex.Message); } catch { //Se deu erro na hora de gravar o erro para o ERP, infelizmente não posso fazer mais nada. Wandrey 28/04/2011 } } } } } } catch (Exception ex) { try { // grava o arquivo generico oAux.GravarArqErroERP(string.Format(Propriedade.NomeArqERRUniNFe, DateTime.Now.ToString("yyyyMMddTHHmmss")), ex.Message); } catch { //Se deu erro na hora de gravar o erro para o ERP, infelizmente não posso fazer mais nada. Wandrey 28/04/2011 } } }
/// <summary> /// Faz a leitura do XML de pedido de consulta da situação da NFe /// </summary> /// <param name="arquivoXML">Nome do XML a ser lido</param> /// <param name="emp">Código da empresa</param> /* * private void PedSit(int emp, string arquivoXML) * { * this.dadosPedSit.tpAmb = Empresas.Configuracoes[emp].AmbienteCodigo; * this.dadosPedSit.chNFe = string.Empty; * * XmlDocument doc = new XmlDocument(); * doc.Load(arquivoXML); * * XmlNodeList consSitNFeList = doc.GetElementsByTagName("consSitMDFe"); * * foreach (XmlNode consSitNFeNode in consSitNFeList) * { * XmlElement consSitNFeElemento = (XmlElement)consSitNFeNode; * * dadosPedSit.tpAmb = Convert.ToInt32("0" + consSitNFeElemento.GetElementsByTagName(NFe.Components.TpcnResources.tpAmb.ToString())[0].InnerText); * dadosPedSit.chNFe = consSitNFeElemento.GetElementsByTagName(TpcnResources.chMDFe.ToString())[0].InnerText; * * if (consSitNFeElemento.GetElementsByTagName(NFe.Components.TpcnResources.tpEmis.ToString()).Count != 0) * { * this.dadosPedSit.tpEmis = Convert.ToInt16(consSitNFeElemento.GetElementsByTagName(NFe.Components.TpcnResources.tpEmis.ToString())[0].InnerText); * /// para que o validador não rejeite, excluo a tag <tpEmis> * doc.DocumentElement.RemoveChild(consSitNFeElemento.GetElementsByTagName(NFe.Components.TpcnResources.tpEmis.ToString())[0]); * /// salvo o arquivo modificado * doc.Save(arquivoXML); * } * } * }*/ #endregion #region LerRetornoSitMDFe() /// <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="ChaveMDFe">Chave da NFe que está sendo consultada</param> /// <remarks> /// Autor: Wandrey Mundin Ferreira /// Data: 16/06/2010 /// </remarks> private void LerRetornoSitMDFe(string ChaveMDFe) { int emp = Empresas.FindEmpresaByThread(); oGerarXML.XmlDistEventoMDFe(emp, this.vStrXmlRetorno); LerXML oLerXml = new LerXML(); MemoryStream msXml = Functions.StringXmlToStreamUTF8(this.vStrXmlRetorno); FluxoNfe oFluxoNfe = new FluxoNfe(); XmlDocument doc = new XmlDocument(); doc.Load(msXml); XmlNodeList retConsSitList = doc.GetElementsByTagName("retConsSitMDFe"); foreach (XmlNode retConsSitNode in retConsSitList) { XmlElement retConsSitElemento = (XmlElement)retConsSitNode; //Definir a chave da NFe a ser pesquisada string strChaveNFe = "MDFe" + ChaveMDFe; //Definir o nome do arquivo da NFe e seu caminho string strNomeArqNfe = oFluxoNfe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe); if (string.IsNullOrEmpty(strNomeArqNfe)) { strNomeArqNfe = strChaveNFe.Substring(4) + Propriedade.ExtEnvio.MDFe; } string strArquivoNFe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqNfe; #region CNPJ da chave não é de uma empresa Uninfe bool notDaEmpresa = (ChaveMDFe.Substring(6, 14) != Empresas.Configuracoes[emp].CNPJ || ChaveMDFe.Substring(0, 2) != Empresas.Configuracoes[emp].UnidadeFederativaCodigo.ToString()); if (!File.Exists(strArquivoNFe) && notDaEmpresa) { return; } #endregion //Pegar o status de retorno da NFe que está sendo consultada a situação var cStatCons = string.Empty; if (retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null) { cStatCons = retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[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) #region Validação do Certificado de Transmissão case "280": case "281": case "283": case "286": case "284": case "285": case "282": #endregion #region Validação Inicial da Mensagem no WebService case "214": case "243": case "108": case "109": #endregion #region Validação das informações de controle da chamada ao WebService case "242": case "409": case "410": case "411": case "238": case "239": #endregion #region Validação da forma da área de dados case "215": case "598": case "599": case "404": case "402": #endregion #region Validação das regras de negócios da consulta a NF-e case "252": case "226": case "494": case "227": case "253": break; #endregion #region Nota fiscal rejeitada case "217": //J-NFe não existe na base de dados do SEFAZ goto case "TirarFluxo"; #endregion #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 = Functions.LerTag(infConsSitElemento, NFe.Components.TpcnResources.cStat.ToString()).Replace(";", ""); switch (strStat) { case "100": var strProtNfe = retConsSitElemento.GetElementsByTagName("protMDFe")[0].OuterXml; //Definir o nome do arquivo -procNfe.xml string strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions.ExtrairNomeArq(strArquivoNFe, Propriedade.ExtEnvio.MDFe) + Propriedade.ExtRetorno.ProcMDFe; //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.Mdfe(strArquivoNFe); //Verificar se a -nfe.xml existe na pasta de autorizados bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtEnvio.MDFe); //Verificar se o -procNfe.xml existe na past de autorizados bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtRetorno.ProcMDFe); //Se o XML de distribuição não estiver na pasta de autorizados if (!procNFeJaNaAutorizada) { if (!File.Exists(strArquivoNFeProc)) { oGerarXML.XmlDistMDFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcMDFe); } } //Se o XML de distribuição não estiver ainda na pasta de autorizados if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtRetorno.ProcMDFe))) { //Move a nfeProc da pasta de NFE em processamento para a NFe Autorizada TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente. //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtRetorno.ProcMDFe); } //Se a NFe não existir ainda na pasta de autorizados if (!(NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtEnvio.MDFe))) { //1-Mover a NFE da pasta de NFE em processamento para NFe Autorizada //2-Só vou mover o -nfe.xml para a pasta autorizados se já existir a -procnfe.xml, caso contrário vou manter na pasta EmProcessamento // para tentar gerar novamente o -procnfe.xml // Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 if (procNFeJaNaAutorizada) { TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); } } else { //1-Se já estiver na pasta de autorizados, vou somente mover ela da pasta de XML´s em processamento //2-Só vou mover o -nfe.xml da pasta EmProcessamento se também existir a -procnfe.xml na pasta autorizados, caso contrário vou manter na pasta EmProcessamento // para tentar gerar novamente o -procnfe.xml // Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 if (procNFeJaNaAutorizada) { oAux.MoveArqErro(strArquivoNFe); } //oAux.DeletarArquivo(strArquivoNFe); } //Disparar a geração/impressão do UniDanfe. 03/02/2010 - Wandrey if (procNFeJaNaAutorizada) { string strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.Autorizados.ToString() + "\\" + Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) + Functions.ExtrairNomeArq(strArquivoNFe, Propriedade.ExtEnvio.MDFe) + Propriedade.ExtRetorno.ProcMDFe; try { TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]); } catch (Exception ex) { Auxiliar.WriteLog("TaskMDFeConsultaSituacao: " + ex.Message, false); } } } if (File.Exists(strArquivoNFeProc)) { //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento Functions.DeletarArquivo(strArquivoNFeProc); } break; 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 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; } } }
/// <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> private void LerRetornoLoteNFe() { /* vStrXmlRetorno = "<?xml version=\"1.0\" encoding=\"windows-1250\"?>" + "<retConsReciNFe xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\"2.00\">" + "<tpAmb>2</tpAmb>" + "<verAplic>0582</verAplic>" + "<nRec>310000008211450</nRec>" + "<cStat>104</cStat>" + "<xMotivo>Rejeicao: UF informada no campo cUF nao e atendida pelo Web Service</xMotivo>" + "<cUF>31</cUF>" + "<protNFe versao=\"2.00\" xmlns=\"http://www.portalfiscal.inf.br/nfe\">" + "<infProt Id=\"ID31100371139034000100550000009999201000000005\">" + "<tpAmb>2</tpAmb>" + "<verAplic>2.00</verAplic>" + "<chNFe>31100371139034000100550000009999201000000005</chNFe>" + "<dhRecbto>2010-03-17T17:07:34</dhRecbto>" + "<nProt>131100015665325</nProt>" + "<digVal>ajBuZFhtT3JyT0VFVHIzdDJvZTc3RHhURElnPQ==</digVal>" + "<cStat>100</cStat>" + "<xMotivo>AUTORIZADA</xMotivo>" + "</infProt>" + "</protNFe>" + "</retConsReciNFe>"; */ int emp = Empresas.FindEmpresaByThread(); var msXml = Functions.StringXmlToStreamUTF8(vStrXmlRetorno); var fluxoNFe = new FluxoNfe(); 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(TpcnResources.nRec.ToString())[0] != null) { nRec = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.nRec.ToString())[0].InnerText; } //Pegar o status de retorno do lote enviado var cStatLote = string.Empty; if (retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null) { cStatLote = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[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) #region Validação do certificado de transmissão case "280": case "281": case "282": case "283": case "284": case "285": case "286": #endregion #region Validação inicial da mensagem no webservice case "214": case "243": case "108": case "109": #endregion #region Validação das informações de controle da chamada ao webservice case "242": case "409": case "410": case "411": case "238": case "239": #endregion #region Validação da forma da área de dados case "215": case "516": case "517": case "545": case "587": case "588": case "404": case "402": #endregion #region Validação das regras de negócio da consulta recibo case "252": case "248": case "553": case "105": case "223": #endregion break; #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 #endregion #region Lote foi processado, agora tenho que tratar as notas fiscais dele case "104": //Lote processado //Atualizar a tag da data e hora da ultima consulta do recibo fluxoNFe.AtualizarDPedRec(nRec, DateTime.Now); FinalizarNFe(retConsReciNFeElemento.GetElementsByTagName("protNFe"), fluxoNFe, emp); 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 if (Convert.ToInt32(cStatLote) >= 1) { //Vou retirar as notas do fluxo pelo recibo if (nRec != string.Empty) { fluxoNFe.ExcluirNfeFluxoRec(nRec.Trim()); } } break; #endregion } } }
/// <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> /// #if notused protected override void LerRetornoLoteCTe() { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; var oLerXml = new LerXML(); var msXml = Functions.StringXmlToStream(vStrXmlRetorno); var fluxoNFe = new FluxoNfe(); try { var doc = new XmlDocument(); doc.Load(msXml); var retConsReciNFeList = doc.GetElementsByTagName("retConsReciCTe"); 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 "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 "226": //E-UF da Chave de Acesso difere da UF do Web Service case "236": //E-Valida DV da Chave de Acesso case "217": //E-Acesso BD CTE case "216": //E-Verificar se campo "Codigo Numerico" 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("protCTe"); 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("chCTe")[0] != null) { strChaveNFe = "CTe" + infProtElemento.GetElementsByTagName("chCTe")[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("LerRetornoLoteCTe(): Não pode obter o nome do arquivo"); strNomeArqNfe = strChaveNFe.Substring(3) + Propriedade.ExtEnvio.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, Propriedade.ExtRetorno.ProcNFe); var strArquivoNFeProc = Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions/*oAux*/.ExtrairNomeArq(strNomeArqNfe, Propriedade.ExtEnvio.Nfe) + Propriedade.ExtRetorno.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 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 MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); //Disparar a geração/impressçao do UniDanfe. 03/02/2010 - Wandrey //ExecutaUniDanfe(strNomeArqNfe, oLerXml.oDadosNfe.dEmi); } break; case "301": //NFe Denegada - Irregularidade fiscal do emitente if (File.Exists(strArquivoNFe)) { //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 MoverArquivo(strArquivoNFe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi); } break; case "302": //NFe Denegada - Irregularidade fiscal do remetente goto case "301"; case "303": //NFe Denegada - Irregularidade fiscal do destinatário goto case "301"; case "304": //NFe Denegada - Irregularidade fiscal do expedidor goto case "301"; case "305": //NFe Denegada - Irregularidade fiscal do recebedor goto case "301"; case "306": //NFe Denegada - Irregularidade fiscal do tomador 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> /// 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> private void LerRetornoLoteCTe(int emp) { var oLerXml = new LerXML(); var fluxoNFe = new FluxoNfe(); var doc = new XmlDocument(); doc.Load(Functions.StringXmlToStreamUTF8(vStrXmlRetorno)); var retConsReciNFeList = doc.GetElementsByTagName("retConsReciCTe"); 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(TpcnResources.nRec.ToString())[0] != null) { nRec = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.nRec.ToString())[0].InnerText; } //Pegar o status de retorno do lote enviado var cStatLote = string.Empty; if (retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null) { cStatLote = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[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 "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 "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 "226": //E-UF da Chave de Acesso difere da UF do Web Service case "236": //E-Valida DV da Chave de Acesso case "217": //E-Acesso BD CTE case "216": //E-Verificar se campo "Codigo Numerico" break; #region Serviço paralisado case "108": case "109": //Se o serviço estiver paralisado momentaneamente ou sem previsão de retorno, vamos tentar consultar somente a cada 3 minutos pra evitar consumo indevido. if (nRec != string.Empty) { fluxoNFe.AtualizarDPedRec(nRec, DateTime.Now.AddSeconds(180)); } break; #endregion Serviço paralisado #endregion Rejeições do XML de consulta do recibo (Não é o lote que foi rejeitado e sim o XML de consulta do recibo) #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 Lote ainda está sendo processado #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 Lote não foi localizado pelo recibo que está sendo consultado #region Lote foi processado, agora tenho que tratar as notas fiscais dele case "104": //Lote processado var protNFeList = retConsReciNFeElemento.GetElementsByTagName("protCTe"); 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(TpcnResources.chCTe.ToString())[0] != null) { strChaveNFe = "CTe" + infProtElemento.GetElementsByTagName(TpcnResources.chCTe.ToString())[0].InnerText; } if (infProtElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null) { strStat = infProtElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0].InnerText; } //Definir o nome do arquivo da NFe e seu caminho var strNomeArqNfe = fluxoNFe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe); // 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)) { oGerarXML.XmlRetorno(Propriedade.Extensao(Propriedade.TipoEnvio.PedRec).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.PedRec).RetornoXML, vStrXmlRetorno); throw new Exception("LerRetornoLoteCTe(): Não pode obter o nome do arquivo"); } strNomeArqNfe = strChaveNFe.Substring(3) + Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML; } var strArquivoNFe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + 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)) { //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados XmlDocument conteudoXMLCTe = new XmlDocument(); conteudoXMLCTe.Load(strArquivoNFe); oLerXml.Cte(conteudoXMLCTe); //Juntar o protocolo com a NFE já copiando para a pasta em processamento var strArquivoNFeProc = oGerarXML.XmlDistCTe(strArquivoNFe, strProtNfe, oLerXml.oDadosNfe.versao); //Mover a cteProc da pasta de CTe em processamento para a NFe Autorizada //Para envitar falhar, tenho que mover primeiro o XML de distribuição (-procCTe.xml) para //depois mover o da nfe (-cte.xml), pois se ocorrer algum erro, tenho como reconstruir o senário, //assim sendo não inverta as posições. Wandrey 08/10/2009 TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); //Mover a CTe da pasta de CTe em processamento para CTe Autorizada //Para envitar falhar, tenho que mover primeiro o XML de distribuição (-procCTe.xml) para //depois mover o da nfe (-cte.xml), pois se ocorrer algum erro, tenho como reconstruir o cenário. //assim sendo não inverta as posições. Wandrey 08/10/2009 if (!Empresas.Configuracoes[emp].SalvarSomenteXMLDistribuicao) { TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); } else { TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Originais, oLerXml.oDadosNfe.dEmi); } //Disparar a geração/impressao do UniDanfe. 03/02/2010 - Wandrey try { var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.Autorizados.ToString() + "\\" + Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) + Path.GetFileName(strArquivoNFeProc); TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]); } catch (Exception ex) { Auxiliar.WriteLog("TaskCTeRetRecepcao: " + ex.Message, false); } } break; case "301": //NFe Denegada - Irregularidade fiscal do emitente if (File.Exists(strArquivoNFe)) { //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s Denegados XmlDocument conteudoXMLCTe = new XmlDocument(); conteudoXMLCTe.Load(strArquivoNFe); oLerXml.Cte(conteudoXMLCTe); //Mover a NFE da pasta de NFE em processamento para NFe Denegadas TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi); /// /// existe DACTE de CTe denegado??? /// try { var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.Denegados.ToString() + "\\" + Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) + Functions.ExtrairNomeArq(strArquivoNFe, Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML) + Propriedade.ExtRetorno.Den; TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]); } catch (Exception ex) { Auxiliar.WriteLog("TaskCTeRetRecepcao: " + ex.Message, false); } } break; case "302": //NFe Denegada - Irregularidade fiscal do remetente goto case "301"; case "303": //NFe Denegada - Irregularidade fiscal do destinatário goto case "301"; case "304": //NFe Denegada - Irregularidade fiscal do expedidor goto case "301"; case "305": //NFe Denegada - Irregularidade fiscal do recebedor goto case "301"; case "306": //NFe Denegada - Irregularidade fiscal do tomador 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 Lote foi processado, agora tenho que tratar as notas fiscais dele #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 Qualquer outro tipo de status que não for os acima relacionados, vai tirar a nota fiscal do fluxo. } } }
/// <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> /// #if notused protected override void LerRetornoSitNFe(string ChaveNFe) { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; LerXML oLerXml = new LerXML(); MemoryStream msXml = Functions.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 #region Cancelamento NFe new TaskCancelamento().GerarXmlDistCanc(ChaveNFe); //Wandrey 12/01/2012 #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("LerRetornoSitNFe(): Não pode obter o nome do arquivo"); strNomeArqNfe = strChaveNFe.Substring(3) + Propriedade.ExtEnvio.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) #region Validação do Certificado de Transmissão case "280": case "281": case "283": case "286": case "284": case "285": case "282": #endregion #region Validação Inicial da Mensagem no WebService case "214": case "243": case "108": case "109": #endregion #region Validação das informações de controle da chamada ao WebService case "242": case "409": case "410": case "411": case "238": case "239": #endregion #region Validação da forma da área de dados case "215": case "516": case "517": case "545": case "587": case "588": case "404": case "402": #endregion #region Validação das regras de negócios da consulta a NF-e case "252": case "226": case "236": case "614": case "615": case "616": case "617": case "618": case "619": case "620": 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 #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 = Functions.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 strProtNfe = GeraStrProtNFe(infConsSitElemento);//danasa 11-4-2012 //Definir o nome do arquivo -procNfe.xml string strArquivoNFeProc = Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions/*oAux*/.ExtrairNomeArq(strArquivoNFe, Propriedade.ExtEnvio.Nfe) + Propriedade.ExtRetorno.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, Propriedade.ExtEnvio.Nfe); //Verificar se o -procNfe.xml existe na past de autorizados bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtRetorno.ProcNFe); //Se o XML de distribuição não estiver na pasta de autorizados if (!procNFeJaNaAutorizada) { if (!File.Exists(strArquivoNFeProc)) { oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcNFe); } } //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 MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente. //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtRetorno.ProcNFe); } //Se a NFe não existir ainda na pasta de autorizados if (!NFeJaNaAutorizada) { //1-Mover a NFE da pasta de NFE em processamento para NFe Autorizada //2-Só vou mover o -nfe.xml para a pasta autorizados se já existir a -procnfe.xml, caso contrário vou manter na pasta EmProcessamento // para tentar gerar novamente o -procnfe.xml // Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 if (procNFeJaNaAutorizada) MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi); } else { //1-Se já estiver na pasta de autorizados, vou somente mover ela da pasta de XML´s em processamento //2-Só vou mover o -nfe.xml da pasta EmProcessamento se também existir a -procnfe.xml na pasta autorizados, caso contrário vou manter na pasta EmProcessamento // para tentar gerar novamente o -procnfe.xml // Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012 if (procNFeJaNaAutorizada) oAux.MoveArqErro(strArquivoNFe); //oAux.DeletarArquivo(strArquivoNFe); } //Disparar a geração/impressão do UniDanfe. 03/02/2010 - Wandrey if (procNFeJaNaAutorizada) 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 Functions.DeletarArquivo(strArquivoNFeProc); } break; //danasa 11-4-2012 case "110": //Uso Denegado case "301": case "302": //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s Denegados // // NFe existe na pasta EmProcessamento? ProcessaNotaDenegada(emp, oLerXml, strArquivoNFe, infConsSitElemento); 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"; case "205": //Nfe já está denegada na base do SEFAZ goto case "100"; ///<<<<<<<<<< ??????????????????? >>>>>>>>>>>> /// //Ler o XML para pegar a data de emissão para criar a psta dos XML´s Denegados /* if (File.Exists(strArquivoNFe)) { 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;*/ #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); } }