コード例 #1
0
        public async void AtivarModoOnline()
        {
            var configuração             = _configuracaoRepository.GetConfiguracao();
            var dataHoraContingencia     = configuração.DataHoraEntradaContingencia;
            var primeiraNotaContingencia =
                _notaFiscalRepository.GetPrimeiraNotaEmitidaEmContingencia(dataHoraContingencia, DateTime.Now);

            NotaFiscalEntity notaParaCancelar = null;

            if (primeiraNotaContingencia != null)
            {
                var numero = int.Parse(primeiraNotaContingencia.Numero) - 1;
                notaParaCancelar = _notaFiscalRepository.GetNota(numero.ToString(), primeiraNotaContingencia.Serie,
                                                                 primeiraNotaContingencia.Modelo);
            }

            var mensagensErro = await _emiteNotaFiscalContingenciaService.TransmitirNotasFiscalEmContingencia();

            if (mensagensErro != null)
            {
                _emiteNotaFiscalContingenciaService.InutilizarCancelarNotasPendentesContingencia(notaParaCancelar,
                                                                                                 _notaFiscalRepository);
                NotasTransmitidasEvent(mensagensErro);
            }

            configuração.IsContingencia = false;
            _configuracaoRepository.Salvar(configuração);
        }
コード例 #2
0
        public int SalvarNotaFiscalPendente(NotaFiscal notaFiscal, string xml,
                                            Ambiente ambiente)
        {
            var notaFiscalEntity = new NotaFiscalEntity
            {
                UfDestinatario = notaFiscal.Destinatario?.Endereco != null
                    ? notaFiscal.Destinatario.Endereco.UF
                    : notaFiscal.Emitente.Endereco.UF,
                Destinatario = notaFiscal.Destinatario == null
                    ? "CONSUMIDOR NÃO IDENTIFICADO"
                    : notaFiscal.Destinatario.NomeRazao,
                DocumentoDestinatario = notaFiscal.Destinatario?.Documento,
                Status        = (int)notaFiscal.Identificacao.Status,
                Chave         = notaFiscal.Identificacao.Chave,
                DataEmissao   = notaFiscal.Identificacao.DataHoraEmissao,
                Modelo        = notaFiscal.Identificacao.Modelo == Modelo.Modelo55 ? "55" : "65",
                Serie         = notaFiscal.Identificacao.Serie.ToString(),
                TipoEmissao   = notaFiscal.Identificacao.TipoEmissao.ToString(),
                ValorDesconto = notaFiscal.TotalNFe.IcmsTotal.ValorTotalDesconto,
                ValorDespesas = notaFiscal.TotalNFe.IcmsTotal.ValorDespesasAcessorias,
                ValorFrete    = notaFiscal.TotalNFe.IcmsTotal.ValorTotalFrete,
                ValorICMS     = notaFiscal.TotalNFe.IcmsTotal.ValorTotalIcms,
                ValorProdutos = notaFiscal.ValorTotalProdutos,
                ValorSeguro   = notaFiscal.TotalNFe.IcmsTotal.ValorTotalSeguro,
                ValorTotal    = notaFiscal.TotalNFe.IcmsTotal.ValorTotalNFe,
                Ambiente      = ambiente == Ambiente.Homologacao ? 2 : 1,
                Numero        = notaFiscal.Identificacao.Numero,
                IsProducao    = ambiente == Ambiente.Producao
            };

            return(Salvar(notaFiscalEntity, xml));
        }
コード例 #3
0
 public virtual int Salvar(NotaFiscalEntity notaFiscalEntity, string xml)
 {
     try
     {
         if (notaFiscalEntity.Status != (int)Status.CANCELADA)
         {
             notaFiscalEntity.XmlPath = XmlFileHelper.SaveXmlFile(notaFiscalEntity, xml);
         }
         return(Salvar(notaFiscalEntity));
     }
     catch (Exception e)
     {
         log.Error(e);
         try
         {
             XmlFileHelper.DeleteXmlFile(notaFiscalEntity);
             throw;
         }
         catch (Exception ex)
         {
             log.Error(ex);
             throw new Exception("Não foi possível remover o xml de nota fiscal: " + e.Message);
         }
     }
 }
