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); } } } } }
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); } } } } }
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); }
public ProductViewModel(DiscountedProduct discountedProduct) { this.SummaryText = $"{discountedProduct.Name} ({discountedProduct.UnitPrice:C}))"; }
public ProductsViewModel(DiscountedProduct product) { this.SummaryText = string.Format(PriceCulture, "{0} ({1:C})", product.Name, product.UnitPrice); }
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; }
/// <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); }