Welcome to Zuora Product Documentation

Explore our rich library of product information

ProductSyncUtil class

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

This article describes the ProductSyncUtil class, its global methods and the related class. You can use these classes and global methods to programmatically trigger product synchronization and cleanups from Salesforce to Zuora. The classes and global methods support the following operations in the single-entity and multi-entity environments:

  • Synchronizing Products, Features, UOMs, and related objects from Salesforce

  • Deleting Products, Features, UOMs, and related objects in the Zuora product catalog. When you mark the products and features to be deleted in the Product Sync UI in Salesforce, the syncProducts global method will delete the product in the Zuora product catalog.

ProductSyncUtil Class Properties

Property

Type

Required

Description

FEATURE_TYPE

Static Final String

NA

A constant that represents the SObject type of ZFeature__c.

PRODUCT_FEATURE_TYPE

Static Final String

NA

A constant that represents the SObject type of ZProductFeature__c.

PRODUCT_RATE_PLAN_CHARGE_TYPE

Static Final String

NA

A constant that represents the SObject type of ProductRatePlanCharge__c.

PRODUCT_RATE_PLAN_TYPE

Static Final String

NA

A constant that represents the SObject type of ProductRatePlan__c.

PRODUCT_TYPE

Static Final String

NA

A constant that represents the SObject type of Product2.

batchSize

Integer

No

(Deprecated) User-defined batch size

objectType

String

No

(Deprecated) Specifies the type of the object to be synchronized.

ProductSyncUtil Global Methods

The ProductSyncUtil class provides the following global methods to synchronize or delete products and related objects.

Method

Return Type

Description

setBatchSize(Integer batchSize)

void

(Deprecated) Sets the batch size for synchronization jobs. You can use the method to reduce the number of products to be synchronized per batch for complicated products.

The default batch size is 50.

setSObjectType(String objectType)

void

(Deprecated) Sets the SObject type of the records to be synchronized.

syncProducts(List<Id> productIds)

Id[]

(Deprecated) Synchronizes a list of products specified by the list of product Ids. Returns an array of ApexSyncJob Ids that can be polled to check the progress of the SyncJobs.

In a multi-entity environment, the method returns the SyncJob Ids for each entity.

This method deletes the products that are marked as delete from Zuora Product Catalog.

syncRecords(ProductSyncConfiguration productSyncConfiguration)

Id[]

Synchronizes the records specified in the ProductSyncConfiguration reference.

See ProductSyncConfiguration Class below for the details.

Returns an array of ApexSyncJob Ids that can be polled to check the progress of the SyncJobs.

ProductSyncConfiguration Class

Property

Type

Required

Description

batchSize

Integer

No

User-defined batch size.

recordIds

Set<Id>

Yes

Defines the Set of records to be synchronized.

recordType

String

Yes

Specifies the type of SObject to be synchronized.

Code Sample

Synchronize all Products and Check Status of SyncJobs (Deprecated Approach)

List<Product2> products = [
    SELECT Id
    FROM Product2
];
List<Id> productIds = new List<Id>();
for(Product2 product : products) {
    productIds.add(product.Id);
}
zqu.ProductSyncUtil util = new zqu.ProductSyncUtil();
util.setSObjectType('Product2'); 
Id[] jobIds = util.syncProducts(productIds);
AsyncApexJob syncjobs = [
    SELECT Id, Status, JobItemsProcessed, TotalJobItems
    FROM AsyncApexJob
    WHERE Id IN :jobIds
];
for (AsyncApexJob job: syncJobs) {
    if(job.Status != 'Completed') {
        System.debug('Sync Progress: ' + (job.JobItemsProcessed / job.TotalJobItems));
    } else {
        System.debug('Job Complete!');
    }
}

Synchronize all Products and Check Status of SyncJobs

