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); } }
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 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 } } }
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 } } }
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 } } }
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 } } }