Exemplo n.º 1
0
        public void TestMethod4()
        {
            NotaFiscalDesconto   notaFiscal           = new NotaFiscalDesconto();
            NotaFiscalRepository notaFiscalRepository = new NotaFiscalRepository();
            NotaFiscalService    NotaFiscalService    = new NotaFiscalService();
            Pedido pedido = new Pedido();


            pedido.EstadoOrigem  = "SP";
            pedido.EstadoDestino = "RJ";
            pedido.NomeCliente   = "Carlos Lui";

            pedido.ItensDoPedido.Add(
                new PedidoItem()
            {
                Brinde          = false,
                CodigoProduto   = "1256",
                NomeProduto     = "Tenis",
                ValorItemPedido = 200
            });


            NotaFiscalService.Gravar(pedido);
        }
Exemplo n.º 2
0
        public async Task NotaCanceladaXmlExisteTest()
        {
            NotaFiscal         notaFiscal;
            ConfiguracaoEntity config;
            int notaFiscalId = EnviarNotaTesteUnitarioUtils.EnviarNotaFiscal(out notaFiscal, out config);

            var notaFiscalDb = new NotaFiscalService().GetNotaFiscalByIdAsync(notaFiscalId, false).Result;

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

            await new NotaFiscalService().CancelarNotaFiscalAsync(emitente.Endereco.UF, codigoUFEnum, Ambiente.Homologacao, emitente.CNPJ, notaFiscal.Identificacao.Chave,
                                                                  notaFiscalDb.Protocolo, notaFiscal.Identificacao.Modelo, "Teste unitário cancelamento");

            var notaTest = new NotaFiscalService().GetNotaFiscalByChave(notaFiscal.Identificacao.Chave, Ambiente.Homologacao);
            var evento   = new EventoService().GetEventoPorNota(notaTest.Id, true);

            ValidadorXml.ValidarXml(evento.LoadXml(), "procEventoCancNFe_v1.00.xsd");
            ValidadorXml.ValidarXml(notaTest.LoadXml(), "procNFe_v4.00.xsd");

            Assert.IsTrue(notaTest.Status == (int)NFe.Repository.Status.CANCELADA);
            Assert.IsTrue(File.Exists(evento.XmlPath));
            Assert.IsTrue(File.Exists(notaTest.XmlPath));
        }
