QuotePreview Component
The QuotePreview component allows Zuora Quotes developers to customize the Order Preview page, providing features such as custom method calls, validation logic, and configurable visual attributes.
The QuotePreview component provides Zuora Quotes developers the ability to customize the Order Preview page, which appears when you click Send to Zuora. The QuotePreview component supports:
-
A plug-in to insert a custom
sendToZBillingmethod call. -
Logic to block Create Order requests if certain validation criteria are not met.
-
Logic to configure the visual attributes of the page, such as section titles, section expand and collapse, button bar location, and an embedded custom notification component.
-
A component body to insert custom Visualforce content.
The QuotePreview component is available in Version 6.0 and later of Zuora Quotes.
The QuotePreview component consists of the following:
-
zqu.QuotePreview.component: The Visualforce component containing the configurable Property component and SelectProduct component.
-
zqu.QuotePreviewOptions.cls: An apex class that contains all the configuration options you specified on the QuotePreview component.
-
zqu.QuotePreviewController: An apex class that handles the backend logic and sets up the visual parts of the QuotePreview component. Any page controller embedding the QuotePreview component should extend this controller,
QuotePreview Component Attributes
The QuotePreview component has the following attributes:
|
Attribute |
Type |
Required |
Description |
|---|---|---|---|
|
id |
String |
No |
An identifier that allows the component to be referenced by other components in the page. |
|
options |
zqu.QuotePreviewOptions |
N/A |
The configuration options for the component. See the next table for detail. |
|
rendered |
Boolean |
No |
Specifies whether the component is rendered on the page. The default value is True. |
QuotePreviewOptions Class Properties
The QuotePreviewOptions class includes the following properties.
|
Property |
Type |
Required? |
Description |
|---|---|---|---|
|
buttonBarLocation |
String |
No |
The location of the button bar. Supported values are:
|
|
createOrderPlugin |
String |
No |
The fully qualified name of the ICreateOrder plug-in interface used to send the quote to Zuora. This plug-in is called when the user clicks Submit . |
|
DEFAULT_CREATE_ORDER_PLUGIN |
static String |
No |
Name of the default CreateOrder plug-in |
|
disableCreateButton |
Boolean |
No |
If True, blocks users from sending the quote to Zuora when a validation fails. The default is False. |
|
hideButtonBar |
Boolean |
No |
If True, the button bar does not render. The default is False. |
|
hideQuoteProperty |
Boolean |
No |
If True, the quote property component does not render. The default is False. |
|
hideSelectedProducts |
Boolean |
No |
If True, the selected products component does not render. The default is False. |
|
isSelectedProductsCollapsible |
Boolean |
No |
If True, the page block section containing the selected products is collapsible. The default is False. |
|
notificationOptions |
zqu. NotificationOptions |
No |
Configuration options for the notification component embedded in this component. |
|
previewController |
zqu. QuotePreviewController |
Yes |
This reference allows developers to access instance variables of the page controller from within the CreateOrder plug-in. |
|
quoteId |
String |
Yes |
The ID of the quote to preview |
|
quotePropertyTitle |
String |
No |
The title of the quote property component |
|
selectedProductsTitle |
String |
No |
The title of the page block section containing the selected products |
|
VALID_BUTTON_LOCATIONS |
static SET |
No |
The location of the menu buttons. Supported values are:
|
Create Order Plugin
The QuotePreview component provides the Create Order Plugin. The Create Order Plugin is used to send a quote to Zuora. This plug-in is executed when the user clicks Submit on the Order Preview page.
The Create Order plugin interface is defined as:
global zqu .QuotePreviewController.ICreateOrderPlugin
The plugin contains the following interface method:
PageReference CreateOrder (zqu.QuotePreviewController)
See below for a sample code for the Create Order Plugin.
Sample Code
Sample Apex Class
The following is a sample implementation of the Quote Preview controller:
public with sharing class CustomQuotePreviewSample extends zqu.QuotePreviewController {
/*CLASS VARIABLES*/
public static final String BLANK_CONTACT_ERROR_MESSAGE = 'A quote must have a valid bill to contact and sold to contact to be sent to Zuora. Click Go Back to return to the quote\'s detail page';
public static final String QUOTE_SUBMIT_SUCCESS = 'Quote was successfully submitted to Zuora!';
/*INSTANCE VARIABLES*/
// Configuration options for quote preview component
public zqu.QuotePreviewOptions previewOptions {
get;
set;
}
// Configuration options for notification component within quote preview component
public zqu.NotificationOptions notificationOptions {
get;
set;
}
// Handler to the quote object
private zqu__Quote__c quote {
get;
set;
}
// Constructor
public CustomQuotePreviewSample(ApexPages.StandardController stdController) {
// Ensure that the BillTo/SoldTo contacts are accessible
if (!Test.isRunningTest()) stdController.addFields(new List < String > {
'zqu__BillToContact__c', 'zqu__ElectronicPaymentMethodId__c', 'zqu__Opportunity__r.AccountId', 'zqu__SoldToContact__c', 'zqu__ZuoraAccountID__c'
});
// Get quote object
quote = (zqu__Quote__c) stdController.getRecord();
// Initialize preview options
previewOptions = new zqu.QuotePreviewOptions();
// Pass quote id to the preview options
previewOptions.quoteId = stdController.getId();
// Set display options
previewOptions.buttonBarLocation = 'top';
previewOptions.quotePropertyTitle = 'Quote Details';
previewOptions.selectedProductsTitle = 'Selected Products and Rate Plans';
previewOptions.isSelectedProductsCollapsible = true;
// Set preview controller and CreateOrderPlugin
previewOptions.previewController = this;
previewOptions.createOrderPlugin = 'CustomQuotePreviewSample.CreateOrderPlugin';
// Initialize the notification options
notificationOptions = new zqu.NotificationOptions();
// If the quote is missing a Bill To Contact or Sold To Contact, disable the create order button
// and display a popup message for the error
if (quote.zqu__BillToContact__c == null || quote.zqu__SoldToContact__c == null) {
previewOptions.disableCreateButton = true;
notificationOptions.failureBody = BLANK_CONTACT_ERROR_MESSAGE;
notificationOptions.isPopup = true;
notificationOptions.backAction = 'toQuoteDetail();';
}
// Set configuration options for notification component within quote preview component
previewOptions.notificationOptions = notificationOptions;
}
// Method to return to quote's detail page from notification popup
public PageReference toQuoteDetail() {
return new PageReference('/' + quote.Id);
}
// Plugin implementation of ICreateOrder interface
public class CreateOrderPlugin implements ICreateOrderPlugin {
public PageReference CreateOrder(zqu.QuotePreviewController qpc) {
// Cast plugin instance
CustomQuotePreviewSample previewController = (CustomQuotePreviewSample) qpc;
//Retrieve quote object from outer controller
zqu__Quote__c quote = previewController.quote;
if (quote == null) return null;
// Retrieve config information
Map < String, Object > zqconfig = zqu.zQuoteUtil.getZuoraConfigInformation();
List < zqu.zQuoteUtil.ZBillingQuoteCollection > quotes = new List < zqu.zQuoteUtil.ZBillingQuoteCollection > ();
zqu.zQuoteUtil.ZBillingQuoteCollection quoteCol = new zqu.zQuoteUtil.ZBillingQuoteCollection();
// Set Account ID on collection
if (String.isNotEmpty(quote.zqu__Opportunity__r.AccountId)) {
quoteCol.sfdcAccountId = quote.zqu__Opportunity__r.AccountId;
}
quoteCol.zAccountId = String.isEmpty(quote.zqu__ZuoraAccountId__c) ? 'new' : quote.zqu__ZuoraAccountId__c;
quoteCol.quoteRequests = new List < zqu.zQuoteUtil.ZBillingQuoteRequest > ();
zqu.zQuoteUtil.ZBillingQuoteRequest req = new zqu.zQuoteUtil.ZBillingQuoteRequest();
req.sfdcQuoteId = quote.Id;
//Set the payment method id on request from the quote if not null
if (String.isNotBlank(quote.zqu__ElectronicPaymentMethodID__c)) {
req.paymentMethodId = quote.zqu__ElectronicPaymentMethodID__c;
}
//Set generate invoice flag on request
req.generateInvoice = (Boolean) zqconfig.get('Generate_Invoice__c');
//Set process payments flag on the request
Boolean processPayment = (Boolean) zqconfig.get('Process_Payments__c') == null ? false : (Boolean) zqconfig.get('Process_Payments__c');
req.processPayment = processPayment && String.isNotBlank(quote.zqu__ZuoraAccountID__c);
quoteCol.quoteRequests.add(req);
quotes.add(quoteCol);
//Send request
List < zqu.zQuoteUtil.zBillingResult > results = Test.isRunningTest() ?
new List < zqu.zQuoteUtil.zBillingResult > {CustomQuotePreviewSampleTest.testZBillingResult} :
zqu.zQuoteUtil.sendToZBilling(quotes);
//Display results using popup notification component
previewController.notificationOptions.isPopup = true;
//If zBillingResult was successful, navigate to Subscription Confirmation page. If not, display error message on current page
for (zqu.zQuoteUtil.zBillingResult result: results) {
if (result.success) {
//Enable popup notification with OK button redirecting to quote detail page
previewController.notificationOptions.continueAction = 'hidePopupNotification();displayStatusModal();toQuoteDetail();';
previewController.notificationOptions.backAction = '';
//Post confirmation message
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM, QUOTE_SUBMIT_SUCCESS));
}
else {
//Enable popup notification with cancel button only
previewController.notificationOptions.continueAction = '';
previewController.notificationOptions.backAction = 'hidePopupNotification();displayStatusModal();toQuoteDetail();';
//Post error message
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, result.message));
}
}
//Stay on current page
return null;
}
}
}
Sample Visualforce Page
The following is a sample Visualforce page for Quote Preview:
<apex:page showHeader="true" sidebar="false" standardController="zqu__Quote__c" extensions="CustomQuotePreviewSample" >
<apex:form >
<zqu:QuotePreview options="{!previewOptions}" >
Custom content placed in the component body like this will be rendered beneath the Select Products component!
</zqu:QuotePreview >
<!-- Action function to return to quote detail page from popup notification component -->
<apex:actionFunction name="toQuoteDetail" action="{!toQuoteDetail}" />
</apex:form>
</apex:page>