internal void ApplyDiscount(DatedDiscount datedDiscount) { if (datedDiscount.DoesApplyTo(_product)) { _appliedDiscount = new AppliedDiscount(datedDiscount.DiscountPercent, _appliedDiscount); } }
public void UpdateOffers(Holidays holiday, AppliedDiscount discount) { if (AppliedOffers.ContainsKey(holiday)) { AppliedOffers.Remove(holiday); } AppliedOffers.Add(holiday, discount); }
public AppliedDiscount CalculateDiscount(IEnumerable <ParcelOrderOutputItem> items) { var appliedDiscount = new AppliedDiscount { TotalCost = items.Select(i => i.Cost).Sum() }; var groupedByParcelDiscountType = items.GroupBy(g => new { g.DiscountTypes, g.ParcelType }); groupedByParcelDiscountType.ToList().ForEach(grp => { var discountRule = (_configuredDiscounts.Where(t => t.DiscountTypes.Equals(grp.Key.DiscountTypes))).SingleOrDefault(); if (discountRule != null) { var totalCounts = grp.Count(); var groups = Math.Abs(totalCounts / discountRule.Limit); if (groups <= 0) { return; } var i = 0; IEnumerable <ParcelOrderOutputItem> modifiedGroup = grp; do { var min = modifiedGroup.Select(m => m.Cost).Min(); appliedDiscount.SavedCost += min; appliedDiscount.TotalCost -= min; modifiedGroup = grp.Where(c => !c.Cost.Equals(min)).ToList(); i += 1; } while (i < groups); } }); return(appliedDiscount); }
public List <AppliedDiscount> DiscountsApplicable(List <ProductQuantity> productList) { var discountsApplied = new List <AppliedDiscount>(); foreach (var item in productList) { if (item.Product.Id == _discountedProduct.Id) { var discount = CalculateDiscount(item); var appliedDiscount = new AppliedDiscount { Type = DiscountType.Percentage, Description = $"{item.Product.Name} {_percentage:P0} OFF: - {discount.ToCurrencyString()}", Amount = discount }; discountsApplied.Add(appliedDiscount); } } return(discountsApplied); }
public AppliedDiscount CalculateMixedDiscount(IEnumerable <ParcelOrderOutputItem> items) { var appliedDiscount = new AppliedDiscount { TotalCost = items.Select(i => i.Cost).Sum() }; var discountRule = (_configuredDiscounts.Where(t => t.DiscountTypes.Equals(DiscountTypes.Mixed))).SingleOrDefault(); if (discountRule == null) { throw new NotSupportedException("Discount Ruleset not supported."); } var totalCounts = items.Count(); var groups = Math.Abs(totalCounts / discountRule.Limit); if (groups <= 0) { return(appliedDiscount); } var i = 0; var modifiedGroup = items; do { var min = modifiedGroup.Select(m => m.Cost).Min(); appliedDiscount.SavedCost += min; appliedDiscount.TotalCost -= min; modifiedGroup = modifiedGroup.Where(c => !c.Cost.Equals(min)).ToList(); i += 1; } while (i < groups); return(appliedDiscount); }
public IEnumerable <AppliedDiscount> DiscountsApplicable(IEnumerable <ProductQuantity> items) { var itemArray = items as ProductQuantity[] ?? items.ToArray(); var discountsApplied = new List <AppliedDiscount>(); foreach (var item in itemArray) { if (item.Product.ProductId == _discountedItem.ProductId) { var discount = CalculateDiscount(item); var appliedDiscount = new AppliedDiscount { Type = DiscountType.Percentage, Text = $"{item.Product.Name} {_percentage:P0} OFF: - {discount.ToCurrencyString()}", Amount = discount }; discountsApplied.Add(appliedDiscount); } } return(discountsApplied); }