コード例 #4
0
        public void InutilizarCancelarNotasPendentesContingencia(NotaFiscalEntity notaParaCancelar,
            INotaFiscalRepository notaFiscalRepository)
        {
            if (notaParaCancelar == null || notaParaCancelar.Status == 0)
                return;

            var emitente = _emissorService.GetEmissor();
            var ufEmissor = emitente.Endereco.UF;
            var codigoUf = UfToCodigoUfConversor.GetCodigoUf(ufEmissor);

            var certificado = _certificadoService.GetX509Certificate2();
            var ambiente = (Ambiente)notaParaCancelar.Ambiente - 1;
            var modelo = notaParaCancelar.Modelo.Equals("55") ? Modelo.Modelo55 : Modelo.Modelo65;

            var result =
                _nfeConsulta.ConsultarNotaFiscal(notaParaCancelar.Chave, codigoUf, certificado, ambiente, modelo);
            var codigoUfEnum = (CodigoUfIbge)Enum.Parse(typeof(CodigoUfIbge), emitente.Endereco.UF);

            if (result.IsEnviada)
            {
                _cancelaNotaFiscalService.CancelarNotaFiscal(ufEmissor, codigoUfEnum, ambiente, emitente.CNPJ,
                    notaParaCancelar.Chave, result.Protocolo.infProt.nProt, modelo, "Nota duplicada em contingência");
            }
            else
            {
                var resultadoInutilizacao = _notaInutilizadaService.InutilizarNotaFiscal(ufEmissor, codigoUfEnum,
                    ambiente, emitente.CNPJ, modelo, notaParaCancelar.Serie,
                    notaParaCancelar.Numero, notaParaCancelar.Numero);

                if (resultadoInutilizacao.Status != Sefaz.NfeInutilizacao2.Status.ERRO)
                    _notaFiscalRepository.ExcluirNota(notaParaCancelar.Chave, ambiente);
            }
        }
コード例 #5
0
ファイル: MailManager.cs プロジェクト: phsilvasantos/nfe-wpf
        public async void EnviarEmailDestinatario(string email, string xmlPath, NotaFiscalEntity notaFiscal)
        {
            var xml = await notaFiscal.LoadXmlAsync();

            var notaFiscalCore = _notaFiscalRepository.GetNotaFiscalFromNfeProcXml(xml);

            var pdfPath = GeradorPDF.ObterPdfEnvioNotaFiscalEmail(notaFiscalCore);

            await EnviarEmailDestinatario(email, xmlPath, pdfPath);
        }
コード例 #6
0
        public void UpdateNotaFiscal(Guid id, NotaFiscalEntity notaFiscalEntity)
        {
            if (notaFiscalEntity == null)
            {
                NotificarValidacoesErro(notaFiscalEntity.ValidationResult);
            }

            _notaFiscalRepository.Update(id, notaFiscalEntity);
            Commit();
        }
コード例 #7
0
        private void NotaFiscalVM_NotaCanceladaEventHandler(NotaFiscalEntity nota)
        {
            var notaCancelada = NotasFiscais.FirstOrDefault(n => n.Chave == nota.Chave);
            var index         = NotasFiscais.IndexOf(notaCancelada);

            var notaMemento = new NotaFiscalMemento(nota.Numero,
                                                    nota.Modelo == "NFC-e" ? Modelo.Modelo65 : Modelo.Modelo55, nota.DataEmissao, nota.DataAutorizacao,
                                                    nota.Destinatario, nota.UfDestinatario, nota.ValorTotal.ToString("N2", new CultureInfo("pt-BR")),
                                                    (Status)nota.Status, nota.Chave);

            NotasFiscais[index] = notaMemento;
        }
コード例 #8
0
        public void TestMethod_NumeroNf()
        {
            var notaFiscal = new NotaFiscalEntity
            {
                CnpjDestinatarioNf = "00909909090",
                DataNf             = DateTime.Now,
                ValorTotal         = -100
            };

            var result = notaFiscal.IsValid();

            Assert.AreEqual(true, result, "o número da nota fiscal tem que se informado");
        }
