/// <summary> /// executa a limpeza das pastas temp e retorno /// </summary> /// <by>http://desenvolvedores.net/marcelo</by> private void ExecutaLimpeza() { Thread thread = null; foreach (KeyValuePair <Thread, int> item in Auxiliar.threads) { if (item.Key.Name == Thread.CurrentThread.Name) { thread = item.Key; } } if (thread != null) { lock (thread) { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; //se chegou até aqui é porque é para fazer a limpeza dos diretórios #region temporario Limpar(Empresa.Configuracoes[emp].PastaErro); #endregion #region retorno Limpar(Empresa.Configuracoes[emp].PastaRetorno); #endregion //pode dormir pelos dias de limpeza. não é necessário fazer a limpeza antes do dia //não é interessante sair da thread porque o uninfe pode ficar no ar 24/7 System.Threading.Monitor.Wait(thread, new TimeSpan(1, 0, 0, 0), false); } } }
private void Limpar(string diretorio) { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; // danasa 27-2-2011 if (Empresa.Configuracoes[emp].DiasLimpeza == 0) { return; } //recupera os arquivos da pasta temporario string[] files = Directory.GetFiles(diretorio, "*.*", SearchOption.AllDirectories); DateTime UltimaData = DateTime.Today.AddDays(-Empresa.Configuracoes[emp].DiasLimpeza); foreach (string file in files) { FileInfo fi = new FileInfo(file); //usar a última data de acesso, e não a data de criação if (fi.LastWriteTime <= UltimaData) { try { fi.Delete(); } catch { //td bem... nao deu para excluir. fica pra próxima } } Application.DoEvents(); } }
/// <summary> /// Monta o um lote para cada NFe /// </summary> /// <param name="oNfe">Objeto referente a instância da classe UniNfeClass</param> /// <by>Wandrey Mundin Ferreira</by> /// <date>17/04/2009</date> private void MontarLoteUmaNfe(Object oNfe) { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; //Definir o tipo do serviço Type tipoServico = oNfe.GetType(); List <string> lstArquivos = new List <string>(); FluxoNfe oFluxoNfe = new FluxoNfe(); lstArquivos = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio + InfoApp.NomePastaXMLAssinado, "*" + ExtXml.Nfe); for (int i = 0; i < lstArquivos.Count; i++) { string cError = ""; try { LerXML.DadosNFeClass oDadosNfe = this.LerXMLNFe(lstArquivos[i]); if (!oFluxoNfe.NFeComLote(oDadosNfe.chavenfe)) { //Gerar lote tipoServico.InvokeMember("vXmlNfeDadosMsg", System.Reflection.BindingFlags.SetProperty, null, oNfe, new object[] { lstArquivos[i] }); tipoServico.InvokeMember("LoteNfe", System.Reflection.BindingFlags.InvokeMethod, null, oNfe, new object[] { lstArquivos[i] }); } } catch (IOException ex) { cError = (ex.InnerException != null ? ex.InnerException.Message : ex.Message); } catch (Exception ex) { cError = (ex.InnerException != null ? ex.InnerException.Message : ex.Message); } /// /// danasa 9-2009 /// if (!string.IsNullOrEmpty(cError)) { Auxiliar oAux = new Auxiliar(); /// /// grava o arquivo de erro /// oAux.GravarArqErroERP(Path.GetFileNameWithoutExtension(lstArquivos[i]) + ".err", cError); /// /// move o arquivo para a pasta de erro /// oAux.MoveArqErro(lstArquivos[i]); } } }
private void AssinarValidarXML() { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; /// /// danasa 21-9-2009 /// this.ConvTXT(Empresa.Configuracoes[emp].PastaValidar); List <string> lstMascaras = new List <string>(); lstMascaras.Add(ExtXml.Nfe); lstMascaras.Add(ExtXml.EnvLot); lstMascaras.Add(ExtXml.PedRec); lstMascaras.Add(ExtXml.PedSit); lstMascaras.Add(ExtXml.PedSta); lstMascaras.Add(ExtXml.PedCan); lstMascaras.Add(ExtXml.PedInu); lstMascaras.Add(ExtXml.PedSta); lstMascaras.Add(ExtXml.ConsCad); lstMascaras.Add(ExtXmlRet.ProcCancNFe); lstMascaras.Add(ExtXmlRet.ProcInutNFe); lstMascaras.Add(ExtXmlRet.ProcNFe); lstMascaras.Add(ExtXml.ConsDPEC); lstMascaras.Add(ExtXml.EnvDPEC); Auxiliar oAux = new Auxiliar(); List <string> lstArquivos = new List <string>(); for (int i = 0; i < lstMascaras.Count; i++) { lstArquivos = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaValidar, "*" + lstMascaras[i]); for (int b = 0; b < lstArquivos.Count; b++) { if (Auxiliar.FileInUse(lstArquivos[b])) { continue; } oAux.ValidarAssinarXML(lstArquivos[b]); } lstArquivos.Clear(); } Thread.Sleep(2000); }
/// <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 = new FindEmpresaThread(Thread.CurrentThread).Index; string sArqRetorno = string.Empty; Auxiliar oAux = new Auxiliar(); if (Path.GetExtension(ArquivoXml).ToLower() == ".txt") { sArqRetorno = Empresa.Configuracoes[emp].PastaRetorno + "\\" + oAux.ExtrairNomeArq(ArquivoXml, ExtXml.ConsInf) + "-ret-cons-inf.txt"; } else { sArqRetorno = Empresa.Configuracoes[emp].PastaRetorno + "\\" + oAux.ExtrairNomeArq(ArquivoXml, ExtXml.ConsInf) + "-ret-cons-inf.xml"; } try { InfoApp oInfUniNfe = new InfoApp(); //Deletar o arquivo de solicitação do serviço FileInfo oArquivo = new FileInfo(ArquivoXml); oArquivo.Delete(); oInfUniNfe.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 } } }
protected void GerarChaveNFe() { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; Auxiliar oAux = new Auxiliar(); /// /// processa arquivos XML /// List <string> lstArquivos = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.GerarChaveNFe_XML); foreach (string ArqXMLPedido in lstArquivos) { oAux.GerarChaveNFe(ArqXMLPedido, true); } /// /// processa arquivos TXT /// lstArquivos = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.GerarChaveNFe_TXT); foreach (string ArqXMLPedido in lstArquivos) { oAux.GerarChaveNFe(ArqXMLPedido, false); } }
/// <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); } }
public FluxoNfe() { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; NomeXmlControleFluxo = Empresa.Configuracoes[emp].PastaEmpresa + "\\fluxonfe.xml"; }
/// <summary> /// Converter arquivos de NFe no formato TXT para XML /// </summary> /// <by>Wandrey Mundin Ferreira</by> /// <date>03/069/2009</date> protected void ConvTXT(string vPasta) { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; Auxiliar oAux = new Auxiliar(); List <string> lstArquivos = this.ArquivosPasta(vPasta /*ConfiguracaoApp.vPastaXMLEnvio*/, "*-nfe.txt"); for (int i = 0; i < lstArquivos.Count; i++) { if (Auxiliar.FileInUse(lstArquivos[i])) { continue; } UnitxtTOxmlClass oUniTxtToXml = new UnitxtTOxmlClass(); string ccMessage = string.Empty; string ccExtension = "-nfe.err"; try { /// /// exclui o arquivo de erro /// oAux.DeletarArquivo(Empresa.Configuracoes[emp].PastaRetorno + "\\" + Path.GetFileName(oAux.ExtrairNomeArq(lstArquivos[i], "-nfe.txt") + ccExtension)); oAux.DeletarArquivo(Empresa.Configuracoes[emp].PastaRetorno + "\\" + Path.GetFileName(oAux.ExtrairNomeArq(lstArquivos[i], "-nfe.txt") + "-nfe-ret.xml")); oAux.DeletarArquivo(Empresa.Configuracoes[emp].PastaErro + "\\" + Path.GetFileName(lstArquivos[i])); /// /// exclui o arquivo TXT original /// oAux.DeletarArquivo(Empresa.Configuracoes[emp].PastaRetorno + "\\" + Path.GetFileNameWithoutExtension(lstArquivos[i]) + "-orig.txt"); /// /// processa a conversão /// oUniTxtToXml.Converter(lstArquivos[i], vPasta /*ConfiguracaoApp.vPastaXMLEnvio*/); //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(lstArquivos[i], ".txt"); } else { /// /// salva o arquivo texto original /// FileInfo otxtArquivo = new FileInfo(lstArquivos[i]); if (vPasta.Equals(Empresa.Configuracoes[emp].PastaEnvio)) { string vvNomeArquivoDestino = Empresa.Configuracoes[emp].PastaRetorno + "\\" + Path.GetFileNameWithoutExtension(lstArquivos[i]) + "-orig.txt"; otxtArquivo.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 (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 /// FileInfo oArquivo = new FileInfo(vPasta /*ConfiguracaoApp.vPastaXMLEnvio*/ + "\\convertidos\\" + txtClass.XMLFileName); string vNomeArquivoDestino = vPasta /*ConfiguracaoApp.vPastaXMLEnvio*/ + "\\" + txtClass.XMLFileName; /// /// excluo o XML se já existe /// oAux.DeletarArquivo(vNomeArquivoDestino); /// /// move o arquivo da pasta "Envio\Convertidos" para a pasta "Envio" /// ou /// move o arquivo da pasta "Validar\Convertidos" para a pasta "Validar" /// oArquivo.MoveTo(vNomeArquivoDestino); } } } 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(lstArquivos[i], ".txt"); /// /// exclui todos os XML gerados na pasta Enviados\convertidos /// foreach (txtTOxmlClassRetorno txtClass in oUniTxtToXml.cRetorno) { oAux.DeletarArquivo(vPasta /*ConfiguracaoApp.vPastaXMLEnvio*/ + "\\convertidos\\" + txtClass.XMLFileName); } /// /// danasa 8-2009 /// /// Gravar o retorno para o ERP em formato TXT com o erro ocorrido /// oAux.GravarArqErroERP(oAux.ExtrairNomeArq(lstArquivos[i], "-nfe.txt") + ccExtension, ccMessage); } } }
/// <summary> /// Processa/envia os XML´s gravados na pasta de envio /// </summary> /// <param name="oNfe">Objeto referente a UniNfeClass</param> /// <param name="strPasta">Pasta de envio</param> /// <param name="strMascara">Mascara dos arquivos a serem pesquisados e processados</param> /// <param name="strAtividade">Atividade a ser executada com o(s) XML(s) encontrados</param> /// <by>Wandrey Mundin Ferreira</by> /// <date>03/04/2009</date> protected void ProcessaXML(Object oNfe, Servicos srvServico) { string strPasta = string.Empty; List <string> lstArquivos = new List <string>(); lstArquivos.Clear(); string strMascaraArq = string.Empty; string strMetodo = string.Empty; int emp = new FindEmpresaThread(Thread.CurrentThread).Index; switch (srvServico) { case Servicos.EmProcessamento: EmProcessamento(); break; case Servicos.CancelarNFe: strMetodo = "Cancelamento"; lstArquivos = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.PedCan); lstArquivos.AddRange(this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.PedCan_TXT)); goto default; case Servicos.InutilizarNumerosNFe: strMetodo = "Inutilizacao"; lstArquivos = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.PedInu); lstArquivos.AddRange(this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.PedInu_TXT)); goto default; case Servicos.PedidoConsultaSituacaoNFe: strMetodo = "Consulta"; lstArquivos = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.PedSit); lstArquivos.AddRange(this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.PedSit_TXT)); goto default; case Servicos.PedidoConsultaStatusServicoNFe: strMetodo = "StatusServico"; lstArquivos = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.PedSta); lstArquivos.AddRange(this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.PedSta_TXT)); goto default; case Servicos.PedidoSituacaoLoteNFe: strMetodo = "RetRecepcao"; this.GerarXMLPedRec(oNfe); lstArquivos = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.PedRec); //Tem que ficar depois de ter gerado os XML de consulta do recibo ou dá falha. Wandrey 22/05/2009 goto default; case Servicos.ConsultaCadastroContribuinte: strMetodo = "ConsultaCadastro"; lstArquivos = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.ConsCad); lstArquivos.AddRange(this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.ConsCad_TXT)); goto default; case Servicos.ConsultaInformacoesUniNFe: strMetodo = "GravarXMLDadosCertificado"; lstArquivos = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.ConsInf); lstArquivos.AddRange(this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.ConsInf_TXT)); goto default; case Servicos.AlterarConfiguracoesUniNFe: strMetodo = "ReconfigurarUniNfe"; lstArquivos = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.AltCon); lstArquivos.AddRange(this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.AltCon_TXT)); goto default; case Servicos.EnviarDPEC: strMetodo = "RecepcaoDPEC"; lstArquivos = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.EnvDPEC); lstArquivos.AddRange(this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.EnvDPEC_TXT)); goto default; case Servicos.ConsultarDPEC: strMetodo = "ConsultaDPEC"; lstArquivos = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.ConsDPEC); lstArquivos.AddRange(this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.ConsDPEC_TXT)); goto default; case Servicos.AssinarNFePastaEnvio: this.AssinarValidarNFe(oNfe, Empresa.Configuracoes[emp].PastaEnvio); break; case Servicos.AssinarNFePastaEnvioEmLote: if (Empresa.Configuracoes[emp].PastaEnvioEmLote != string.Empty) { this.AssinarValidarNFe(oNfe, Empresa.Configuracoes[emp].PastaEnvioEmLote); } break; case Servicos.MontarLoteUmaNFe: this.MontarLoteUmaNfe(oNfe); break; case Servicos.MontarLoteVariasNFe: if (Empresa.Configuracoes[emp].PastaEnvioEmLote != string.Empty) { this.MontarLoteVariasNfe(oNfe); } break; case Servicos.EnviarLoteNfe: strMetodo = "Recepcao"; lstArquivos = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvio, "*" + ExtXml.EnvLot); goto default; case Servicos.ValidarAssinar: this.AssinarValidarXML(); //Somente validar e assinar os diversos XML´s da NFe break; case Servicos.ConverterTXTparaXML: this.ConvTXT(Empresa.Configuracoes[emp].PastaEnvio); break; case Servicos.GerarChaveNFe: this.GerarChaveNFe(); break; case Servicos.LimpezaTemporario: ExecutaLimpeza(); break; default: //Assinar, validar, enviar ou somente processar os arquivos XML encontrados na pasta de envio for (int i = 0; i < lstArquivos.Count; i++) { //Se o arquivo estiver ainda em uso eu pulo ele para tentar mais tarde if (Auxiliar.FileInUse(lstArquivos[i])) { continue; } try { //Processa ou envia o XML this.EnviarArquivo(lstArquivos[i], oNfe, strMetodo); } catch { //Não pode ser tratado nenhum erro aqui, visto que já estão sendo tratados e devidamente retornados //para o ERP no ponto da execução dos serviços. Foi muito bem testado e analisado. Wandrey 09/03/2010 } } break; } }
/// <summary> /// Monta o um lote com várias NFe´s /// </summary> /// <param name="oNfe">Objeto referente a instância da classe absServicoNFe</param> /// <by>Wandrey Mundin Ferreira</by> /// <date>28/04/2009</date> private void MontarLoteVariasNfe(Object oNfe) { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; List <string> lstArqMontarLote = new List <string>(); //Aguardar a assinatura de todos os arquivos da pasta de lotes lstArqMontarLote = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvioEmLote, "*" + ExtXml.Nfe); if (lstArqMontarLote.Count > 0) { return; } //Verificar se existe o arquivo que solicita a montagem do lote lstArqMontarLote = this.ArquivosPasta(Empresa.Configuracoes[emp].PastaEnvioEmLote, "*" + ExtXml.MontarLote); for (int b = 0; b < lstArqMontarLote.Count; b++) { string NomeArquivo = lstArqMontarLote[b]; //O arquivo existe mas pode estar em uso if (Auxiliar.FileInUse(NomeArquivo) == true) { return; } Auxiliar oAux = new Auxiliar(); List <string> lstNfe = new List <string>(); FileStream fsArquivo = null; FluxoNfe oFluxoNfe = new FluxoNfe(); string MensagemErro = string.Empty; bool lTeveErro = false; try { XmlDocument doc = new XmlDocument(); //Criar instância do XmlDocument Class fsArquivo = new FileStream(NomeArquivo, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); //Abrir um arquivo XML usando FileStream doc.Load(fsArquivo); //Carregar o arquivo aberto no XmlDocument XmlNodeList documentoList = doc.GetElementsByTagName("MontarLoteNFe"); //Pesquisar o elemento Documento no arquivo XML foreach (XmlNode documentoNode in documentoList) { XmlElement documentoElemento = (XmlElement)documentoNode; int QtdeArquivo = documentoElemento.GetElementsByTagName("ArquivoNFe").Count; for (int d = 0; d < QtdeArquivo; d++) { string ArquivoNFe = Empresa.Configuracoes[emp].PastaEnvioEmLote + InfoApp.NomePastaXMLAssinado + "\\" + documentoElemento.GetElementsByTagName("ArquivoNFe")[d].InnerText; if (File.Exists(ArquivoNFe)) { try { LerXML.DadosNFeClass oDadosNfe = this.LerXMLNFe(ArquivoNFe); if (!oFluxoNfe.NFeComLote(oDadosNfe.chavenfe)) { lstNfe.Add(ArquivoNFe); } else { MensagemErro += "Arquivo: " + ArquivoNFe + " já está no fluxo de envio e não será incluido em novo lote.\r\n"; lTeveErro = true; FileInfo oArq = new FileInfo(ArquivoNFe); oArq.Delete(); } } catch (IOException ex) { MensagemErro += ex.Message + "\r\n"; lTeveErro = true; } catch (Exception ex) { MensagemErro += ex.Message + "\r\n"; lTeveErro = true; } } else { lTeveErro = true; MensagemErro += "Arquivo: " + ArquivoNFe + " não existe e não será incluido no lote!\r\n"; } } } fsArquivo.Close(); //Fecha o arquivo XML //Definir o tipo do serviço Type tipoServico = oNfe.GetType(); try { //Gerar lote tipoServico.InvokeMember("LoteNfe", System.Reflection.BindingFlags.InvokeMethod, null, oNfe, new object[] { lstNfe }); } catch (IOException ex) { MensagemErro += ex.Message + "\r\n"; lTeveErro = true; } catch (Exception ex) { MensagemErro += ex.Message + "\r\n"; lTeveErro = true; } } catch (Exception ex) { if (fsArquivo != null) { fsArquivo.Close(); } lTeveErro = true; MensagemErro += ex.Message + "\r\n"; } //Deletar o arquivo de solicitão de montagem do lote de NFe try { FileInfo oArquivo = new FileInfo(NomeArquivo); oArquivo.Delete(); } catch (IOException ex) { lTeveErro = true; MensagemErro += ex.Message + "\r\n"; } catch (Exception ex) { lTeveErro = true; MensagemErro += ex.Message + "\r\n"; } if (lTeveErro) { try { oAux.GravarArqErroServico(NomeArquivo, ExtXml.MontarLote, "-montar-lote.err", MensagemErro); } catch { //Se deu algum erro na hora de gravar o arquivo de erro de retorno para o ERP, infelizmente não poderemos fazer nada //pois deve estar ocorrendo alguma falha de rede, hd, permissão de acesso a pasta ou arquivos, etc. Wandrey 22/03/2010 } } } }
/// <summary> /// Analisa o tipo do XML que está na pasta de envio e executa a operação necessária. Exemplo: Envia ao SEFAZ, reconfigura o UniNFE, etc... /// </summary> /// <param name="cArquivo">Nome do arquivo XML a ser enviado ou analisado</param> /// <param name="oNfe">Objeto da classe UniNfeClass a ser utilizado nas operações</param> private void EnviarArquivo(string cArquivo, Object oNfe, string strMetodo) { #region Código retirado /* * Não pode ser verificado neste ponto, visto que os retornos esperados pelo ERP podem se modificar, assim * sendo movi esta parte do código para dentro dos métodos da classe InvocarObjeto, lá ele vai dar exatamente * o retorno que o ERP espera e já trata todos os serviços que precisam da internet e os que não precisam * continuam funcionando normalmente. * Wandrey 16/11/2009 * if (!InternetCS.IsConnectedToInternet()) * { * //Registrar o erro da validação para o sistema ERP * throw new Exception("Sem conexão com a internet.\r\nMétodo: " + strMetodo + "\r\nArquivo: " + cArquivo); * } */ #endregion int emp = new FindEmpresaThread(Thread.CurrentThread).Index; //Definir o tipo do serviço Type tipoServico = oNfe.GetType(); //Definir o arquivo XML para a classe UniNfeClass tipoServico.InvokeMember("vXmlNfeDadosMsg", System.Reflection.BindingFlags.SetProperty, null, oNfe, new object[] { cArquivo }); try { if (Empresa.Configuracoes[emp].tpEmis != TipoEmissao.teContingencia && Empresa.Configuracoes[emp].tpEmis != TipoEmissao.teFSDA && Empresa.Configuracoes[emp].tpEmis != TipoEmissao.teDPEC) //Confingência em formulário de segurança e DPEC não envia na hora, tem que aguardar voltar para normal. { if (strMetodo == "ReconfigurarUniNfe") { this.ReconfigurarUniNFe(cArquivo); } else if (strMetodo == "GravarXMLDadosCertificado") { this.GravarXMLDadosCertificado(cArquivo); } else { tipoServico.InvokeMember(strMetodo, System.Reflection.BindingFlags.InvokeMethod, null, oNfe, null); } } else { if (strMetodo == "ReconfigurarUniNfe") { this.ReconfigurarUniNFe(cArquivo); } else if (strMetodo == "RetRecepcao" || strMetodo == "Consulta" || strMetodo == "StatusServico" || strMetodo == "RecepcaoDPEC" || strMetodo == "ConsultaDPEC") { tipoServico.InvokeMember(strMetodo, System.Reflection.BindingFlags.InvokeMethod, null, oNfe, null); } else if (strMetodo == "GravarXMLDadosCertificado") { this.GravarXMLDadosCertificado(cArquivo); } } } catch (Exception ex) { throw (ex); } }
/// <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); } }
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> /// 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> /// Efetua uma leitura do XML da nota fiscal eletrônica e faz diversas conferências do seu conteúdo e bloqueia se não /// estiver de acordo com as configurações do UNINFE /// </summary> /// <param name="strArquivoNFe">Arquivo XML da NFe</param> /// <returns>true = Validado com sucesso</returns> /// <by>Wandrey Mundin Ferreira</by> /// <date>16/04/2009</date> protected bool ValidacoesGeraisXMLNFe(string strArquivoNFe, LerXML.DadosNFeClass oDadosNFe) { int emp = new FindEmpresaThread(Thread.CurrentThread).Index; bool booValido = false; string cTextoErro = ""; try { //Verificar o tipo de emissão se bate com o configurado, se não bater vai retornar um erro //para o ERP // danasa 8-2009 if ((Empresa.Configuracoes[emp].tpEmis == TipoEmissao.teNormal && (oDadosNFe.tpEmis == "1" || oDadosNFe.tpEmis == "2" || oDadosNFe.tpEmis == "5" || oDadosNFe.tpEmis == "4")) || (Empresa.Configuracoes[emp].tpEmis == TipoEmissao.teSCAN && (oDadosNFe.tpEmis == "3"))) { booValido = true; } // danasa 8-2009 else if (Empresa.Configuracoes[emp].tpEmis == TipoEmissao.teContingencia && (oDadosNFe.tpEmis == "2")) { booValido = false; //Retorno somente falso mas sem exception para não fazer nada. Wandrey 09/06/2009 } else if (Empresa.Configuracoes[emp].tpEmis == TipoEmissao.teDPEC && (oDadosNFe.tpEmis == "4")) { booValido = false; //Retorno somente falso mas sem exception para não fazer nada. Wandrey 19/06/2009 } else if (Empresa.Configuracoes[emp].tpEmis == TipoEmissao.teFSDA && (oDadosNFe.tpEmis == "5")) { booValido = false; //Retorno somente falso mas sem exception para não fazer nada. Wandrey 19/06/2009 } else { booValido = false; // danasa 8-2009 if (Empresa.Configuracoes[emp].tpEmis == TipoEmissao.teNormal && oDadosNFe.tpEmis == "3") { cTextoErro = "O UniNFe está configurado para enviar a Nota Fiscal ao Ambiente da SEFAZ " + "(Secretaria Estadual da Fazenda) e o XML está configurado para enviar " + "para o SCAN do Ambiente Nacional.\r\n\r\n"; } // danasa 8-2009 else if (Empresa.Configuracoes[emp].tpEmis == TipoEmissao.teSCAN && (oDadosNFe.tpEmis == "1" || oDadosNFe.tpEmis == "2" || oDadosNFe.tpEmis == "5")) { cTextoErro = "O UniNFe está configurado para enviar a Nota Fiscal ao SCAN do Ambiente Nacional " + "e o XML está configurado para enviar para o Ambiente da SEFAZ (Secretaria Estadual da Fazenda)\r\n\r\n"; } cTextoErro += "O XML não será enviado e será movido para a pasta de XML com erro para análise."; throw new Exception(cTextoErro); } #region Verificar se os valores das tag´s que compõe a chave da nfe estão batendo com as informadas na chave //Verificar se os valores das tag´s que compõe a chave da nfe estão batendo com as informadas na chave if (booValido) { cTextoErro = string.Empty; #region Tag <cUF> if (oDadosNFe.cUF != oDadosNFe.chavenfe.Substring(3, 2)) { cTextoErro += "O código da UF informado na tag <cUF> está diferente do informado na chave da NF-e.\r\n" + "Código da UF informado na tag <cUF>: " + oDadosNFe.cUF + "\r\n" + "Código da UF informado na chave da NF-e: " + oDadosNFe.chavenfe.Substring(3, 2) + "\r\n\r\n"; booValido = false; } #endregion #region Tag <tpEmis> if (ConfiguracaoApp.TipoAplicativo == TipoAplicativo.Nfe) { if (oDadosNFe.tpEmis != oDadosNFe.chavenfe.Substring(37, 1)) { cTextoErro += "O código numérico informado na tag <tpEmis> está diferente do informado na chave da NF-e.\r\n" + "Código numérico informado na tag <tpEmis>: " + oDadosNFe.tpEmis + "\r\n" + "Código numérico informado na chave da NF-e: " + oDadosNFe.chavenfe.Substring(37, 1) + "\r\n\r\n"; booValido = false; } } #endregion #region Tag <cNF> if ((ConfiguracaoApp.TipoAplicativo == TipoAplicativo.Nfe && oDadosNFe.cNF != oDadosNFe.chavenfe.Substring(38, 8)) || (ConfiguracaoApp.TipoAplicativo == TipoAplicativo.Cte && oDadosNFe.cNF != oDadosNFe.chavenfe.Substring(37, 9))) { cTextoErro += "O código numérico informado na tag <cNF> está diferente do informado na chave da NF-e.\r\n" + "Código numérico informado na tag <cNF>: " + oDadosNFe.cNF + "\r\n" + "Código numérico informado na chave da NF-e: " + oDadosNFe.chavenfe.Substring(38, 8) + "\r\n\r\n"; booValido = false; } #endregion #region Tag <mod> if (oDadosNFe.mod != oDadosNFe.chavenfe.Substring(23, 2)) { cTextoErro += "O modelo informado na tag <mod> está diferente do informado na chave da NF-e.\r\n" + "Modelo informado na tag <mod>: " + oDadosNFe.mod + "\r\n" + "Modelo informado na chave da NF-e: " + oDadosNFe.chavenfe.Substring(23, 2) + "\r\n\r\n"; booValido = false; } #endregion #region Tag <nNF> if (Convert.ToInt32(oDadosNFe.nNF) != Convert.ToInt32(oDadosNFe.chavenfe.Substring(28, 9))) { cTextoErro += "O número da NF-e informado na tag <nNF> está diferente do informado na chave da NF-e.\r\n" + "Número da NFe informado na tag <nNF>: " + Convert.ToInt32(oDadosNFe.nNF).ToString() + "\r\n" + "Número da NFe informado na chave da NF-e: " + Convert.ToInt32(oDadosNFe.chavenfe.Substring(28, 9)).ToString() + "\r\n\r\n"; booValido = false; } #endregion #region Tag <cDV> if (oDadosNFe.cDV != oDadosNFe.chavenfe.Substring(46, 1)) { cTextoErro += "O número do dígito verificador informado na tag <cDV> está diferente do informado na chave da NF-e.\r\n" + "Número do dígito verificador informado na tag <cDV>: " + oDadosNFe.cDV + "\r\n" + "Número do dígito verificador informado na chave da NF-e: " + oDadosNFe.chavenfe.Substring(46, 1) + "\r\n\r\n"; booValido = false; } #endregion #region Tag <CNPJ> da tag <emit> if (oDadosNFe.CNPJ != oDadosNFe.chavenfe.Substring(9, 14)) { cTextoErro += "O CNPJ do emitente informado na tag <emit><CNPJ> está diferente do informado na chave da NF-e.\r\n" + "CNPJ do emitente informado na tag <emit><CNPJ>: " + oDadosNFe.CNPJ + "\r\n" + "CNPJ do emitente informado na chave da NF-e: " + oDadosNFe.chavenfe.Substring(9, 14) + "\r\n\r\n"; booValido = false; } #endregion #region Tag <serie> if (Convert.ToInt32(oDadosNFe.serie) != Convert.ToInt32(oDadosNFe.chavenfe.Substring(25, 3))) { cTextoErro += "A série informada na tag <serie> está diferente da informada na chave da NF-e.\r\n" + "Série informada na tag <cDV>: " + Convert.ToInt32(oDadosNFe.serie).ToString() + "\r\n" + "Série informada na chave da NF-e: " + Convert.ToInt32(oDadosNFe.chavenfe.Substring(25, 3)).ToString() + "\r\n\r\n"; booValido = false; } #endregion #region Tag <dEmi> if (oDadosNFe.dEmi.Month.ToString("00") != oDadosNFe.chavenfe.Substring(7, 2) || oDadosNFe.dEmi.Year.ToString("0000").Substring(2, 2) != oDadosNFe.chavenfe.Substring(5, 2)) { cTextoErro += "A ano e mês da emissão informada na tag <dEmi> está diferente da informada na chave da NF-e.\r\n" + "Mês/Ano da data de emissão informada na tag <dEmi>: " + oDadosNFe.dEmi.Month.ToString("00") + "/" + oDadosNFe.dEmi.Year.ToString("0000").Substring(2, 2) + "\r\n" + "Mês/Ano informados na chave da NF-e: " + oDadosNFe.chavenfe.Substring(5, 2) + "/" + oDadosNFe.chavenfe.Substring(7, 2) + "\r\n\r\n"; booValido = false; } #endregion if (!booValido) { throw new Exception(cTextoErro); } } #endregion } catch (Exception ex) { booValido = false; throw (ex); } return(booValido); }
/// <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); }
/// <summary> /// Criar uma lista com os recibos a serem consultados no servidor do SEFAZ /// </summary> /// <returns>Lista dos recibos</returns> /// <by>Wandrey Mundin Ferreira</by> public List <ReciboCons> CriarListaRec() { List <ReciboCons> lstRecibo = new List <ReciboCons>(); List <string> lstNumRec = new List <string>(); FileStream fsArquivo = null; try { XmlDocument doc = new XmlDocument(); //Criar instância do XmlDocument Class fsArquivo = new FileStream(NomeXmlControleFluxo, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); //Abrir um arquivo XML usando FileStream doc.Load(fsArquivo); //Carregar o arquivo aberto no XmlDocument XmlNodeList documentoList = doc.GetElementsByTagName(ElementoFixo.Documento.ToString()); //Pesquisar o elemento Documento no arquivo XML foreach (XmlNode documentoNode in documentoList) { XmlElement documentoElemento = (XmlElement)documentoNode; string nRec = documentoElemento.GetElementsByTagName(ElementoEditavel.nRec.ToString())[0].InnerText; int tMed = 3; //3 segundos DateTime dPedRec = DateTime.Now.AddMinutes(-60); if (documentoElemento.GetElementsByTagName(ElementoEditavel.tMed.ToString())[0] != null && documentoElemento.GetElementsByTagName(ElementoEditavel.tMed.ToString())[0].InnerText != string.Empty) { tMed = Convert.ToInt32(documentoElemento.GetElementsByTagName(ElementoEditavel.tMed.ToString())[0].InnerText); } if (documentoElemento.GetElementsByTagName(ElementoEditavel.dPedRec.ToString())[0] != null && documentoElemento.GetElementsByTagName(ElementoEditavel.dPedRec.ToString())[0].InnerText != string.Empty) { dPedRec = Convert.ToDateTime(documentoElemento.GetElementsByTagName(ElementoEditavel.dPedRec.ToString())[0].InnerText); } if (nRec != string.Empty && !lstNumRec.Contains(nRec)) { lstNumRec.Add(nRec); ReciboCons oReciboCons = new ReciboCons(); oReciboCons.dPedRec = dPedRec; oReciboCons.nRec = nRec; oReciboCons.tMed = tMed; lstRecibo.Add(oReciboCons); } //Se tiver mais de 2 dias no fluxo, vou excluir a nota dele. //Não faz sentido uma nota ficar no fluxo todo este tempo, então vou fazer uma limpeza //Wandrey 11/09/2009 if (DateTime.Now.Subtract(dPedRec).Days >= 2) { string ChaveNFe = documentoElemento.GetAttribute(ElementoFixo.ChaveNFe.ToString()); string NomeArquivo = documentoElemento.GetElementsByTagName(ElementoFixo.ArqNFe.ToString())[0].InnerText; int emp = new FindEmpresaThread(Thread.CurrentThread).Index; //Deletar o arquivo da pasta em processamento Auxiliar oAux = new Auxiliar(); oAux.MoveArqErro(Empresa.Configuracoes[emp].PastaEnviado + "\\" + Enums.PastaEnviados.EmProcessamento.ToString() + "\\" + NomeArquivo); //Deletar a NFE do arquivo de controle de fluxo this.ExcluirNfeFluxo(ChaveNFe); } } fsArquivo.Close(); //Fecha o arquivo XML } catch (XmlException ex) { if (fsArquivo != null) { fsArquivo.Close(); } throw (ex); } catch (Exception ex) { if (fsArquivo != null) { fsArquivo.Close(); } throw (ex); } return(lstRecibo); }