CRM and CX Blogs by SAP
Stay up-to-date on the latest developments and product news about intelligent customer experience and CRM technologies through blog posts from SAP experts.
cancel
Showing results for 
Search instead for 
Did you mean: 
priti_mittal
Product and Topic Expert
Product and Topic Expert
0 Kudos
7,017
Objective : There are the instances  when there is a need to support same promo code across the catalogs. Since Promotion ‘code’ is unique identifier within promotion module. This article has the details to handle such use case - "Same Promotion code for different catalog."

Description : One of the possible solution is to deploy multiple promotion modules in the Promotion Engine. Associating catalog to different promotion module will resolve the problem. After this , same promotion could be published in all the necessary promotion modules. This way we can have same promo code for different catalogs.

Steps are as follows ,

step -1 Create Promotion module 

  • Below are the required impex files to create new promotion module with name “promotions-ca-module” and map it to testCAProductCatalog Online version.


INSERT_UPDATE DroolsKIEModule ; name[unique=true]    ; mvnGroupId   ; mvnArtifactId ; mvnVersion ; ruleType(code) ; active ; version ;  
; promotions-ca-module ; hybris-rules ; promotions-ca ; 1.0.0 ; PROMOTION ; true ; -1 ;

INSERT_UPDATE DroolsKIEBase ; name[unique=true] ; kieModule(name)[unique=true] ; equalityBehavior(code) ; eventProcessingMode(code)
; promotions-ca-base ; promotions-ca-module ; EQUALITY ; STREAM

INSERT_UPDATE DroolsKIESession ; name[unique=true] ; kieBase(name)[unique=true] ; sessionType(code)
; promotions-ca-session ; promotions-ca-base ; STATELESS

INSERT_UPDATE DroolsRuleEngineContext ; name[unique=true] ; kieSession(name) ; ruleFiringLimit
; promotions-ca-context ; promotions-ca-session ; 200 ;

UPDATE DroolsKIEBase ; name[unique=true] ; defaultKIESession(name)
; promotions-ca-base ; promotions-ca-session
UPDATE DroolsKIEModule ; name[unique=true] ; defaultKIEBase(name)
"#% afterEach: de.hybris.platform.core.Registry.getApplicationContext().getBean(""ruleEngineSystemSetup"").initializeModule(impex.getLastImportedItem());"
; promotions-ca-module ; promotions-ca-base

INSERT_UPDATE CatalogVersionToRuleEngineContextMapping ; context(name)[unique=true] ; catalogVersion(catalog(id),version)[unique=true]
; promotions-ca-context ; testCAProductCatalog:Online

 

  • Promotion Module - Backoffice view : with new promo module




 

step-2 :  Publishing promotion from backoffice 

  • Navigate to Marketing -> Promotion rules -> Show All

  • Select promotion for example : target_customer_order_threshold_fixed_discount


  • click on publish rule , choose module let say promotions-module to publish.




  • After this promotion would be available for USOnline catalog to storefront .

  • Edit promotion Rule. Change website from one group to other . Here we have taken the example to change the group from USPromoGroup to CAPromoGroup

  • Now re-publish the promotion to different module let say ,promotions-ca-module.




  • This way promotion with same code could be deployed and would be  available for both the modules.


 

step-3 :  Publishing promotion via impex 

The use case here is to publish promotion rule in promotions-module and promotions-ca-module with the help of impex

To deploy the promotion rule with same code into more than one promotion module , will introduce translator . This translator will take care of promotion version so that correct version could be picked up to insert/update the values such as website, condition action etc.

Translator : Sample Code
package com.test.core.impex.translators;
import de.hybris.platform.core.Registry;
import de.hybris.platform.impex.jalo.translators.AbstractValueTranslator;
import de.hybris.platform.jalo.Item;
import de.hybris.platform.jalo.JaloInvalidParameterException;
import de.hybris.platform.jalo.enumeration.EnumerationValue;
import de.hybris.platform.promotionengineservices.jalo.PromotionSourceRule;
import de.hybris.platform.promotionengineservices.model.PromotionSourceRuleModel;
import de.hybris.platform.ruleengineservices.enums.RuleStatus;
import de.hybris.platform.servicelayer.model.ModelService;
import de.hybris.platform.servicelayer.search.FlexibleSearchQuery;
import de.hybris.platform.servicelayer.search.FlexibleSearchService;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;