Exemplo n.º 3
0
        private void buttonGerarNotaFiscal_Click(object sender, EventArgs e)
        {
            try
            {
                if (IsValid())
                {
                    NotaFiscalService service = new NotaFiscalService();
                    Pedido            pedido  = new Pedido();

                    pedido.EstadoOrigem  = txtEstadoOrigem.Text;
                    pedido.EstadoDestino = txtEstadoDestino.Text;
                    pedido.NomeCliente   = textBoxNomeCliente.Text;

                    DataTable table = (DataTable)dataGridViewPedidos.DataSource;

                    foreach (DataRow row in table.Rows)
                    {
                        pedido.ItensDoPedido.Add(
                            new PedidoItem()
                        {
                            Brinde          = Convert.ToBoolean(row["Brinde"]),
                            CodigoProduto   = row["Codigo do produto"].ToString(),
                            NomeProduto     = row["Nome do produto"].ToString(),
                            ValorItemPedido = Convert.ToDouble(row["Valor"].ToString())
                        });
                    }
                    service.GerarNotaFiscal(pedido);
                    MessageBox.Show("Operação efetuada com sucesso", "Sucesso!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    Utils.CleanControls(this.Controls);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        public void EnviarNotaDestinatarioSemEndTest()
        {
            var idDestinatario = DestinatarioService.Salvar(new DestinatarioEntity()
            {
                NomeRazao = "Domício de Araújo", Documento = "73598348134", TipoDestinatario = (int)TipoDestinatario.PessoaFisica
            });

            Assert.AreNotEqual(0, idDestinatario);

            try
            {
                NotaFiscal         notaFiscal;
                ConfiguracaoEntity config;
                var DestinatarioEntity = DestinatarioService.GetDestinatarioByID(idDestinatario);
                var destinatario       = new Destinatario(Ambiente.Homologacao, Modelo.Modelo65, null, null, null, TipoDestinatario.PessoaFisica,
                                                          nomeRazao: DestinatarioEntity.NomeRazao, documento: DestinatarioEntity.Documento);

                new NotaFiscalService().AtivarModoOnline();
                EnviarNotaTesteUnitarioUtils.EnviarNotaFiscal(out notaFiscal, out config, destinatario);

                var notaTest = new NotaFiscalService().GetNotaFiscalByChave(notaFiscal.Identificacao.Chave, Ambiente.Homologacao);

                if (ConsultaStatusServicoService.ExecutarConsultaStatus(config, Modelo.Modelo65))
                {
                    Assert.IsTrue(notaTest.Status == (int)NFe.Repository.Status.ENVIADA);
                }
                else
                {
                    Assert.IsTrue(notaTest.Status == (int)NFe.Repository.Status.CONTINGENCIA);
                }
            }
            finally
            {
                DestinatarioService.ExcluirDestinatario(idDestinatario);
            }
        }
Exemplo n.º 5
0
        public void GerarNotaFiscal_HavingGeneratedAnInvalidXml_ShouldNotPersistNotaFiscalInDataBase()
        {
            // arrange
            var pedido = A.Dummy <Pedido>();

            pedido.ItensDoPedido.Add(A.Dummy <PedidoItem>());

            A.CallTo(() => _xmlWriter.Record(A <string> .Ignored, A <NotaFiscal> .Ignored)).Returns(false);

            A.CallTo(() => _notaFiscalRepository.GetNextIdNotaFiscal()).Returns(A.Dummy <int>());

            A.CallTo(() => _notaFiscalRepository.GetLastIdNotaFiscalItem()).Returns(A.Dummy <int>());

            // act
            var notaFiscalService = new NotaFiscalService(_xmlWriter, _notaFiscalRepository);
            var result            = notaFiscalService.GerarNotaFiscal(pedido);

            // assert
            A.CallTo(() => _xmlWriter.Record(A <string> .Ignored, A <NotaFiscal> .Ignored))
            .MustHaveHappenedOnceExactly();

            A.CallTo(() => _notaFiscalRepository.GetNextIdNotaFiscal())
            .MustHaveHappenedOnceExactly();

            A.CallTo(() => _notaFiscalRepository.GetLastIdNotaFiscalItem())
            .MustHaveHappenedOnceExactly();

            A.CallTo(() => _notaFiscalRepository.InsertNotaFiscal(A <int> .Ignored, A <int> .Ignored,
                                                                  A <string> .Ignored, A <string> .Ignored, A <string> .Ignored)).MustNotHaveHappened();

            A.CallTo(() => _notaFiscalRepository.InsertNotaFiscalItem(A <int> .Ignored, A <string> .Ignored, A <string> .Ignored,
                                                                      A <double> .Ignored, A <double> .Ignored, A <double> .Ignored, A <string> .Ignored, A <string> .Ignored, A <double> .Ignored,
                                                                      A <double> .Ignored, A <double> .Ignored, A <double> .Ignored)).MustNotHaveHappened();

            Assert.IsFalse(result.Status);
        }
Exemplo n.º 6
0
 public void Cleanup()
 {
     notaFiscalService = null;
 }
 public NotaFiscalController(UnitOfWork unitOfWork, NotaFiscalService notaFiscalService)
 {
     _unitOfWork        = unitOfWork;
     _notaFiscalService = notaFiscalService;
 }
Exemplo n.º 8
0
        private void buttonGerarNotaFiscal_Click(object sender, EventArgs e)
        {
            NotaFiscalService service = new NotaFiscalService();

            if (txtBoxNomeCliente.Text == "")  // verifica nome do cliente em branco
            {
                txtBoxNomeCliente.Focus();
                MessageBox.Show("Nome de cliente em branco.");
                return;
            }
            else
            {
                pedido.clientePedido.nomeCliente = txtBoxNomeCliente.Text;
            }

            if (!EstadoFuncs.EstadoValido(cbxEstadoOrigem.Text))  // verifica se estado é válido
            {
                cbxEstadoOrigem.Focus();
                MessageBox.Show("Estado de Origem não existe ou em branco.");
                return;
            }
            else
            {
                pedido.EstadoOrigem.siglaEstado = cbxEstadoOrigem.Text;
            }


            if (!EstadoFuncs.EstadoValido(cbxEstadoDestino.Text))  // verifica se estado é válido
            {
                cbxEstadoDestino.Focus();
                MessageBox.Show("Estado de Destino não existe ou em branco.");
                return;
            }
            else
            {
                pedido.EstadoDestino.siglaEstado = cbxEstadoDestino.Text;
            }


            DataTable table = (DataTable)dataGridViewPedidos.DataSource;

            if (table.Rows.Count == 0)  // não deixa criar pedido sem itens
            {
                MessageBox.Show("Pedido sem Itens.");
                return;
            }


            pedido.ItensDoPedido.Clear();  // limpa os itens de pedido caso seja chamada novamente por causa de erros nos dados dos itens
            int linhaAtual = 0;

            foreach (DataRow row in table.Rows)
            {
                PedidoItem pedidoItem = new PedidoItem();

                if (row["Nome do produto"].ToString() == "")  // verifica se nome do produto está em branco
                {
                    dataGridViewPedidos.CurrentCell = dataGridViewPedidos.Rows[linhaAtual].Cells["Nome do produto"];
                    MessageBox.Show("Nome do Produto em branco.");
                    return;
                }
                else
                {
                    pedidoItem.NomeProduto = row["Nome do produto"].ToString();
                }


                if (row["Codigo do produto"].ToString() == "")  // verifica se código do produto está em branco
                {
                    dataGridViewPedidos.CurrentCell = dataGridViewPedidos.Rows[linhaAtual].Cells["Codigo do produto"];
                    MessageBox.Show("Código do Produto em branco.");
                    return;
                }
                else
                {
                    pedidoItem.CodigoProduto = row["Codigo do produto"].ToString();
                }

                if (row["Valor"].ToString() == "")  // verifica se valor do produto está em branco
                {
                    dataGridViewPedidos.CurrentCell = dataGridViewPedidos.Rows[linhaAtual].Cells["Valor"];
                    MessageBox.Show("Valor em branco.");
                    return;
                }
                else
                {
                    double number;
                    if (Double.TryParse(row["Valor"].ToString(), out number))
                    {
                        pedidoItem.ValorItemPedido = number;
                    }
                    else
                    {
                        dataGridViewPedidos.CurrentCell = dataGridViewPedidos.Rows[linhaAtual].Cells["Valor"];
                        MessageBox.Show("Valor do produto é inválido.");
                        return;
                    }
                }


                if (row["Brinde"] == DBNull.Value) // proteção contra o DBNull quando não é selecionado nada na coluna BRINDE
                {
                    pedidoItem.Brinde = false;
                }
                else
                {
                    pedidoItem.Brinde = Convert.ToBoolean(row["Brinde"]);
                }

                pedido.ItensDoPedido.Add(pedidoItem);

                linhaAtual++;  // passa para próxima linha
            }

            service.GerarNotaFiscal(pedido);
            if (service.SalvaNotaFiscal())
            {
                MessageBox.Show("NF salva com sucesso");
                LimpaCampos(); // item 06 - limpar campos
            }
            else
            {
                MessageBox.Show("Erro ao Salvar NF");
            }
        }
Exemplo n.º 9
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);
            }
        }
Exemplo n.º 10
0
        private void buttonGerarNotaFiscal_Click(object sender, EventArgs e)
        {
            if (textBoxNomeCliente.Text == "" || cboEstadoOrigem.SelectedItem == null || cboEstadoDestino.SelectedItem == null)
            {
                MessageBox.Show(this, "Necessário preencher os dados da nota fiscal", buttonGerarNotaFiscal.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            DataTable table = (DataTable)dataGridViewPedidos.DataSource;

            if (table.Rows.Count == 0)
            {
                MessageBox.Show(this, "Nenhum item adicionado", buttonGerarNotaFiscal.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            NotaFiscalService service = new NotaFiscalService();

            pedido.EstadoOrigem  = (Estado)cboEstadoOrigem.SelectedItem;
            pedido.EstadoDestino = (Estado)cboEstadoDestino.SelectedItem;
            pedido.NomeCliente   = textBoxNomeCliente.Text;

            foreach (DataRow row in table.Rows)
            {
                if (row.IsNull("Nome do produto") || row.IsNull("Codigo do produto"))
                {
                    MessageBox.Show(this, "Preencher o nome e o código de todos os itens", buttonGerarNotaFiscal.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                if (row.IsNull("Brinde"))
                {
                    row["Brinde"] = false;
                }
                if (row.IsNull("Valor"))
                {
                    MessageBox.Show(this, "Preencher o valor de todos os itens", buttonGerarNotaFiscal.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                if (row.IsNull("Desconto"))
                {
                    row["Desconto"] = 0;
                }

                pedido.ItensDoPedido.Add(
                    new PedidoItem()
                {
                    Brinde          = Convert.ToBoolean(row["Brinde"]),
                    CodigoProduto   = row["Codigo do produto"].ToString(),
                    NomeProduto     = row["Nome do produto"].ToString(),
                    ValorItemPedido = Convert.ToDouble(row["Valor"].ToString()),
                    Desconto        = Convert.ToDouble(row["Desconto"])
                });
            }

            try
            {
                service.GerarNotaFiscal(pedido);
                MessageBox.Show(this, "Operação efetuada com sucesso", buttonGerarNotaFiscal.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                LimpaCampos();
            }
            catch (ServiceException ex)
            {
                MessageBox.Show(this, ex.Message, buttonGerarNotaFiscal.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        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 async Task <List <string> > TransmitirConsultarLoteContingenciaAsync(ConfiguracaoEntity config, List <string> notasNFCe, Modelo modelo)
        {
            var retornoTransmissao = TransmitirLoteNotasFiscaisContingencia(notasNFCe, modelo);

            if (retornoTransmissao.TipoMensagem == TipoMensagem.ErroValidacao)
            {
                return(new List <string>()
                {
                    retornoTransmissao.Mensagem
                });
            }
            else if (retornoTransmissao.TipoMensagem == TipoMensagem.ServicoIndisponivel)
            {
                return(new List <string>()
                {
                    mensagemErro
                });
            }

            int           tempoEspera = Int32.Parse(retornoTransmissao.RetEnviNFeInfRec.tMed) * 1000;
            List <string> 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 ambiente = config.IsProducao ? Ambiente.Producao : Ambiente.Homologacao;
                var nota     = new NotaFiscalService().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)NFe.Repository.Status.ENVIADA;

                    string xml = await nota.LoadXmlAsync();

                    xml = xml.Replace("<protNFe />", resultado.Xml);

                    var notaFiscalService = new NotaFiscalService();

                    await notaFiscalService.SalvarAsync(nota, xml);
                }
                else
                {
                    if (resultado.Motivo.Contains("Duplicidade"))
                    {
                        X509Certificate2 certificado;
                        var certificadoEntity = new CertificadoRepository(new NFeContext()).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)NFe.Repository.Status.ENVIADA;

                            string xml = await nota.LoadXmlAsync();

                            xml = xml.Replace("<protNFe />", protSerialized);

                            var notaFiscalService = new NotaFiscalService();

                            await notaFiscalService.SalvarAsync(nota, xml);
                        }
                        else
                        {
                            erros.Add(string.Format("Modelo: {0} Nota: {1} Série: {2} \nMotivo: {3}", nota.Modelo, nota.Numero, nota.Serie, resultado.Motivo)); //O que fazer com essas mensagens de erro?
                        }
                    }
                    else
                    {
                        erros.Add(string.Format("Modelo: {0} Nota: {1} Série: {2} \nMotivo: {3}", nota.Modelo, nota.Numero, nota.Serie, resultado.Motivo)); //O que fazer com essas mensagens de erro?
                    }
                }
            }

            return(erros);
        }
 public NotaFiscalServiceTest()
 {
     _repositoryMock      = new Mock <INotaFiscalRepository>();
     _templateServiceMock = new Mock <ITemplateService>();
     _notaFiscalService   = new NotaFiscalService(_repositoryMock.Object, _templateServiceMock.Object);
 }