public IActionResult Post(List <PedidoItem> pedidosItens)
        {
            try
            {
                //Adiciona um novo pedido com os itens do pedido
                Pedido pedido = _pedidoRepository.Adicionar(pedidosItens);

                //Caso ok retorna o pedido
                return(Ok(pedido));
            }
            catch (Exception ex)
            {
                return(BadRequest(ex.Message));
            }
        }
        private async Task <Pedido> ObterPedido()
        {
            var pedidoId = ObterPedidoId();

            if (pedidoId == Guid.Empty)
            {
                var novoPedido = new Pedido();
                await _pedidoRepository.Adicionar(novoPedido);

                InserirSessionPedidoId(novoPedido.Id);
                return(novoPedido);
            }

            var pedido = await _pedidoRepository.ObterDadosPedido(pedidoId);

            return(pedido);
        }
        public async Task <bool> Handle(AdicionarItemPedidoCommand message, CancellationToken cancellationToken)
        {
            if (!ValidarComando(message))
            {
                return(false);
            }

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

            var pedidoItem = new PedidoItem(
                message.ProdutoId,
                message.Nome,
                message.Quantidade,
                message.ValorUnitario
                );

            if (pedido == null)
            {
                pedido = Pedido.PedidoFactory.NovoPedidoRascunho(message.ClienteId);
                pedido.AdicionarItem(pedidoItem);

                _pedidoRepository.Adicionar(pedido);
                pedido.AdicionarEvento(new PedidoRascunhoIniciadoEvent(message.ClienteId, message.ProdutoId));
            }
            else
            {
                var pedidoItemExistente = pedido.PedidoItemExistente(pedidoItem);
                pedido.AdicionarItem(pedidoItem);

                if (pedidoItemExistente)
                {
                    _pedidoRepository.AtualizarItem(pedido.PedidoItems.FirstOrDefault(p => p.ProdutoId == pedidoItem.ProdutoId));
                }
                else
                {
                    _pedidoRepository.AdicionarItem(pedidoItem);
                }

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

            pedido.AdicionarEvento(new PedidoItemAdicionadoEvent(pedido.ClienteId, pedido.Id, message.ProdutoId, message.Nome, message.ValorUnitario, message.Quantidade));

            return(await _pedidoRepository.UnitOfWork.Commit());
        }
예제 #4
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());
        }
예제 #5
0
        public async Task <bool> Handle(AdicionarItemPedidoCommand request, CancellationToken cancellationToken)
        {
            if (!ValidarComando(request))
            {
                return(false);
            }

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

            var pedidoItem = new PedidoItem(produtoId: request.ProdutoId, quantidade: request.Quantidade,
                                            valorUnitario: request.ValorUnitario,
                                            produtoNome: request.Nome);

            if (pedido == null)
            {
                pedido = Pedido.PedidoFactory.NovoPedidoRascunho(request.ClienteId);
                pedido.AdicionarItem(pedidoItem);

                _pedidoRepository.Adicionar(pedido);
            }
            else
            {
                var pedidoItemExistente = pedido.PedidoItemExistente(pedidoItem);
                pedido.AdicionarItem(pedidoItem);

                if (pedidoItemExistente)
                {
                    _pedidoRepository.AtualizarItem(pedido.PedidoItems.FirstOrDefault(p => p.ProdutoId == pedidoItem.ProdutoId));
                }
                else
                {
                    _pedidoRepository.AdicionarItem(pedidoItem);
                }

                _pedidoRepository.Atualizar(pedido);
            }

            pedido.AdicionarEvento(new PedidoItemAdicionadoEvent(clienteId: request.ClienteId, produtoId: request.ProdutoId,
                                                                 quantidade: request.Quantidade,
                                                                 valorUnitario: request.ValorUnitario,
                                                                 produtoNome: request.Nome, pedidoId: pedido.Id));

            return(await _pedidoRepository.UnitOfWork.Commit());
        }
예제 #6
0
        public async Task <ValidationResult> Handle(AdicionarPedidoCommand message, CancellationToken cancellationToken)
        {
            // Validação do comando
            if (!message.EhValido())
            {
                return(message.ValidationResult);
            }

            // Mapear Pedido
            var pedido = MapearPedido(message);

            // Aplicar voucher se houver
            if (!await AplicarVoucher(message, pedido))
            {
                return(ValidationResult);
            }

            // Validar pedido
            if (!ValidarPedido(pedido))
            {
                return(ValidationResult);
            }

            // Processar pagamento
            if (!ProcessarPagamento(pedido))
            {
                return(ValidationResult);
            }

            // Se pagamento tudo ok!
            pedido.AutorizarPedido();

            // Adicionar Evento
            pedido.AdicionarEvento(new PedidoRealizadoEvent(pedido.Id, pedido.ClientId));

            // Adicionar Pedido Repositorio
            _pedidoRepository.Adicionar(pedido);

            // Persistir dados de pedido e voucher
            return(await PersistirDados(_pedidoRepository.UnitOfWork));
        }
