Views: 2710
Number of votes: 2
Average rating:

Custom promotion engine

Hypothesis: Promotion engine will run promotions only for the defined market even if editors are creating promotions for other markets also.

using System;
using System.Collections.Generic;
using System.Linq;
using EPiServer.Commerce.Marketing;
using EPiServer.Commerce.Marketing.Internal;
using EPiServer.Commerce.Order;
using EPiServer.Core;

namespace EPiServer.Reference.Commerce.Site.Features.Discounts.BrandBased
{
    public class CustomPromotionEngine : PromotionEngine
    {
        private readonly PromotionEngineContentLoader promotionEngineContentLoader;
        private readonly Lazy<ContentReference> campaignFolderRootLink;
        private readonly IRedemptionLimitService redemptionLimitService;
        private readonly PromotionFilters promotionFilters;
        private readonly PromotionApplicator promotionApplicator;
        private readonly ILineItemCalculator lineItemCalculator;
        private readonly IShippingCalculator shippingCalculator;
        private readonly IOrderFormCalculator orderFormCalculator;
        private readonly IContentLoader contentLoader;

        public CustomPromotionEngine(PromotionEngineContentLoader promotionEngineContentLoader, IRedemptionLimitService redemptionLimitService, PromotionFilters promotionFilters, PromotionApplicator promotionExecutor, ILineItemCalculator lineItemCalculator, IShippingCalculator shippingCalculator, IOrderFormCalculator orderFormCalculator, IContentLoader contentLoader) :
            base(promotionEngineContentLoader, redemptionLimitService, promotionFilters, promotionExecutor, lineItemCalculator, shippingCalculator, orderFormCalculator)
        {
            this.promotionEngineContentLoader = promotionEngineContentLoader;
            this.campaignFolderRootLink = new Lazy<ContentReference>(new Func<ContentReference>(this.GetCampaignFolderRoot));
            this.redemptionLimitService = redemptionLimitService;
            this.promotionFilters = promotionFilters;
            this.promotionApplicator = promotionExecutor;
            this.lineItemCalculator = lineItemCalculator;
            this.shippingCalculator = shippingCalculator;
            this.orderFormCalculator = orderFormCalculator;
            this.contentLoader = contentLoader;
        }

        public override IEnumerable<RewardDescription> Run(IOrderGroup orderGroup, PromotionEngineSettings settings)
        {
            if (orderGroup.Market.MarketName == "United Kingdom")
            {
                return base.Run(orderGroup, settings);
            }
            else
            {
                return Enumerable.Empty<RewardDescription>();
            }
        }

        }
}

Add registry for your custom promotion engine

c.For<IPromotionEngine>().Use<CustomPromotionEngine>();

Code was tested in quick silver

Jul 20, 2016

Please login to comment.