Represents the contextual object used in the price calculation pipeline.
Example #1
0
        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;
        }
Example #2
0
        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));
        }
Example #3
0
 public void Calculate(PriceCalculationContext context)
 {
     foreach (var module in _modules)
     {
         module.Execute(context);
     }
 }
Example #4
0
 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;
        }
Example #7
0
        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;
        }
Example #8
0
        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);
        }
Example #9
0
        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;
        }
Example #10
0
 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;
        }