예제 #7
0
        public async Task <ValidationResult> Handle(AdicionarPedidoCommand message, CancellationToken cancellationToken)
        {
            // validar comando
            if (!message.EhValido())
            {
                return(message.ValidationResult);
            }

            //mapear pedido
            var pedido = MapearPedido(message);

            // aplicar voucher
            if (!await AplicarVoucher(message, pedido))
            {
                return(ValidationResult);
            }

            // validar pedido
            if (!ValidarPedido(pedido))
            {
                return(ValidationResult);
            }

            // processar pagamento
            if (!await ProcessarPagamento(pedido, message))
            {
                return(ValidationResult);
            }

            // se pagamento ok
            pedido.AutorizarPedido();

            // adicionar evento
            pedido.AdicionarEvento(new PedidoRealizadoEvent(pedido.Id, pedido.ClienteId));

            // adicionar pedido repositorio
            _pedidoRepository.Adicionar(pedido);

            // persistir dados do pedido e voucher
            return(await PersistirDados(_pedidoRepository.UnitOfWork));
        }
예제 #8
0
        public async Task <bool> Handle(AdicionarPedidoCommand message, CancellationToken cancellationToken)
        {
            if (!ValidarComando(message))
            {
                return(false);
            }

            var user = await _userRepository.ObterPorNome(_usuarioAutenticado.GetCurrentUserName());

            if (user.Cliente == null)
            {
                return(false);
            }

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

            pedido.InformarCliente(user.Cliente);

            await _repositoryPedido.Adicionar(pedido);

            return(await _repositoryPedido.UnitOfWork.Commit());
        }
        public async Task <string> Get()
        {
            var carga = new List <Pedido>();

            for (int i = 0; i < 40; i++)
            {
                if (i % 2 == 0)
                {
                    carga.Add(new Pedido
                    {
                        DataCadastro = DateTime.Now,
                        DataEntrega  = DateTime.Now.AddDays(1),
                        Endereco     = new PedidoEndereco()
                        {
                            CEP         = "27343-360",
                            Bairro      = "Jardim America",
                            Cidade      = "Barra Mansa",
                            Estado      = "Rio de Janeiro",
                            Complemento = "Casa 01",
                            Logradouro  = "Rua Franscisco Ribeiro",
                            Numero      = "132"
                        },
                        EquipeEntrega = new PedidoEquipeEntrega()
                        {
                            Nome         = "Transportadora xpto",
                            Descricao    = "Transportadora  lorem ipsum",
                            PlacaVeiculo = "LKJ-2132"
                        },
                        PedidoItems = new List <PedidoItem>()
                        {
                            new PedidoItem()
                            {
                                Nome = "Playstation 5", Descricao = "Console para jogos.", Valor = 5400
                            },
                            new PedidoItem()
                            {
                                Nome = "Xbox One", Descricao = "Console para jogos.", Valor = 3400
                            }
                        },
                    });
                }
                else
                {
                    carga.Add(new Pedido
                    {
                        DataCadastro = DateTime.Now,
                        DataEntrega  = DateTime.Now.AddDays(1),
                        Endereco     = new PedidoEndereco()
                        {
                            CEP         = "22131-360",
                            Bairro      = "Voldac",
                            Cidade      = "Volta Redonda",
                            Estado      = "Rio de Janeiro",
                            Complemento = "Casa 01",
                            Logradouro  = "Rua E",
                            Numero      = "212"
                        },
                        EquipeEntrega = new PedidoEquipeEntrega()
                        {
                            Nome         = "Transportadora yz",
                            Descricao    = "Transportadora  lorem ipsum",
                            PlacaVeiculo = "KMK-3121"
                        },
                        PedidoItems = new List <PedidoItem>()
                        {
                            new PedidoItem()
                            {
                                Nome = "Piscina 2000L", Descricao = "Piscina para criancas ate 6 anos.", Valor = 300
                            },
                            new PedidoItem()
                            {
                                Nome = "Pula pula", Descricao = "Cama elastica para criancas ate 12 anos.", Valor = 4700
                            }
                        },
                    });
                }
            }

            foreach (var item in carga)
            {
                await _pedidoRepository.Adicionar(item);
            }

            return("Carga Fake Realizada");
        }