@SuppressWarnings("deprecation")
public class PromotionVersionTranslator extends AbstractValueTranslator {

private static final String PROMOTION_QUERY_PART1 = "select {pk} from {PromotionSourceRule} where {code} = '";
private static final String PROMOTION_QUERY_PART2 = "' AND {status} IN ({{select {pk} from {EnumerationValue} where {code} IN ('PUBLISHED','UNPUBLISHED','INACTIVE') }}) order by {version} desc";


@Override
public String exportValue(Object var1) throws JaloInvalidParameterException {
if(var1 instanceof PromotionSourceRule ) {
return ((PromotionSourceRule)var1).getCode();
}
return var1.toString();
}

@Override
public final Object importValue(String valueExpr, Item toItem) throws JaloInvalidParameterException {
this.clearStatus();
Object ret=findVersionValue( valueExpr);
return ret;
}

private Long findVersionValue(String code) {


final FlexibleSearchQuery query = new FlexibleSearchQuery(PROMOTION_QUERY_PART1+code+PROMOTION_QUERY_PART2 );
List<PromotionSourceRuleModel> results = getFlexibleSearchService().<PromotionSourceRuleModel> search(query).getResult();

Long finalVersion = Long.valueOf(0);
if(CollectionUtils.isNotEmpty(results)) {
PromotionSourceRuleModel promotionSourceRuleModel = results.get(0);
PromotionSourceRule promotionSourceRule = getModelService().getSource(promotionSourceRuleModel);
EnumerationValue status = promotionSourceRule.getStatus();
Long version = promotionSourceRule.getVersion();
if(status.getCode().equals(RuleStatus.UNPUBLISHED.getCode())) {
finalVersion= version;
}
else {
finalVersion= version+1;
}

}
return finalVersion;
}

private FlexibleSearchService getFlexibleSearchService() {
return (FlexibleSearchService) Registry.getApplicationContext().getBean("flexibleSearchService",
FlexibleSearchService.class);
}

private ModelService getModelService() {
return (ModelService) Registry.getApplicationContext().getBean("modelService",
ModelService.class);
}
}

 

  • Below impex header with groovy script will handle the deployment of promotion (same code) to promotion module promotions-module and promotions-ca-module simultaneously .


$defaultPromoGrp=CAPromoGrp
$defaultStatus=PUBLISHED


INSERT_UPDATE PromotionSourceRule ; code[unique=true] ; version[unique=true][translator=com.test.core.impex.translators.PromotionVersionTranslator]; name[lang=en] ; status(code) ; priority ; maxAllowedRuns ; stackable[default=false] ; ; actions ; description[lang=en]
"#% afterEach: de.hybris.platform.core.Registry.getApplicationContext().getBean(""ruleCompilerService"").compile( de.hybris.platform.core.Registry.getApplicationContext().getBean(""modelService"").get(impex.getLastImportedItem()),""promotions-ca-module""); de.hybris.platform.core.Registry.getApplicationContext().getBean(""platformRuleEngineService"").initializeAllRulesModules();"

#Test promotion
; test; test; test promotion;PUBLISHED; 40; 1; true ; orderPromotionRuleGroup; <replace with condition>; "[{""definitionId"":""y_trigger_message"",""parameters"":{}}]" ;; This is test promo. ; This is test promo.



$defaultPromoGrp=USPromoGrp
$defaultStatus=PUBLISHED

INSERT_UPDATE PromotionSourceRule ; code[unique=true] ; version[unique=true][translator=com.test.core.impex.translators.PromotionVersionTranslator]; name[lang=en] ; status(code) ; priority ; maxAllowedRuns ; stackable[default=false] ; ; actions ; description[lang=en]
"#% afterEach: de.hybris.platform.core.Registry.getApplicationContext().getBean(""ruleCompilerService"").compile( de.hybris.platform.core.Registry.getApplicationContext().getBean(""modelService"").get(impex.getLastImportedItem()),""promotions-module""); de.hybris.platform.core.Registry.getApplicationContext().getBean(""platformRuleEngineService"").initializeAllRulesModules();"

#Test promotion
; test; test; test promotion;PUBLISHED; 40; 1; true ; orderPromotionRuleGroup; <replace with condition>; "[{""definitionId"":""y_trigger_message"",""parameters"":{}}]" ;; This is test promo. ; This is test promo.