Пример #1
0
        public async Task <bool> Handle(AtualizarItemPedidoCommand message, CancellationToken cancellationToken)
        {
            if (!ValidarComando(message))
            {
                return(false);
            }

            var pedido = await pedidoRepository.ObterPedidoRascunhoPorClienteId(message.ClienteId);

            if (pedido == null)
            {
                await mediatrHandler.PublicarNotificacao(new DomainNotification("pedido", "Pedido não encontrado!"));

                return(false);
            }

            var pedidoItem = await pedidoRepository.ObterItemPorPedido(pedido.Id, message.ProdutoId);

            if (!pedido.PedidoItemExistente(pedidoItem))
            {
                await mediatrHandler.PublicarNotificacao(new DomainNotification("pedido", "Item do pedido não encontrado!"));

                return(false);
            }

            pedido.AtualizarUnidades(pedidoItem, message.Quantidade);
            //pedido.AdicionarEvento(new PedidoProdutoAtualizadoEvent(message.ClienteId, pedido.Id, message.ProdutoId, message.Quantidade));

            pedidoRepository.AtualizarItem(pedidoItem);
            pedidoRepository.Atualizar(pedido);

            return(await pedidoRepository.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);
        }
Пример #3
0
        public async Task <bool> Handle(AdicionarPedidoCommand message, CancellationToken cancellationToken)
        {
            if (!ValidarComando(message))
            {
                return(false);
            }


            var cliente = await _clienteRepository.ObterPorId(message.ClienteId);

            var drone = _droneRepository.ObterTodos().Result.OrderByDescending(d => d.Autonomia).FirstOrDefault(d => d.Capacidade >= message.Peso);

            if (drone == null)
            {
                await _mediatr.PublicarNotificacao(new DomainNotification(message.MessageType, "Pedido acima do peso máximo aceito."));

                return(false);
            }

            double distancia = _localizacaoLoja.CalcularDistanciaEmKilometros(new Localizacao(cliente.Latitude, cliente.Longitude));

            distancia *= 2;

            int tempoTrajetoCompleto = distancia.CalcularTempoTrajetoEmMinutos(drone.Velocidade);

            if (tempoTrajetoCompleto > drone.Autonomia)
            {
                await _mediatr.PublicarNotificacao(new DomainNotification(message.MessageType, "Fora da área de entrega."));

                return(false);
            }

            var pedido = new Pedido(message.Peso, message.DataHora, message.Status, message.Valor);

            pedido.InformarCliente(cliente);

            pedido.AdicionarEvento(new PedidoAdicionadoEvent(pedido.Valor, message.BandeiraCartao, message.NumeroCartao, message.MesVencimentoCartao, message.AnoVencimentoCartao)
            {
                AggregateRoot = pedido.Id
            });
            await _pedidoRepository.Adicionar(pedido);

            return(await _pedidoRepository.UnitOfWork.Commit());
        }
Пример #4
0
        private bool ValidarComando(Command message)
        {
            if (message.EhValido())
            {
                return(true);
            }

            foreach (var error in message.ValidationResult.Errors)
            {
                _bus.PublicarNotificacao(new DomainNotification(message.MessageType, error.ErrorMessage));
            }

            return(false);
        }
Пример #5
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);
        }
Пример #6
0
 protected void NotificarErro(string codigo, string mensagem)
 {
     _mediatrHandler.PublicarNotificacao(new DomainNotification(codigo, mensagem));
 }
Пример #7
0
        public async Task <bool> Handle(AtualizarItemPedidoCommand request, CancellationToken cancellationToken)
        {
            if (!ValidarComando(request))
            {
                return(false);
            }

            var pedido = await _pedidoRepository.ObterPedidoRascunhoPorClienteId(request.ClienteId);

            if (pedido == null)
            {
                await _mediatorHandler.PublicarNotificacao(new DomainNotification("pedido", "Pedido não encontrado"));

                return(false);
            }

            var pedidoItem = await _pedidoRepository.ObterItemPorPedido(pedido.Id, request.ProdutoId);

            if (pedidoItem != null && !pedido.PedidoItemExistente(pedidoItem))
            {
                await _mediatorHandler.PublicarNotificacao(new DomainNotification("pedido",
                                                                                  "Item do pedido não encontrado"));

                return(false);
            }

            pedido.AtualizarUnidades(pedidoItem, request.Quantidade);

            pedido.AdicionarEvento(new PedidoAtualizadoEvent(pedido.ClienteId, pedido.Id, pedido.ValorTotal));

            _pedidoRepository.AtualizarItem(pedidoItem);
            _pedidoRepository.Atualizar(pedido);

            return(await _pedidoRepository.UnitOfWork.Commit());
        }