public async Task <Transacao> Run(
            [ActivityTrigger] PagarComCartaoComando comando,
            ILogger logger)
        {
            logger.LogInformation($"[START ACTIVITY] --> {nameof(Activity_PagarComCartao)} para pedido: {comando.PedidoId}");
            var resultado = await _servico.Executar(comando);

            return(resultado);
        }
Beispiel #2
0
        public async Task <Transacao> Executar(PagarComCartaoComando comando)
        {
            var pedido = await _contextoSql.Pedidos.Include(x => x.Itens).FirstOrDefaultAsync(x => x.Id == comando.PedidoId);

            var transacao = Transacao.CriarAprovado(comando.PedidoId);

            pedido.PagamentoAprovado(transacao);
            await _contextoSql.AddAsync(transacao);

            await _contextoSql.SaveChangesAsync();

            return(transacao);
        }
        public static async Task <PedidoEmProcessamento> RunOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context,
            ILogger logger)
        {
            var novoPedidoComando = context.GetInput <NovoPedidoComando>();

            novoPedidoComando.ProcessoId = context.InstanceId;
            var pedidoEmProcessamento = new PedidoEmProcessamento(context.InstanceId, "");

            if (!context.IsReplaying)
            {
                logger.LogInformation($"Processando pedido {pedidoEmProcessamento.Id}");
            }

            var pedido = await context.CallActivityAsync <Pedido>(nameof(Activity_CriarPedido), novoPedidoComando);

            pedidoEmProcessamento.Status = pedido.Status.ToString();
            context.SetCustomStatus(pedidoEmProcessamento.Status);

            if (novoPedidoComando.FormaPagamento.Forma == "Boleto")
            {
                if (!context.IsReplaying)
                {
                    logger.LogInformation($"Processando pagamento em  boleto para pedido {pedidoEmProcessamento.Id}");
                }
                var gerarBoletoComando = new GerarBoletoComando(novoPedidoComando.ProcessoId);
                var boleto             = await context.CallActivityAsync <Boleto>(nameof(Activity_GerarBoleto), gerarBoletoComando);

                pedidoEmProcessamento.Status = "AguardandoPagamento";
                context.SetCustomStatus(pedidoEmProcessamento.Status);

                var confirmacaoPagamento = await context.WaitForExternalEvent <string>("PagamentoRealizado",
                                                                                       TimeSpan.FromDays((boleto.Vencimento.AddDays(1) - DateTime.UtcNow).TotalDays), "Negado");

                if (confirmacaoPagamento == "Negado")
                {
                    var cancelarPedidoComando = new CancelarPedidoComando(novoPedidoComando.ProcessoId);
                    await context.CallActivityAsync <Boleto>(nameof(Activity_CancelaPedido), cancelarPedidoComando);

                    pedidoEmProcessamento.Status = "Cancelado";
                    return(pedidoEmProcessamento);
                }

                var comandoRecebimentoBoleto = new BoletoRecebidoComando(boleto.NossoNumero, boleto.PedidoId);
                await context.CallActivityAsync <Pedido>(nameof(Activity_ConfirmarRecebimentoBoleto), comandoRecebimentoBoleto);
            }

            if (novoPedidoComando.FormaPagamento.Forma == "Cartao")
            {
                if (!context.IsReplaying)
                {
                    logger.LogInformation($"Processando pagamento em  cartao para pedido {pedidoEmProcessamento.Id}");
                }
                pedidoEmProcessamento.Status = "AguardandoPagamento";
                context.SetCustomStatus(pedidoEmProcessamento.Status);
                var pagamentoCartao = new PagarComCartaoComando(novoPedidoComando.ProcessoId, novoPedidoComando.FormaPagamento.Token);
                var transacao       = await context.CallActivityAsync <Transacao>(nameof(Activity_PagarComCartao), pagamentoCartao);

                if (transacao.Status == Transacao.EStatus.Negado)
                {
                    var confirmacaoPagamento = await context.WaitForExternalEvent <string>("PagamentoAprovado");

                    if (confirmacaoPagamento == "Negado")
                    {
                        var cancelarPedidoComando = new CancelarPedidoComando(novoPedidoComando.ProcessoId);
                        await context.CallActivityAsync <Boleto>(nameof(Activity_CancelaPedido), cancelarPedidoComando);

                        pedidoEmProcessamento.Status = "Cancelado";
                        return(pedidoEmProcessamento);
                    }
                }
            }

            pedidoEmProcessamento.Status = "ProntoParaEnvio";
            context.SetCustomStatus("ProntoParaEnvio");
            return(pedidoEmProcessamento);
        }