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."); } }
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); } }
public async void CancelarPedidoSemEstoque(PedidoAutorizadoIntegrationEvent message) { var pedidoCancelado = new PedidoCanceladoIntegrationEvent(message.ClienteId, message.PedidoId); await _bus.PublishAsync(pedidoCancelado); }