public void CertificadosInstalados(string arquivo) { bool lConsultar = false; bool lErro = false; string arqRet = "uninfe-ret-cons-certificado.xml"; string tmp_arqRet = Path.Combine(Propriedade.PastaGeralTemporaria, arqRet); string cStat = ""; string xMotivo = ""; try { XmlDocument doc = new XmlDocument(); doc.Load(arquivo); foreach (XmlElement item in doc.DocumentElement) { lConsultar = doc.DocumentElement.GetElementsByTagName("xServ")[0].InnerText.Equals("CONS-CERTIFICADO", StringComparison.InvariantCultureIgnoreCase); } if (lConsultar) { X509Store store = new X509Store("MY", StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates; X509Certificate2Collection collection1 = (X509Certificate2Collection)collection.Find(X509FindType.FindByTimeValid, DateTime.Now, false); X509Certificate2Collection collection2 = (X509Certificate2Collection)collection.Find(X509FindType.FindByKeyUsage, X509KeyUsageFlags.DigitalSignature, false); #region Cria XML de retorno if (File.Exists(tmp_arqRet)) File.Delete(tmp_arqRet); XmlDocument RetCertificados = new XmlDocument(); XmlNode raiz = RetCertificados.CreateElement("Certificados"); RetCertificados.AppendChild(raiz); RetCertificados.Save(tmp_arqRet); #endregion #region Monta XML de Retorno com dados do Certificados Instalados for (int i = 0; i < collection2.Count; i++) { #region layout retorno /*layout de retorno - Renan Borges <Certificados> <ThumbPrint ID="999..."> <Subject>XX...</Subject> <ValidadeInicial>dd/dd/dddd</ValidadeInicial> <ValidadeFinal>dd/dd/dddd</ValidadeFinal> <A3>true</A3> </Certificados> */ #endregion X509Certificate2 _X509Cert = collection2[i]; XmlDocument docGerar = new XmlDocument(); docGerar.Load(tmp_arqRet); XmlNode Registro = docGerar.CreateElement("ThumbPrint"); XmlAttribute IdThumbPrint = docGerar.CreateAttribute(NFe.Components.TpcnResources.ID.ToString()); IdThumbPrint.Value = _X509Cert.Thumbprint.ToString(); Registro.Attributes.Append(IdThumbPrint); XmlNode Subject = docGerar.CreateElement("Subject"); XmlNode ValidadeInicial = docGerar.CreateElement("ValidadeInicial"); XmlNode ValidadeFinal = docGerar.CreateElement("ValidadeFinal"); XmlNode A3 = docGerar.CreateElement("A3"); Subject.InnerText = _X509Cert.Subject.ToString(); ValidadeInicial.InnerText = _X509Cert.NotBefore.ToShortDateString(); ValidadeFinal.InnerText = _X509Cert.NotAfter.ToShortDateString(); A3.InnerText = _X509Cert.IsA3().ToString().ToLower(); docGerar.SelectSingleNode("Certificados").AppendChild(Registro); Registro.AppendChild(Subject); Registro.AppendChild(ValidadeInicial); Registro.AppendChild(ValidadeFinal); Registro.AppendChild(A3); docGerar.Save(tmp_arqRet); } #endregion } } catch { cStat = "2"; xMotivo = "Nao foi possivel fazer a consulta de Certificados Instalados na estação " + Propriedade.NomeAplicacao; lErro = true; File.Delete(tmp_arqRet); } finally { string cArqRetorno = Propriedade.PastaGeralRetorno + "\\" + arqRet; #region XML de Retorno para ERP try { FileInfo oArqRetorno = new FileInfo(cArqRetorno); if (oArqRetorno.Exists == true) { oArqRetorno.Delete(); } if (!lConsultar && !lErro) { cStat = "2"; xMotivo = "Nao foi possivel fazer a consulta de Certificados Instalados na estação (xServ não identificado) no " + Propriedade.NomeAplicacao; } if (lErro || !lConsultar) { File.Delete(tmp_arqRet); var xml = new XDocument(new XDeclaration("1.0", "utf-8", null), new XElement("retCadConfUniNFe", new XElement(NFe.Components.TpcnResources.cStat.ToString(), cStat), new XElement(NFe.Components.TpcnResources.xMotivo.ToString(), xMotivo))); xml.Save(cArqRetorno); } else { if (File.Exists(cArqRetorno)) File.Delete(cArqRetorno); if (File.Exists(arquivo)) File.Delete(arquivo); File.Move(tmp_arqRet, Propriedade.PastaGeralRetorno + "\\" + arqRet); } } catch (Exception ex) { //Ocorreu erro na hora de gerar o arquivo de erro para o ERP Auxiliar oAux = new Auxiliar(); oAux.GravarArqErroERP(Path.GetFileNameWithoutExtension(cArqRetorno) + ".err", xMotivo + Environment.NewLine + ex.Message); } #endregion } }
public ConverterTXT(string arquivo) { Auxiliar oAux = new Auxiliar(); NFe.ConvertTxt.ConversaoTXT oUniTxtToXml = new NFe.ConvertTxt.ConversaoTXT(); string pasta = new FileInfo(arquivo).DirectoryName; pasta = pasta.Substring(0, pasta.Length - 5); //Retirar a pasta \Temp do final - Wandrey 03/08/2011 string ccMessage = string.Empty; string ccExtension = "-nfe.err"; try { int emp = Empresas.FindEmpresaByThread(); /// /// exclui o arquivo de erro /// Functions.DeletarArquivo(Empresas.Configuracoes[emp].PastaXmlRetorno + "\\" + Path.GetFileName(Functions.ExtrairNomeArq(arquivo, Propriedade.ExtEnvio.Nfe_TXT) + ccExtension)); Functions.DeletarArquivo(Empresas.Configuracoes[emp].PastaXmlRetorno + "\\" + Path.GetFileName(Functions.ExtrairNomeArq(arquivo, Propriedade.ExtEnvio.Nfe_TXT) + "-nfe-ret.xml")); Functions.DeletarArquivo(Empresas.Configuracoes[emp].PastaXmlErro + "\\" + Path.GetFileName(arquivo)); /// /// exclui o arquivo TXT original /// Functions.DeletarArquivo(Empresas.Configuracoes[emp].PastaXmlRetorno + "\\" + Path.GetFileNameWithoutExtension(arquivo) + "-orig.txt"); /// /// processa a conversão /// oUniTxtToXml.Converter(arquivo, pasta);//Empresas.Configuracoes[emp].PastaRetorno); //Deu tudo certo com a conversão? if (string.IsNullOrEmpty(oUniTxtToXml.cMensagemErro)) { /// /// danasa 8-2009 /// if (oUniTxtToXml.cRetorno.Count == 0) { ccMessage = "cStat=02\r\n" + "xMotivo=Falha na conversão. Sem informações para converter o arquivo texto"; oAux.MoveArqErro(arquivo, ".txt"); } else { // // salva o arquivo texto original // if (pasta.ToLower().Equals(Empresas.Configuracoes[emp].PastaXmlEnvio.ToLower()) || pasta.ToLower().Equals(Empresas.Configuracoes[emp].PastaValidar.ToLower())) { FileInfo ArqOrig = new FileInfo(arquivo); string vvNomeArquivoDestino = Empresas.Configuracoes[emp].PastaXmlRetorno + "\\" + Path.GetFileNameWithoutExtension(arquivo) + "-orig.txt"; ArqOrig.MoveTo(vvNomeArquivoDestino); } ccExtension = "-nfe.txt"; ccMessage = "cStat=01\r\n" + "xMotivo=Convertido com sucesso. Foi(ram) convertida(s) " + oUniTxtToXml.cRetorno.Count.ToString() + " nota(s) fiscal(is)"; foreach (NFe.ConvertTxt.txtTOxmlClassRetorno txtClass in oUniTxtToXml.cRetorno) { /// /// monta o texto que será gravado no arquivo de aviso ao ERP /// ccMessage += Environment.NewLine + "Nota fiscal: " + txtClass.NotaFiscal.ToString("000000000") + " Série: " + txtClass.Serie.ToString("000") + " - ChaveNFe: " + txtClass.ChaveNFe; // move o arquivo XML criado na pasta Envio\Convertidos para a pasta Envio // ou // move o arquivo XML criado na pasta Validar\Convertidos para a pasta Validar string nomeArquivoDestino = Path.Combine(pasta, Path.GetFileName(txtClass.XMLFileName)); Functions.Move(txtClass.XMLFileName, nomeArquivoDestino); Functions.DeletarArquivo(Empresas.Configuracoes[emp].PastaXmlErro + "\\" + txtClass.ChaveNFe + Propriedade.ExtEnvio.Nfe); } } } else { /// /// danasa 8-2009 /// ccMessage = "cStat=99\r\n" + "xMotivo=Falha na conversão\r\n" + "MensagemErro=" + oUniTxtToXml.cMensagemErro; } } catch (Exception ex) { ccMessage = ex.Message; ccExtension = "-nfe.err"; } if (!string.IsNullOrEmpty(ccMessage)) { oAux.MoveArqErro(arquivo, ".txt"); if (ccMessage.StartsWith("cStat=02") || ccMessage.StartsWith("cStat=99")) { /// /// exclui todos os XML gerados na pasta Envio\convertidos somente se houve erro na conversão /// foreach (NFe.ConvertTxt.txtTOxmlClassRetorno txtClass in oUniTxtToXml.cRetorno) { Functions.DeletarArquivo(pasta + "\\convertidos\\" + Path.GetFileName(txtClass.XMLFileName)); } } /// /// danasa 8-2009 /// /// Gravar o retorno para o ERP em formato TXT com o erro ocorrido /// oAux.GravarArqErroERP(Functions.ExtrairNomeArq(arquivo, Propriedade.ExtEnvio.Nfe_TXT) + ccExtension, ccMessage); } }
/// <summary> /// Método responsável por reconfigurar automaticamente o UniNFe a partir de um XML com as /// informações necessárias. /// O Método grava um arquivo na pasta de retorno do UniNFe com a informação se foi bem /// sucedida a reconfiguração ou não. /// </summary> /// <param name="cArquivoXml">Nome e pasta do arquivo de configurações gerado pelo ERP para atualização das configurações do uninfe</param> public void ReconfigurarUniNFe(string cArquivoXml) { int emp = Empresas.FindEmpresaByThread(); string cStat = ""; string xMotivo = ""; bool lErro = false; bool lEncontrouTag = false; try { /// /// inclui o processo de inclusao de empresa pelo 'txt' emp = CadastrarEmpresa(cArquivoXml, emp); if (Path.GetExtension(cArquivoXml).ToLower() == ".txt") { #region Formato TXT List<string> cLinhas = Functions.LerArquivo(cArquivoXml); lEncontrouTag = Functions.PopulateClasse(Empresas.Configuracoes[emp], cLinhas); foreach (string texto in cLinhas) { string[] dados = texto.Split('|'); int nElementos = dados.GetLength(0); if (nElementos <= 1) continue; switch (dados[0].ToLower()) { case "proxy": //Se a tag <Proxy> existir ele pega o novo conteúdo ConfiguracaoApp.Proxy = (nElementos == 2 ? Convert.ToBoolean(dados[1].Trim()) : false); lEncontrouTag = true; break; case "proxyservidor": //Se a tag <ProxyServidor> existir ele pega o novo conteúdo ConfiguracaoApp.ProxyServidor = (nElementos == 2 ? dados[1].Trim() : ""); lEncontrouTag = true; break; case "proxyusuario": //Se a tag <ProxyUsuario> existir ele pega o novo conteúdo ConfiguracaoApp.ProxyUsuario = (nElementos == 2 ? dados[1].Trim() : ""); lEncontrouTag = true; break; case "proxysenha": //Se a tag <ProxySenha> existir ele pega o novo conteúdo ConfiguracaoApp.ProxySenha = (nElementos == 2 ? dados[1].Trim() : ""); lEncontrouTag = true; break; case "proxyporta": //Se a tag <ProxyPorta> existir ele pega o novo conteúdo ConfiguracaoApp.ProxyPorta = (nElementos == 2 ? Convert.ToInt32("0" + dados[1].Trim()) : 0); lEncontrouTag = true; break; case "checarconexaointernet": //Se a tag <ChecarConexaoInternet> existir ele pega o novo conteúdo ConfiguracaoApp.ChecarConexaoInternet = (nElementos == 2 ? Convert.ToBoolean(dados[1].Trim()) : true); lEncontrouTag = true; break; case "gravarlogoperacaorealizada": ConfiguracaoApp.GravarLogOperacoesRealizadas = (nElementos == 2 ? Convert.ToBoolean(dados[1].Trim()) : true); lEncontrouTag = true; break; case "senhaconfig": //Se a tag <senhaconfig> existir ele pega o novo conteúdo ConfiguracaoApp.SenhaConfig = (nElementos == 2 ? dados[1].Trim() : ""); ConfiguracaoApp.mSenhaConfigAlterada = false; lEncontrouTag = true; break; } } #endregion } else { #region Formato XML XmlDocument doc = new XmlDocument(); doc.Load(cArquivoXml); XmlNodeList ConfUniNfeList = doc.GetElementsByTagName("altConfUniNFe"); foreach (XmlNode ConfUniNfeNode in ConfUniNfeList) { XmlElement ConfUniNfeElemento = (XmlElement)ConfUniNfeNode; lEncontrouTag = Functions.PopulateClasse(Empresas.Configuracoes[emp], ConfUniNfeElemento); //Se a tag <Proxy> existir ele pega o novo conteúdo if (ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.Proxy.ToString()).Count != 0) { ConfiguracaoApp.Proxy = Convert.ToBoolean(ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.Proxy.ToString())[0].InnerText); lEncontrouTag = true; } //Se a tag <ProxyServidor> existir ele pega o novo conteúdo if (ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.ProxyServidor.ToString()).Count != 0) { ConfiguracaoApp.ProxyServidor = ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.ProxyServidor.ToString())[0].InnerText; lEncontrouTag = true; } //Se a tag <ProxyUsuario> existir ele pega o novo conteúdo if (ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.ProxyUsuario.ToString()).Count != 0) { ConfiguracaoApp.ProxyUsuario = ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.ProxyUsuario.ToString())[0].InnerText; lEncontrouTag = true; } //Se a tag <ProxySenha> existir ele pega o novo conteúdo if (ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.ProxySenha.ToString()).Count != 0) { ConfiguracaoApp.ProxySenha = ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.ProxySenha.ToString())[0].InnerText; lEncontrouTag = true; } //Se a tag <ProxyPorta> existir ele pega o novo conteúdo if (ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.ProxyPorta.ToString()).Count != 0) { ConfiguracaoApp.ProxyPorta = Convert.ToInt32("0" + ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.ProxyPorta.ToString())[0].InnerText); lEncontrouTag = true; } //Se a tag <ChecarConexaoInternet> existir ele pega o novo conteúdo if (ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.ChecarConexaoInternet.ToString()).Count != 0) { ConfiguracaoApp.ChecarConexaoInternet = Convert.ToBoolean(ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.ChecarConexaoInternet.ToString())[0].InnerText); lEncontrouTag = true; } if (ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.GravarLogOperacaoRealizada.ToString()).Count != 0) { ConfiguracaoApp.GravarLogOperacoesRealizadas = Convert.ToBoolean(ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.GravarLogOperacaoRealizada.ToString())[0].InnerText); lEncontrouTag = true; } //Se a tag <SenhaConfig> existir ele pega no novo conteúdo if (ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.SenhaConfig.ToString()).Count != 0) { ConfiguracaoApp.SenhaConfig = ConfUniNfeElemento.GetElementsByTagName(NfeConfiguracoes.SenhaConfig.ToString())[0].InnerText; ConfiguracaoApp.mSenhaConfigAlterada = false; lEncontrouTag = true; } } #endregion } if (lEncontrouTag) { if (ConfiguracaoApp.Proxy && (ConfiguracaoApp.ProxyPorta == 0 || string.IsNullOrEmpty(ConfiguracaoApp.ProxyServidor) || string.IsNullOrEmpty(ConfiguracaoApp.ProxyUsuario) || string.IsNullOrEmpty(ConfiguracaoApp.ProxySenha))) { throw new Exception(NFeStrConstants.proxyError); } Empresas.Configuracoes[emp].RemoveEndSlash(); Empresas.CriarPasta(); /// /// salva a configuracao da empresa /// //Na reconfiguração enviada pelo ERP, não vou validar o certificado, vou deixar gravar mesmo que o certificado esteja com problema. Wandrey 05/10/2012 Empresas.Configuracoes[emp].SalvarConfiguracao(false, true); /// salva o arquivo da lista de empresas this.GravarArqEmpresas(); /// salva as configuracoes gerais this.GravarConfigGeral(); cStat = "1"; xMotivo = "Configuração do " + Propriedade.NomeAplicacao + " alterada com sucesso"; lErro = false; } else { cStat = "2"; xMotivo = "Ocorreu uma falha ao tentar alterar a configuracao do " + Propriedade.NomeAplicacao + ": Nenhuma tag padrão de configuração foi localizada no XML"; lErro = true; } } catch (Exception ex) { cStat = "2"; xMotivo = "Ocorreu uma falha ao tentar alterar a configuracao do " + Propriedade.NomeAplicacao + ": " + ex.Message; lErro = true; } //Se deu algum erro tenho que voltar as configurações como eram antes, ou seja //exatamente como estavam gravadas no XML de configuração if (lErro) { ConfiguracaoApp.CarregarDados(); ConfiguracaoApp.CarregarDadosSobre(); Empresas.CarregaConfiguracao(); #region Ticket: #110 Empresas.CreateLockFile(true); #endregion } //Gravar o XML de retorno com a informação do sucesso ou não na reconfiguração FileInfo arqInfo = new FileInfo(cArquivoXml); string pastaRetorno = string.Empty; if (arqInfo.DirectoryName.ToLower().Trim() == Propriedade.PastaGeralTemporaria.ToLower().Trim()) { pastaRetorno = Propriedade.PastaGeralRetorno; } else { pastaRetorno = Empresas.Configuracoes[emp].PastaXmlRetorno; } string nomeArqRetorno; if (Path.GetExtension(cArquivoXml).ToLower() == ".txt") nomeArqRetorno = Functions.ExtrairNomeArq(cArquivoXml, Propriedade.ExtEnvio.AltCon_TXT) + "-ret-alt-con.txt"; else nomeArqRetorno = Functions.ExtrairNomeArq(cArquivoXml, Propriedade.ExtEnvio.AltCon_XML) + "-ret-alt-con.xml"; string cArqRetorno = pastaRetorno + "\\" + nomeArqRetorno; try { FileInfo oArqRetorno = new FileInfo(cArqRetorno); if (oArqRetorno.Exists == true) { oArqRetorno.Delete(); } if (Path.GetExtension(cArquivoXml).ToLower() == ".txt") { File.WriteAllText(cArqRetorno, "cStat|" + cStat + "\r\nxMotivo|" + xMotivo + "\r\n", Encoding.Default); } else { var xml = new XDocument(new XDeclaration("1.0", "utf-8", null), new XElement("retAltConfUniNFe", new XElement(NFe.Components.TpcnResources.cStat.ToString(), cStat), new XElement(NFe.Components.TpcnResources.xMotivo.ToString(), xMotivo))); xml.Save(cArqRetorno); } } catch (Exception ex) { //Ocorreu erro na hora de gerar o arquivo de erro para o ERP /// /// danasa 8-2009 /// Auxiliar oAux = new Auxiliar(); oAux.GravarArqErroERP(Path.GetFileNameWithoutExtension(cArqRetorno) + ".err", xMotivo + Environment.NewLine + ex.Message); } try { //Deletar o arquivo de configurações automáticas gerado pelo ERP FileInfo oArqReconf = new FileInfo(cArquivoXml); oArqReconf.Delete(); } catch { //Não vou fazer nada, so trato a exceção para evitar fechar o aplicativo. Wandrey 09/03/2010 } }
/// <summary> /// Exporta os WSDLs e Schemas da DLL para as pastas do UniNFe /// </summary> public void load() { if (Empresas.Configuracoes.Count == 0) { /// /// OPS!!! nenhuma empresa ainda cadastrada, então gravamos o log na pasta de log do uninfe ConfiguracaoApp.GravarLogOperacoesRealizadas = true; } Propriedade.Estados = null; List<ArquivoItem> ListArqsAtualizar = new List<ArquivoItem>(); UpdateWSDL(ListArqsAtualizar); bool gravaLista = false; try { System.Reflection.Assembly ass = System.Reflection.Assembly.LoadFrom(Propriedade.PastaExecutavel + "\\NFe.Components.Wsdl.dll"); string[] x = ass.GetManifestResourceNames(); if (x.GetLength(0) > 0) { string fileoutput = null; List<string> okFiles = new List<string>(); string prefix = ""; /// /// se o Uninfe estiver sendo executado como embedded da aplicacao /// switch (NFe.Components.Propriedade.TipoAplicativo) { case TipoAplicativo.Nfe: case TipoAplicativo.NFCe: prefix = "NFe"; break; case TipoAplicativo.MDFe: prefix = "MDFe"; break; case TipoAplicativo.Cte: prefix = "CTe"; break; } if (prefix != "") { fileoutput = Path.GetTempFileName(); ExtractResourceToDisk(ass, "NFe.Components.Wsdl.NFe.WSDL.Webservice.xml", fileoutput); /// /// le apenas os wsdl's definidos para o tipo de aplicativo /// var xxa = new XmlDocument(); xxa.Load(fileoutput); foreach (var a1 in xxa.GetElementsByTagName("Estado")) foreach (var tag in new string[] { "LocalHomologacao", "LocalProducao" }) foreach (var a2 in (a1 as XmlElement).GetElementsByTagName(tag)) if (a2 is XmlElement) for (int c = 0; c < (a2 as XmlElement).ChildNodes.Count; ++c) if ((a2 as XmlElement).ChildNodes[c] is XmlElement) { string ln = (a2 as XmlElement).ChildNodes[c].Name; if (ln.StartsWith(prefix) || (prefix.Equals("NFe") && ln.StartsWith("DFe"))) { if ((a2 as XmlElement).ChildNodes[c].InnerText != "") { ln = (a2 as XmlElement).ChildNodes[c].InnerText.ToLower().Replace("\\", "."); if (!okFiles.Contains(ln)) okFiles.Add(ln); if (!okFiles.Contains(ln.Replace(".wsdl", "_200.wsdl"))) okFiles.Add(ln.Replace(".wsdl", "_200.wsdl")); /// /// adiciona a lista os wsdl's de NFCe /// if (!okFiles.Contains(ln.Replace(".wsdl", "_c.wsdl"))) okFiles.Add(ln.Replace(".wsdl", "_c.wsdl")); } } } File.Delete(fileoutput); } var afiles = (from d in x where d.StartsWith("NFe.Components.Wsdl.NF" + (Propriedade.TipoAplicativo == TipoAplicativo.Nfse ? "se" : "")) select d); foreach (string s in afiles) { fileoutput = s.Replace("NFe.Components.Wsdl.", NFe.Components.Propriedade.PastaExecutavel + "\\"); if (fileoutput == null) continue; if (fileoutput.ToLower().EndsWith(".xsd")) { /// Ex: NFe.Components.Wsdl.NFe.NFe.xmldsig-core-schema_v1.01.xsd /// /// pesquisa pelo nome do XSD int plast = fileoutput.ToLower().LastIndexOf("_v"); if (plast == -1) plast = fileoutput.IndexOf(".xsd") - 1; while (fileoutput[plast] != '.' && plast >= 0) --plast; string fn = fileoutput.Substring(plast + 1); fileoutput = fileoutput.Substring(0, plast).Replace(".", "\\") + "\\" + fn; } else { fileoutput = (fileoutput.Substring(0, fileoutput.LastIndexOf('.')) + "#" + fileoutput.Substring(fileoutput.LastIndexOf('.') + 1)).Replace(".", "\\").Replace("#", "."); } if (NFe.Components.Propriedade.TipoAplicativo != TipoAplicativo.Todos) { if (NFe.Components.Propriedade.TipoAplicativo == TipoAplicativo.Nfse) { if (!s.ToLower().Contains(".nfse.")) continue; } else { if (s.ToLower().Contains(".nfse.")) continue; if (s.ToLower().EndsWith(".wsdl") && okFiles.Count > 0) { if (!okFiles.Contains(s.Replace("NFe.Components.Wsdl.NFe.", "").ToLower()) && !okFiles.Contains(s.Replace("NFe.Components.Wsdl.NFse.", "").ToLower())) { continue; } } if (s.ToLower().EndsWith(".xsd")) { if (NFe.Components.Propriedade.TipoAplicativo == TipoAplicativo.Cte || NFe.Components.Propriedade.TipoAplicativo == TipoAplicativo.MDFe) { if (!s.ToLower().Contains(".schemas." + prefix.ToLower() + ".")) continue; } if (NFe.Components.Propriedade.TipoAplicativo == TipoAplicativo.NFCe || NFe.Components.Propriedade.TipoAplicativo == TipoAplicativo.Nfe) { if (s.ToLower().Contains(".schemas.cte.") || s.ToLower().Contains(".schemas.mdfe.")) continue; } } } } FileInfo fi = new FileInfo(fileoutput); ArquivoItem item = null; if (fi.Exists) //danasa 9-2013 if (ListArqsAtualizar.Count > 0) { item = ListArqsAtualizar.FirstOrDefault(f => f.Arquivo.ToLower() == fi.Name.ToLower()); } // A comparação é feita (fi.LastWriteTime != item.Data) // Pois intende-se que se a data do arquivo que esta na pasta do UniNFe for superior a data // de quando foi feita a ultima atualizacao do UniNfe, significa que ele foi atualizado manualmente e não devemos // sobrepor o WSDL ou SCHEMA do Usuario - Renan 26/03/2013 if (item == null || (item != null && fi.LastWriteTime.ToString("dd/MM/yyyy") != item.Data.ToString("dd/MM/yyyy"))) { if (item == null || (item != null && !item.Manual)) { if (ExtractResourceToDisk(ass, s, fileoutput)) gravaLista = true; } else { if (item != null && !item.Manual) Auxiliar.WriteLog(fileoutput + " não copiado", false); } } else if (item != null) { gravaLista = true; item.Manual = true; } } } if (gravaLista) GravarVersoesWSDLs(ListArqsAtualizar); } catch (Exception ex) { string xMotivo = "Não foi possível atualizar pacotes de Schemas/WSDLs."; Auxiliar.WriteLog(xMotivo + Environment.NewLine + ex.Message, false); if (Empresas.Configuracoes.Count > 0) { int emp = Empresas.FindEmpresaByThread(); Auxiliar oAux = new Auxiliar(); oAux.GravarArqErroERP(Empresas.Configuracoes[emp].CNPJ + ".err", xMotivo + Environment.NewLine + ex.Message); } } finally { if (NFe.Components.Propriedade.TipoAplicativo == TipoAplicativo.Todos || NFe.Components.Propriedade.TipoAplicativo == TipoAplicativo.Nfse) { WebServiceNFSe.SalvarXMLMunicipios(); } } }
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 } } }
/// <summary> /// Gravar o XML de retorno com as informações do UniNFe para o aplicativo de ERP /// </summary> /// <param name="oNfe">Objeto da classe UniNfeClass para conseguir pegar algumas informações para gravar o XML</param> /// <by>Wandrey Mundin Ferreira</by> /// <date>29/01/2009</date> private void GravarXMLDadosCertificado(string ArquivoXml) { int emp = Empresas.FindEmpresaByThread(); string sArqRetorno = string.Empty; Auxiliar oAux = new Auxiliar(); if (Path.GetExtension(ArquivoXml).ToLower() == ".txt") sArqRetorno = Empresas.Configuracoes[emp].PastaXmlRetorno + "\\" + Functions.ExtrairNomeArq(ArquivoXml, Propriedade.ExtEnvio.ConsInf_TXT) + "-ret-cons-inf.txt"; else sArqRetorno = Empresas.Configuracoes[emp].PastaXmlRetorno + "\\" + Functions.ExtrairNomeArq(ArquivoXml, Propriedade.ExtEnvio.ConsInf_XML) + "-ret-cons-inf.xml"; try { Aplicacao app = new Aplicacao(); //Deletar o arquivo de solicitação do serviço FileInfo oArquivo = new FileInfo(ArquivoXml); oArquivo.Delete(); oArquivo = new FileInfo(sArqRetorno); if (oArquivo.Exists) oArquivo.Delete(); app.GravarXMLInformacoes(sArqRetorno); } catch (Exception ex) { try { oAux.GravarArqErroERP(Path.GetFileNameWithoutExtension(sArqRetorno) + ".err", ex.Message); } catch { //Se também falhou gravar o arquivo de retorno para o ERP, infelizmente não posso fazer mais nada. Deve estar com algum problema na rede, HD, permissão de acesso as pastas, etc... Wandrey 09/03/2010 } } }
/// <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> public void GravarXMLInformacoes(string sArquivo) { int emp = Empresas.FindEmpresaByThread(); string cStat = "1"; string xMotivo = "Consulta efetuada com sucesso"; //Ler os dados do certificado digital string sSubject = ""; string sValIni = ""; string sValFin = ""; CertificadoDigital cert = new CertificadoDigital(); if (cert.PrepInfCertificado(Empresas.Configuracoes[emp])) { sSubject = cert.sSubject; sValIni = cert.dValidadeInicial.ToString(); sValFin = cert.dValidadeFinal.ToString(); } else { if (!Empresas.Configuracoes[emp].UsaCertificado) xMotivo = "Empresa sem certificado digital informado e/ou não necessário"; else { cStat = "2"; xMotivo = "Certificado digital não foi localizado"; } } //danasa 22/7/2011 //pega a data da ultima modificacao do 'uninfe.exe' diretamente porque pode ser que esteja sendo executado o servico //então, precisamos dos dados do uninfe.exe e não do servico string dtUltModif; URLws item; string tipo = ""; dtUltModif = File.GetLastWriteTime(Propriedade.NomeAplicacao + ".exe").ToString("dd/MM/yyyy - HH:mm:ss"); //Gravar o XML com as informações do aplicativo try { bool isXml = false; object oXmlGravar; if (Path.GetExtension(sArquivo).ToLower() == ".txt") { oXmlGravar = new System.IO.StringWriter(); } else { isXml = true; XmlWriterSettings oSettings = new XmlWriterSettings(); UTF8Encoding c = new UTF8Encoding(true); //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 oXmlGravar = XmlWriter.Create(sArquivo, oSettings); } //Abrir o XML if (isXml) { ((XmlWriter)oXmlGravar).WriteStartDocument(); ((XmlWriter)oXmlGravar).WriteStartElement("retConsInf"); } Functions.GravaTxtXml(oXmlGravar, NFe.Components.TpcnResources.cStat.ToString(), cStat); Functions.GravaTxtXml(oXmlGravar, NFe.Components.TpcnResources.xMotivo.ToString(), xMotivo); //Dados do certificado digital if (isXml) ((XmlWriter)oXmlGravar).WriteStartElement("DadosCertificado"); Functions.GravaTxtXml(oXmlGravar, "sSubject", sSubject); Functions.GravaTxtXml(oXmlGravar, "dValIni", sValIni); Functions.GravaTxtXml(oXmlGravar, "dValFin", sValFin); if (isXml) ((XmlWriter)oXmlGravar).WriteEndElement(); //DadosCertificado //Dados gerais do Aplicativo if (isXml) ((XmlWriter)oXmlGravar).WriteStartElement("DadosUniNfe"); Functions.GravaTxtXml(oXmlGravar, NFe.Components.TpcnResources.versao.ToString(), Propriedade.Versao); Functions.GravaTxtXml(oXmlGravar, "dUltModif", dtUltModif); Functions.GravaTxtXml(oXmlGravar, "PastaExecutavel", Propriedade.PastaExecutavel); Functions.GravaTxtXml(oXmlGravar, "NomeComputador", Environment.MachineName); //danasa 22/7/2011 Functions.GravaTxtXml(oXmlGravar, "ExecutandoPeloServico", Propriedade.ServicoRodando.ToString()); if (isXml) ((XmlWriter)oXmlGravar).WriteEndElement(); //DadosUniNfe //Dados das configurações do aplicativo if (isXml) ((XmlWriter)oXmlGravar).WriteStartElement(NFeStrConstants.nfe_configuracoes); //Functions.GravaTxtXml(oXmlGravar, NFe.Components.NFeStrConstants.DiretorioSalvarComo, Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString()); bool hasFTP = false; foreach (var pT in Empresas.Configuracoes[emp].GetType().GetProperties()) { if (pT.CanWrite) { if (pT.Name.Equals("diretorioSalvarComo")) continue; if (isXml) { if (!hasFTP && pT.Name.StartsWith("FTP")) { ((XmlWriter)oXmlGravar).WriteStartElement("FTP"); hasFTP = true; } else if (hasFTP && !pT.Name.StartsWith("FTP")) { ((XmlWriter)oXmlGravar).WriteEndElement(); hasFTP = false; } } object v = pT.GetValue(Empresas.Configuracoes[emp], null); NFe.Components.Functions.GravaTxtXml(oXmlGravar, pT.Name, v == null ? "" : v.ToString()); } } if (hasFTP && isXml) ((XmlWriter)oXmlGravar).WriteEndElement(); /// /// o ERP poderá verificar se determinado servico está definido no UniNFe /// foreach (webServices list in WebServiceProxy.webServicesList) { if (list.ID == Empresas.Configuracoes[emp].UnidadeFederativaCodigo) { if (isXml) ((XmlWriter)oXmlGravar).WriteStartElement(list.UF); if (Empresas.Configuracoes[emp].AmbienteCodigo == 2) { item = list.LocalHomologacao; if (isXml) ((XmlWriter)oXmlGravar).WriteStartElement("Homologacao"); else tipo = list.UF + ".Homologacao."; } else { item = list.LocalProducao; if (isXml) ((XmlWriter)oXmlGravar).WriteStartElement("Producao"); else tipo = list.UF + ".Producao."; } switch (Empresas.Configuracoes[emp].Servico) { case TipoAplicativo.Nfse: Functions.GravaTxtXml(oXmlGravar, tipo + NFe.Components.Servicos.NFSeCancelar.ToString(), (!string.IsNullOrEmpty(item.CancelarNfse)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + NFe.Components.Servicos.NFSeConsultarLoteRps.ToString(), (!string.IsNullOrEmpty(item.ConsultarLoteRps)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + NFe.Components.Servicos.NFSeConsultar.ToString(), (!string.IsNullOrEmpty(item.ConsultarNfse)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + NFe.Components.Servicos.NFSeConsultarPorRps.ToString(), (!string.IsNullOrEmpty(item.ConsultarNfsePorRps)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + NFe.Components.Servicos.NFSeConsultarSituacaoLoteRps.ToString(), (!string.IsNullOrEmpty(item.ConsultarSituacaoLoteRps)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + NFe.Components.Servicos.NFSeRecepcionarLoteRps.ToString(), (!string.IsNullOrEmpty(item.RecepcionarLoteRps)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + NFe.Components.Servicos.NFSeConsultarURL.ToString(), (!string.IsNullOrEmpty(item.ConsultarURLNfse)).ToString()); break; default: if (Empresas.Configuracoes[emp].Servico == TipoAplicativo.NFCe || Empresas.Configuracoes[emp].Servico == TipoAplicativo.Nfe || Empresas.Configuracoes[emp].Servico == TipoAplicativo.Todos) { Functions.GravaTxtXml(oXmlGravar, tipo + "NFeConsulta", (!string.IsNullOrEmpty(item.NFeConsulta)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "NFeRecepcao", (!string.IsNullOrEmpty(item.NFeRecepcao)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "NFeRecepcaoEvento", (!string.IsNullOrEmpty(item.NFeRecepcaoEvento)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "NFeConsultaCadastro", (!string.IsNullOrEmpty(item.NFeConsultaCadastro)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "NFeConsultaNFeDest", (!string.IsNullOrEmpty(item.NFeConsultaNFeDest)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + NFe.Components.Servicos.NFeDownload.ToString(), (!string.IsNullOrEmpty(item.NFeDownload)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "NFeInutilizacao", (!string.IsNullOrEmpty(item.NFeInutilizacao)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "NFeManifDest", (!string.IsNullOrEmpty(item.NFeManifDest)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "NFeStatusServico", (!string.IsNullOrEmpty(item.NFeStatusServico)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "NFeAutorizacao", (!string.IsNullOrEmpty(item.NFeAutorizacao)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "NFeRetAutorizacao", (!string.IsNullOrEmpty(item.NFeRetAutorizacao)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "DFeRecepcao", (!string.IsNullOrEmpty(item.DFeRecepcao)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + NFe.Components.Servicos.LMCAutorizacao.ToString(), (!string.IsNullOrEmpty(item.LMCAutorizacao)).ToString()); } if (Empresas.Configuracoes[emp].Servico == TipoAplicativo.MDFe || Empresas.Configuracoes[emp].Servico == TipoAplicativo.Todos) { Functions.GravaTxtXml(oXmlGravar, tipo + "MDFeRecepcao", (!string.IsNullOrEmpty(item.MDFeRecepcao)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "MDFeRetRecepcao", (!string.IsNullOrEmpty(item.MDFeRetRecepcao)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "MDFeConsulta", (!string.IsNullOrEmpty(item.MDFeConsulta)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "MDFeStatusServico", (!string.IsNullOrEmpty(item.MDFeStatusServico)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + NFe.Components.Servicos.MDFeRecepcaoEvento.ToString(), (!string.IsNullOrEmpty(item.MDFeRecepcaoEvento)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + NFe.Components.Servicos.MDFeConsultaNaoEncerrado.ToString(), (!string.IsNullOrEmpty(item.MDFeNaoEncerrado)).ToString()); } if (Empresas.Configuracoes[emp].Servico == TipoAplicativo.Cte || Empresas.Configuracoes[emp].Servico == TipoAplicativo.Todos) { Functions.GravaTxtXml(oXmlGravar, tipo + NFe.Components.Servicos.CTeRecepcaoEvento.ToString(), (!string.IsNullOrEmpty(item.CTeRecepcaoEvento)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "CTeConsultaCadastro", (!string.IsNullOrEmpty(item.CTeConsultaCadastro)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "CTeInutilizacao", (!string.IsNullOrEmpty(item.CTeInutilizacao)).ToString()); Functions.GravaTxtXml(oXmlGravar, tipo + "CTeStatusServico", (!string.IsNullOrEmpty(item.CTeStatusServico)).ToString()); } break; } if (isXml) { ((XmlWriter)oXmlGravar).WriteEndElement(); //Ambiente ((XmlWriter)oXmlGravar).WriteEndElement(); //list.UF } } } //Finalizar o XML if (isXml) { ((XmlWriter)oXmlGravar).WriteEndElement(); //nfe_configuracoes ((XmlWriter)oXmlGravar).WriteEndElement(); //retConsInf ((XmlWriter)oXmlGravar).WriteEndDocument(); ((XmlWriter)oXmlGravar).Flush(); ((XmlWriter)oXmlGravar).Close(); } else { ((StringWriter)oXmlGravar).Flush(); File.WriteAllText(sArquivo, ((StringWriter)oXmlGravar).GetStringBuilder().ToString()); ((StringWriter)oXmlGravar).Close(); } } catch (Exception ex) { Functions.DeletarArquivo(sArquivo); /// /// danasa 8-2009 /// Auxiliar oAux = new Auxiliar(); oAux.GravarArqErroERP(Path.GetFileNameWithoutExtension(sArquivo) + ".err", ex.Message); } }