/// <summary>
            /// Converts retail discount data from database to discount object.
            /// </summary>
            /// <param name="retailDiscount">Retail discount data from database.</param>
            /// <param name="priceContext">Price context.</param>
            /// <returns>Discount object.</returns>
            /// <remarks>This is private. Exposed as internal for test.</remarks>
            internal static DiscountBase ConvertRetailDiscountToDiscountBase(RetailDiscount retailDiscount, PriceContext priceContext)
            {
                DiscountBase discount = ConvertRetailDiscountToDiscountBase(retailDiscount);

                SetEffectiveDiscounDiscountPriorityFromPriceGroups(discount, priceContext);

                return(discount);
            }
            /// <summary>
            /// Converts retail discount data from database to discount object.
            /// </summary>
            /// <param name="retailDiscount">Retail discount data from database.</param>
            /// <returns>Discount object.</returns>
            /// <remarks>This is private. Exposed as internal for test.</remarks>
            internal static DiscountBase ConvertRetailDiscountToDiscountBase(RetailDiscount retailDiscount)
            {
                DiscountBase        discount    = null;
                OfferDiscount       offer       = null;
                MixAndMatchDiscount mixAndMatch = null;
                MultipleBuyDiscount multipleBuy = null;
                ThresholdDiscount   threshold   = null;

                switch (retailDiscount.PeriodicDiscountType)
                {
                case PeriodicDiscountOfferType.Offer:
                    offer    = new OfferDiscount(retailDiscount.ValidationPeriod);
                    discount = offer;
                    break;

                case PeriodicDiscountOfferType.MixAndMatch:
                    mixAndMatch = new MixAndMatchDiscount(retailDiscount.ValidationPeriod);
                    mixAndMatch.DealPriceValue              = retailDiscount.MixAndMatchDealPrice;
                    mixAndMatch.DiscountAmountValue         = retailDiscount.MixAndMatchDiscountAmount;
                    mixAndMatch.DiscountPercentValue        = retailDiscount.MixAndMatchDiscountPercent;
                    mixAndMatch.NumberOfLeastExpensiveLines = retailDiscount.MixAndMatchNumberOfLeastExpensiveLines;
                    mixAndMatch.LeastExpensiveMode          = retailDiscount.LeastExpensiveMode;
                    mixAndMatch.NumberOfTimesApplicable     = retailDiscount.MixAndMatchNumberOfTimeApplicable;
                    foreach (RetailDiscountLine mixMatchLine in retailDiscount.DiscountLines)
                    {
                        if (!mixAndMatch.LineGroupToNumberOfItemsMap.ContainsKey(mixMatchLine.MixAndMatchLineGroup))
                        {
                            mixAndMatch.LineGroupToNumberOfItemsMap.Add(mixMatchLine.MixAndMatchLineGroup, mixMatchLine.MixAndMatchLineNumberOfItemsNeeded);
                        }
                    }

                    discount = mixAndMatch;
                    break;

                case PeriodicDiscountOfferType.MultipleBuy:
                    multipleBuy = new MultipleBuyDiscount(retailDiscount.ValidationPeriod);
                    multipleBuy.QuantityDiscountLevels.AddRange(retailDiscount.MultibuyQuantityTiers);
                    discount = multipleBuy;
                    break;

                case PeriodicDiscountOfferType.Threshold:
                    threshold = new ThresholdDiscount(retailDiscount.ValidationPeriod);
                    threshold.ShouldCountNonDiscountItems = retailDiscount.ShouldCountNonDiscountItems != 0;
                    threshold.ThresholdDiscountTiers.AddRange(retailDiscount.ThresholdDiscountTiers);
                    discount = threshold;
                    break;
                }

                if (discount != null)
                {
                    discount.IsCategoryToProductOrVariantIdsMapSet = false;

                    discount.OfferId                = retailDiscount.OfferId;
                    discount.OfferName              = retailDiscount.Name;
                    discount.PeriodicDiscountType   = retailDiscount.PeriodicDiscountType;
                    discount.IsDiscountCodeRequired = retailDiscount.IsDiscountCodeRequired;
                    discount.ConcurrencyMode        = retailDiscount.ConcurrencyMode;
                    discount.PricingPriorityNumber  = retailDiscount.PricingPriorityNumber;
                    discount.CurrencyCode           = retailDiscount.CurrencyCode;
                    discount.DateValidationPeriodId = retailDiscount.ValidationPeriodId;
                    discount.DateValidationType     = (DateValidationType)retailDiscount.DateValidationType;
                    discount.DiscountType           = GetDiscountMethodType(discount.PeriodicDiscountType, retailDiscount.DiscountType);
                    discount.ValidFrom              = retailDiscount.ValidFromDate;
                    discount.ValidTo                = retailDiscount.ValidToDate;

                    foreach (RetailDiscountLine discountLine in retailDiscount.DiscountLines)
                    {
                        discountLine.DiscountMethod = (int)GetLineDiscountOfferMethod(discount.PeriodicDiscountType, discount.DiscountType, discountLine.DiscountMethod, discountLine.MixAndMatchLineSpecificDiscountType);
                        discount.DiscountLines.Add(discountLine.DiscountLineNumber, discountLine);
                    }

                    foreach (RetailDiscountPriceGroup priceGroup in retailDiscount.PriceGroups)
                    {
                        discount.PriceDiscountGroupIds.Add(priceGroup.PriceGroupId);
                    }

                    foreach (DiscountCode discountCode in retailDiscount.DiscountCodes)
                    {
                        discount.DiscountCodes.Add(discountCode.Code);
                        discount.DiscountCodes.Add(discountCode.Barcode);
                    }
                }

                return(discount);
            }