/// <summary> /// Adds and processes a promo code /// </summary> /// <param name="promoCode"></param> public void AddPromoCode(PromoCode promoCode) { // check constraints if (PromoCodes.Exists(p => p.Code == promoCode.Code)) { throw new Exception("Cannot enter same promo code twice!"); } if (promoCode.SpecialPriceItem != null && !Order.OrderDetails.Exists(o => o.ProductId == promoCode.SpecialPriceItem.Id)) { throw new Exception("Must purchase special item to receive discount: " + promoCode.SpecialPriceItem.Name); } if (promoCode.WithPurchaseOf != null && !Order.OrderDetails.Exists(o => o.ProductId == promoCode.WithPurchaseOf.Id)) { throw new Exception("Must purchase qualifying item: " + promoCode.WithPurchaseOf.Name); } if (promoCode.MinimumQualifyingPurchase != null && TotalExtendedPrice < promoCode.MinimumQualifyingPurchase) { throw new Exception("Must have a minimum purchase of $" + promoCode.MinimumQualifyingPurchase.ToString()); } if (promoCode.CodeStart != null && DateTime.Now < promoCode.CodeStart) { DateTime codeStart = (DateTime)promoCode.CodeStart; throw new Exception("Code is not valid until " + codeStart.ToShortDateString()); } if (promoCode.CodeEnd != null && DateTime.Now > promoCode.CodeEnd) { throw new Exception("Code is expired!"); } // Apply promotions if (promoCode.PromotionalItem != null) { Order.OrderDetails.Add(new OrderDetail() { Product = promoCode.PromotionalItem, UnitPrice = promoCode.PromotionalItemPrice ?? 0, Quantity = 1, IsPromotionalItem = true, PlacedInCart = DateTime.Now, Shipping = 0 }); } // special price may be zero; only apply if a percentage is not given if ((promoCode.PercentOffItem == null || promoCode.PercentOffItem == 0) && promoCode.SpecialPriceItem != null) { OrderDetail item = Order.OrderDetails.Find(o => o.Product.Id == promoCode.SpecialPriceItem.Id); item.UnitPrice = promoCode.SpecialPrice ?? 0; } // percent off item if (promoCode.PercentOffItem != null && promoCode.PercentOffItem > 0 && promoCode.SpecialPriceItem != null) { OrderDetail item = Order.OrderDetails.Find(o => o.Product.Id == promoCode.SpecialPriceItem.Id); item.UnitPrice = PercentOff(item.UnitPrice, promoCode.PercentOffItem ?? 0); } // percent off order if (promoCode.PercentOffOrder != null && promoCode.PercentOffOrder > 0) { for (int i = 0; i < Order.OrderDetails.Count; i++) { OrderDetail item = Order.OrderDetails[i]; item.UnitPrice = PercentOff(item.UnitPrice, promoCode.PercentOffOrder ?? 0); } } // Add promocode to list PromoCodes.Add(promoCode); }
/// <summary> /// Removes shipping charges from an item in the shopping cart /// </summary> /// <param name="orderDetail"></param> public void RemoveShippingCharges(OrderDetail orderDetail) { orderDetail.Shipping = 0; }