/// <summary> /// Gets a list of all products /// </summary> /// <returns>Returns all products and any active promotions</returns> public List<ProductDTO> GetProducts() { var result = db.Products.OrderBy(p => p.Description); List<ProductDTO> productsDTO = new List<ProductDTO>(); foreach(Product product in result.ToList()) { // get the product DTO, and only return promotions that have not expired ProductDTO productDTO = new ProductDTO { Code = product.Code, Description = product.Description, ProductTypeCode = product.ProductTypeCode, Price = product.Price, Promotions = ConvertPromotionList(product.Promotions.Where(p => p.EndDate == null).ToList()) }; productsDTO.Add(productDTO); } return productsDTO; }
private decimal GetPrice(ProductDTO product, ref int productItemCount, ref bool promotionApplied, OrderDTO order) { // set the price (including a discount) decimal price = product.Price; if (product.Promotions.Count > 0) { // assume the service only return 1 active promotion PromotionDTO promotion = product.Promotions.First(); if (promotion.PromotionCode == Constants.PromotionType.Discount) { // we reset the productItemCount once the promotion reaches the max apply to count if (promotion.ApplyTo != null && productItemCount > promotion.Quantity + promotion.ApplyTo) productItemCount = 1; // set the price by the percentage discount if (productItemCount > promotion.Quantity) { price = price * promotion.Amount; promotionApplied = true; } } else if (promotion.PromotionCode == Constants.PromotionType.Price && productItemCount == promotion.Quantity) { // for a price by a number of items, we set the price on the final item in the group, and set // all other items in the group to a price of 0 for (int i = order.OrderItems.Count - 1; i >= order.OrderItems.Count - promotion.Quantity + 1; i--) { OrderItemDTO orderItemPriceAdjustment = order.OrderItems.ToList()[i]; orderItemPriceAdjustment.Price = 0; orderItemPriceAdjustment.PromotionApplied = true; } price = promotion.Amount; productItemCount = 0; promotionApplied = true; } } return price; }