private async void ProcessarPedidos(object state)
        {
            using (var scope = _serviceProvider.CreateScope())
            {
                _logger.LogInformation($"Processando Pedido");

                var pedidoQueries = scope.ServiceProvider.GetRequiredService <IPedidoQueries>();
                var pedido        = await pedidoQueries.ObterPedidosAutorizados();

                if (pedido == null)
                {
                    return;
                }

                _logger.LogInformation($"Processando Pedido ID: {pedido.Id}");

                var bus = scope.ServiceProvider.GetRequiredService <IMessageBus>();

                var pedidoAutorizado = new PedidoAutorizadoIntegrationEvent(pedido.ClienteId, pedido.Id,
                                                                            pedido.PedidoItems.ToDictionary(p => p.ProdutoId, p => p.Quantidade));

                await bus.PublishAsync(pedidoAutorizado);

                _logger.LogInformation($"Pedido ID: {pedido.Id} foi encaminhado para baixa no estoque.");
            }
        }
示例#2
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);
            }
        }
示例#3
0
 public async void CancelarPedidoSemEstoque(PedidoAutorizadoIntegrationEvent message)
 {
     var pedidoCancelado = new PedidoCanceladoIntegrationEvent(message.ClienteId, message.PedidoId);
     await _bus.PublishAsync(pedidoCancelado);
 }