/// <summary> /// Efetua a validação de qualquer XML, NFE, Cancelamento, Inutilização, etc..., e retorna se está ok ou não /// </summary> /// <param name="Arquivo">Nome do arquivo XML a ser validado e assinado</param> /// <param name="PastaValidar">Nome da pasta onde fica os arquivos a serem validados</param> /// <param name="PastaXMLErro">Nome da pasta onde é para gravar os XML´s validados que apresentaram erro.</param> /// <param name="PastaXMLRetorno">Nome da pasta de retorno onde será gravado o XML com o status da validação</param> /// <param name="Certificado">Certificado digital a ser utilizado na validação</param> /// <by>Wandrey Mundin Ferreira</by> /// <date>28/05/2009</date> public void ValidarAssinarXML(string Arquivo) { int emp = Empresas.FindEmpresaByThread(); Boolean Assinou = true; //Assinar o XML se tiver tag para assinar AssinaturaDigital oAD = new AssinaturaDigital(); try { if (TipoArqXml.nRetornoTipoArq >= 1 && TipoArqXml.nRetornoTipoArq <= SchemaXML.MaxID) { this.EncryptAssinatura(Arquivo); //danasa: 12/2013 oAD.Assinar(Arquivo, emp, Empresas.Configuracoes[emp].UnidadeFederativaCodigo); Assinou = true; } } catch (Exception ex) { Assinou = false; try { GravarXMLRetornoValidacao(Arquivo, "2", "Ocorreu um erro ao assinar o XML: " + ex.Message); new Auxiliar().MoveArqErro(Arquivo); } catch { //Se deu algum erro na hora de gravar o retorno do erro para o ERP, infelizmente não posso fazer nada. //Isso pode acontecer se falhar rede, hd, problema de permissão de pastas, etc... Wandrey 23/03/2010 } } if (Assinou) { #region Adicionar a tag do qrCode na NFCe if (Arquivo.EndsWith(Propriedade.ExtEnvio.Nfe, StringComparison.InvariantCultureIgnoreCase)) { if (!String.IsNullOrEmpty(Empresas.Configuracoes[emp].IndentificadorCSC)) { QRCode qrCode = new QRCode(Empresas.Configuracoes[emp].IndentificadorCSC, Empresas.Configuracoes[emp].TokenCSC, Arquivo); 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(); } } } #endregion // Validar o Arquivo XML if (TipoArqXml.nRetornoTipoArq >= 1 && TipoArqXml.nRetornoTipoArq <= SchemaXML.MaxID) { try { Validar(Arquivo); if (Retorno != 0) { this.GravarXMLRetornoValidacao(Arquivo, "3", "Ocorreu um erro ao validar o XML: " + RetornoString); new Auxiliar().MoveArqErro(Arquivo); } else { if (!Directory.Exists(Empresas.Configuracoes[emp].PastaValidado)) { Directory.CreateDirectory(Empresas.Configuracoes[emp].PastaValidado); } string ArquivoNovo = Empresas.Configuracoes[emp].PastaValidado + "\\" + Functions.ExtrairNomeArq(Arquivo, ".xml") + ".xml"; Functions.Move(Arquivo, ArquivoNovo); /* if (File.Exists(ArquivoNovo)) { FileInfo oArqNovo = new FileInfo(ArquivoNovo); oArqNovo.Delete(); } FileInfo oArquivo = new FileInfo(Arquivo); oArquivo.MoveTo(ArquivoNovo); */ this.GravarXMLRetornoValidacao(Arquivo, "1", "XML assinado e validado com sucesso."); } } catch (Exception ex) { try { this.GravarXMLRetornoValidacao(Arquivo, "4", "Ocorreu um erro ao validar o XML: " + ex.Message); new Auxiliar().MoveArqErro(Arquivo); } catch { //Se deu algum erro na hora de gravar o retorno do erro para o ERP, infelizmente não posso fazer nada. //Isso pode acontecer se falhar rede, hd, problema de permissão de pastas, etc... Wandrey 23/03/2010 } } } else { try { this.GravarXMLRetornoValidacao(Arquivo, "5", "Ocorreu um erro ao validar o XML: " + TipoArqXml.cRetornoTipoArq); new Auxiliar().MoveArqErro(Arquivo); } catch { //Se deu algum erro na hora de gravar o retorno do erro para o ERP, infelizmente não posso fazer nada. //Isso pode acontecer se falhar rede, hd, problema de permissão de pastas, etc... Wandrey 23/03/2010 } } } }
/// <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; } }