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;
 }
예제 #3
0
            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);
            }
예제 #4
0
            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);
            }