private const int _Minutos = 10; //10 minutos? public NFeEmProcessamento() { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; if (Empresa.Configuracoes[emp].UltimaVerificacaoEmProcessamento.Year > 1) { /// /// executa de 10x10 minutos para evitar ter que acessar o HD sem necessidade /// DateTime dCheck = Empresa.Configuracoes[emp].UltimaVerificacaoEmProcessamento.AddMinutes(_Minutos); if (dCheck > DateTime.Now) { return; } } Empresa.Configuracoes[emp].UltimaVerificacaoEmProcessamento = DateTime.Now; this.oAux = new Auxiliar(); try { /// /// le todos os arquivos que estão na pasta em processamento /// string[] files = Directory.GetFiles(Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString(), "*" + ExtXml.Nfe, SearchOption.TopDirectoryOnly); /// /// considera os arquivos em que a data do ultimo acesso é superior a 10 minutos /// DateTime UltimaData = DateTime.Now.AddMinutes(-_Minutos); foreach (string file in files) { if (!Auxiliar.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(); } try { //Ler a NFe oLerXml.Nfe(file); //Verificar se o -nfe.xml existe na pasta de autorizados bool NFeJaNaAutorizada = oAux.EstaAutorizada(file, oLerXml.oDadosNfe.dEmi, ExtXml.Nfe); //Verificar se o -procNfe.xml existe na past de autorizados bool procNFeJaNaAutorizada = oAux.EstaAutorizada(file, oLerXml.oDadosNfe.dEmi, ExtXmlRet.ProcNFe); //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, oAux.ExtrairNomeArq(file, ExtXml.Nfe) + ExtXml.Nfe); } //gera um -ped-sit.xml mesmo sendo autorizada ou denegada, pois assim sendo, o ERP precisaria dele string vArquivoSit = oLerXml.oDadosNfe.chavenfe.Substring(3); oGerarXml.Consulta(vArquivoSit + ExtXml.PedSit, Convert.ToInt32(oLerXml.oDadosNfe.tpAmb), Convert.ToInt32(oLerXml.oDadosNfe.tpEmis), oLerXml.oDadosNfe.chavenfe.Substring(3)); } 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(Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + oAux.ExtrairNomeArq(file, ExtXml.Nfe) + ExtXmlRet.ProcNFe); //Tirar a nota fiscal do fluxo fluxo.ExcluirNfeFluxo(oLerXml.oDadosNfe.chavenfe); } } catch (Exception ex) { /// /// grava o arquivo com extensao .ERR /// oAux.GravarArqErroERP(Path.GetFileNameWithoutExtension(file) + ".err", ex.Message); } } } } } catch (Exception ex) { /// /// grava o arquivo generico /// oAux.GravarArqErroERP(string.Format(InfoApp.NomeArqERRUniNFe, DateTime.Now.ToString("yyyyMMddThhmmss")), ex.Message); } }
/// <summary> /// Assinar e validar o XML da Nota Fiscal Eletrônica e move para a pasta de assinados /// </summary> /// <param name="bMoverXML">true = Mover XML assinado da pasta de Lote para a subpasta Assinado</param> /// <param name="strPasta">Nome da pasta onde está o XML a ser validado e assinado</param> /// <returns>true = Conseguiu assinar e validar</returns> /// <by>Wandrey Mundin Ferreira</by> /// <date>03/04/2009</date> public Boolean AssinarValidarXMLNFe(string strPasta) { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; Boolean bRetorna = false; Boolean bAssinado = this.Assinado(this.vXmlNfeDadosMsg); Boolean bValidadoSchema = false; Boolean bValidacaoGeral = false; //Criar Pasta dos XML´s a ser enviado em Lote já assinados string strPastaLoteAssinado = strPasta + InfoApp.NomePastaXMLAssinado; //Se o arquivo XML já existir na pasta de assinados, vou avisar o ERP que já tem um em andamento string strArqDestino = strPastaLoteAssinado + "\\" + oAux.ExtrairNomeArq(this.vXmlNfeDadosMsg, ".xml") + ".xml"; try { //Fazer uma leitura de algumas tags do XML LerXML.DadosNFeClass oDadosNFe = this.LerXMLNFe(this.vXmlNfeDadosMsg); string ChaveNfe = oDadosNFe.chavenfe; string TpEmis = oDadosNFe.tpEmis; //Inserir NFe no XML de controle do fluxo try { 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(Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + oAux.ExtrairNomeArq(this.vXmlNfeDadosMsg, ".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" + // this.vXmlNfeDadosMsg); } else { //Deletar o arquivo XML da pasta de temporários de XML´s com erros se o mesmo existir oAux.DeletarArqXMLErro(Empresa.Configuracoes[emp].PastaErro + "\\" + oAux.ExtrairNomeArq(this.vXmlNfeDadosMsg, ".xml") + ".xml"); } //Validações gerais if (this.ValidacoesGeraisXMLNFe(this.vXmlNfeDadosMsg, oDadosNFe)) { bValidacaoGeral = true; } //Assinar o arquivo XML if (bValidacaoGeral && !bAssinado) { AssinaturaDigital oAD = new AssinaturaDigital(); ValidarXMLs oValidador = new ValidarXMLs(); oValidador.TipoArquivoXML(this.vXmlNfeDadosMsg); oAD.Assinar(this.vXmlNfeDadosMsg, oValidador.TagAssinar, Empresa.Configuracoes[emp].X509Certificado); bAssinado = true; } // Validar o Arquivo XML da NFe com os Schemas se estiver assinado if (bValidacaoGeral && bAssinado) { string cResultadoValidacao = oAux.ValidarArqXML(this.vXmlNfeDadosMsg); if (cResultadoValidacao == "") { bValidadoSchema = true; } else { //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 if (bValidadoSchema) { try { //Se a pasta de assinados não existir, vamos criar if (!Directory.Exists(strPastaLoteAssinado)) { Directory.CreateDirectory(strPastaLoteAssinado); } if (!File.Exists(strArqDestino)) { //Mover o arquivo para a pasta de XML´s assinados FileInfo oArquivo = new FileInfo(this.vXmlNfeDadosMsg); oArquivo.MoveTo(strArqDestino); bRetorna = true; } else { oFluxoNfe.InserirNfeFluxo(ChaveNfe, oAux.ExtrairNomeArq(strArqDestino, ".xml") + ".xml"); 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" + this.vXmlNfeDadosMsg); } } catch (IOException ex) { throw (ex); } catch (Exception ex) { throw (ex); } } if (bRetorna) { try { oFluxoNfe.InserirNfeFluxo(ChaveNfe, oAux.ExtrairNomeArq(strArqDestino, ".xml") + ".xml"); } catch (Exception ex) { throw (ex); } } } catch (Exception ex) { throw (ex); } } catch (Exception ex) { try { oAux.GravarArqErroServico(this.vXmlNfeDadosMsg, ExtXml.Nfe, ExtXmlRet.Nfe_ERR, ex.Message); //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(strArqDestino); } catch { //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 } } return(bRetorna); }