/// <summary> /// Metodo responsável por invocar o serviço do WebService do SEFAZ /// </summary> /// <param name="oWSProxy">Objeto da classe construida do WSDL</param> /// <param name="oServicoWS">Objeto da classe de envio do XML</param> /// <param name="cMetodo">Método da classe de envio do XML que faz o envio</param> /// <param name="oCabecMsg">Objeto da classe de cabecalho do serviço</param> /// <param name="oServicoNFe">Objeto do Serviço de envio da NFE do UniNFe</param> /// <param name="cFinalArqEnvio">string do final do arquivo a ser enviado. Sem a extensão ".xml"</param> /// <param name="cFinalArqRetorno">string do final do arquivo a ser gravado com o conteúdo do retorno. Sem a extensão ".xml"</param> /// <remarks> /// Autor: Wandrey Mundin Ferreira /// Data: 17/03/2010 /// </remarks> public void Invocar(WebServiceProxy oWSProxy, object oServicoWS, string cMetodo, object oCabecMsg, object oServicoNFe, string cFinalArqEnvio, string cFinalArqRetorno) { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; XmlDocument docXML = new XmlDocument(); // Definir o tipo de serviço da NFe Type typeServicoNFe = oServicoNFe.GetType(); // Resgatar o nome do arquivo XML a ser enviado para o webservice string XmlNfeDadosMsg = (string)(typeServicoNFe.InvokeMember("vXmlNfeDadosMsg", System.Reflection.BindingFlags.GetProperty, null, oServicoNFe, null)); try { //Verificar se o certificado digital está vencido, se tiver vai forçar uma exceção CertificadoDigital CertDig = new CertificadoDigital(); CertDig.PrepInfCertificado(Empresa.Configuracoes[emp].X509Certificado); if (CertDig.lLocalizouCertificado == true) { if (DateTime.Compare(DateTime.Now, CertDig.dValidadeFinal) > 0) { throw new ExceptionInvocarObjeto(ErroPadrao.CertificadoVencido, "(" + CertDig.dValidadeInicial.ToString() + " a " + CertDig.dValidadeFinal.ToString() + ")"); } } // Exclui o Arquivo de Erro oAux.DeletarArquivo(Empresa.Configuracoes[emp].PastaRetorno + "\\" + oAux.ExtrairNomeArq(XmlNfeDadosMsg, cFinalArqEnvio + ".xml") + cFinalArqRetorno + ".err"); // Validar o Arquivo XML string cResultadoValidacao = oAux.ValidarArqXML(XmlNfeDadosMsg); if (cResultadoValidacao != "") { throw new Exception(cResultadoValidacao); } // Montar o XML de Lote de envio de Notas fiscais docXML.Load(XmlNfeDadosMsg); } catch (Exception ex) { throw (ex); } // Definir Proxy if (ConfiguracaoApp.Proxy) { oWSProxy.SetProp(oServicoWS, "Proxy", Auxiliar.DefinirProxy()); } // Limpa a variável de retorno XmlNode XmlRetorno; //Vou mudar o timeout para evitar que demore a resposta e o uninfe aborte antes de recebe-la. Wandrey 17/09/2009 //Isso talvez evite de não conseguir o número do recibo se o serviço do SEFAZ estiver lento. oWSProxy.SetProp(oServicoWS, "Timeout", 60000); try { //Verificar antes se tem conexão com a internet, se não tiver já gera uma exceção no padrão já esperado pelo ERP if (!InternetCS.IsConnectedToInternet()) { //Registrar o erro da validação para o sistema ERP throw new ExceptionInvocarObjeto(ErroPadrao.FalhaInternet, "\r\nArquivo: " + XmlNfeDadosMsg); } //Atribuir conteúdo para uma propriedade da classe NfeStatusServico2 if (cMetodo.Substring(0, 3).ToLower() == "sce") // DPEC { oWSProxy.SetProp(oServicoWS, "sceCabecMsgValue", oCabecMsg); } else { switch (ConfiguracaoApp.TipoAplicativo) { case UniNFeLibrary.Enums.TipoAplicativo.Cte: oWSProxy.SetProp(oServicoWS, "cteCabecMsgValue", oCabecMsg); break; case UniNFeLibrary.Enums.TipoAplicativo.Nfe: oWSProxy.SetProp(oServicoWS, "nfeCabecMsgValue", oCabecMsg); break; default: break; } } try { //Invocar o membro XmlRetorno = (XmlNode)oWSProxy.InvokeXML(oServicoWS, cMetodo, new object[] { docXML }); } catch (Exception ex) { if (cMetodo.Substring(0, 3).ToLower() == "sce") //danasa 21/10/2010 { throw new ExceptionEnvioXML(ErroPadrao.FalhaEnvioXmlWSDPEC, "\r\nArquivo " + XmlNfeDadosMsg + "\r\nMessage Exception: " + ex.Message); } //Se for XML da NFe a mensagem é padronizada, caso contrário é uma mensagem geral. Wandrey 25/02/2011 if (cMetodo == "nfeRecepcaoLote2") { throw new ExceptionEnvioXML(ErroPadrao.FalhaEnvioXmlNFeWS, "\r\nArquivo " + XmlNfeDadosMsg + "\r\nMessage Exception: " + ex.Message); } else { throw new ExceptionEnvioXML(ErroPadrao.FalhaEnvioXmlWS, "\r\nArquivo " + XmlNfeDadosMsg + "\r\nMessage Exception: " + ex.Message); } } //Atualizar o atributo do serviço da Nfe com o conteúdo retornado do webservice do sefaz typeServicoNFe.InvokeMember("vStrXmlRetorno", System.Reflection.BindingFlags.SetProperty, null, oServicoNFe, new object[] { XmlRetorno.OuterXml }); // Registra o retorno de acordo com o status obtido if (cFinalArqEnvio != string.Empty && cFinalArqRetorno != string.Empty) { typeServicoNFe.InvokeMember("XmlRetorno", System.Reflection.BindingFlags.InvokeMethod, null, oServicoNFe, new Object[] { cFinalArqEnvio + ".xml", cFinalArqRetorno + ".xml" }); } } catch (ExceptionEnvioXML ex) { throw (ex); } catch (ExceptionInvocarObjeto ex) { throw (ex); } catch (Exception ex) { throw (ex); } }
/// <summary> /// Grava XML com algumas informações do aplicativo, /// dentre elas os dados do certificado digital configurado nos parâmetros, /// versão, última modificação, etc. /// </summary> /// <param name="sArquivo">Pasta e nome do arquivo XML a ser gravado com as informações</param> /// <param name="oAssembly">Passar sempre: Assembly.GetExecutingAssembly() pois ele vai pegar o Assembly do EXE ou DLL de onde está sendo chamado o método</param> /// <by>Wandrey Mundin Ferreira</by> /// <date>29/01/2009</date> public void GravarXMLInformacoes(string sArquivo) { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; string cStat = "1"; string xMotivo = "Consulta efetuada com sucesso"; //Ler os dados do certificado digital string sSubject = ""; string sValIni = ""; string sValFin = ""; CertificadoDigital oDigCert = new CertificadoDigital(); oDigCert.PrepInfCertificado(Empresa.Configuracoes[emp].X509Certificado); if (oDigCert.lLocalizouCertificado == true) { sSubject = oDigCert.sSubject; sValIni = oDigCert.dValidadeInicial.ToString(); sValFin = oDigCert.dValidadeFinal.ToString(); } else { cStat = "2"; xMotivo = "Certificado digital não foi localizado"; } //Gravar o XML com as informações do aplicativo try { if (Path.GetExtension(sArquivo).ToLower() == ".txt") { StringBuilder aTXT = new StringBuilder(); aTXT.AppendLine("cStat|" + cStat); aTXT.AppendLine("xMotivo|" + xMotivo); //Dados do certificado digital aTXT.AppendLine("sSubject|" + sSubject); aTXT.AppendLine("dValIni|" + sValIni); aTXT.AppendLine("dValFin|" + sValFin); //Dados gerais do Aplicativo aTXT.AppendLine("versao|" + InfoApp.Versao()); aTXT.AppendLine("dUltModif|" + File.GetLastWriteTimeUtc(Application.ExecutablePath).ToString("dd/MM/yyyy hh:mm:ss")); aTXT.AppendLine("PastaExecutavel|" + InfoApp.PastaExecutavel()); aTXT.AppendLine("NomeComputador|" + Environment.MachineName); //Dados das configurações do aplicativo aTXT.AppendLine("PastaBackup|" + (string.IsNullOrEmpty(Empresa.Configuracoes[emp].PastaBackup) ? "" : Empresa.Configuracoes[emp].PastaBackup)); aTXT.AppendLine("PastaXmlEmLote|" + (string.IsNullOrEmpty(Empresa.Configuracoes[emp].PastaEnvioEmLote) ? "" : Empresa.Configuracoes[emp].PastaEnvioEmLote)); aTXT.AppendLine("PastaXmlAssinado|" + (string.IsNullOrEmpty(InfoApp.NomePastaXMLAssinado) ? "" : InfoApp.NomePastaXMLAssinado)); aTXT.AppendLine("PastaValidar|" + (string.IsNullOrEmpty(Empresa.Configuracoes[emp].PastaValidar) ? "" : Empresa.Configuracoes[emp].PastaValidar)); aTXT.AppendLine("PastaXmlEnviado|" + (string.IsNullOrEmpty(Empresa.Configuracoes[emp].PastaEnviado) ? "" : Empresa.Configuracoes[emp].PastaEnviado)); aTXT.AppendLine("PastaXmlEnvio|" + (string.IsNullOrEmpty(Empresa.Configuracoes[emp].PastaEnvio) ? "" : Empresa.Configuracoes[emp].PastaEnvio)); aTXT.AppendLine("PastaXmlErro|" + (string.IsNullOrEmpty(Empresa.Configuracoes[emp].PastaErro) ? "" : Empresa.Configuracoes[emp].PastaErro)); aTXT.AppendLine("PastaXmlRetorno|" + (string.IsNullOrEmpty(Empresa.Configuracoes[emp].PastaRetorno) ? "" : Empresa.Configuracoes[emp].PastaRetorno)); aTXT.AppendLine("DiasParaLimpeza|" + Empresa.Configuracoes[emp].DiasLimpeza.ToString()); aTXT.AppendLine("DiretorioSalvarComo|" + Empresa.Configuracoes[emp].DiretorioSalvarComo.ToString()); aTXT.AppendLine("GravarRetornoTXTNFe|" + Empresa.Configuracoes[emp].GravarRetornoTXTNFe.ToString()); aTXT.AppendLine("AmbienteCodigo|" + Empresa.Configuracoes[emp].tpAmb.ToString()); aTXT.AppendLine("tpEmis|" + Empresa.Configuracoes[emp].tpEmis.ToString()); aTXT.AppendLine("UnidadeFederativaCodigo|" + Empresa.Configuracoes[emp].UFCod.ToString()); File.WriteAllText(sArquivo, aTXT.ToString(), Encoding.Default); } else { XmlWriterSettings oSettings = new XmlWriterSettings(); UTF8Encoding c = new UTF8Encoding(false); //Para começar, vamos criar um XmlWriterSettings para configurar nosso XML oSettings.Encoding = c; oSettings.Indent = true; oSettings.IndentChars = ""; oSettings.NewLineOnAttributes = false; oSettings.OmitXmlDeclaration = false; //Agora vamos criar um XML Writer XmlWriter oXmlGravar = XmlWriter.Create(sArquivo, oSettings); //Abrir o XML oXmlGravar.WriteStartDocument(); oXmlGravar.WriteStartElement("retConsInf"); oXmlGravar.WriteElementString("cStat", cStat); oXmlGravar.WriteElementString("xMotivo", xMotivo); //Dados do certificado digital oXmlGravar.WriteStartElement("DadosCertificado"); oXmlGravar.WriteElementString("sSubject", sSubject); oXmlGravar.WriteElementString("dValIni", sValIni); oXmlGravar.WriteElementString("dValFin", sValFin); oXmlGravar.WriteEndElement(); //DadosCertificado //Dados gerais do Aplicativo oXmlGravar.WriteStartElement("DadosUniNfe"); oXmlGravar.WriteElementString("versao", InfoApp.Versao()); oXmlGravar.WriteElementString("dUltModif", File.GetLastWriteTimeUtc(Application.ExecutablePath).ToString("dd/MM/yyyy hh:mm:ss")); oXmlGravar.WriteElementString("PastaExecutavel", InfoApp.PastaExecutavel()); oXmlGravar.WriteElementString("NomeComputador", Environment.MachineName); oXmlGravar.WriteEndElement(); //DadosUniNfe //Dados das configurações do aplicativo oXmlGravar.WriteStartElement("nfe_configuracoes"); oXmlGravar.WriteElementString("PastaBackup", (string.IsNullOrEmpty(Empresa.Configuracoes[emp].PastaBackup) ? "" : Empresa.Configuracoes[emp].PastaBackup)); oXmlGravar.WriteElementString("PastaXmlEmLote", (string.IsNullOrEmpty(Empresa.Configuracoes[emp].PastaEnvioEmLote) ? "" : Empresa.Configuracoes[emp].PastaEnvioEmLote)); oXmlGravar.WriteElementString("PastaXmlAssinado", (string.IsNullOrEmpty(InfoApp.NomePastaXMLAssinado) ? "" : InfoApp.NomePastaXMLAssinado)); oXmlGravar.WriteElementString("PastaValidar", (string.IsNullOrEmpty(Empresa.Configuracoes[emp].PastaValidar) ? "" : Empresa.Configuracoes[emp].PastaValidar)); oXmlGravar.WriteElementString("PastaXmlEnviado", (string.IsNullOrEmpty(Empresa.Configuracoes[emp].PastaEnviado) ? "" : Empresa.Configuracoes[emp].PastaEnviado)); oXmlGravar.WriteElementString("PastaXmlEnvio", (string.IsNullOrEmpty(Empresa.Configuracoes[emp].PastaEnvio) ? "" : Empresa.Configuracoes[emp].PastaEnvio)); oXmlGravar.WriteElementString("PastaXmlErro", (string.IsNullOrEmpty(Empresa.Configuracoes[emp].PastaErro) ? "" : Empresa.Configuracoes[emp].PastaErro)); oXmlGravar.WriteElementString("PastaXmlRetorno", (string.IsNullOrEmpty(Empresa.Configuracoes[emp].PastaRetorno) ? "" : Empresa.Configuracoes[emp].PastaRetorno)); oXmlGravar.WriteElementString("DiasParaLimpeza", Empresa.Configuracoes[emp].DiasLimpeza.ToString()); oXmlGravar.WriteElementString("DiretorioSalvarComo", Empresa.Configuracoes[emp].DiretorioSalvarComo.ToString()); oXmlGravar.WriteElementString("GravarRetornoTXTNFe", Empresa.Configuracoes[emp].GravarRetornoTXTNFe.ToString()); oXmlGravar.WriteElementString("AmbienteCodigo", Empresa.Configuracoes[emp].tpAmb.ToString()); oXmlGravar.WriteElementString("tpEmis", Empresa.Configuracoes[emp].tpEmis.ToString()); oXmlGravar.WriteElementString("UnidadeFederativaCodigo", Empresa.Configuracoes[emp].UFCod.ToString()); oXmlGravar.WriteEndElement(); //nfe_configuracoes //Finalizar o XML oXmlGravar.WriteEndElement(); //retConsInf oXmlGravar.WriteEndDocument(); oXmlGravar.Flush(); oXmlGravar.Close(); } } catch (Exception ex) { /// /// danasa 8-2009 /// Auxiliar oAux = new Auxiliar(); oAux.GravarArqErroERP(Path.GetFileNameWithoutExtension(sArquivo) + ".err", ex.Message); } }
/// <summary> /// Metodo responsável por invocar o serviço do WebService do SEFAZ - NFe Versão 1.10 /// </summary> /// <param name="oWSProxy">Objeto da classe construida do WSDL</param> /// <param name="oServicoWS">Objeto da classe de envio do XML</param> /// <param name="cMetodo">Método da classe de envio do XML que faz o envio</param> /// <param name="oCabecMsg">Objeto da classe de cabecalho do serviço</param> /// <param name="oServicoNFe">Objeto do Serviço de envio da NFE do UniNFe</param> /// <param name="cFinalArqEnvio">string do final do arquivo a ser enviado. Sem a extensão ".xml"</param> /// <param name="cFinalArqRetorno">string do final do arquivo a ser gravado com o conteúdo do retorno. Sem a extensão ".xml"</param> /// <remarks> /// Autor: Wandrey Mundin Ferreira /// Data: 17/03/2010 /// </remarks> public void Invocar(WebServiceProxy oWSProxy, object oServicoWS, string cMetodo, object oServicoNFe, string cFinalArqEnvio, string cFinalArqRetorno) { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; // Definir o tipo de serviço da NFe Type typeServicoNFe = oServicoNFe.GetType(); // Resgatar o nome do arquivo XML a ser enviado para o webservice string XmlNfeDadosMsg = (string)(typeServicoNFe.InvokeMember("vXmlNfeDadosMsg", System.Reflection.BindingFlags.GetProperty, null, oServicoNFe, null)); try { //Verificar se o certificado digital está vencido, se tiver vai forçar uma exceção CertificadoDigital CertDig = new CertificadoDigital(); CertDig.PrepInfCertificado(Empresa.Configuracoes[emp].X509Certificado); if (CertDig.lLocalizouCertificado == true) { if (DateTime.Compare(DateTime.Now, CertDig.dValidadeFinal) > 0) { throw new ExceptionInvocarObjeto(ErroPadrao.CertificadoVencido, "(" + CertDig.dValidadeInicial.ToString() + " a " + CertDig.dValidadeFinal.ToString() + ")"); } } // Exclui o Arquivo de Erro oAux.DeletarArquivo(Empresa.Configuracoes[emp].PastaRetorno + "\\" + oAux.ExtrairNomeArq(XmlNfeDadosMsg, cFinalArqEnvio + ".xml") + cFinalArqRetorno + ".err"); // Validar o Arquivo XML //string cResultadoValidacao = oAux.ValidarArqXML(XmlNfeDadosMsg); //if (cResultadoValidacao != "") //{ // throw new Exception(cResultadoValidacao); //} } catch (Exception ex) { throw (ex); } // Definir Proxy if (ConfiguracaoApp.Proxy) { oWSProxy.SetProp(oServicoWS, "Proxy", Auxiliar.DefinirProxy()); } // Limpa a variável de retorno string XmlRetorno; //Vou mudar o timeout para evitar que demore a resposta e o uninfe aborte antes de recebe-la. Wandrey 17/09/2009 //Isso talvez evite de não conseguir o número do recibo se o serviço do SEFAZ estiver lento. oWSProxy.SetProp(oServicoWS, "Timeout", 60000); try { //Verificar antes se tem conexão com a internet, se não tiver já gera uma exceção no padrão já esperado pelo ERP if (!InternetCS.IsConnectedToInternet()) { //Registrar o erro da validação para o sistema ERP throw new ExceptionInvocarObjeto(ErroPadrao.FalhaInternet, "\r\nArquivo: " + XmlNfeDadosMsg); } string CabecMsg = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><cabecMsg xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\"1.02\"><versaoDados>1.07</versaoDados></cabecMsg>"; string NFeDadosMsg = oAux.XmlToString(XmlNfeDadosMsg); try { //Invocar o membro XmlRetorno = (string)oWSProxy.InvokeStr(oServicoWS, cMetodo, new object[] { CabecMsg, NFeDadosMsg }); } catch (Exception ex) { throw new ExceptionEnvioXML(ErroPadrao.FalhaEnvioXmlWS, "\r\nArquivo " + XmlNfeDadosMsg + "\r\nMessage Exception: " + ex.Message); } //Atualizar o atributo do serviço da Nfe com o conteúdo retornado do webservice do sefaz typeServicoNFe.InvokeMember("vStrXmlRetorno", System.Reflection.BindingFlags.SetProperty, null, oServicoNFe, new object[] { XmlRetorno }); // Registra o retorno de acordo com o status obtido if (cFinalArqEnvio != string.Empty && cFinalArqRetorno != string.Empty) { typeServicoNFe.InvokeMember("XmlRetorno", System.Reflection.BindingFlags.InvokeMethod, null, oServicoNFe, new Object[] { cFinalArqEnvio + ".xml", cFinalArqRetorno + ".xml" }); } } catch (ExceptionEnvioXML ex) { throw (ex); } catch (ExceptionInvocarObjeto ex) { throw (ex); } catch (Exception ex) { throw (ex); } }