K Khan
Jul 20, 2016
visibility 4428
star star star star star
(2 votes)

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

Comments

error Please login to comment.
Latest blogs
Finding Thomas Part 3 - The Moment of Recognition

Remember Thomas? In digital landscape, Thomas is the returning visitor who reads everything, opens every email, converts on nothing. In standard...

Ritu Madan | Jun 26, 2026

Add more scheduled job settings from the Optimizely CMS 12 admin UI -- with OptiScheduledJob.ExtraParameters

  Optimizely (EPiServer) CMS 12 ships a great scheduled-jobs framework, but it has one frustrating gap: a job has nowhere to store its own...

Binh Nguyen Thi | Jun 25, 2026

Automated Search & Navigation to Graph Migration with Claude Code

A Claude Code plugin that scans your S&N codebase, applies Graph SDK transformations, and validates the result. Install once, run one command. CMS ...

Connor Fortin | Jun 24, 2026

Migrating from Find to Graph: Lessons Learned from a Real CMS 13 Project

While migrating a search solution from Optimizely Search & Navigation (Find) to Optimizely Graph in CMS 13, I encountered several issues that were...

Binh Nguyen Thi | Jun 24, 2026