K Khan
Jul 20, 2016
  4392
(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

Please login to comment.
Latest blogs
Optimizely CMS 13: What Actually Changed and Why It Matters

I had the privilege of attending a deep-dive session on CMS 13 this week, and after seeing the full roadmap laid out across these slides, I wanted ...

Aniket | May 12, 2026

Introducing the Optimizely MCP Server: AI That Speaks Commerce

MCP AI Commerce B2B Claude ChatGPT OpenAI Optimizely Insite Commerce Introducing the Optimizely MCP Server : AI That Speaks Commerce We've connecte...

Vaibhav | May 12, 2026

AEO, GEO and SEO with Epicweb AI Assistant in Optimizely CMS

Traditional SEO remains important, but content must now also be optimized for answer engines and generative AI. This article explains how the Epicw...

Luc Gosso (MVP) | May 11, 2026 |

Accelerating Optimizely CMS and Commerce upgrades with agentic AI (Part 1 of 2)

How Niteco's Upgrade Machine   uses orchestrated AI coding agents to deliver a buildable baseline and a running CMS, then hands over for...

Hung Le Hoang | May 11, 2026