Example #1
0
        /// <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);
        }