示例#1
0
        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));
            }
        }
示例#2
0
        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());
        }
示例#3
0
        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);
        }
示例#4
0
        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));
        }
示例#6
0
        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());
        }
示例#9
0
        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());
        }
示例#10
0
        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());
        }
示例#11
0
 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");
         }
     }
 }
示例#12
0
        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 }));
        }
示例#13
0
        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));
        }
示例#14
0
        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);
        }
示例#15
0
        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));
            }
        }
示例#16
0
        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);
        }
示例#17
0
        public async Task <IActionResult> AtualizarSituacaoPedido(AtualizarSituacaoPedidoViewModel viewModel)
        {
            await _mediator.PublicarEvento(new PagementoPedidoProcessadoEvent(viewModel.PedidoId, viewModel.SituacaoPagamento));

            return(Ok());
        }