/// <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); }
/// <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); }
public override void Execute() { int emp = Empresas.FindEmpresaByThread(); FluxoNfe oFluxoNfe = new FluxoNfe(); LerXML oLer = new LerXML(); try { dadosRec = new DadosRecClass(); //Ler o XML de Lote para pegar o número do lote que está sendo enviado oLer.Nfe(ConteudoXML); 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, 0); System.Net.SecurityProtocolType securityProtocolType = WebServiceProxy.DefinirProtocoloSeguranca(Convert.ToInt32(oLer.oDadosNfe.cUF), Convert.ToInt32(oLer.oDadosNfe.tpAmb), Convert.ToInt32(oLer.oDadosNfe.tpEmis), Servico); //Criar objetos das classes dos serviços dos webservices do SEFAZ object oRecepcao = wsProxy.CriarObjeto(wsProxy.NomeClasseWS); object oCabecMsg = null; if (oLer.oDadosNfe.versao != "4.00") { oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS(Convert.ToInt32(oLer.oDadosNfe.cUF), Servico)); wsProxy.SetProp(oCabecMsg, TpcnResources.cUF.ToString(), oLer.oDadosNfe.cUF); wsProxy.SetProp(oCabecMsg, TpcnResources.versaoDados.ToString(), oLer.oDadosNfe.versao); } //Invocar o método que envia o XML para o SEFAZ if (Empresas.Configuracoes[emp].IndSinc && 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, wsProxy.NomeMetodoWS[0], oCabecMsg, this, Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.PedRec).RetornoXML, false, securityProtocolType); Protocolo(vStrXmlRetorno); } else { oInvocarObj.Invocar(wsProxy, oRecepcao, wsProxy.NomeMetodoWS[0], oCabecMsg, this, Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.ExtRetorno.Rec, true, securityProtocolType); Recibo(vStrXmlRetorno, emp); } if (dadosRec.cStat == "104") //Lote processado - Processo da NFe Síncrono - Wandrey 13/03/2014 { FinalizarNFeSincrono(vStrXmlRetorno, emp, oLer.oDadosNfe.chavenfe); 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 { if (dadosRec.tMed > 0) { Thread.Sleep(dadosRec.tMed * 1000); } //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); XmlDocument xmlPedRec = oGerarXML.XmlPedRecNFe(dadosRec.nRec, oLer.oDadosNfe.versao, oLer.oDadosNfe.mod, emp); TaskNFeRetRecepcao nfeRetRecepcao = new TaskNFeRetRecepcao(xmlPedRec); nfeRetRecepcao.chNFe = oLer.oDadosNfe.chavenfe; nfeRetRecepcao.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 { if (Empresas.Configuracoes[emp].IndSinc && 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); } catch (ExceptionEnvioXML ex) { TrataException(emp, ex, oLer.oDadosNfe.chavenfe); } catch (ExceptionSemInternet ex) { TrataException(emp, ex, oLer.oDadosNfe.chavenfe); } catch (Exception ex) { TrataException(emp, ex, oLer.oDadosNfe.chavenfe); } }