コード例 #9
0
        public void TestMethod_ValorTotal()
        {
            var notaFiscal = new NotaFiscalEntity
            {
                CnpjDestinatarioNf = "00909909090",
                DataNf             = DateTime.Now,
                NumeroNf           = 1,
                ValorTotal         = -100
            };

            var result = notaFiscal.IsValid();

            Assert.AreEqual(true, result, "O Valor tem que ser maior que zero");
        }
コード例 #10
0
        public Task <NotaFiscalEntity> InsertNotaFiscal(NotaFiscalEntity notaFiscalEntity)
        {
            if (!notaFiscalEntity.IsValid())
            {
                NotificarValidacoesErro(notaFiscalEntity.ValidationResult);
                return(null);
            }

            var notaFiscal = _notaFiscalRepository.Add(notaFiscalEntity);

            Commit();

            return(notaFiscal);
        }
コード例 #11
0
        public int Salvar(NotaFiscalEntity notafiscal)
        {
            if (notafiscal.Id == 0)
            {
                _notasFiscais.Add(notafiscal);
                notafiscal.Id = _notasFiscais.Count();
            }
            else
            {
                var notaFiscal = _notasFiscais.First(n => n.Id == notafiscal.Id);
                _notasFiscais.Remove(notaFiscal);
                _notasFiscais.Add(notaFiscal);
            }

            return(notafiscal.Id);
        }
コード例 #12
0
        public int Salvar(NotaFiscalEntity notafiscal)
        {
            using (var context = new NFeContext())
            {
                if (notafiscal.Id == 0)
                {
                    context.Entry(notafiscal).State = EntityState.Added;
                }
                else
                {
                    context.Entry(notafiscal).State = EntityState.Modified;
                }

                context.SaveChanges();
                return(notafiscal.Id);
            }
        }
コード例 #13
0
        private NotaFiscalEntity CorrigirNotaDuplicada(NotaFiscal notaFiscal, string qrCode,
                                                       string nFeNamespaceName, X509Certificate2 certificado, TNFe nfe, int idNotaCopiaSeguranca)
        {
            var retornoConsulta = _nfeConsulta.ConsultarNotaFiscal(notaFiscal.Identificacao.Chave,
                                                                   notaFiscal.Emitente.Endereco.CodigoUF, certificado,
                                                                   notaFiscal.Identificacao.Ambiente, notaFiscal.Identificacao.Modelo);

            var protSerialized   = XmlUtil.Serialize(retornoConsulta.Protocolo, nFeNamespaceName);
            var protDeserialized = (TProtNFe)XmlUtil.Deserialize <TProtNFe>(protSerialized);

            NotaFiscalEntity notaFiscalEntity = _notaFiscalRepository.GetNotaFiscalById(idNotaCopiaSeguranca, false);

            notaFiscalEntity.Status          = (int)Status.ENVIADA;
            notaFiscalEntity.DataAutorizacao = retornoConsulta.DhAutorizacao;

            notaFiscalEntity.Protocolo = retornoConsulta.Protocolo.infProt.nProt;
            var xmlNFeProc = XmlUtil.GerarNfeProcXml(nfe, qrCode, protDeserialized);

            _notaFiscalRepository.Salvar(notaFiscalEntity, xmlNFeProc);
            return(notaFiscalEntity);
        }
