public void _3_PercentDiscount_Categories() { //15 percent off Female-Winter-Collection var exp = "Category=1001;PriceType=R;PercentDiscount=0.15"; var promoExp = PromotionLineItemExpression.Parse(exp); var promo = new PromotionLineItem { PromotionLineItemExpression = exp }; var cartlineItems = new List <Cart>() { new Cart() { Categories = new List <string>() { "1001" }, OriginalPrice = 40m, DiscountAmount = 0m, Quantity = 2, DiscountApplied = false, PriceType = "R" }, new Cart() { Categories = new List <string>() { "1003", "1004" }.ToList(), OriginalPrice = 20m, DiscountAmount = 0m, Quantity = 1, DiscountApplied = false, PriceType = "R" } }; new CartProcessor().ApplyEach(promo, cartlineItems); Assert.AreEqual(88m, cartlineItems.Sum(c => c.Sum)); //Assert.AreEqual(CartContext.Products.Single(p => p.Code == "1001").Price, // cartProcessor.Process(promotion.PromotionLineItems, cartLineItems).FirstOrDefault().DiscountedPrice); }
public void _2_PromoExpression_Parse() { var exp = "Category=1001,1002;PriceType=R,W;ItemCode=1001,1005;FreeShipping=True;BuyItemCategory=1004;BuyItemCount=5;BuyItemCode=1001,1002;GetItemCategory=1003;GetItemCount=2;GetItemCode=1005;PercentDiscount=0.25;AmountDiscount=10"; var promoExp = PromotionLineItemExpression.Parse(exp); Assert.AreEqual("1001,1002", string.Join(",", promoExp.Category.ToArray())); Assert.AreEqual("R,W", string.Join(",", promoExp.PriceType.ToArray())); Assert.AreEqual("1001,1005", string.Join(",", promoExp.ItemCode.ToArray())); Assert.AreEqual(true, promoExp.FreeShipping); Assert.AreEqual("1004", string.Join(",", promoExp.BuyItemCategory.ToArray())); Assert.AreEqual(5, promoExp.BuyItemCount); Assert.AreEqual("1003", string.Join(",", promoExp.GetItemCategory.ToArray())); Assert.AreEqual(2, promoExp.GetItemCount); Assert.AreEqual("1005", string.Join(",", promoExp.GetItemCode.ToArray())); Assert.AreEqual("1001,1002", string.Join(",", promoExp.BuyItemCode.ToArray())); Assert.AreEqual(.25m, promoExp.PercentDiscount); Assert.AreEqual(10m, promoExp.AmountDiscount); }
public void ApplyEach(PromotionLineItem promo, List <Cart> carts) { var tempLineItems = new List <Cart>(); foreach (var lineItem in carts) { var promoExp = PromotionLineItemExpression.Parse(promo.PromotionLineItemExpression); lineItem.DiscountApplied = false; if (promoExp.Category.Count > 0 && !lineItem.DiscountApplied && promoExp.PriceType.Contains(lineItem.PriceType)) { var qualifiedCategories = promoExp.Category.Intersect(lineItem.Categories); if (qualifiedCategories.Count() > 0) { lineItem.DiscountAmount = promoExp.AmountDiscount + (lineItem.OriginalPrice * promoExp.PercentDiscount); //lineItem.DiscountedPrice = lineItem.OriginalPrice - lineItem.DiscountAmount; } lineItem.DiscountApplied = true; } if (promoExp.ItemCode.Count > 0 && !lineItem.DiscountApplied && promoExp.PriceType.Contains(lineItem.PriceType)) { var qualified = promoExp.ItemCode.Contains(lineItem.Product.Code); if (qualified) { lineItem.DiscountAmount = promoExp.AmountDiscount + (lineItem.OriginalPrice * promoExp.PercentDiscount); //lineItem.DiscountedPrice = lineItem.OriginalPrice - lineItem.DiscountAmount; } lineItem.DiscountApplied = true; } if (promoExp.BuyItemCode.Count > 0 && !lineItem.DiscountApplied && promoExp.PriceType.Contains(lineItem.PriceType)) { var qualified = promoExp.BuyItemCode.Contains(lineItem.Product.Code) && lineItem.Quantity >= promoExp.BuyItemCount; if (qualified) { //how many free items ? var freeItemCount = lineItem.Quantity / promoExp.BuyItemCount; //slow !!!!!!!!!!!!!!! using (var context = new ShoppingCartContext()) { var product = context.Products.Single(p => p.Code == promoExp.GetItemCode.FirstOrDefault()); //only support single get product for (int i = 0; i < freeItemCount; i++) { tempLineItems.Add(new Cart() { OriginalPrice = context.ProductOffers.ToList().Single(po => po.ProductId == product.Id && po.PriceTypeId == 1).Price, DiscountAmount = context.ProductOffers.ToList().Single(po => po.ProductId == product.Id && po.PriceTypeId == 1).Price, ShippingCost = lineItem.ShippingCost, //DiscountedPrice = 0m, DiscountApplied = true, AddOnItem = true, Quantity = promoExp.GetItemCount, Code = Guid.NewGuid().ToString(), Categories = lineItem.Categories, DateCreated = lineItem.DateCreated, PriceType = lineItem.PriceType, Product = product //ProductCode = product.Code }); } } } } //if the cart line item applies for this promo //if (promo.ProductOffers.Any(po => po.Code == lineItem.ProductOffer.Code) && lineItem.ProductOffer.Discountable && promo.Quantity >= lineItem.Quantity) //{ // if (promo.FreeShipping) // lineItem.ShippingCost = 0m; // lineItem.DiscountAmount = (lineItem.OriginalPrice * (1 - promo.PercentDiscount)) - promo.AmountDiscount; // lineItem.DiscountedPrice = lineItem.OriginalPrice - lineItem.DiscountAmount + lineItem.ShippingCost; //} } carts.AddRange(tempLineItems); //return ret; }