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); }
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); }
private static List <OrderSandwich> OrderSandwichs(CreateOrderCommand request) { return(request.Sandwiches.Where(s => !s.Deleted.HasValue || !s.Deleted.Value).ToList()); }