コード例 #14
0
        public int SalvarNotaFiscalPendente(NotaFiscal notaFiscal, string v, Ambiente ambiente)
        {
            var NotaFiscalEntity = new NotaFiscalEntity();

            if (notaFiscal.Destinatario != null && notaFiscal.Destinatario.Endereco != null)
            {
                NotaFiscalEntity.UfDestinatario = notaFiscal.Destinatario.Endereco.UF;
            }
            else
            {
                NotaFiscalEntity.UfDestinatario = notaFiscal.Emitente.Endereco.UF;
            }

            NotaFiscalEntity.Destinatario = notaFiscal.Destinatario == null
                ? "CONSUMIDOR NÃO IDENTIFICADO"
                : notaFiscal.Destinatario.NomeRazao;
            NotaFiscalEntity.DocumentoDestinatario =
                notaFiscal.Destinatario == null ? null : notaFiscal.Destinatario.Documento;
            NotaFiscalEntity.Status        = (int)notaFiscal.Identificacao.Status;
            NotaFiscalEntity.Chave         = notaFiscal.Identificacao.Chave;
            NotaFiscalEntity.DataEmissao   = notaFiscal.Identificacao.DataHoraEmissao;
            NotaFiscalEntity.Modelo        = notaFiscal.Identificacao.Modelo == Modelo.Modelo55 ? "55" : "65";
            NotaFiscalEntity.Serie         = notaFiscal.Identificacao.Serie.ToString();
            NotaFiscalEntity.TipoEmissao   = notaFiscal.Identificacao.TipoEmissao.ToString();
            NotaFiscalEntity.ValorDesconto = notaFiscal.TotalNFe.IcmsTotal.ValorTotalDesconto;
            NotaFiscalEntity.ValorDespesas = notaFiscal.TotalNFe.IcmsTotal.ValorDespesasAcessorias;
            NotaFiscalEntity.ValorFrete    = notaFiscal.TotalNFe.IcmsTotal.ValorTotalFrete;
            NotaFiscalEntity.ValorICMS     = notaFiscal.TotalNFe.IcmsTotal.ValorTotalIcms;
            NotaFiscalEntity.ValorProdutos = notaFiscal.ValorTotalProdutos;
            NotaFiscalEntity.ValorSeguro   = notaFiscal.TotalNFe.IcmsTotal.ValorTotalSeguro;
            NotaFiscalEntity.ValorTotal    = notaFiscal.TotalNFe.IcmsTotal.ValorTotalNFe;
            NotaFiscalEntity.Ambiente      = ambiente == Ambiente.Homologacao ? 2 : 1;
            NotaFiscalEntity.Numero        = notaFiscal.Identificacao.Numero;
            NotaFiscalEntity.IsProducao    = ambiente == Ambiente.Producao;

            return(Salvar(NotaFiscalEntity));
        }
コード例 #15
0
 private static void AtribuirValoresApósEnvioComSucesso(NotaFiscal notaFiscal, string qrCode, NotaFiscalEntity notaFiscalEntity)
 {
     notaFiscal.QrCodeUrl            = qrCode;
     notaFiscal.Identificacao.Status = Status.ENVIADA;
     notaFiscal.DhAutorizacao        = notaFiscalEntity.DataAutorizacao.ToString("dd/MM/yyyy HH:mm:ss");
     notaFiscal.DataHoraAutorização  = notaFiscalEntity.DataAutorizacao;
     notaFiscal.ProtocoloAutorizacao = notaFiscalEntity.Protocolo;
 }
コード例 #16
0
        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);
            }
        }
