public bool ExecutarConsultaStatus(ConfiguracaoEntity config, Modelo modelo)
        {
            var ambiente = config.IsProducao ? Ambiente.Producao : Ambiente.Homologacao;
            var codigoUf = (CodigoUfIbge)Enum.Parse(typeof(CodigoUfIbge), _emissorService.GetEmissor().Endereco.UF);

            X509Certificate2 certificado = null;

            var certificadoEntity = _certificadoService.GetCertificado();

            if (certificadoEntity == null)
            {
                return(false);
            }

            if (!string.IsNullOrWhiteSpace(certificadoEntity.Caminho))
            {
                certificado = _certificateManager.GetCertificateByPath(certificadoEntity.Caminho,
                                                                       RijndaelManagedEncryption.DecryptRijndael(certificadoEntity.Senha));
            }
            else
            {
                certificado = _certificateManager.GetCertificateBySerialNumber(certificadoEntity.NumeroSerial, false);
            }

            return(NFeStatusServico.ExecutarConsultaStatus(codigoUf, ambiente, certificado, modelo));
        }
Пример #2
0
        static void Main(string[] args)
        {
            Console.Read();
            HttpPost.send();

            return;

            string salt       = "";
            string textNormal = "hola_";
            string textEncrip = "";

            salt       = Guid.NewGuid().ToString();
            textEncrip = RijndaelManagedEncryption.EncryptRijndael(textNormal, salt);
            textNormal = RijndaelManagedEncryption.DecryptRijndael(textEncrip, salt);

            Console.WriteLine("---------------------------------------");
            Console.WriteLine("salt:" + salt);
            Console.WriteLine("textEncrip:" + textEncrip);
            Console.WriteLine("textNormal:" + textNormal);

            Console.WriteLine("---------------------------------------");
            Console.WriteLine("Usando AESAlgorithm:");
            textEncrip = AESAlgorithm.Encrypt(textNormal);
            //string otherTextEncript = AESAlgorithm.Encrypt("hola_");
            Console.WriteLine("textNormal:" + textNormal);
            Console.WriteLine("textEncrip:" + textEncrip);
            Console.WriteLine("textDecrip:" + AESAlgorithm.Decrypt(textEncrip));

            // Error padding code Base64 erroneo a proposito
            Console.WriteLine("textDecrip2:" + AESAlgorithm.Decrypt("pw7qE1E4o6/1QAKSPv8Jwg=="));

            Console.Read();
        }
Пример #3
0
 private void AdicionarSenhaCmd_Execute(PasswordBox pwBox)
 {
     if (!string.IsNullOrWhiteSpace(pwBox.Password))
     {
         var crypto = RijndaelManagedEncryption.EncryptRijndael(pwBox.Password);
         Certificado.Senha = crypto;
         var certificado = _certificateManager.GetFriendlyCertificate(Certificado.Caminho, pwBox.Password);
         Certificado.Nome         = certificado.FriendlySubjectName;
         Certificado.NumeroSerial = certificado.SerialNumber;
         IsButtonSaveEnabled      = true;
     }
 }
Пример #4
0
        public void CryptDecrypt_Success()
        {
            // Act
            var encrypted = RijndaelManagedEncryption.EncryptRijndael(strTest);
            var decrypted = RijndaelManagedEncryption.DecryptRijndael(encrypted);

            // Assert
            if (decrypted == strTest)
            {
                Assert.True(true);
            }
        }
Пример #5
0
        private static X509Certificate2 EscolherCertificado(CertificadoEntity certificadoEntity)
        {
            X509Certificate2 certificado;

            if (!string.IsNullOrWhiteSpace(certificadoEntity.Caminho))
            {
                certificado = CertificateManager.GetCertificateByPath(certificadoEntity.Caminho,
                                                                      RijndaelManagedEncryption.DecryptRijndael(certificadoEntity.Senha));
            }
            else
            {
                certificado = CertificateManager.GetCertificateBySerialNumber(certificadoEntity.NumeroSerial, false);
            }

            return(certificado);
        }
        private void EnviarCancelamentoNotaFiscal(NFCeModel notaFiscalModel)
        {
            X509Certificate2 certificado;

            var modeloNota = notaFiscalModel.Modelo.Contains("NFC-e") ? Modelo.Modelo65 : Modelo.Modelo55;
            var config     = _configuracaoService.GetConfiguracao();

            var emitente = _emissorService.GetEmissor();
            var codigoUF = (CodigoUfIbge)Enum.Parse(typeof(CodigoUfIbge), emitente.Endereco.UF);
            var ambiente = config.IsProducao ? Ambiente.Producao : Ambiente.Homologacao;

            var certificadoEntity = _certificadoService.GetCertificado();

            if (!string.IsNullOrWhiteSpace(certificadoEntity.Caminho))
            {
                certificado = _certificateManager.GetCertificateByPath(certificadoEntity.Caminho,
                                                                       RijndaelManagedEncryption.DecryptRijndael(certificadoEntity.Senha));
            }
            else
            {
                certificado = _certificateManager.GetCertificateBySerialNumber(certificadoEntity.NumeroSerial, false);
            }

            UF          = emitente.Endereco.UF;
            CodigoUF    = codigoUF;
            Cnpj        = emitente.CNPJ;
            Chave       = notaFiscalModel.Chave;
            Protocolo   = notaFiscalModel.Protocolo;
            ModeloNota  = modeloNota;
            Certificado = certificado;
            Ambiente    = ambiente;

            var app        = Application.Current;
            var mainWindow = app.MainWindow;

            new CancelarNotaWindow()
            {
                Owner = mainWindow
            }.ShowDialog();
        }
