private Task PopularListaNotasFiscais(int page = 1)
        {
            return(Task.Run(() =>
            {
                var notasDb = _notaFiscalRepository.Take(100, page);

                if (notasDb == null)
                {
                    return;
                }

                notasDb = notasDb.OrderByDescending(n => n.DataEmissao).AsEnumerable();
                var notaFiscalMementos = new List <NotaFiscalMemento>();

                foreach (var nota in notasDb)
                {
                    var notaMemento = new NotaFiscalMemento(nota.Numero,
                                                            nota.Modelo == "65" ? 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);

                    notaFiscalMementos.Add(notaMemento);
                }

                Application.Current.Dispatcher.BeginInvoke(new Action(() =>
                {
                    NotasFiscais = new ObservableCollection <NotaFiscalMemento>(notaFiscalMementos);
                }));
            }));
        }
        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;
        }
        private async Task AtualizarNotasPendentes()
        {
            if (_isNotasPendentesVerificadas || NotasFiscais.Count == 0)
            {
                return;
            }

            _isNotasPendentesVerificadas = true;

            var notasFiscaisPendentes = _notaFiscalRepository.GetNotasPendentes(false);

            if (notasFiscaisPendentes.Count == 0)
            {
                return;
            }

            var codigoUf    = UfToCodigoUfConversor.GetCodigoUf(_emissorService.GetEmissor().Endereco.UF);
            var certificado = _certificadoService.GetX509Certificate2();
            var config      = _configuracaoService.GetConfiguracao();

            if (certificado == null)
            {
                throw new ArgumentNullException(nameof(certificado));
            }

            var idsNotasPendentes = notasFiscaisPendentes.Select(n => n.Id);

            foreach (var idNotaPendente in idsNotasPendentes)
            {
                var nota = await ConsultarNotasAsync(idNotaPendente, codigoUf, certificado, config);

                if (nota == null)
                {
                    continue;
                }

                var notaPendente =
                    NotasFiscais.FirstOrDefault(n => n.Status == "Pendente" && n.Chave == nota.Chave);
                var index = NotasFiscais.IndexOf(notaPendente);

                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;
            }
        }
 private void EnviarEmailCmd_Execute(NotaFiscalMemento notaFiscal)
 {
     _enviarEmailViewModel.EnviarEmail(notaFiscal.Chave);
 }
        private void VisualizarNotaCmd_Execute(NotaFiscalMemento notaFiscalMemento)
        {
            var notaFiscal = (NFCeModel)_notaFiscalRepository.GetNotaFiscalByChave(notaFiscalMemento.Chave);

            _visualizarNotaEnviadaViewModel.VisualizarNotaFiscal(notaFiscal);
        }
        private async void EnviarNotaNovamenteCmd_ExecuteAsync(NotaFiscalMemento notaPendenteMemento)
        {
            IsBusy      = true;
            BusyContent = "Enviando...";

            var config = _configuracaoService.GetConfiguracao();

            var modelo = notaPendenteMemento.Tipo == "NFC-e" ? Modelo.Modelo65 : Modelo.Modelo55;

            //Preencher objeto da NotaFiscal a partir do XML e enviar para a correspondente ViewModel NFe ou NFCe
            var app        = Application.Current;
            var mainWindow = app.MainWindow;

            if (!_consultaStatusServicoService.ExecutarConsultaStatus(config, modelo))
            {
                MessageBox.Show(mainWindow,
                                "Serviço continua indisponível. Aguarde o reestabelecimento da conexão e tente novamente.",
                                "Erro de conexão ou serviço indisponível", MessageBoxButton.OK, MessageBoxImage.Information);
                return;
            }

            var ambiente     = config.IsProducao ? Ambiente.Producao : Ambiente.Homologacao;
            var notaFiscalDb = _notaFiscalRepository.GetNotaFiscalByChave(notaPendenteMemento.Chave);
            var xml          = await notaFiscalDb.LoadXmlAsync();

            var notaFiscalBo = _notaFiscalRepository.GetNotaFiscalFromNfeProcXml(xml);

            notaFiscalBo.Identificacao.DataHoraEmissao = DateTime.Now;

            foreach (var prod in notaFiscalBo.Produtos)
            {
                var produtoDb = _produtoService.GetByCodigo(prod.Codigo);
                prod.Id = produtoDb.Id;
            }

            try
            {
                var cscId = ambiente == Ambiente.Homologacao ? config.CscIdHom : config.CscId;
                var csc   = ambiente == Ambiente.Homologacao ? config.CscHom : config.Csc;

                _notaFiscalRepository.ExcluirNota(notaPendenteMemento.Chave, ambiente);
                _enviaNotaFiscalService.EnviarNotaFiscal(notaFiscalBo, cscId, csc);

                IsBusy = false;

                var mbResult = MessageBox.Show(mainWindow, "Nota enviada com sucesso! Deseja imprimi-la?",
                                               "Emissão NFe", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No);

                if (mbResult == MessageBoxResult.Yes)
                {
                    BusyContent = "Gerando impressão...";
                    IsBusy      = true;
                    await GeradorPDF.GerarPdfNotaFiscal(notaFiscalBo);
                }

                IsBusy = false;

                var          notaIndex = NotasFiscais.IndexOf(notaPendenteMemento);
                Destinatario destinatario;
                var          destinatarioUf = notaFiscalBo.Emitente.Endereco.UF;

                if (notaFiscalBo.Destinatario != null)
                {
                    destinatario   = notaFiscalBo.Destinatario;
                    destinatarioUf = destinatario.Endereco != null ? destinatario.Endereco.UF : destinatarioUf;
                }
                else
                {
                    destinatario = new Destinatario("CONSUMIDOR NÃO IDENTIFICADO");
                }

                var valorTotalProdutos = notaFiscalBo.ValorTotalProdutos.ToString("N2", new CultureInfo("pt-BR"));

                var notaMemento = new NotaFiscalMemento(notaFiscalBo.Identificacao.Numero,
                                                        notaFiscalBo.Identificacao.Modelo, notaFiscalBo.Identificacao.DataHoraEmissao,
                                                        notaFiscalBo.DataHoraAutorização, destinatario.NomeRazao, destinatarioUf, valorTotalProdutos,
                                                        notaFiscalBo.Identificacao.Status, notaFiscalBo.Identificacao.Chave);

                NotasFiscais[notaIndex] = notaMemento;
                NotaPendenteReenviadaEvent(notaFiscalBo);
            }
            catch (Exception e)
            {
                log.Error(e);
                MessageBox.Show(mainWindow,
                                "Ocorreram os seguintes erros ao tentar enviar a nota fiscal:\n\n" + e.InnerException.Message,
                                "Erro", MessageBoxButton.OK, MessageBoxImage.Information);
            }
        }