public async Task Handle(PedidoIniciadoEvent message, CancellationToken cancellationToken) { var result = await _estoqueService.DebitarListaProdutosPedido(message.ProdutosPedido); if (result) { await _mediatrHandler.PublicarEvento(new PedidoEstoqueConfirmadoEvent(message.PedidoId, message.ClienteId, message.Total, message.ProdutosPedido, message.NomeCartao, message.NumeroCartao, message.ExpiracaoCartao, message.CvvCartao)); } else { await _mediatrHandler.PublicarEvento(new PedidoEstoqueRejeitadoEvent(message.PedidoId, message.ClienteId)); } }
public async Task <bool> DebitarEstoque(Guid produtoId, int quantidade) { var produto = await _produtoRepository.ObterPorID(produtoId); //Validacoes.ValidarSeNulo(produto, "O produto informado está nulo."); if (produto == null) { return(false); } if (!produto.PossuiEstoque(quantidade)) { return(false); } produto.DebitarEstoque(quantidade); //Aqui deverá ser acionado um evento para alertar que é necessário a compra de mais quantidades deste produto. if (produto.quantidadeEstoque < 10) { //avisar, mandar email, mandar sms, integração com outro sistema e avisar que estoque está baixo await _bus.PublicarEvento(new ProdutoAbaixoEstoqueEvent(produto.id, produto.quantidadeEstoque)); } _produtoRepository.Atualizar(produto); return(await _produtoRepository.unitOfWork.Commit()); }
public async Task <bool> Commit() { foreach (var entry in ChangeTracker.Entries() .Where(entry => entry.Entity.GetType().GetProperty("DataCadastro") != null)) { if (entry.State == EntityState.Added) { entry.Property("DataCadastro").CurrentValue = DateTime.Now; } if (entry.State == EntityState.Modified) { entry.Property("DataCadastro").IsModified = false; } } var success = await base.SaveChangesAsync() > 0; if (success) { await _mediatrHandler.PublicarEvento(this); } return(success); }
public async Task <bool> DebitarEstoque(Guid produtoId, int quantidade) { var produto = await _produtoRepository.ObterPorId(produtoId); if (produto == null) { return(false); } if (!produto.PossuiEstoque(quantidade)) { return(false); } produto.DebitarEstoque(quantidade); //Cria um evento para informar que o produto está com estoque baixo. if (produto.QuantidadeEstoque < 10) { await _bus.PublicarEvento(new ProdutoAbaixoEstoqueEvent(produto.Id, produto.QuantidadeEstoque)); } _produtoRepository.Atualizar(produto); return(await _produtoRepository.UnitOfWork.Commit()); }
public async Task <bool> DebitarEstoque(Guid produtoId, int quantidade) { var produto = await _produtoRepository.ObterPorId(produtoId); if (produto == null) { return(false); //podemos tbm lançar uma exception } if (!produto.PossuiEstoque(quantidade)) { return(false); } produto.DebitarEstoque(quantidade); //TODO: Parametrizar a quantidade de estoque baixo if (produto.QuantidadeEstoque < 10) { //avisar, mandar email, abrir chamado, realizar nova compra, etc. //Essa manipução é feita dentro da classe ProdutoEventHandler await _bus.PublicarEvento(new ProdutoAbaixoEstoqueEvent(produto.Id, produto.QuantidadeEstoque)); //TODO: aqui esse new infringe o Single Responsibility Principle? (acho que sim) } return(await AtualizarProduto(produto)); }
public async Task <bool> DebitarEstoque(Guid produtoId, int quantidade) { var produto = await _produtoRepository.ObterPorId(produtoId); if (produto == null) { return(false); } if (!produto.PossuiEstoque(quantidade)) { return(false); } produto.DebitarEstoque(quantidade); //TODO: Parametrizar qtd de estoque baixo if (produto.QuantidadeEstoque < 10) { // Notificar responsavel, abrir chamado, realizar nova compra por exemplo nao sao responsabilidades dessa classe // Apenas publica evento falando que isso aconteceu e o que deve ser feita com essa informacao nao interessa aqui await _mediatr.PublicarEvento(new ProdutoAbaixoEstoqueEvent(produto.Id, produto.QuantidadeEstoque)); } _produtoRepository.Atualizar(produto); return(await _produtoRepository.UnitOfWork.Commit()); }
private async Task <bool> DebitarItemEstoque(Guid produtoId, int quantidade) { var produto = await _produtoRepository.ObterPorId(produtoId); if (produto == null) { return(false); } if (!produto.PossuiEstoque(quantidade)) { await _mediatorHandler.PublicarNotificacao(new DomainNotification("Estoque", $"Produto - {produto.Nome} sem estoque")); return(false); } produto.DebitarEstoque(quantidade); // TODO: 10 pode ser parametrizavel em arquivo de configuração if (produto.QuantidadeEstoque < 10) { await _mediatorHandler.PublicarEvento(new ProdutoAbaixoEstoqueEvent(produto.Id, produto.QuantidadeEstoque)); } _produtoRepository.Atualizar(produto); return(true); }
public async Task <bool> DebitarEstoque(Guid produtoId, int quantidade) { var produto = await _produtoRepository.ObterPorId(produtoId); if (produto is null) { return(false); } if (!produto.PossuiEstoque(quantidade)) { return(false); } produto.DebitarEstoque(quantidade); //TODO: Parametrizar a quantidade de estoque baixo if (produto.QuantidadeEstoque < 10) { //Avisar, mandar e-mail, abrir chamado, ralizar compra await _bus.PublicarEvento(new ProdutoAbaixoEstoqueEvent(produto.Id, produto.QuantidadeEstoque)); } return(await _produtoRepository.UnitOfWork.Commit()); }
public async Task <bool> DebitarEstoque(Guid produtoId, int quantidade) { var produto = await _produtoRepository.ObterPorId(produtoId); if (produto == null) { return(false); } if (!produto.PossuiEstoque(quantidade)) { return(false); } produto.DebitarEstoque(quantidade); // TODO: 10 pode ser parametrizavel em arquivo de configuração if (produto.QuantidadeEstoque < 10) { await _bus.PublicarEvento(new ProdutoAbaixoEstoqueEvent(produto.Id, produto.QuantidadeEstoque)); } _produtoRepository.Atualizar(produto); return(await _produtoRepository.UnitOfWork.Commit()); }
public async Task <bool> DebitarEstoque(Guid produtoId, int quantidade) { var produto = await _produtoRepository.ObterPorId(produtoId); if (produto == null) { return(false); } if (!produto.PossuiEstoque(quantidade)) { return(false); } produto.DebitarEstoque(quantidade); // TODO: Parametrizar a quantidade de estoque baixo if (produto.QuantidadeEstoque < 10) { //Publica o evento ProdutoAbaixoEstoque, onde a instância passada como parâmetro deve obrigatoriamente //herdar de Event await _bus.PublicarEvento(new ProdutoAbaixoEstoqueEvent(produto.Id, produto.QuantidadeEstoque)); } _produtoRepository.Atualizar(produto); return(await _produtoRepository.UnitOfWork.Commit()); }
private async Task ObterAsync() { foreach (var msg in _consumer.Consume()) { try { await _mediatr.PublicarEvento(JsonConvert.DeserializeObject <PedidoSolicitadoEvent>(JsonConvert.SerializeObject(Encoding.UTF8.GetString(msg.Value)))); } catch (Exception ex) { _logger.LogCritical($"algo errado aconteceu"); } } }
public async Task <ActionResult> PostAsync([FromBody] PedidoViewModel pedido) { var command = new AdicionarPedidoCommand(peso: pedido.Peso, latitude: pedido.Latitude, longitude: pedido.Longitude); var enviado = await _bus.EnviarComando(command); if (!enviado) { return(BadRequest()); } await _bus.PublicarEvento(new SolicitarEntregaEvent(command.Id)); return(CreatedAtAction("GetPedido", new { Sucess = true, command.Id })); }
public async Task RealizarCalculo(Calculo calculo) { var configuracao = await _calculoDAO.ObterConfiguracao(calculo.IdConfiguracao).ConfigureAwait(false); Validacoes.ValidarSeNulo(configuracao, "Não existe nenhuma configuração cadastrada."); calculo.AtualizarQuantidadeDePilares(CalcularQuantidadeDePilares(calculo, configuracao)); calculo.AtualizarDistanciaDosVaos(CalcularDistanciaDosVaos(calculo)); calculo.AtualizarPilaresComBaseReforcada(CalcularBaseReforcada(calculo, configuracao)); await _mediatrHandler.PublicarEvento(new CalculoRealizadoEvent(calculo.Id, calculo)); }
public static async Task PublicarEventos(this IMediatrHandler mediator, PagamentoContext ctx) { var domainEntities = ctx.ChangeTracker .Entries <Entity>() .Where(x => x.Entity.Notificacoes != null && x.Entity.Notificacoes.Any()); var domainEvents = domainEntities .SelectMany(x => x.Entity.Notificacoes) .ToList(); domainEntities.ToList() .ForEach(entity => entity.Entity.LimparEventos()); var tasks = domainEvents .Select(async(domainEvent) => { await mediator.PublicarEvento(domainEvent); }); await Task.WhenAll(tasks); }
public async Task CadastroFiel(CadastroFielViewModel cadastroFielViewModel) { if (cadastroFielViewModel.EhValido()) { var fiel = _mapper.Map <FielViewModel>(cadastroFielViewModel); await _cadastroService.CadastroFiel(fiel); if (await _fielIunitOfWork.Commit()) { var cadastroEvent = new FielCadastradoEvent(cadastroFielViewModel.Email, cadastroFielViewModel.Telefone, cadastroFielViewModel.NomeFiel); await _mediatrHandler.PublicarEvento <FielCadastradoEvent>(cadastroEvent); } } foreach (var erro in cadastroFielViewModel.Erros()) { DomainNotificationHandler.AddNotification(new DomainNotification(erro.PropertyName, erro.ErrorMessage)); } }
public async Task <Transacao> RealizarPagamentoPedido(PagamentoPedido pagamentoPedido) { var pedido = new Pedido { Id = pagamentoPedido.PedidoId, Valor = pagamentoPedido.Total }; var pagamento = new Pagamento { Valor = pagamentoPedido.Total, NomeCartao = pagamentoPedido.NomeCartao, NumeroCartao = pagamentoPedido.NumeroCartao, ExpiracaoCartao = pagamentoPedido.ExpiracaoCartao, CvvCartao = pagamentoPedido.CvvCartao, PedidoId = pagamentoPedido.PedidoId }; var transacao = _pagamentoCartaoCreditoFacade.RealizarPagamento(pedido, pagamento); if (transacao.StatusTransacao == StatusTransacao.Pago) { pagamento.AdicionarEvento(new PedidoPagamentoRealizadoEvent(pedido.Id, pagamentoPedido.ClienteId, transacao.PagamentoId, transacao.Id, pedido.Valor)); _pagamentoRepository.Adicionar(pagamento); _pagamentoRepository.AdicionarTransacao(transacao); await _pagamentoRepository.UnitOfWork.Commit(); return(transacao); } await _mediatrHandler.PublicarNotificacao(new DomainNotification("pagamento", "A operadora recusou o pagamento")); await _mediatrHandler.PublicarEvento(new PedidoPagamentoRecusadoEvent(pedido.Id, pagamentoPedido.ClienteId, transacao.PagamentoId, transacao.Id, pedido.Valor)); return(transacao); }
public async Task <IActionResult> AtualizarSituacaoPedido(AtualizarSituacaoPedidoViewModel viewModel) { await _mediator.PublicarEvento(new PagementoPedidoProcessadoEvent(viewModel.PedidoId, viewModel.SituacaoPagamento)); return(Ok()); }