Пример #7
0
        public X509Certificate2 GetX509Certificate2()
        {
            X509Certificate2 certificado;
            var certificadoEntity = GetCertificado();

            if (certificadoEntity == null)
            {
                return(null);
            }

            if (!string.IsNullOrWhiteSpace(certificadoEntity.Caminho))
            {
                certificado = _certificateManager.GetCertificateByPath(certificadoEntity.Caminho,
                                                                       RijndaelManagedEncryption.DecryptRijndael(certificadoEntity.Senha));
            }
            else
            {
                certificado = _certificateManager.GetCertificateBySerialNumber(certificadoEntity.NumeroSerial, false);
            }

            return(certificado);
        }
        public int EmitirNotaContingencia(NotaFiscal notaFiscal, string cscId, string csc)
        {
            var qrCode = string.Empty;
            string newNodeXml;
            const string nFeNamespaceName = "http://www.portalfiscal.inf.br/nfe";
            var digVal = string.Empty;

            var config = _configuracaoService.GetConfiguracao();

            notaFiscal.Identificacao.Numero = _configuracaoService.ObterProximoNumeroNotaFiscal(notaFiscal.Identificacao.Modelo);
            notaFiscal.Identificacao.DataHoraEntradaContigencia = config.DataHoraEntradaContingencia;
            notaFiscal.Identificacao.JustificativaContigencia = config.JustificativaContingencia;
            notaFiscal.Identificacao.TipoEmissao = notaFiscal.Identificacao.Modelo == Modelo.Modelo65
                ? TipoEmissao.ContigenciaNfce
                : TipoEmissao.FsDa;
            notaFiscal.CalcularChave();

            X509Certificate2 certificado;

            var certificadoEntity = _certificadoRepository.GetCertificado();

            if (!string.IsNullOrWhiteSpace(certificadoEntity.Caminho))
                certificado = _certificateManager.GetCertificateByPath(certificadoEntity.Caminho,
                    RijndaelManagedEncryption.DecryptRijndael(certificadoEntity.Senha));
            else
                certificado = _certificateManager.GetCertificateBySerialNumber(certificadoEntity.NumeroSerial, false);

            if (notaFiscal.Identificacao.Ambiente == Ambiente.Homologacao)
                notaFiscal.Produtos[0].Descricao = "NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL";

            var refUri = "#NFe" + notaFiscal.Identificacao.Chave;

            var xml = Regex.Replace(XmlUtil.GerarXmlLoteNFe(notaFiscal, nFeNamespaceName), "<motDesICMS>1</motDesICMS>",
                string.Empty);
            XmlNode node = AssinaturaDigital.AssinarLoteComUmaNota(xml, refUri, certificado, ref digVal);

            if (notaFiscal.Identificacao.Modelo == Modelo.Modelo65)
            {
                qrCode = QrCodeUtil.GerarQrCodeNFe(notaFiscal.Identificacao.Chave, notaFiscal.Destinatario,
                    digVal, notaFiscal.Identificacao.Ambiente,
                    notaFiscal.Identificacao.DataHoraEmissao,
                    notaFiscal.TotalNFe.IcmsTotal.ValorTotalNFe.ToString("F", CultureInfo.InvariantCulture),
                    notaFiscal.TotalNFe.IcmsTotal.ValorTotalIcms.ToString("F", CultureInfo.InvariantCulture), cscId,
                    csc, notaFiscal.Identificacao.TipoEmissao);

                newNodeXml = node.InnerXml.Replace("<qrCode />", "<qrCode>" + qrCode + "</qrCode>");
            }
            else
            {
                newNodeXml = node.InnerXml.Replace("<infNFeSupl><qrCode /></infNFeSupl>", "");
            }

            var document = new XmlDocument();
            document.LoadXml(newNodeXml);
            node = document.DocumentElement;

            if (node == null) throw new ArgumentException("Xml inválido.");

            var lote = (TEnviNFe)XmlUtil.Deserialize<TEnviNFe>(node.OuterXml);
            var nfe = lote.NFe[0];

            //salvar nota PreEnvio aqui
            notaFiscal.Identificacao.Status = Status.CONTINGENCIA;

            var idNotaCopiaSeguranca =  _notaFiscalRepository.SalvarNotaFiscalPendente(notaFiscal,
                XmlUtil.GerarNfeProcXml(nfe, qrCode),
                notaFiscal.Identificacao.Ambiente);

            var notaFiscalEntity =  _notaFiscalRepository.GetNotaFiscalById(idNotaCopiaSeguranca, false);
            notaFiscalEntity.Status = (int)Status.CONTINGENCIA;
            var nfeProcXml = XmlUtil.GerarNfeProcXml(nfe, qrCode);

             _notaFiscalRepository.Salvar(notaFiscalEntity, nfeProcXml);
            notaFiscal.QrCodeUrl = qrCode;
            return idNotaCopiaSeguranca;
        }
        private MensagemRetornoTransmissaoNotasContingencia TransmitirLoteNotasFiscaisContingencia(List<string> nfeList,
    Modelo modelo)
        {
            var lote = new TEnviNFe
            {
                idLote = "999999",
                indSinc = TEnviNFeIndSinc.Item0,
                versao = "4.00",
                NFe = new TNFe[1]
            };
            //qual a regra pra gerar o id?
            //apenas uma nota no lote
            lote.NFe[0] = new TNFe(); //Gera tag <NFe /> vazia para usar no replace

            var parametroXml = XmlUtil.Serialize(lote, "http://www.portalfiscal.inf.br/nfe");
            parametroXml = parametroXml.Replace("<NFe />", XmlUtil.GerarXmlListaNFe(nfeList))
                .Replace("<motDesICMS>1</motDesICMS>", string.Empty);

            var document = new XmlDocument();
            document.LoadXml(parametroXml);
            var node = document.DocumentElement;

            var config = _configuracaoService.GetConfiguracao();

            var ambiente = config.IsProducao ? Ambiente.Producao : Ambiente.Homologacao;
            var codigoUf = (CodigoUfIbge)Enum.Parse(typeof(CodigoUfIbge), _emissorService.GetEmissor().Endereco.UF);
            X509Certificate2 certificado;

            var certificadoEntity = _certificadoRepository.GetCertificado();

            if (!string.IsNullOrWhiteSpace(certificadoEntity.Caminho))
                certificado = _certificateManager.GetCertificateByPath(certificadoEntity.Caminho,
                    RijndaelManagedEncryption.DecryptRijndael(certificadoEntity.Senha));
            else
                certificado = _certificateManager.GetCertificateBySerialNumber(certificadoEntity.NumeroSerial, false);

            try
            {
                var servico = _serviceFactory.GetService(modelo, ambiente, Servico.AUTORIZACAO, codigoUf, certificado);
                var client = (NFeAutorizacao4SoapClient)servico.SoapClient;

                var result = client.nfeAutorizacaoLote(node);
                var retorno = (TRetEnviNFe)XmlUtil.Deserialize<TRetEnviNFe>(result.OuterXml);

                return new MensagemRetornoTransmissaoNotasContingencia
                {
                    RetEnviNFeInfRec = (TRetEnviNFeInfRec)retorno.Item,
                    TipoMensagem = TipoMensagem.Sucesso
                };
            }
            catch (Exception e)
            {
                log.Error(e);
                if (!_isFirstTimeResending)
                {
                    _isFirstTimeResending = true;
                    return TransmitirLoteNotasFiscaisContingencia(nfeList, modelo);
                }

                _isFirstTimeResending = false;

                return new MensagemRetornoTransmissaoNotasContingencia
                {
                    TipoMensagem = TipoMensagem.ServicoIndisponivel
                };
            }
        }
        private List<RetornoNotaFiscal> ConsultarReciboLoteContingencia(string nRec, Modelo modelo)
        {
            var config = _configuracaoService.GetConfiguracao();
            X509Certificate2 certificado;

            var certificadoEntity = _certificadoRepository.GetCertificado();

            if (!string.IsNullOrWhiteSpace(certificadoEntity.Caminho))
                certificado = _certificateManager.GetCertificateByPath(certificadoEntity.Caminho,
                    RijndaelManagedEncryption.DecryptRijndael(certificadoEntity.Senha));
            else
                certificado = _certificateManager.GetCertificateBySerialNumber(certificadoEntity.NumeroSerial, false);

            var consultaRecibo = new TConsReciNFe
            {
                versao = "4.00",
                tpAmb = config.IsProducao ? XmlSchemas.NfeRetAutorizacao.Envio.TAmb.Item1 : XmlSchemas.NfeRetAutorizacao.Envio.TAmb.Item2,
                nRec = nRec
            };

            var parametroXml = XmlUtil.Serialize(consultaRecibo, "http://www.portalfiscal.inf.br/nfe");

            var node = new XmlDocument();
            node.LoadXml(parametroXml);

            var ambiente = config.IsProducao ? Ambiente.Producao : Ambiente.Homologacao;
            var codigoUf = (CodigoUfIbge)Enum.Parse(typeof(CodigoUfIbge), _emissorService.GetEmissor().Endereco.UF);

            try
            {
                var servico =
                    _serviceFactory.GetService(modelo, ambiente, Servico.RetAutorizacao, codigoUf, certificado);
                var client = (NFeRetAutorizacao4SoapClient)servico.SoapClient;

                var result = client.nfeRetAutorizacaoLote(node);

                var retorno = (TRetConsReciNFe)XmlUtil.Deserialize<TRetConsReciNFe>(result.OuterXml);

                return retorno.protNFe.Select(protNFe => new RetornoNotaFiscal
                {
                    Chave = protNFe.infProt.chNFe,
                    CodigoStatus = protNFe.infProt.cStat,
                    DataAutorizacao = protNFe.infProt.dhRecbto,
                    Motivo = protNFe.infProt.xMotivo,
                    Protocolo = protNFe.infProt.nProt,
                    Xml = XmlUtil.Serialize(protNFe, string.Empty)
                            .Replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", string.Empty)
                            .Replace("TProtNFe", "protNFe")
                            .Replace("<infProt xmlns=\"http://www.portalfiscal.inf.br/nfe\">", "<infProt>")
                })
                    .ToList();
            }
            catch (Exception e)
            {
                log.Error(e);
                if (!_isFirstTimeRecheckingRecipts)
                {
                    _isFirstTimeRecheckingRecipts = true;
                    return ConsultarReciboLoteContingencia(nRec, modelo);
                }

                _isFirstTimeRecheckingRecipts = false;
                return null;
            }
        }
        private async Task<List<string>> TransmitirConsultarLoteContingenciaAsync(ConfiguracaoEntity config,
    List<string> notasNfCe, Modelo modelo)
        {
            var retornoTransmissao = TransmitirLoteNotasFiscaisContingencia(notasNfCe, modelo);

            switch (retornoTransmissao.TipoMensagem)
            {
                case TipoMensagem.ErroValidacao:
                    return new List<string> { retornoTransmissao.Mensagem };
                case TipoMensagem.ServicoIndisponivel:
                    return new List<string> { MensagemErro };
            }

            var tempoEspera = int.Parse(retornoTransmissao.RetEnviNFeInfRec.tMed) * 1000;
            var erros = new List<string>();
            Thread.Sleep(tempoEspera);
            var resultadoConsulta = ConsultarReciboLoteContingencia(retornoTransmissao.RetEnviNFeInfRec.nRec, modelo);

            if (resultadoConsulta == null) return new List<string> { MensagemErro };

            foreach (var resultado in resultadoConsulta)
            {
                var nota = _notaFiscalRepository.GetNotaFiscalByChave(resultado.Chave);

                if (resultado.CodigoStatus == "100")
                {
                    nota.DataAutorizacao = DateTime.ParseExact(resultado.DataAutorizacao, "yyyy-MM-ddTHH:mm:sszzz",
                        CultureInfo.InvariantCulture);
                    nota.Protocolo = resultado.Protocolo;
                    nota.Status = (int)Status.ENVIADA;

                    var xml = await nota.LoadXmlAsync();
                    xml = xml.Replace("<protNFe />", resultado.Xml);

                     _notaFiscalRepository.Salvar(nota, xml);
                }
                else
                {
                    if (resultado.Motivo.Contains("Duplicidade"))
                    {
                        X509Certificate2 certificado;
                        var certificadoEntity = _certificadoRepository.GetCertificado();
                        var emitente = _emissorService.GetEmissor();

                        if (!string.IsNullOrWhiteSpace(certificadoEntity.Caminho))
                            certificado = _certificateManager.GetCertificateByPath(certificadoEntity.Caminho,
                                RijndaelManagedEncryption.DecryptRijndael(certificadoEntity.Senha));
                        else
                            certificado =
                                _certificateManager.GetCertificateBySerialNumber(certificadoEntity.NumeroSerial, false);

                        var retornoConsulta = _nfeConsulta.ConsultarNotaFiscal
                        (
                            nota.Chave,
                            emitente.Endereco.CodigoUF,
                            certificado,
                            config.IsProducao ? Ambiente.Producao : Ambiente.Homologacao,
                            nota.Modelo.Equals("65") ? Modelo.Modelo65 : Modelo.Modelo55
                        );

                        if (retornoConsulta.IsEnviada)
                        {
                            var protSerialized = XmlUtil.Serialize(retornoConsulta.Protocolo, string.Empty)
                                .Replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", string.Empty)
                                .Replace("TProtNFe", "protNFe");

                            protSerialized = Regex.Replace(protSerialized, "<infProt (.*?)>", "<infProt>");

                            nota.DataAutorizacao = retornoConsulta.DhAutorizacao;
                            nota.Protocolo = retornoConsulta.Protocolo.infProt.nProt;
                            nota.Status = (int)Status.ENVIADA;

                            var xml = await nota.LoadXmlAsync();
                            xml = xml.Replace("<protNFe />", protSerialized);

                             _notaFiscalRepository.Salvar(nota, xml);
                        }
                        else
                        {
                            erros.Add(
                                $"Modelo: {nota.Modelo} Nota: {nota.Numero} Série: {nota.Serie} \nMotivo: {resultado.Motivo}"); //O que fazer com essas mensagens de erro?
                        }
                    }
                    else
                    {
                        erros.Add(
                            $"Modelo: {nota.Modelo} Nota: {nota.Numero} Série: {nota.Serie} \nMotivo: {resultado.Motivo}"); //O que fazer com essas mensagens de erro?
                    }
                }
            }

            return erros;
        }
