protected virtual AmountBasedReward GetBestAmountReward(decimal currentAmount, int quantity, IEnumerable <AmountBasedReward> reward) { AmountBasedReward retVal = null; var maxAbsoluteReward = reward .Where(y => y.AmountType == RewardAmountType.Absolute) .OrderByDescending(y => y.GetRewardAmount(currentAmount, quantity)).FirstOrDefault(); var maxRelativeReward = reward .Where(y => y.AmountType == RewardAmountType.Relative) .OrderByDescending(y => y.GetRewardAmount(currentAmount, quantity)).FirstOrDefault(); var absDiscountAmount = maxAbsoluteReward != null?maxAbsoluteReward.GetRewardAmount(currentAmount, quantity) : 0; var relDiscountAmount = maxRelativeReward != null?currentAmount *maxRelativeReward.GetRewardAmount(currentAmount, quantity) : 0; if (maxAbsoluteReward != null && maxRelativeReward != null) { retVal = absDiscountAmount > relDiscountAmount ? maxAbsoluteReward : maxRelativeReward; } else if (maxAbsoluteReward != null) { retVal = maxAbsoluteReward; } else if (maxRelativeReward != null) { retVal = maxRelativeReward; } return(retVal); }
private static AmountBasedReward EvaluateBestAmountReward(decimal currentAmount, AmountBasedReward[] promoRewards) { AmountBasedReward retVal = null; var maxAbsoluteReward = promoRewards .Where(y => y.AmountType == RewardAmountType.Absolute) .OrderByDescending(y => y.Amount).FirstOrDefault(); var maxRelativeReward = promoRewards .Where(y => y.AmountType == RewardAmountType.Relative) .OrderByDescending(y => y.Amount).FirstOrDefault(); var absDiscountAmount = maxAbsoluteReward != null ? maxAbsoluteReward.Amount : 0; var relDiscountAmount = maxRelativeReward != null ? currentAmount * maxRelativeReward.Amount : 0; if (maxAbsoluteReward != null && maxRelativeReward != null) { if (absDiscountAmount > relDiscountAmount) { retVal = maxAbsoluteReward; } else { retVal = maxRelativeReward; } } else if (maxAbsoluteReward != null) { retVal = maxAbsoluteReward; } else if (maxRelativeReward != null) { retVal = maxRelativeReward; } return(retVal); }
public virtual void TestGetRewardAmounts(AmountBasedReward reward, decimal price, int qty, decimal expectedResult) { Assert.Equal(reward.GetRewardAmount(price, qty), expectedResult); }