コード例 #17
0
        /** <exception cref="Exception"/>
         * <summary>Responsável pelo envio da Nota Fiscal para a SEFAZ.</summary>
         */
        internal async Task <int> EnviarNotaFiscalAsync(NotaFiscal notaFiscal, string cscId, string csc)
        {
            string           qrCode               = "";
            TNFe             nfe                  = null;
            string           newNodeXml           = string.Empty;
            int              idNotaCopiaSeguranca = 0;
            NotaFiscalEntity notaFiscalEntity     = null;

            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();

            certificado = EscolherCertificado(certificadoEntity);

            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);

                if (notaFiscal.Identificacao.Modelo == Modelo.Modelo65)
                {
                    //NFC-e tem QrCode obrigatório
                    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];

                var servico = ServiceFactory.GetService(notaFiscal.Identificacao.Modelo, notaFiscal.Identificacao.Ambiente, Factory.Servico.AUTORIZACAO, codigoUF, certificado);
                var client  = (NFeAutorizacao4.NFeAutorizacao4SoapClient)servico.SoapClient;

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

                var notaFiscalService = new NotaFiscalService();

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

                XmlNode     result  = client.nfeAutorizacaoLote(node);
                TRetEnviNFe retorno = (TRetEnviNFe)XmlUtil.Deserialize <TRetEnviNFe>(result.OuterXml);
                XmlSchemas.NfeAutorizacao.Retorno.TProtNFe protocolo = (XmlSchemas.NfeAutorizacao.Retorno.TProtNFe)retorno.Item; //existem dois valores possíveis de retorno (esse aqui só vale para lote com 1 nota)

                if (protocolo.infProt.cStat.Equals("100"))
                {
                    notaFiscalEntity = await notaFiscalService.GetNotaFiscalByIdAsync(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;
                    string xmlNFeProc = XmlUtil.GerarNfeProcXml(nfe, qrCode, protocolo);

                    await notaFiscalService.SalvarAsync(notaFiscalEntity, xmlNFeProc);
                }
                else
                {
                    if (protocolo.infProt.xMotivo.Contains("Duplicidade"))
                    {
                        notaFiscalEntity = await CorrigirNotaDuplicada(notaFiscal, qrCode, nFeNamespaceName, certificado, nfe, idNotaCopiaSeguranca, notaFiscalEntity);
                    }
                    else
                    {
                        //Nota continua com status pendente nesse caso
                        XmlUtil.SalvarXmlNFeComErro(notaFiscal, node);
                        string 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);
                    }
                }

                notaFiscal.QrCodeUrl            = qrCode;
                notaFiscal.Identificacao.Status = Status.ENVIADA;
                notaFiscal.DhAutorizacao        = notaFiscalEntity.DataAutorizacao.ToString("dd/MM/yyyy HH:mm:ss");
                notaFiscal.DataHoraAutorização  = notaFiscalEntity.DataAutorizacao;
                notaFiscal.ProtocoloAutorizacao = notaFiscalEntity.Protocolo;
                return(idNotaCopiaSeguranca);
            }
            catch (Exception e)
            {
                var codigoUF = notaFiscal.Identificacao.UF;
                var ambiente = notaFiscal.Identificacao.Ambiente;

                if (e.InnerException is WebException)
                {
                    throw new Exception("Serviço indisponível ou sem conexão com a internet.", e.InnerException);
                }

                try
                {
                    notaFiscalEntity = await VerificarSeNotaFoiEnviada(notaFiscal, cscId, csc, qrCode, nfe, idNotaCopiaSeguranca, notaFiscalEntity, nFeNamespaceName, certificado);
                }
                catch (Exception retornoConsultaException)
                {
                    EscreverLogErro(e);
                    EscreverLogErro(retornoConsultaException);
                    XmlUtil.SalvarXmlNFeComErro(notaFiscal, node);
                    throw retornoConsultaException;
                }

                notaFiscal.QrCodeUrl            = qrCode;
                notaFiscal.Identificacao.Status = Status.ENVIADA;
                notaFiscal.DhAutorizacao        = notaFiscalEntity.DataAutorizacao.ToString("dd/MM/yyyy HH:mm:ss");
                notaFiscal.DataHoraAutorização  = notaFiscalEntity.DataAutorizacao;
                notaFiscal.ProtocoloAutorizacao = notaFiscalEntity.Protocolo;
                return(idNotaCopiaSeguranca);
            }
        }
コード例 #18
0
        private static async Task <NotaFiscalEntity> CorrigirNotaDuplicada(NotaFiscal notaFiscal, string qrCode, string nFeNamespaceName, X509Certificate2 certificado, TNFe nfe, int idNotaCopiaSeguranca, NotaFiscalEntity notaFiscalEntity)
        {
            var retornoConsulta = NFeConsulta.ConsultarNotaFiscal(notaFiscal.Identificacao.Chave, notaFiscal.Emitente.Endereco.CodigoUF, certificado,
                                                                  notaFiscal.Identificacao.Ambiente, notaFiscal.Identificacao.Modelo);

            var protSerialized   = XmlUtil.Serialize(retornoConsulta.Protocolo, nFeNamespaceName);
            var protDeserialized = (XmlSchemas.NfeAutorizacao.Retorno.TProtNFe)XmlUtil.Deserialize <XmlSchemas.NfeAutorizacao.Retorno.TProtNFe>(protSerialized);

            var notaFiscalService = new NotaFiscalService();

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

            notaFiscalEntity.Status          = (int)Status.ENVIADA;
            notaFiscalEntity.DataAutorizacao = retornoConsulta.DhAutorizacao;

            notaFiscalEntity.Protocolo = retornoConsulta.Protocolo.infProt.nProt;
            string xmlNFeProc = XmlUtil.GerarNfeProcXml(nfe, qrCode, protDeserialized);

            await notaFiscalService.SalvarAsync(notaFiscalEntity, xmlNFeProc);

            return(notaFiscalEntity);
        }