Пример #12
0
 /// <summary>
 /// Gets the decrypted string value for a given encrypted string.
 /// </summary>
 /// <param name="value"></param>
 /// <returns></returns>
 public static string DecryptValue(string value)
 {
     return(RijndaelManagedEncryption.DecryptRijndael(value, _salt));
 }
Пример #13
0
        public bool IsNotaFiscalValida(NotaFiscal notaFiscal, string cscId, string csc)
        {
            string qrCode = "";

            string refUri           = "#NFe" + notaFiscal.Identificacao.Chave;
            string digVal           = "";
            string nFeNamespaceName = "http://www.portalfiscal.inf.br/nfe";

            X509Certificate2 certificado;

            var certificadoEntity = new CertificadoRepository(new NFeContext()).GetCertificado();

            if (!string.IsNullOrWhiteSpace(certificadoEntity.Caminho))
            {
                certificado = CertificateManager.GetCertificateByPath(certificadoEntity.Caminho,
                                                                      RijndaelManagedEncryption.DecryptRijndael(certificadoEntity.Senha));
            }
            else
            {
                certificado = CertificateManager.GetCertificateBySerialNumber(certificadoEntity.NumeroSerial, false);
            }

            var     xml  = Regex.Replace(XmlUtil.GerarXmlLoteNFe(notaFiscal, nFeNamespaceName), "<motDesICMS>1</motDesICMS>", string.Empty);;
            XmlNode node = AssinaturaDigital.AssinarLoteComUmaNota(xml, refUri, certificado, ref digVal);

            TNFe   nfe        = null;
            string newNodeXml = string.Empty;

            try
            {
                var codigoUF = (CodigoUfIbge)Enum.Parse(typeof(CodigoUfIbge), notaFiscal.Emitente.Endereco.UF);

                if (notaFiscal.Identificacao.Modelo == Modelo.Modelo65)
                {
                    qrCode = QrCodeUtil.GerarQrCodeNFe(notaFiscal.Identificacao.Chave, notaFiscal.Destinatario, digVal, notaFiscal.Identificacao.Ambiente,
                                                       notaFiscal.Identificacao.DataHoraEmissao, notaFiscal.TotalNFe.IcmsTotal.ValorTotalNFe.ToString("F", CultureInfo.InvariantCulture),
                                                       notaFiscal.TotalNFe.IcmsTotal.ValorTotalIcms.ToString("F", CultureInfo.InvariantCulture), cscId, csc, notaFiscal.Identificacao.TipoEmissao);

                    newNodeXml = node.InnerXml.Replace("<qrCode />", "<qrCode>" + qrCode + "</qrCode>");
                }
                else
                {
                    newNodeXml = node.InnerXml;
                }

                var document = new XmlDocument();
                document.LoadXml(newNodeXml);
                node = document.DocumentElement;

                TEnviNFe lote = (TEnviNFe)XmlUtil.Deserialize <TEnviNFe>(node.OuterXml);
                nfe = lote.NFe[0];

                ValidadorXml.ValidarXml(node.OuterXml, "enviNFe_v4.00.xsd");

                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
        internal async Task <int> EnviarNotaContingencia(NotaFiscal notaFiscal, string cscId, string csc)
        {
            TNFe   nfe              = null;
            string qrCode           = string.Empty;
            string newNodeXml       = string.Empty;
            string nFeNamespaceName = "http://www.portalfiscal.inf.br/nfe";
            string digVal           = string.Empty;

            int idNotaCopiaSeguranca = 0;

            var config = ConfiguracaoService.GetConfiguracao();

            notaFiscal.Identificacao.DataHoraEntradaContigencia = config.DataHoraEntradaContingencia;
            notaFiscal.Identificacao.JustificativaContigencia   = config.JustificativaContingencia;
            notaFiscal.Identificacao.TipoEmissao = notaFiscal.Identificacao.Modelo == Modelo.Modelo65 ? TipoEmissao.ContigenciaNfce : TipoEmissao.FsDa;
            notaFiscal.CalcularChave();

            X509Certificate2 certificado;

            var certificadoEntity = new CertificadoRepository(new NFeContext()).GetCertificado();

            if (!string.IsNullOrWhiteSpace(certificadoEntity.Caminho))
            {
                certificado = CertificateManager.GetCertificateByPath(certificadoEntity.Caminho,
                                                                      RijndaelManagedEncryption.DecryptRijndael(certificadoEntity.Senha));
            }
            else
            {
                certificado = CertificateManager.GetCertificateBySerialNumber(certificadoEntity.NumeroSerial, false);
            }

            if (notaFiscal.Identificacao.Ambiente == Domain.Services.Identificacao.Ambiente.Homologacao)
            {
                notaFiscal.Produtos[0].Descricao = "NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL";
            }

            var refUri = "#NFe" + notaFiscal.Identificacao.Chave;

            var     xml  = Regex.Replace(XmlUtil.GerarXmlLoteNFe(notaFiscal, nFeNamespaceName), "<motDesICMS>1</motDesICMS>", string.Empty);
            XmlNode node = AssinaturaDigital.AssinarLoteComUmaNota(xml, refUri, certificado, ref digVal);

            var codigoUF = (CodigoUfIbge)Enum.Parse(typeof(CodigoUfIbge), notaFiscal.Emitente.Endereco.UF);

            if (notaFiscal.Identificacao.Modelo == Modelo.Modelo65)
            {
                qrCode = QrCodeUtil.GerarQrCodeNFe(notaFiscal.Identificacao.Chave, notaFiscal.Destinatario, digVal, notaFiscal.Identificacao.Ambiente,
                                                   notaFiscal.Identificacao.DataHoraEmissao, notaFiscal.TotalNFe.IcmsTotal.ValorTotalNFe.ToString("F", CultureInfo.InvariantCulture),
                                                   notaFiscal.TotalNFe.IcmsTotal.ValorTotalIcms.ToString("F", CultureInfo.InvariantCulture), cscId, csc, notaFiscal.Identificacao.TipoEmissao);

                newNodeXml = node.InnerXml.Replace("<qrCode />", "<qrCode>" + qrCode + "</qrCode>");
            }
            else
            {
                newNodeXml = node.InnerXml.Replace("<infNFeSupl><qrCode /></infNFeSupl>", "");
            }

            var document = new XmlDocument();

            document.LoadXml(newNodeXml);
            node = document.DocumentElement;

            TEnviNFe lote = (TEnviNFe)XmlUtil.Deserialize <TEnviNFe>(node.OuterXml);

            nfe = lote.NFe[0];

            //salvar nota PreEnvio aqui
            notaFiscal.Identificacao.Status = NFe.Repository.Status.CONTINGENCIA;

            var notaFiscalService = new NotaFiscalService();

            idNotaCopiaSeguranca = await notaFiscalService.SalvarNotaFiscalPendenteAsync(notaFiscal, XmlUtil.GerarNfeProcXml(nfe, qrCode), notaFiscal.Identificacao.Ambiente);

            var notaFiscalEntity = await notaFiscalService.GetNotaFiscalByIdAsync(idNotaCopiaSeguranca, false);

            notaFiscalEntity.Status = (int)Status.CONTINGENCIA;
            string nfeProcXml = XmlUtil.GerarNfeProcXml(nfe, qrCode);

            await notaFiscalService.SalvarAsync(notaFiscalEntity, nfeProcXml);

            notaFiscal.QrCodeUrl = qrCode;
            return(idNotaCopiaSeguranca);
        }
        private List <RetornoNotaFiscal> ConsultarReciboLoteContingencia(string nRec, Modelo modelo)
        {
            var config = ConfiguracaoService.GetConfiguracao();
            X509Certificate2 certificado = null;

            var certificadoEntity = CertificadoService.GetCertificado();

            if (!string.IsNullOrWhiteSpace(certificadoEntity.Caminho))
            {
                certificado = CertificateManager.GetCertificateByPath(certificadoEntity.Caminho,
                                                                      RijndaelManagedEncryption.DecryptRijndael(certificadoEntity.Senha));
            }
            else
            {
                certificado = CertificateManager.GetCertificateBySerialNumber(certificadoEntity.NumeroSerial, false);
            }

            var consultaRecibo = new TConsReciNFe();

            consultaRecibo.versao = "4.00";
            consultaRecibo.tpAmb  = config.IsProducao ? XmlSchemas.NfeRetAutorizacao.Envio.TAmb.Item1 : XmlSchemas.NfeRetAutorizacao.Envio.TAmb.Item2;
            consultaRecibo.nRec   = nRec;

            string parametroXML = XmlUtil.Serialize(consultaRecibo, "http://www.portalfiscal.inf.br/nfe");

            var node = new XmlDocument();

            node.LoadXml(parametroXML);

            Ambiente ambiente = config.IsProducao ? Ambiente.Producao : Ambiente.Homologacao;
            var      codigoUF = (CodigoUfIbge)Enum.Parse(typeof(CodigoUfIbge), EmissorService.GetEmissor().Endereco.UF);

            try
            {
                var servico = ServiceFactory.GetService(modelo, ambiente, Factory.Servico.RetAutorizacao, codigoUF, certificado);
                var client  = (NFeRetAutorizacao4.NFeRetAutorizacao4SoapClient)servico.SoapClient;

                var result = client.nfeRetAutorizacaoLote(node);

                TRetConsReciNFe          retorno             = (TRetConsReciNFe)XmlUtil.Deserialize <TRetConsReciNFe>(result.OuterXml);
                List <RetornoNotaFiscal> retornoConsultaList = new List <RetornoNotaFiscal>();

                foreach (var protNFe in retorno.protNFe)
                {
                    var retornoConsultaNota = new RetornoNotaFiscal();

                    retornoConsultaNota.Chave           = protNFe.infProt.chNFe;
                    retornoConsultaNota.CodigoStatus    = protNFe.infProt.cStat;
                    retornoConsultaNota.DataAutorizacao = protNFe.infProt.dhRecbto;
                    retornoConsultaNota.Motivo          = protNFe.infProt.xMotivo;
                    retornoConsultaNota.Protocolo       = protNFe.infProt.nProt;
                    retornoConsultaNota.Xml             = XmlUtil.Serialize(protNFe, string.Empty)
                                                          .Replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", string.Empty)
                                                          .Replace("TProtNFe", "protNFe")
                                                          .Replace("<infProt xmlns=\"http://www.portalfiscal.inf.br/nfe\">", "<infProt>");

                    retornoConsultaList.Add(retornoConsultaNota);
                }

                return(retornoConsultaList);
            }
            catch (Exception)
            {
                if (!_isFirstTimeRecheckingRecipts)
                {
                    _isFirstTimeRecheckingRecipts = true;
                    return(ConsultarReciboLoteContingencia(nRec, modelo));
                }
                else
                {
                    _isFirstTimeRecheckingRecipts = false;
                    return(null);
                }
            }
        }
Пример #16
0
 protected void Page_Load(object sender, EventArgs e)
 {
     salt       = Guid.NewGuid().ToString();
     textEncrip = RijndaelManagedEncryption.EncryptRijndael(textNormal, salt);
     textNormal = RijndaelManagedEncryption.DecryptRijndael(textEncrip, salt);
 }
Пример #17
0
        static void Main(string[] args)
        {
            try
            {
                GlobalApp.oLog      = new LOGFiles(GlobalApp.FolderLog.Trim(), "TestConsole", "Program.cs", "Main", "TestConsole", AssemblyInfo.Company.Trim());
                GlobalApp.DetailLog = new List <DetailLOG>(); GlobalApp.iCount = 1; GlobalApp.Numero = 0; GlobalApp.Mensaje = string.Empty; GlobalApp.FechaActual = DateTime.Now; _oTime0 = DateTime.Now;
                if (Directory.Exists(GlobalApp.FolderLog.Trim()) == false)
                {
                    Directory.CreateDirectory(GlobalApp.FolderLog.Trim());
                }                                                                                                                              // Carpeta de los archivos LOG de la aplicación.
                if (Directory.Exists(GlobalApp.FolderTemporal.Trim()) == false)
                {
                    Directory.CreateDirectory(GlobalApp.FolderTemporal.Trim());
                }                                                                                                                              // Carpeta de archivo de reportes finales.
                if (Directory.Exists(GlobalApp.FolderLayOut.Trim()) == false)
                {
                    Directory.CreateDirectory(GlobalApp.FolderLayOut.Trim());
                }                                                                                                                              // Carpeta de archivo de layout.

                Console.WriteLine("Consola de aplicación en .NET Core.\nVersión " + AssemblyInfo.Version.ToString());
                Console.WriteLine("México " + DateTime.Now.Year.ToString() + ".\n");

                Console.WriteLine("Fecha de inicio: " + _oTime0.ToString());

                GlobalApp.DetailLog.Add(new DetailLOG()
                {
                    Id         = GlobalApp.iCount++,
                    Fecha      = DateTime.Now.ToString("yyyy'/'MM'/'dd' 'hh':'mm':'ss'.'fff' 'tt"),
                    TipoEvento = TipoInformacion.Informacion,
                    Numero     = 0,
                    Comentario = "Fecha de inicio: " + _oTime0.ToString()
                });

                // Inicializamos las variables.
                InitVars();

                Console.WriteLine("Fecha universal: {0}", Tool.ToDateUniversal(DateTime.Now));

                var _ValoraCifrar = "Que_Chingue_A_Su_Mother_AMLO_Y_EL_AMERICA";
                var _strNewGUID   = Guid.NewGuid().ToString();
                Console.WriteLine("Valor a cifrar: {0}. Valor cifrado: {1}.", _ValoraCifrar, RijndaelManagedEncryption.EncryptRijndael(_ValoraCifrar, _strNewGUID));
                Console.WriteLine("Valor desencriptado: {0}.", RijndaelManagedEncryption.DecryptRijndael(RijndaelManagedEncryption.EncryptRijndael(_ValoraCifrar, _strNewGUID), _strNewGUID));

                // Mapeo de DataTables.
                var priestsDataSet = DataSetGenerator.Priests();
                DataNamesMapper <Person> mapper  = new DataNamesMapper <Person>();
                List <Person>            persons = mapper.Map(priestsDataSet.Tables[0]).ToList();

                var ranchersDataSet = DataSetGenerator.Ranchers();
                persons.AddRange(mapper.Map(ranchersDataSet.Tables[0]));

                foreach (var person in persons)
                {
                    Console.WriteLine("First Name: " + person.FirstName + ", Last Name: " + person.LastName
                                      + ", Date of Birth: " + person.DateOfBirth.ToShortDateString()
                                      + ", Job Title: " + person.JobTitle + ", Nickname: " + person.TakenName
                                      + ", Is American: " + person.IsAmerican);
                }

                // Cargando el archivo de configuración de la aplicación 'appsettings.json'.
                var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
                              .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

                IConfigurationRoot configuration = builder.Build();

                // Leemos algunos de sus valores de la configuración,.
                string dbConn  = configuration.GetSection("ConnectionStrings").GetSection("SQLServerConnectionBD").Value;
                string dbConn2 = configuration.GetSection("ConnectionStrings").GetSection("MariaDBConnectionBD").Value;

                // Limpiamos esta variable.
                configuration = null;

                Console.WriteLine("Cadena de conexión a Microsoft SQL Server: {0}", dbConn);
                Console.WriteLine("Cadena de conexión a MariaDB/MySQL Server: {0}", dbConn2);

                Console.WriteLine("Fecha universal: {0}", Tool.ToDateUniversal(DateTime.Now));

                var strDato = "CapMax = ((DepositoConceptoJubilacionPension - CargosDomiciliados - CargosConceptoCreditos) * 0.4);nnCapMax=n((DepositoConceptoJubilacionPension - CargosDomiciliados - CargosConceptoCreditos) - CapMax) n> (NúmeroCasasComerciales < 2 ? 400 : 800)? CapMax : (NúmeroCasasComerciales < 2 ? 400 : 800);nnCapMax = CapMax > 0 ? CapMax : 0;tnnCapMax = NúmeroCasasComerciales >= 3 ? 0 : CapMax;";
                Console.WriteLine("Dato anterior: {0}", strDato);
                strDato = Regex.Replace(strDato, Patrones.PatronAlphaLatino.Trim(), string.Empty);
                Console.WriteLine("Dato nuevo: {0}", strDato);

                var ArchivoReporteStr = string.Empty;

                // Uso de DBFactory.
                // El primer parametro es el nombre de la conexión a Base de Datos, según en el archivo AppSettings.json.
                // El segundo parametro es el tipo de conexión por plataforma de Base de Datos.
                Console.WriteLine("Haciendo una consulta SQL a Base de Datos (AWS Redshift via ODBC...)");
                using (var oDb = new DBManager("AWSConnectionBD", DataBaseProviders.Odbc))
                {
                    // Carga de parametros.
                    // var _oParam = new List<IDbDataParameter>();
                    // _oParam.Add(oDb.CreateParameter("@Id", valor1, System.Data.DBType.String))
                    // _oParam.Add(oDb.CreateParameter("@Id2", valor2, System.Data.DBType.String))
                    // var oDt = oDb.GetDataToDataTable("SQL_Command_Strng", System.Data.CommandType.Text, _oParam.ToArray());

                    var oDt = oDb.GetDataToDataTable("SELECT * FROM public.\"schema-convdatosgenerales-keops\" t1;", System.Data.CommandType.Text, null);
                    Console.WriteLine("Consulta ejecutada correctamente. Total de registros: {0}.", oDt.Rows.Count);

                    // Exportar un query de Base de Datos directo a archivo de texto plano.
                    Console.WriteLine("Generando reporte de bases de datos...");
                    ArchivoReporteStr = Path.Combine(GlobalApp.FolderTemporal.Trim(), string.Format("{0}.txt", Guid.NewGuid().ToString()));
                    oDb.ExportData(ArchivoReporteStr, "|", "SELECT * FROM public.\"schema-convdatosgenerales-keops\" t1;", System.Data.CommandType.Text, null);
                    Console.WriteLine("El reporte se ha generado correctamente en {0}", ArchivoReporteStr.Trim());
                } // Fin de la conexión de AWS Redshift via ODBC.

                Console.WriteLine("Haciendo una consulta SQL a Base de Datos (SQL Server Azure...)");
                using (var oDb = new DBManager("SQLServerConnectionBD", DataBaseProviders.SQLServer))
                {
                    var oDt = oDb.GetDataToDataTable("SELECT * FROM products t1;", System.Data.CommandType.Text, null);
                    Console.WriteLine("Consulta ejecutada correctamente. Total de registros: {0}.", oDt.Rows.Count);

                    Console.WriteLine("Generando reporte de bases de datos...");
                    ArchivoReporteStr = Path.Combine(GlobalApp.FolderTemporal.Trim(), string.Format("{0}.csv", Guid.NewGuid().ToString()));
                    oDb.ExportData(ArchivoReporteStr, ",", "SELECT * FROM products t1;", System.Data.CommandType.Text, null);
                    Console.WriteLine("El reporte se ha generado correctamente en {0}", ArchivoReporteStr.Trim());
                } // Fin de la conexión para SQL Server Azure.

                Console.WriteLine("Haciendo una consulta SQL a Base de Datos (MySQL Server/MariaDB Server...)");
                using (var oDb = new DBManager("MariaDBConnectionBD", DataBaseProviders.MySQLServer))
                {
                    _oSb.Clear().AppendFormat("SHOW DATABASES;");

                    var s = oDb.GetDataToMapping <ListaBD>(_oSb.ToString(), System.Data.CommandType.Text, null);

                    Console.WriteLine("Consulta ejecutada correctamente. Total de registros: {0}.", s.Count);

                    // Recorremos la lista.
                    Console.WriteLine("Leyendo la lista de Bases de Datos.");

                    foreach (var u in s)
                    {
                        Console.WriteLine("{0}", u.Database.Trim());
                    }

                    // Guardamos la lista de bases de datos en un archivo CSV.
                    Console.WriteLine("Generando reporte de bases de datos...");
                    ArchivoReporteStr = Path.Combine(GlobalApp.FolderTemporal.Trim(), string.Format("{0}.dat", Guid.NewGuid().ToString()));
                    oDb.ExportData(ArchivoReporteStr, "|", _oSb.ToString(), System.Data.CommandType.Text, null);
                    Console.WriteLine("El reporte se ha generado correctamente en {0}", ArchivoReporteStr.Trim());

                    // Exportar directamente a Google Drive.
                    Console.WriteLine("Generando reporte de bases de datos para Google Drive...");
                    var UrlSourceDrive = string.Empty; var IdKeyGoogleDrive = string.Empty;
                    oDb.ExportDataToGoogleSheetsInFolderWithPermissions(ArchivoReporteStr.Replace(".dat", ".csv"), ",", "ClientId", "SecretId", GlobalApp.FolderPersonal.Trim(), "AplicacionGoogleAPI", "Identificador_Google_Drive", "*****@*****.**",
                                                                        GoogleDrivePermissions.Reader, GoogleDriveGroups.User, false, false, true, out UrlSourceDrive, out IdKeyGoogleDrive, _oSb.ToString(), System.Data.CommandType.Text, null);

                    Console.WriteLine("Identificadores de Google Drive: {0} y {1}", UrlSourceDrive, IdKeyGoogleDrive);
                } // Fin de la conexión para MySQL Server/ MariaDB.

                _oSb = null;
            }
            catch (Exception oEx)
            {
                GlobalApp.Numero = 100; GlobalApp.Mensaje = string.Concat(((oEx.InnerException == null) ? oEx.Message.Trim() : oEx.InnerException.Message.ToString()));
                GlobalApp.DetailLog.Add(new DetailLOG()
                {
                    Id         = GlobalApp.iCount++,
                    Fecha      = DateTime.Now.ToString("yyyy'/'MM'/'dd' 'hh':'mm':'ss'.'fff' 'tt"),
                    TipoEvento = TipoInformacion.ErrorProceso,
                    Numero     = GlobalApp.Numero,
                    Comentario = GlobalApp.Mensaje
                });
                Console.WriteLine("Ocurrieron errores al ejecutar este proceso: " + GlobalApp.Mensaje.Trim() + ". Seguimiento de pila: " + oEx.StackTrace.Trim());
            }
            finally
            {
                // Limpiamos variables.
                _oTime1 = DateTime.Now; _oTimeTotal = new TimeSpan(_oTime1.Ticks - _oTime0.Ticks); DestroyVars();

                // Obtengo la fecha de termino.
                GlobalApp.DetailLog.Add(new DetailLOG()
                {
                    Id         = GlobalApp.iCount++,
                    Fecha      = DateTime.Now.ToString("yyyy'/'MM'/'dd' 'hh':'mm':'ss'.'fff' 'tt"),
                    TipoEvento = TipoInformacion.Informacion,
                    Numero     = 0,
                    Comentario = "Fecha de termino: " + _oTime1.ToString()
                });
                Console.WriteLine("Fecha de termino: " + _oTime1.ToString());

                // Obtengo el tiempo transcurrido.
                GlobalApp.DetailLog.Add(new DetailLOG()
                {
                    Id         = GlobalApp.iCount++,
                    Fecha      = DateTime.Now.ToString("yyyy'/'MM'/'dd' 'hh':'mm':'ss'.'fff' 'tt"),
                    TipoEvento = TipoInformacion.Informacion,
                    Numero     = 0,
                    Comentario = "Tiempo transcurrido en ejecutarse este proceso: " + _oTimeTotal.ToString()
                });
                Console.WriteLine("Tiempo transcurrido en ejecutarse este proceso: " + _oTimeTotal.ToString());

                // Guardamos los mensajes en el log y limpiamos las variables.
                GlobalApp.oLog.ListEvents = GlobalApp.DetailLog; XMLSerializacion <LOGFiles> .WriteToXmlFile(Path.Combine(GlobalApp.FolderLog, string.Concat("LOGTestConsole_", DateTime.Now.ToString("yyyy''MM''dd''hh''mm''ss''fff"), ".xml")), GlobalApp.oLog, false);

                GlobalApp.DetailLog = null; GlobalApp.oLog = null;

                Console.WriteLine("Pulse cualquier tecla para salir..."); Console.ReadLine();
            }
        }
        public int EnviarNotaFiscal(NotaFiscal notaFiscal, string cscId, string csc)
        {
            if (notaFiscal.Identificacao.Ambiente == Ambiente.Homologacao)
            {
                notaFiscal.Produtos[0].Descricao = "NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL";
            }

            X509Certificate2 certificado;

            var certificadoEntity = _certificadoRepository.GetCertificado();

            if (!string.IsNullOrWhiteSpace(certificadoEntity.Caminho))
            {
                certificado = _certificateManager.GetCertificateByPath(certificadoEntity.Caminho,
                                                                       RijndaelManagedEncryption.DecryptRijndael(certificadoEntity.Senha));
            }
            else
            {
                certificado = _certificateManager.GetCertificateBySerialNumber(certificadoEntity.NumeroSerial, false);
            }

            if (!IsNotaFiscalValida(notaFiscal, cscId, csc, certificado))
            {
                throw new ArgumentException("Nota fiscal inválida.");
            }

            try
            {
                var              qrCode               = "";
                TNFe             nfe                  = null;
                var              newNodeXml           = string.Empty;
                var              idNotaCopiaSeguranca = 0;
                NotaFiscalEntity notaFiscalEntity     = null;

                var refUri           = "#NFe" + notaFiscal.Identificacao.Chave;
                var digVal           = "";
                var nFeNamespaceName = "http://www.portalfiscal.inf.br/nfe";

                var xml = Regex.Replace(XmlUtil.GerarXmlLoteNFe(notaFiscal, nFeNamespaceName),
                                        "<motDesICMS>1</motDesICMS>", string.Empty);
                XmlNode node = AssinaturaDigital.AssinarLoteComUmaNota(xml, refUri, certificado, ref digVal);

                try
                {
                    var codigoUf = (CodigoUfIbge)Enum.Parse(typeof(CodigoUfIbge), notaFiscal.Emitente.Endereco.UF);

                    newNodeXml = PreencherQrCode(notaFiscal, cscId, csc, ref qrCode, digVal, node);

                    var document = new XmlDocument();
                    document.LoadXml(newNodeXml);
                    node = document.DocumentElement;

                    var lote = (TEnviNFe)XmlUtil.Deserialize <TEnviNFe>(node.OuterXml);
                    nfe = lote.NFe[0];

                    var configuração = _configuracaoRepository.GetConfiguracao();

                    if (configuração.IsContingencia)
                    {
                        return(_emiteNotaFiscalContingenciaService.EmitirNotaContingencia(notaFiscal, cscId, csc));
                    }

                    NFeAutorizacao4Soap client = CriarClientWS(notaFiscal, certificado, codigoUf);
                    idNotaCopiaSeguranca = SalvarNotaFiscalPréEnvio(notaFiscal, qrCode, nfe);
                    TProtNFe protocolo = RetornarProtocoloParaLoteSomenteComUmaNotaFiscal(node, client);

                    if (protocolo.infProt.cStat.Equals("100"))
                    {
                        notaFiscalEntity =
                            _notaFiscalRepository.GetNotaFiscalById(idNotaCopiaSeguranca, false);
                        notaFiscalEntity.Status          = (int)Status.ENVIADA;
                        notaFiscalEntity.DataAutorizacao = DateTime.ParseExact(protocolo.infProt.dhRecbto,
                                                                               "yyyy-MM-ddTHH:mm:sszzz", CultureInfo.InvariantCulture);

                        notaFiscalEntity.Protocolo = protocolo.infProt.nProt;
                        var xmlNFeProc = XmlUtil.GerarNfeProcXml(nfe, qrCode, protocolo);
                        _notaFiscalRepository.Salvar(notaFiscalEntity, xmlNFeProc);
                    }
                    else
                    {
                        if (protocolo.infProt.xMotivo.Contains("Duplicidade"))
                        {
                            notaFiscalEntity = CorrigirNotaDuplicada(notaFiscal, qrCode, nFeNamespaceName,
                                                                     certificado, nfe, idNotaCopiaSeguranca);
                        }
                        else
                        {
                            //Nota continua com status pendente nesse caso
                            XmlUtil.SalvarXmlNFeComErro(notaFiscal, node);
                            var mensagem =
                                string.Concat(
                                    "O xml informado é inválido de acordo com o validar da SEFAZ. Nota Fiscal não enviada!",
                                    "\n", protocolo.infProt.xMotivo);
                            throw new ArgumentException(mensagem);
                        }
                    }

                    AtribuirValoresApósEnvioComSucesso(notaFiscal, qrCode, notaFiscalEntity);
                    return(idNotaCopiaSeguranca);
                }
                catch (Exception e)
                {
                    log.Error(e);
                    if (e is WebException || e.InnerException is WebException)
                    {
                        throw new Exception("Serviço indisponível ou sem conexão com a internet.",
                                            e.InnerException);
                    }

                    try
                    {
                        notaFiscalEntity = VerificarSeNotaFoiEnviada(notaFiscal, qrCode, nfe,
                                                                     idNotaCopiaSeguranca, notaFiscalEntity, nFeNamespaceName, certificado);
                    }
                    catch (Exception retornoConsultaException)
                    {
                        log.Error(retornoConsultaException);
                        XmlUtil.SalvarXmlNFeComErro(notaFiscal, node);
                        throw;
                    }

                    AtribuirValoresApósEnvioComSucesso(notaFiscal, qrCode, notaFiscalEntity);
                    return(idNotaCopiaSeguranca);
                }
            }
            catch (Exception e)
            {
                log.Error(e);
                //Necessário para não tentar enviar a mesma nota como contingência.
                _configuracaoService.SalvarPróximoNúmeroSérie(notaFiscal.Identificacao.Modelo,
                                                              notaFiscal.Identificacao.Ambiente);

                if (notaFiscal.Identificacao.Modelo == Modelo.Modelo55)
                {
                    throw;
                }

                var message = e.InnerException != null ? e.InnerException.Message : e.Message;
                NotaEmitidaEmContingenciaEvent(message, notaFiscal.Identificacao.DataHoraEmissao);
                return(_emiteNotaFiscalContingenciaService.EmitirNotaContingencia(notaFiscal, cscId, csc));
            }
            finally
            {
                _configuracaoService.SalvarPróximoNúmeroSérie(notaFiscal.Identificacao.Modelo,
                                                              notaFiscal.Identificacao.Ambiente);
            }
        }