예제 #1
0
        private async Task <Response <Order> > OrderIsValid(CreateOrderCommand request)
        {
            if (string.IsNullOrEmpty(_appContext.UserName))
            {
                return(new Response <Order>("Responsável pela operação não informado!"));
            }

            if (request.Sandwiches == null || request.Sandwiches.Count == 0)
            {
                return(new Response <Order>("Informe ao menos um lanche para abrir o pedido!"));
            }

            //Atualiza as informações do pedido com a última posição do db
            var sandwiches = OrderSandwichs(request);

            for (var i = 0; i < sandwiches.Count; i++)
            {
                sandwiches[i].Sandwich = await _sandwichRepository.FindByIdAsync(sandwiches[i].SandwichId);

                if (sandwiches[i].AdditionalIngredients == null)
                {
                    sandwiches[i].AdditionalIngredients = new List <OrderSandwichIngredient>();
                }

                for (var x = 0; x < sandwiches[i].AdditionalIngredients.Count; x++)
                {
                    sandwiches[i].AdditionalIngredients[x].Ingredient = await _ingredientRepository.FindByIdAsync(sandwiches[i].AdditionalIngredients[x].IngredientId);
                }
            }

            if (sandwiches.Any(x => (x.Sandwich.Deleted.HasValue && x.Sandwich.Deleted.Value) || x.Sandwich.Ingredients.Any(i => i.Deleted.HasValue && i.Deleted.Value)))
            {
                return(new Response <Order>($"Lanche {sandwiches.First(x => (x.Sandwich.Deleted.HasValue && x.Sandwich.Deleted.Value) || x.Sandwich.Ingredients.Any(i => i.Deleted.HasValue && i.Deleted.Value)).Sandwich.Name} indisponível!"));
            }

            if (sandwiches.Any(x => x.AdditionalIngredients.Any(ai => (!ai.Deleted.HasValue || !ai.Deleted.Value) && (ai.Ingredient == null || (ai.Ingredient.Deleted.HasValue && ai.Ingredient.Deleted.Value)))))
            {
                var sandwich   = sandwiches.First(x => x.AdditionalIngredients.Any(ai => (!ai.Deleted.HasValue || !ai.Deleted.Value) && (ai.Ingredient == null || (ai.Ingredient.Deleted.HasValue && ai.Ingredient.Deleted.Value))));
                var ingredient = sandwich.AdditionalIngredients.First(ai => (!ai.Deleted.HasValue || !ai.Deleted.Value) && (ai.Ingredient == null || (ai.Ingredient.Deleted.HasValue && ai.Ingredient.Deleted.Value)));

                return(new Response <Order>($"O ingrediente adicional {ingredient.Ingredient.Name} do Lanche {request.Sandwiches.First(x => x.Sandwich.Deleted.HasValue && x.Sandwich.Deleted.Value).Sandwich.Name}, está indisponível!"));
            }

            return(null);
        }
예제 #2
0
        public async Task <Response <Order> > Handle(CreateOrderCommand request, CancellationToken cancellationToken)
        {
            var orderEntity = new Order()
            {
                Id = Guid.NewGuid(), Status = Common.OrderStatusEnum.NewOrder, Rules = new List <OrderPriceRule>(), Created = DateTime.Now, CreatedBy = _appContext.UserName
            };
            Response <Order> response = await OrderIsValid(request);

            if (response == null)
            {
                //Calcula o valor total dos itens do pedido
                var sandwiches = OrderSandwichs(request);
                orderEntity.Sandwiches  = sandwiches;
                orderEntity.TableNumber = request.TableNumber;

                decimal sandwichTotalValue = sandwiches.Select(s => s.Sandwich.Price * s.Quantity).Sum();
                decimal sandwichAdditionalIngredientsValue = sandwiches.Select(s => s.AdditionalIngredients.Where(ai => !ai.Deleted.HasValue || !ai.Deleted.Value).Select(ai => ai.Ingredient.Price * ai.Quantity).Sum()).Sum();
                decimal increaseValue = 0M;
                decimal decreaseValue = 0M;

                orderEntity.TotalItens = sandwichTotalValue + sandwichAdditionalIngredientsValue;
                orderEntity.Total      = orderEntity.TotalItens;

                //Adiciona as regras para calculo do valor final
                var allRules = (await _priceRuleRepository.ListAsync()).Where(pr => !pr.Deleted.HasValue || !pr.Deleted.Value).ToList();
                decreaseValue      = ApplyDecreasePriceRule(orderEntity, sandwiches, allRules);
                orderEntity.Total -= decreaseValue;

                increaseValue      = ApplyIncreasePriceRule(orderEntity, allRules);
                orderEntity.Total += increaseValue;

                await _orderRepository.AddAsync(orderEntity);

                await _unitOfWork.CompleteAsync();

                response = new Response <Order>(orderEntity);
            }

            return(response);
        }
예제 #3
0
 private static List <OrderSandwich> OrderSandwichs(CreateOrderCommand request)
 {
     return(request.Sandwiches.Where(s => !s.Deleted.HasValue || !s.Deleted.Value).ToList());
 }