public virtual void ApplyPromotion(Promotion promotion, List <CartProduct> cartProducts)
        {
            //Single promo so apply to a single product
            var promoProduct = promotion.PromotionProducts.FirstOrDefault();

            if (promoProduct != default(PromotionProduct))
            {
                var cartProduct = cartProducts.Where(cp => cp.Product.SKU == promoProduct.Product.SKU && !cp.IsPromoApplied()).FirstOrDefault();
                if (cartProduct != default(CartProduct))
                {
                    var discountedProductCount = cartProduct.DiscountedProducts.Select(dp => dp.Count).Sum();
                    var nonDiscountedCount     = cartProduct.Count - discountedProductCount;

                    //if not all products have a discount applied
                    if (nonDiscountedCount > 0)
                    {
                        var numOfbatchs = (int)nonDiscountedCount / promoProduct.ProductCount;
                        if (numOfbatchs > 0)
                        {
                            var disountedProduct = new DiscountedProduct()
                            {
                                Count     = numOfbatchs * promoProduct.ProductCount,
                                Product   = cartProduct.Product,
                                Promotion = promotion
                            };

                            cartProduct.setPromoApplied(true);
                            cartProduct.DiscountedProducts.Add(disountedProduct);
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
 public HalfPriceDiscount(
     ProductQuantity productsThatQualifyForDiscount,
     DiscountedProduct discountProduct)
 {
     _productsThatQualifyForDiscount = productsThatQualifyForDiscount ?? throw new ArgumentNullException(nameof(productsThatQualifyForDiscount));
     _discountProduct = discountProduct ?? throw new ArgumentNullException(nameof(discountProduct));
 }
        public ActionResult DeleteConfirmed(int id)
        {
            DiscountedProduct discountedProduct = db.DiscountedProducts.Find(id);

            db.DiscountedProducts.Remove(discountedProduct);
            db.SaveChanges();
            return(RedirectToAction("Index"));
        }
 public ActionResult Edit([Bind(Include = "Id,Discounted_Price,ProductId")] DiscountedProduct discountedProduct)
 {
     if (ModelState.IsValid)
     {
         db.Entry(discountedProduct).State = EntityState.Modified;
         db.SaveChanges();
         return(RedirectToAction("Index"));
     }
     ViewBag.ProductId = new SelectList(db.Products, "Id", "Name", discountedProduct.ProductId);
     return(View(discountedProduct));
 }
        public ActionResult Create([Bind(Include = "Id,Discounted_Price,ProductId")] DiscountedProduct discountedProduct)
        {
            if (ModelState.IsValid)
            {
                db.DiscountedProducts.Add(discountedProduct);
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }

            ViewBag.ProductId = new SelectList(db.Products, "Id", "Name", discountedProduct.ProductId);
            return(View(discountedProduct));
        }
        public ActionResult Details(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            DiscountedProduct discountedProduct = db.DiscountedProducts.Find(id);

            if (discountedProduct == null)
            {
                return(HttpNotFound());
            }
            return(View(discountedProduct));
        }
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            DiscountedProduct discountedProduct = db.DiscountedProducts.Find(id);

            if (discountedProduct == null)
            {
                return(HttpNotFound());
            }
            ViewBag.ProductId = new SelectList(db.Products, "Id", "Name", discountedProduct.ProductId);
            return(View(discountedProduct));
        }
        public ActionResult Create([Bind(Include = "Id,Name,Price,Description")] Product product)
        {
            var products = from p in db.Products
                           select p;

            products = products.Where(p => p.Name.Equals(product.Name));
            if (products.Count() <= 0)
            {
                TempData["Message"] = "";
                db.Products.Add(product);
                db.SaveChanges();
                if (product.Price >= 120)
                {
                    double            minus     = Convert.ToInt32((product.Price / 100) * 10);
                    DiscountedProduct discountP = new DiscountedProduct
                    {
                        Discounted_Price = product.Price - minus,
                        ProductId        = product.Id
                    };
                    db.DiscountedProducts.Add(discountP);
                    db.SaveChanges();
                }
                else
                {
                    DiscountedProduct discountP = new DiscountedProduct
                    {
                        Discounted_Price = product.Price,
                        ProductId        = product.Id
                    };
                    db.DiscountedProducts.Add(discountP);
                    db.SaveChanges();
                }
                return(RedirectToAction("Index"));
            }

            else
            {
                TempData["Message"] = "This product already exists.";
                return(RedirectToAction("Create"));
            }
        }
        public override void ApplyPromotion(Promotion promotion, List <CartProduct> cartProducts)
        {
            var promoSKUIds     = promotion.PromotionProducts.Select(pp => pp.Product.SKU).ToList();
            var cartProductList = cartProducts.Where(cp => !cp.IsPromoApplied() && promoSKUIds.Contains(cp.Product.SKU)).ToList();
            var cartProdSKUIds  = cartProductList.Select(cp => cp.Product.SKU).ToList();
            var minCount        = cartProducts.Select(promoProd => promoProd.Count).Min();

            //Check all promo product are in cart products also
            var areEqual = promoSKUIds.ToHashSet().SetEquals(cartProdSKUIds.ToHashSet());

            if (areEqual)
            {
                //Can I apply promo code if comobo product count is diff
                //e.g Combo offer (2 C's and 3 D's) this offer can not be applied if user order 1C and 4D as we do not meet criteria for C)
                var batchSizes = new List <int>();
                foreach (var skuId in promoSKUIds)
                {
                    var cartProduct            = cartProducts.Where(cp => cp.Product.SKU == skuId).FirstOrDefault();
                    var promotionProduct       = promotion.PromotionProducts.Where(cp => cp.Product.SKU == skuId).FirstOrDefault();
                    var discountedProductCount = cartProduct.DiscountedProducts.Select(dp => dp.Count).Sum();
                    var nonDiscountedCount     = cartProduct.Count - discountedProductCount;

                    //if not all products have a discount applied
                    if (nonDiscountedCount > 0)
                    {
                        var numOfbatchs = (int)nonDiscountedCount / promotionProduct.ProductCount;
                        batchSizes.Add(numOfbatchs);
                    }
                }

                var minBatchSize = batchSizes.Min();
                if (batchSizes.Count == promoSKUIds.Count)
                {
                    var cancelPromoApplication = false;
                    foreach (var skuId in promoSKUIds)
                    {
                        var cartProduct            = cartProducts.Where(cp => cp.Product.SKU == skuId).FirstOrDefault();
                        var promotionProduct       = promotion.PromotionProducts.Where(cp => cp.Product.SKU == skuId).FirstOrDefault();
                        var discountedProductCount = cartProduct.DiscountedProducts.Select(dp => dp.Count).Sum();
                        var nonDiscountedCount     = cartProduct.Count - discountedProductCount;

                        //if not all products have a discount applied
                        if (nonDiscountedCount > 0)
                        {
                            //var numOfbatchs = (int)nonDiscountedCount / promotionProduct.ProductCount;
                            var discountedProdCount = minBatchSize * promotionProduct.ProductCount;

                            if (discountedProdCount > 0)
                            {
                                var disountedProduct = new DiscountedProduct()
                                {
                                    Count     = discountedProdCount,
                                    Product   = cartProduct.Product,
                                    Promotion = promotion
                                };

                                cartProduct.DiscountedProducts.Add(disountedProduct);
                            }
                            else
                            {
                                cancelPromoApplication = true;
                                break;
                            }

                            cartProduct.setPromoApplied(true);
                        }
                    }

                    //Undo promo application and revert setPromoApplied
                    if (cancelPromoApplication)
                    {
                        foreach (var skuId in promoSKUIds)
                        {
                            var cartProduct = cartProducts.Where(cp => cp.Product.SKU == skuId).FirstOrDefault();
                            cartProduct.DiscountedProducts = cartProduct.DiscountedProducts.Where(dp => dp.Promotion.Id != promotion.Id).ToList();
                            cartProduct.setPromoApplied(cartProduct.DiscountedProducts.Count > 0);
                        }
                    }
                }
            }
        }
Ejemplo n.º 10
0
 public ProductViewModel(DiscountedProduct product)
 {
     this.Name      = product.Name;
     this.UnitPrice = product.UnitPrice;
 }
        public virtual double CalculateDiscountedPrice(PromotionProduct promotionProduct, DiscountedProduct discountedProduct)
        {
            //price is calculated for a batch on N
            var productCount = (int)discountedProduct.Count / promotionProduct.ProductCount;

            return(productCount * promotionProduct.PriceMultiplier);
        }
Ejemplo n.º 12
0
 public ProductViewModel(DiscountedProduct discountedProduct)
 {
     this.SummaryText = $"{discountedProduct.Name} ({discountedProduct.UnitPrice:C}))";
 }
Ejemplo n.º 13
0
 public ProductsViewModel(DiscountedProduct product)
 {
     this.SummaryText = string.Format(PriceCulture, "{0} ({1:C})", product.Name, product.UnitPrice);
 }
Ejemplo n.º 14
0
 public ProductViewModel(DiscountedProduct product)
 {
     Name      = product.Name;
     UnitPrice = product.UnitPrice;
     ProductId = product.ProductId;
 }
 public PercentageDiscount(DiscountedProduct discountedItem, decimal percentage)
 {
     _discountedItem = discountedItem ?? throw new ArgumentNullException(nameof(discountedItem));
     _percentage     = percentage;
 }
Ejemplo n.º 16
0
        /// <summary>
        /// Price calculation is diff from base, so overriding
        /// </summary>
        /// <param name="promotionProduct"></param>
        /// <param name="discountedProduct"></param>
        /// <returns></returns>
        public override double CalculateDiscountedPrice(PromotionProduct promotionProduct, DiscountedProduct discountedProduct)
        {
            //price is calculated for a batch of N products
            var productBatchCount = (int)discountedProduct.Count / promotionProduct.ProductCount;

            return(discountedProduct.Count * (1 - promotionProduct.PriceMultiplier) * promotionProduct.Product.Price);
        }