Ejemplo n.º 1
0
        private async Task BaixarEstoque(PedidoAutorizadoIntegrationEvent message)
        {
            using (var scope = _serviceProvider.CreateScope())
            {
                var produtosComEstoque = new List <Produto>();
                var produtoRepository  = scope.ServiceProvider.GetRequiredService <IProdutoRepository>();

                var idsProdutos = string.Join(",", message.Itens.Select(c => c.Key));

                var produtos = await produtoRepository.ObterProdutosPorId(idsProdutos);

                if (produtos.Count != message.Itens.Count)
                {
                    CancelarPedidoSemEstoque(message);

                    return;
                }

                foreach (var produto in produtos)
                {
                    var quantidadeProduto = message.Itens.FirstOrDefault(p => p.Key == produto.Id).Value;

                    if (produto.EstaDisponivel(quantidadeProduto))
                    {
                        produto.RetirarEstoque(quantidadeProduto);
                        produtosComEstoque.Add(produto);
                    }
                }

                if (produtosComEstoque.Count != message.Itens.Count)
                {
                    CancelarPedidoSemEstoque(message);

                    return;
                }

                foreach (var produto in produtosComEstoque)
                {
                    produtoRepository.Atualizar(produto);
                }


                if (!await produtoRepository.UnitOfWork.Commit())
                {
                    throw new DomainException($"Problemas ao atualizar estoque do pedido {message.PedidoId}");
                }


                var pedidoBaixado = new PedidoBaixadoEstoqueIntegrationEvent(message.ClienteId, message.PedidoId);

                await _bus.PublishAsync(pedidoBaixado);
            }
        }
Ejemplo n.º 2
0
        private async Task CapturarPagamento(PedidoBaixadoEstoqueIntegrationEvent message)
        {
            using var scope = _serviceProvider.CreateScope();
            var pagamentoService = scope.ServiceProvider.GetRequiredService <IPagamentoService>();
            var response         = await pagamentoService.CapturarPagamento(message.PedidoId);

            if (!response.ValidationResult.IsValid)
            {
                throw new DomainException($"Falha ao capturar o pagamento do pedido {message.PedidoId}");
            }

            await _bus.PublishAsync(new PedidoPagoIntegrationEvent(message.ClienteId, message.PedidoId));
        }
        private async Task FinalizarPedido(PedidoBaixadoEstoqueIntegrationEvent message)
        {
            using (var scope = _serviceProvider.CreateScope())
            {
                var pedidoRepository = scope.ServiceProvider.GetRequiredService <IPedidoRepository>();

                var pedido = await pedidoRepository.ObterPorId(message.PedidoId);

                pedido.FinalizarPedido();

                pedidoRepository.Atualizar(pedido);

                if (!await pedidoRepository.UnitOfWork.Commit())
                {
                    throw new DomainException($"Falha ao finalizar pedido {message.PedidoId}");
                }
            }
        }