Map<Id, Product2> productObjects = new Map<Id, Product2>([
    SELECT Id
    FROM Product2
]);
zqu.ProductSyncUtil.ProductSyncConfiguration productSyncConfiguration = new zqu.ProductSyncUtil.ProductSyncConfiguration();
productSyncConfiguration.recordIds = productObjects.keySet();
productSyncConfiguration.recordType = zqu.ProductSyncUtil.PRODUCT_TYPE;
// Optionally apply batch size. If there are 10 Product records, 2 Jobs will be created. Each job will sync over 5 product records
productSyncConfiguration.batchSize = 5;
zqu.ProductSyncUtil util = new zqu.ProductSyncUtil();
Id[] productSyncHistoryIds = util.syncRecords(productSyncConfiguration);
AsyncApexJob syncjobs = [
    SELECT Id, Status, JobItemsProcessed, TotalJobItems
    FROM AsyncApexJob W
    HERE Id IN :productSyncHistoryIds
];
for (AsyncApexJob job: syncJobs) {
    if(job.Status != 'Completed') {
        System.debug('Sync Progress: ' + (job.JobItemsProcessed / job.TotalJobItems));
    } else {
        System.debug('Job Complete!');
    }
}

Synchronize all Features

Map<Id, zqu__ZFeature__c> featureObjects = new Map<Id, zqu__ZFeature__c>([
    SELECT Id
    FROM zqu__ZFeature__c
]);
zqu.ProductSyncUtil.ProductSyncConfiguration featureSyncConfiguration = new zqu.ProductSyncUtil.ProductSyncConfiguration();
featureSyncConfiguration.recordIds = featureObjects.keySet();
featureSyncConfiguration.recordType = zqu.ProductSyncUtil.FEATURE_TYPE;
zqu.ProductSyncUtil util = new zqu.ProductSyncUtil();
Id[] featureSyncHistoryIds = util.syncRecords(featureSyncConfiguration);

Synchronize all Product Features

Map<Id, zqu__ZProductFeature__c> productFeatureObjects = new Map<Id, zqu__ZProductFeature__c>([
    SELECT Id
    FROM zqu__ZProductFeature__c
]);
zqu.ProductSyncUtil.ProductSyncConfiguration productFeatureSyncConfiguration = new zqu.ProductSyncUtil.ProductSyncConfiguration();
productFeatureSyncConfiguration.recordIds = productFeatureObjects.keySet();
productFeatureSyncConfiguration.recordType = zqu.ProductSyncUtil.ProductSyncUtil.PRODUCT_FEATURE_TYPE;;
zqu.ProductSyncUtil util = new zqu.ProductSyncUtil();
Id[] productFeatureSyncHistoryIds = util.syncRecords(productFeatureSyncConfiguration);

Synchronize all Product Rate Plans

Map<Id, zqu__ProductRatePlan__c> productRatePlanObjects = new Map<Id, zqu__ProductRatePlan__c>([
    SELECT Id
    FROM zqu__ProductRatePlan__c
]);
zqu.ProductSyncUtil.ProductSyncConfiguration productRatePlanSyncConfiguration = new zqu.ProductSyncUtil.ProductSyncConfiguration();
productRatePlanSyncConfiguration.recordIds = productRatePlanObjects.keySet();
productRatePlanSyncConfiguration.recordType = zqu.ProductSyncUtil.PRODUCT_RATE_PLAN_TYPE;
ProductSyncUtil util = new ProductSyncUtil();
Id[] productRatePlanSyncHistoryIds = util.syncRecords(productRatePlanSyncConfiguration);

Synchronize all Product Rate Plan Charges

Map<Id, zqu__ProductRatePlanCharge__c> productRatePlanChargeObjects = new Map<Id, zqu__ProductRatePlanCharge__c>([
    SELECT Id
    zqu__FROM ProductRatePlanCharge__c
]);
zqu.ProductSyncUtil.ProductSyncConfiguration productRatePlanChargeSyncConfiguration = new zqu.ProductSyncUtil.ProductSyncConfiguration();
productRatePlanChargeSyncConfiguration.recordIds = productRatePlanChargeObjects.keySet();
productRatePlanChargeSyncConfiguration.recordType = zqu.ProductSyncUtil.PRODUCT_RATE_PLAN_CHARGE_TYPE;
zqu.ProductSyncUtil util = new zqu.ProductSyncUtil();
Id[] productRatePlanChargeSyncHistoryIds = util.syncRecords(productRatePlanChargeSyncConfiguration);