internal SingleItemNonOverlappedDiscountResult( DiscountOfferMethod discountMethod, decimal discountAmount, decimal discountPercentage, decimal offerPrice, decimal unitDiscountAmount, ConcurrencyMode concurrencyMode) : this( discountMethod, discountAmount, discountPercentage, offerPrice, unitDiscountAmount, concurrencyMode, isIndependentOfOverlappedDiscounts : true) { }
internal SingleItemNonOverlappedDiscountResult( DiscountOfferMethod discountMethod, decimal discountAmount, decimal discountPercentage, decimal offerPrice, decimal unitDiscountAmount, ConcurrencyMode concurrencyMode, bool isIndependentOfOverlappedDiscounts) : this(true) { this.DiscountMethod = discountMethod; this.DiscountAmount = discountAmount; this.DiscountPercentage = discountPercentage; this.OfferPrice = offerPrice; this.UnitDiscountAmount = unitDiscountAmount; this.CanCompound = concurrencyMode == ConcurrencyMode.Compounded; this.IsIndependentOfOverlappedDiscounts = isIndependentOfOverlappedDiscounts; }
private static DiscountOfferMethod GetLineDiscountOfferMethod(PeriodicDiscountOfferType periodicDiscountType, DiscountMethodType discountMethod, int lineDiscountMethod, int lineSpecificDiscountType) { DiscountOfferMethod offerMethod = (DiscountOfferMethod)lineDiscountMethod; if (periodicDiscountType == PeriodicDiscountOfferType.MixAndMatch && discountMethod == DiscountMethodType.LineSpecific) { if (lineSpecificDiscountType == (int)DiscountMethodType.DealPrice) { offerMethod = DiscountOfferMethod.OfferPrice; } else if (lineSpecificDiscountType == (int)DiscountMethodType.DiscountPercent) { offerMethod = DiscountOfferMethod.DiscountPercent; } } return(offerMethod); }
public override AppliedDiscountApplication GetAppliedDiscountApplication( DiscountableItemGroup[] discountableItemGroups, decimal[] remainingQuantities, IEnumerable <AppliedDiscountApplication> appliedDiscounts, DiscountApplication discountApplication, PriceContext priceContext) { if (discountApplication == null || !discountApplication.RetailDiscountLines.Any() || discountableItemGroups == null || remainingQuantities == null) { return(null); } decimal[] prices = new decimal[discountableItemGroups.Length]; Dictionary <int, IList <DiscountLineQuantity> > discountDictionary = this.GetExistingDiscountDictionaryAndDiscountedPrices( discountableItemGroups, remainingQuantities, appliedDiscounts, discountApplication, true, true, prices); RetailDiscountLineItem retailDiscountLineItem = discountApplication.RetailDiscountLines.ElementAt(0); DiscountOfferMethod discountMethod = (DiscountOfferMethod)retailDiscountLineItem.RetailDiscountLine.DiscountMethod; decimal dealPrice = decimal.Zero; decimal discountValue = decimal.Zero; decimal discountAmountForDiscountLine = decimal.Zero; switch (discountMethod) { case DiscountOfferMethod.DiscountAmount: discountValue = retailDiscountLineItem.RetailDiscountLine.DiscountAmount; discountAmountForDiscountLine = discountValue; break; case DiscountOfferMethod.DiscountPercent: discountValue = prices[retailDiscountLineItem.ItemIndex] * (retailDiscountLineItem.RetailDiscountLine.DiscountPercent / 100M); break; case DiscountOfferMethod.OfferPrice: dealPrice = retailDiscountLineItem.RetailDiscountLine.OfferPrice; decimal bestExistingDealPrice = 0m; bool hasExistingDealPrice = DiscountBase.TryGetBestExistingDealPrice(discountDictionary, retailDiscountLineItem.ItemIndex, out bestExistingDealPrice); // We don't use discounted price here. discountValue = DiscountBase.GetDiscountAmountFromDealPrice(discountableItemGroups[retailDiscountLineItem.ItemIndex].Price, hasExistingDealPrice, bestExistingDealPrice, dealPrice); discountAmountForDiscountLine = discountValue; break; default: break; } // When has no competing discounts or compounded, apply all remaining quantity. bool applyAllAvailableQuantity = (discountApplication.ApplyStandalone || this.CanCompound) && !discountApplication.HonorQuantity; decimal quantityToApply = applyAllAvailableQuantity ? remainingQuantities[retailDiscountLineItem.ItemIndex] : discountApplication.ItemQuantities[retailDiscountLineItem.ItemIndex]; decimal result = discountValue * quantityToApply; AppliedDiscountApplication newAppliedDiscountApplication = null; if (result > decimal.Zero) { Dictionary <int, decimal> itemQuantities; if (applyAllAvailableQuantity) { itemQuantities = new Dictionary <int, decimal>(); itemQuantities[retailDiscountLineItem.ItemIndex] = quantityToApply; } else { itemQuantities = discountApplication.ItemQuantities; } newAppliedDiscountApplication = new AppliedDiscountApplication(discountApplication, result, itemQuantities, isDiscountLineGenerated: true); DiscountLine discountLine = this.NewDiscountLine(discountApplication.DiscountCode, discountableItemGroups[retailDiscountLineItem.ItemIndex].ItemId); discountLine.PeriodicDiscountType = PeriodicDiscountOfferType.Offer; discountLine.DealPrice = dealPrice; discountLine.Amount = discountAmountForDiscountLine; discountLine.Percentage = retailDiscountLineItem.RetailDiscountLine.DiscountPercent; newAppliedDiscountApplication.AddDiscountLine(retailDiscountLineItem.ItemIndex, new DiscountLineQuantity(discountLine, itemQuantities[retailDiscountLineItem.ItemIndex])); if (discountApplication.RemoveItemsFromLookupsWhenApplied) { this.RemoveItemIndexGroupFromLookups(retailDiscountLineItem.ItemIndex); } } return(newAppliedDiscountApplication); }