public IEnumerable<PromotionMatch> MatchApplicablePromotions(PriceCalculationContext context, IEnumerable<Promotion> candidatePromotions) { var matches = new List<PromotionMatch>(); // Lower priority promotions check first candidatePromotions = candidatePromotions.OrderBy(x => x.Priority).ThenBy(x => x.Id); foreach (var promotion in candidatePromotions) { var match = TryMatchPromotion(promotion, context); if (match != null) { matches.Add(match); } } if (matches.Count > 0) { // Higher priority check first matches.Reverse(); CheckOverlappingUsage(matches); } return matches; }
public decimal GetFinalUnitPrice(int productId, int productPriceId, decimal originalPrice) { var customerId = Customer == null ? null : (int?)Customer.Id; var shoppingContext = new ShoppingContext(customerId, Culture); return(PriceCalculationContext.GetFinalPrice(productId, productPriceId, originalPrice, shoppingContext)); }
public void Calculate(PriceCalculationContext context) { foreach (var module in _modules) { module.Execute(context); } }
public void Calculate(PriceCalculationContext context) { foreach (var module in _modules) { module.Execute(context); } }
public CheckPromotionConditionResult CheckConditions(Promotion promotion, PriceCalculationContext context) { var result = new CheckPromotionConditionResult(); if (!promotion.Conditions.Any()) { result.Success = true; foreach (var item in context.Items) { result.MatchedItems.Add(item); } return result; } var operators = _ruleEngine.ComparisonOperators.Select(o => o.Name).ToList(); foreach (var item in context.Items) { var contextModel = new PromotionConditionContextModel { Item = item, Customer = context.Customer }; if (_ruleEngine.Evaluate(promotion.Conditions, contextModel)) { result.Success = true; result.MatchedItems.Add(item); } } return result; }
public ShippingRateCalculationContext(ShippingMethod shippingMethod, object shippingRateProviderConfig, PriceCalculationContext pricingContext) { Require.NotNull(shippingMethod, "shippingMethod"); Require.NotNull(pricingContext, "pricingContext"); ShippingMethod = shippingMethod; ShippingRateProviderConfig = shippingRateProviderConfig; PricingContext = pricingContext; }
public PromotionContext( Promotion promotion, object policyConfig, IEnumerable<PriceCalculationItem> conditionMatchedItems, PriceCalculationContext pricingContext) { Require.NotNull(promotion, "promotion"); Require.NotNull(pricingContext, "pricingContext"); Promotion = promotion; PolicyConfig = policyConfig; ConditionMatchedItems = (conditionMatchedItems ?? Enumerable.Empty<PriceCalculationItem>()).ToList(); PricingContext = pricingContext; }
public static PriceCalculationContext CreateFrom(ShoppingCart cart) { var context = new PriceCalculationContext { Customer = cart.Customer, CouponCode = cart.CouponCode, BillingAddress = cart.BillingAddress, ShippingAddress = cart.ShippingAddress, ShippingMethod = cart.ShippingMethod }; foreach (var item in cart.Items) { context.AddItem(item.Id, item.ProductVariant, item.Quantity); } return(context); }
private PromotionMatch TryMatchPromotion(Promotion promotion, PriceCalculationContext context) { if (promotion.RequireCouponCode && context.CouponCode != promotion.CouponCode) { return null; } var isMatch = false; var conditionMatchedItems = new List<PriceCalculationItem>(); if (!promotion.Conditions.Any()) { isMatch = true; } else { var conditionChecker = new PromotionConditionChecker(_ruleEngine); var result = conditionChecker.CheckConditions(promotion, context); if (result.Success) { isMatch = true; foreach (var item in result.MatchedItems) { if (!conditionMatchedItems.Contains(item)) { conditionMatchedItems.Add(item); } } } } if (isMatch) { return new PromotionMatch(promotion, conditionMatchedItems); } return null; }
public CartPriceCalculated(ShoppingCart cart, PriceCalculationContext context) { CartId = cart.Id; Context = context; }
public static PriceCalculationContext CreateFrom(ShoppingCart cart) { var context = new PriceCalculationContext { Customer = cart.Customer, CouponCode = cart.CouponCode, BillingAddress = cart.BillingAddress, ShippingAddress = cart.ShippingAddress, ShippingMethod = cart.ShippingMethod }; foreach (var item in cart.Items) { context.AddItem(item.Id, item.ProductVariant, item.Quantity); } return context; }