コード例 #19
0
 public int Salvar(NotaFiscalEntity notaFiscalEntity, string p)
 {
     return(Salvar(notaFiscalEntity));
 }
コード例 #20
0
        private async Task ImportarXmlNotasFiscais(string path)
        {
            var regex = new Regex(@"[0-9]{44}-nf[c|e][e]?");

            var files = Directory.EnumerateFiles(path, "*.xml").Where(f => regex.IsMatch(f));

            await Task.Run(() =>
            {
                foreach (var file in files)
                {
                    try
                    {
                        var xml = File.ReadAllText(file);

                        var notaFiscal = _notaFiscalRepository.GetNotaFiscalFromNfeProcXml(xml);

                        var notaFiscalDb = _notaFiscalRepository.GetNotaFiscalByChave(notaFiscal.Identificacao.Chave);

                        if (notaFiscalDb != null)
                        {
                            return;
                        }

                        var notaFiscalEntity = new NotaFiscalEntity();

                        if (notaFiscal.Destinatario != null && notaFiscal.Destinatario.Endereco != null)
                        {
                            notaFiscalEntity.UfDestinatario = notaFiscal.Destinatario.Endereco.UF;
                        }
                        else
                        {
                            notaFiscalEntity.UfDestinatario = notaFiscal.Emitente.Endereco.UF;
                        }

                        notaFiscalEntity.Destinatario = notaFiscal.Destinatario == null
                            ? "CONSUMIDOR NÃO IDENTIFICADO"
                            : notaFiscal.Destinatario.NomeRazao;
                        notaFiscalEntity.DocumentoDestinatario = notaFiscal.Destinatario == null
                            ? null
                            : notaFiscal.Destinatario.Documento;
                        notaFiscalEntity.Status          = (int)notaFiscal.Identificacao.Status;
                        notaFiscalEntity.Chave           = notaFiscal.Identificacao.Chave;
                        notaFiscalEntity.DataEmissao     = notaFiscal.Identificacao.DataHoraEmissao;
                        notaFiscalEntity.Modelo          = notaFiscal.Identificacao.Modelo == Modelo.Modelo55 ? "55" : "65";
                        notaFiscalEntity.Serie           = notaFiscal.Identificacao.Serie.ToString();
                        notaFiscalEntity.TipoEmissao     = notaFiscal.Identificacao.TipoEmissao.ToString();
                        notaFiscalEntity.ValorDesconto   = notaFiscal.TotalNFe.IcmsTotal.ValorTotalDesconto;
                        notaFiscalEntity.ValorDespesas   = notaFiscal.TotalNFe.IcmsTotal.ValorDespesasAcessorias;
                        notaFiscalEntity.ValorFrete      = notaFiscal.TotalNFe.IcmsTotal.ValorTotalFrete;
                        notaFiscalEntity.ValorICMS       = notaFiscal.TotalNFe.IcmsTotal.ValorTotalIcms;
                        notaFiscalEntity.ValorProdutos   = notaFiscal.ValorTotalProdutos;
                        notaFiscalEntity.ValorSeguro     = notaFiscal.TotalNFe.IcmsTotal.ValorTotalSeguro;
                        notaFiscalEntity.ValorTotal      = notaFiscal.TotalNFe.IcmsTotal.ValorTotalNFe;
                        notaFiscalEntity.Ambiente        = notaFiscal.Identificacao.Ambiente == Ambiente.Homologacao ? 2 : 1;
                        notaFiscalEntity.Numero          = notaFiscal.Identificacao.Numero;
                        notaFiscalEntity.IsProducao      = notaFiscal.Identificacao.Ambiente == Ambiente.Producao;
                        notaFiscalEntity.DataAutorizacao = DateTime.ParseExact(notaFiscal.DhAutorizacao,
                                                                               "yyyy-MM-ddTHH:mm:sszzz", CultureInfo.InvariantCulture);
                        notaFiscalEntity.Protocolo = notaFiscal.ProtocoloAutorizacao;
                        notaFiscalEntity.XmlPath   = GetFullPath(file);

                        _notaFiscalRepository.Salvar(notaFiscalEntity, xml);
                    }
                    catch (Exception e)
                    {
                        log.Error(e);
                    }
                }
            });
        }