Ejemplo n.º 1
0
        public override async Task Transmitir()
        {
            Progresso progresso = null;

            progresso = new Progresso(async() =>
            {
                var retTransmissao = await ConsultarRespostaInicial(true);
                await progresso.Update(1);
                var status = retTransmissao.StatusResposta;
                if (status == 103 || status == 104)
                {
                    if (status == 103)
                    {
                        var tempoResposta = retTransmissao.DadosRecibo.TempoMedioResposta;
                        await Task.Delay(TimeSpan.FromSeconds(tempoResposta + 5));
                    }
                    await progresso.Update(2);

                    bool homologacao;
                    try
                    {
                        homologacao = ((NFe)ItemCompleto).AmbienteTestes;
                    }
                    catch (Exception e)
                    {
                        throw new AnaliseErro("Erro durante a obtenção do ambiente de testes.", e);
                    }
                    var resultadoResposta = await ConsultarRespostaFinal(retTransmissao, homologacao);
                    await progresso.Update(3);

                    var protocoloResposta = resultadoResposta.Protocolo?.InfProt;
                    if (protocoloResposta?.cStat == 100)
                    {
                        var nfe      = (NFe)ItemCompleto;
                        ItemCompleto = new ProcessoNFe()
                        {
                            NFe     = nfe,
                            ProtNFe = resultadoResposta.Protocolo
                        };
                        ItemBanco.Status = (int)StatusNota.Emitida;
                        AtualizarDI(ItemCompleto);
                        OnStatusChanged(StatusNota.Emitida);
                        await progresso.Update(4);

                        using (var opEx = new BaseGeral.Repositorio.OperacoesExtras())
                        {
                            var rvVinculado = opEx.GetRVVinculado(nfe.Informacoes.Id);
                            if (rvVinculado != null)
                            {
                                if (rvVinculado.Cancelado)
                                {
                                    var dialog = new MessageDialog("Um registro de venda já cancelado está vinculado a esta nota fiscal, você ainda deseja aplicar as alterações no estoque?", "Aviso");
                                    dialog.Commands.Add(new UICommand("Sim", x => AtualizarEstoques()));
                                    dialog.Commands.Add(new UICommand("Não"));
                                    await dialog.ShowAsync();
                                }
                                else
                                {
                                    var dialog = new MessageDialog("Um registro de venda válido está vinculado a esta nota fiscal, você ainda deseja aplicar as alterações no estoque?", "Aviso");
                                    dialog.Commands.Add(new UICommand("Sim", x => AtualizarEstoques()));
                                    dialog.Commands.Add(new UICommand("Não"));
                                    await dialog.ShowAsync();
                                }
                            }
                            else
                            {
                                AtualizarEstoques();
                            }
                        }

                        void AtualizarEstoques()
                        {
                            var tpOp = nfe.Informacoes.identificacao.TipoOperacao;
                            if (tpOp == 1 && DefinicoesPermanentes.ConfiguracoesEstoque.NFeS)
                            {
                                using (var leit = new BaseGeral.Repositorio.Leitura())
                                    using (var escr = new BaseGeral.Repositorio.Escrita())
                                    {
                                        escr.AtualizarEstoques(DefinicoesTemporarias.DateTimeNow,
                                                               (from prod in nfe.Informacoes.produtos
                                                                let orig = leit.ObterProduto(prod.Produto.CodigoProduto)
                                                                           where orig != null
                                                                           select(orig.Id, prod.Produto.QuantidadeComercializada * -1)).ToArray());
                                    }
                            }
                            else if (tpOp == 0 && DefinicoesPermanentes.ConfiguracoesEstoque.NFeE)
                            {
                                using (var leit = new BaseGeral.Repositorio.Leitura())
                                    using (var escr = new BaseGeral.Repositorio.Escrita())
                                    {
                                        escr.AtualizarEstoques(DefinicoesTemporarias.DateTimeNow,
                                                               (from prod in nfe.Informacoes.produtos
                                                                let orig = leit.ObterProduto(prod.Produto.CodigoProduto)
                                                                           where orig != null
                                                                           select(orig.Id, prod.Produto.QuantidadeComercializada)).ToArray());
                                    }
                            }
                        }

                        return(true, protocoloResposta.xMotivo);
                    }
                    else if (protocoloResposta != null)
                    {
                        return(false, $"{protocoloResposta.cStat}: {protocoloResposta.xMotivo}");
                    }
                    else
                    {
                        return(false, $"{resultadoResposta.StatusResposta}: {resultadoResposta.DescricaoResposta}");
                    }
                }
                else
                {
                    return(false, $"{retTransmissao.StatusResposta}: {retTransmissao.DescricaoResposta}");
                }
            }, "Processar e enviar requisição inicial",
                                      "Aguardar tempo médio de resposta",
                                      "Processar e enviar requisição final",
                                      "Processar e analisar resposta final");
            progresso.Start();
            await progresso.ShowAsync();
        }