예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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;
        }