Welcome to Zuora Product Documentation

Explore our rich library of product information

RuleEngine class

This article describes the properties and the global methods in the RulesEngine class.

Use the RulesEngine class to invoke Zuora Rules Engine from Apex. The RuleEngine class runs against a single record referred to as the master record. The rules are evaluated and executed in the context of the master record. Typically, the master record is a quote in Zuora Quotes.

Constructor Signature

Create an instance of the RulesEngine class using the following signatures. The Rules Engine takes in the API name of the master object, specifically, zqu__Quote__c, and optionally a subset of rules.

  • RulesEngine (String masterObjectType)

  • RulesEngine(String masterObjectType, List rulesToRun)

RulesEngine Global Methods

The RulesEngine class provides the following methods to initialize and run rules.

Method

Return Type

Description

initialize (Map> dataObjects, Set requiredIds)

void

run (zqu.RulesEngine.RuleType type)

zqu.RulesEngineResponse

Specify which types of actions to run in the parameter.

RuleType Enum

When invoking the Rules Engine programmatically, you have the option to specify which types of actions to run. For example, calling the Rules Engine with the Rule Type of VALIDATION will only evaluate rules with a Validation action.

By default, the Rules Engine runs all actions.

The following values are supported for the RuleType enum:

  • zqu.RulesEngine.RuleType.ALL

  • zqu.RulesEngine.RuleType.PRICE

  • zqu.RulesEngine.RuleType.PRODUCT

  • zqu.RulesEngine.RuleType.VALIDATION

RulesEngineResponse Class

The Rules Engine returns the RulesEngineResponse class that contains the following attributes. Use the associated global methods to retrieve the value returned.

Attribute

Global Method

Description

zqu.DataObject Master Object

getMasterObject()

Returns the master record

List <RuleMessage>

getMessages()

Returns the message

Boolean

isSuccess

Returns whether the rules engine ran successfully

RuleMessage Class

The RuleMessage class provides the following global methods to access the actionType , message , messageType , and ruleName from the message response.

Attribute

Global Method

Description

getActionType()

String

Returns the type of action. Possible values:

- PRODUCT

- PRICE

- VALIDATION

- DEBUG

- SYSTEM

getMessage()

String

Returns the body of the message.

getMessageType()

String

Returns the type of message. Possible values:

- DEBUG

- INFO

- WARN

- ERROR

getRuleName()

String

Returns the name of the Rule that was being executed when this message was logged.

Code Samples

The following code invokes the first five rules defined for a quote and executes them. Steps refer to the steps given at the beginning of this article.

// Step #1
// Set the master quote id. Rules are all run in the context of this record.
// Required Ids are the Ids of records that need to be queried from database.
String quoteId = '<Set Quote ID>';
Set < zqu.CacheId > requiredIds = new Set < zqu.CacheId > ();
requiredIds.add( new zqu.CacheId( 'zqu__Quote__c', quoteId ) );
// Step #2
// Optionally, supply a subset of rules.
List < zqu__ZRule__c > rulesToRun = 
  [SELECT Id, Name, zqu__Json__c, zqu__ActionJson__c FROM zqu__ZRule__c LIMIT 5];
// Step #3
// Convert Charge Groups to DataObject
// and attach those to the quote DataObject as children.
// DataObjects are objects that are in memory, but not in the database.
// For example, ChargeGroups that have not yet been saved
Map < String, List < zqu.DataObject > > dataObjects = makeDataObjects(quoteId);
// Step #4
// Initialize the Rules Engine with the API name of master object 
// and a subset of rules.
zqu.RulesEngine re = new zqu.RulesEngine('zqu__Quote__c', rulesToRun);
re.initialize(dataObjects, requiredIds);
// Step #5
// Execute the Rules Engine.
zqu.RulesEngineResponse response = re.run(zqu.RulesEngine.RuleType.ALL);
System.debug(response);
// Step #6
// Extract the updated Charge Groups, and save them to the Quote through the 
// updateChargeGroups() global methods.
zqu.DataObject quoteDataObject = response.getMasterObject();
List<zqu.DataObject> ratePlanDataObjects 
    = quoteDataObject.getChildren('zqu__QuoteRatePlan__c');
List<zqu.zChargeGroup> chargeGroupsForUpdate = new List<zqu.zChargeGroup>();
for(zqu.DataObject rpDataObject : ratePlanDataObjects) {
    zqu.ZChargeGroupDataObject cgForUpdate = (zqu.ZChargeGroupDataObject) rpDataObject;
    chargeGroupsForUpdate.add( cgForUpdate.getChargeGroup() );
}
zqu.ZQuoteUtil.updateChargeGroups(chargeGroupsForUpdate);

The following code sample shows adding product DataObjects to the quote DataObjects.

Map < String, List < zqu.DataObject > > makeDataObjects(Id quoteId) {
  List < zqu.DataObject > dataChargeGroups = new List < zqu.DataObject > ();
  List < zqu.DataObject > dataCharges = new List < zqu.DataObject > ();
  List < zqu.ZChargeGroup > chargeGroups = zqu.zQuoteUtil.getChargeGroups( quoteId );
  // Create a DataObject for ZChargeGroup (QuoteRatePlan)
  // and ZCharges (QuoteRatePlanCharge).
  for(zqu.ZChargeGroup chargeGroup : chargeGroups){
    zqu.DataObject dataChargeGroup = new zqu.ZChargeGroupDataObject(chargeGroup);
    dataChargeGroups.add(dataChargeGroup);
    dataCharges.addAll(dataChargeGroup.getChildren(
      quotesNamespace + 'QuoteRatePlanCharge__c'));
  }
  return new Map < String, List < zqu.DataObject > >{
    quotesNamespace + 'QuoteRatePlan__c' => dataChargeGroups,
    quotesNamespace + 'QuoteRatePlanCharge__c' => dataCharges
  };
}

The sample code above shows how to construct QuoteRatePlan and QuoteCharges from ZChargeGroups and ZCharges, but it does not construct the relationships to the product catalog. When calling the RulesEngine class programmatically, the entire DataObject hierarchy must be constructed and populated with all the information you want to run the rules against.

You can programmatically construct and attach additional object relationships on DataObjects as the following sample code shows.

zqu_ProductRatePlan_c productPlan 
    = [SELECT Id,Name FROM zqu__ProductRatePlan__c LIMIT 1];
zqu.DataObject productRatePlanDataObject = new zqu.CommittedDataObject(productPlan);
dataChargeGroup.putParent('zqu_ProductRatePlan_c', productRatePlanDataObject);