Product catalog on-demand sync
This document provides a sample implementation for syncing products from Zuora to Salesforce using the Product Catalog On-Demand Sync.
Overview
This article presents a sample implementation of the following scenario:
-
Use the Order Builder to create a product in your Zuora tenant.
-
Invoke the Product Catalog On-demand Sync to bring over the product to Salesforce.
ProductCatalogManager
To create and execute the example code :
-
Create the
ProductCatalogManagerApex class with the following code:
public class ProductCatalogManager
{
private Zuora.zApi zapi;
public ProductCatalogManager ()
{
zapi = new Zuora.zapi();
zapi.zlogin();
ticker = String.valueOf( DateTime.now().getTime() );
productName = 'Mobile Plan ' + ticker.substring( ticker.length() - 3, ticker.length() );
}
public String productName { get; set; }
public String ticker { get; set; }
public void createProduct()
{
try
{
String productId;
String ratePlanId;
String chargeId;
Zuora.zObject[] errors;
List<Zuora.zObject> products = new List<Zuora.zObject>();
products.add( populateProduct() );
List<Zuora.zapi.SaveResult> results = zapi.zcreate( products );
Zuora.zapi.SaveResult result = results[0];
if ( result.success )
{
productId = result.Id;
}
else
{
errors = result.errors;
System.debug( LoggingLevel.ERROR, 'An error occurred while creating product: ' + errors );
return;
}
results = zapi.zCreate( populateRatePlans( productId ) );
result = results[0];
if ( result.success )
{
ratePlanId = result.Id;
}
else
{
errors = result.errors;
System.debug( LoggingLevel.ERROR, 'An error occurred while creating rate plan: ' + errors );
return;
}
results = zapi.zCreate( populateRatePlanCharges( ratePlanId ) );
result = results[0];
if ( !result.success )
{
errors = result.errors;
System.debug( LoggingLevel.ERROR, 'An error occurred while creating rete plan charges: ' + errors );
return;
}
syncProduct( productId );
}
catch( Zuora.zRemoteException remoteEx )
{
System.debug( LoggingLevel.ERROR, 'An error occurred: ' + remoteEx.getMessage() );
}
catch( Zuora.zApiException apiEx )
{
System.debug( LoggingLevel.ERROR, 'An error occurred: ' + apiEx.getMessage() );
}
catch( Zuora.zForceException forceEx)
{
System.debug( LoggingLevel.ERROR, 'An error occurred: ' + forceEx.getMessage() );
}
}
private Zuora.zObject populateProduct()
{
Zuora.zObject product = new Zuora.zObject('Product');
product.setValue( 'Name', productName);
product.setValue( 'SKU', 'SKU-' + ticker );
product.setValue( 'EffectiveStartDate', '2010-01-01T00:00:00-08:00' );
product.setValue( 'EffectiveEndDate', '2014-01-01T00:00:00-08:00' );
return product;
}
private List<Zuora.zObject> populateRatePlans( String productId )
{
Zuora.zObject ratePlan = new Zuora.zObject('ProductRatePlan');
ratePlan.setValue( 'Name', 'Basic Package' );
ratePlan.setValue( 'Description', 'Basic package' );
ratePlan.setValue( 'ProductId', productId );
ratePlan.setValue( 'EffectiveStartDate', '2010-01-01T00:00:00-08:00' );
ratePlan.setValue( 'EffectiveEndDate', '2014-01-01T00:00:00-08:00' );
return new List<Zuora.zObject>{ ratePlan };
}
private Zuora.zObject[] populateRatePlanCharges( String ratePlanId )
{
Zuora.zObject[] charges = new Zuora.zObject[]{};
Zuora.zObject charge = new Zuora.zObject('ProductRatePlanCharge');
charge.setValue( 'BillCycleType', 'DefaultFromCustomer' );
charge.setValue( 'BillingPeriod', 'Month' );
charge.setValue( 'ChargeModel', 'FlatFee' );
charge.setValue( 'Name', 'Single-line Monthly Charge' );
charge.setValue( 'ProductRatePlanId', ratePlanId );
charge.setValue( 'TriggerEvent', 'ContractEffective' );
charge.setValue( 'ChargeType', 'Recurring' );
Zuora.zObject tierData = new Zuora.zObject('ProductRatePlanChargeTierData');
Zuora.zObject[] tiers = new Zuora.zObject[]{};
Zuora.zObject tier = new Zuora.zObject( 'ProductRatePlanChargeTier' );
tier.setValue( 'Active', true );
tier.setValue( 'Currency', 'USD' );
tier.setValue( 'Price', '39.99' );
tiers.add( tier );
tierData.setValue( 'ProductRatePlanChargeTier', tiers );
charge.setValue( 'ProductRatePlanChargeTierData', tierData );
charges.add( charge );
return charges;
}
private void syncProduct( String productId )
{
Zuora.OnDemandSyncManager syncManager = new Zuora.OnDemandSyncManager();
syncManager.syncZuoraObjectIdSet = new Set<String>{ productId };
syncManager.syncObjectType = Zuora.OnDemandSyncManager.ObjectType.ZProduct;
List<Zuora.SyncResult> syncResults = syncManager.sendRequest();
System.debug( 'Sync results = ' + syncResults );
}
}
To test the sample code :
-
Execute the following Apex script in the Developer Console.
ProductCatalogManager mgr = new ProductCatalogManager();
mgr.createProduct();