Services CPQ Connector API Developer Reference

ffscpqint.SyncEstimateAndQuoteService

global with sharing class SyncEstimateAndQuoteService

A service that provides functionality related to syncing details from estimates to their related quotes and vice versa.

Methods

syncEstimateAndQuote

global static List<ffscpqint.SyncEstimateAndQuoteService.SyncEstimateAndQuoteResponse> syncEstimateAndQuote(List<ffscpqint.SyncEstimateAndQuoteService.SyncEstimateAndQuoteRequest> requests)

A method that syncs estimate details to their related quotes and vice versa.

Input Parameters

Name Type Description
requests List<ffscpqint.SyncEstimateAndQuoteService.SyncEstimateAndQuoteRequest> The list of SyncEstimateAndQuoteRequest objects.

Return Value

This service returns SyncEstimateAndQuoteResponse in a list that parallels the input list.

Sample Code

//Note: This sample code is for demonstration purposes only. It is not intended for
//use in a production environment, is not guaranteed against defects or errors, and
//is in no way optimized or streamlined.

Id estimateId = 'a6MDK000000L2fJ2AS';
// Id quoteId = 'a5Z6t000000EcEuEAK';

// You can optionally list the details to add to each estimate product instance being created by newly synced quote lines.
// First, use the estimate ID to retrieve unsynced service quote line IDs and the estimate product IDs associated with the same product as the quote lines.
// Construct the retrieveUnsyncedQuoteLines request
ffscpqint.SyncEstimateAndQuoteService.RetrieveUnsyncedQuoteLinesRequest retrieveUnsyncedQuoteLinesRequest = new ffscpqint.SyncEstimateAndQuoteService.RetrieveUnsyncedQuoteLinesRequest();

// The ID of the estimate associated with the quote that the unsynced service quote lines are retrieved from.
retrieveUnsyncedQuoteLinesRequest.EstimateId = estimateId;

// Retrieve the unsynced service quote lines. These will be used when constructing the syncEstimateAndQuote request.
List<ffscpqint.SyncEstimateAndQuoteService.RetrieveUnsyncedQuoteLinesResponse> retrieveUnsyncedQuoteLinesResponses = ffscpqint.SyncEstimateAndQuoteService.retrieveUnsyncedQuoteLines(
    new List<ffscpqint.SyncEstimateAndQuoteService.RetrieveUnsyncedQuoteLinesRequest>{ request }
);

// Construct the syncEstimateAndQuote request
ffscpqint.SyncEstimateAndQuoteService.SyncEstimateAndQuoteRequest request = new ffscpqint.SyncEstimateAndQuoteService.SyncEstimateAndQuoteRequest();

// You must specify either the ID of the quote or of the estimate. You can't specify both.

// The ID of the estimate being synced.
request.EstimateId = estimateId;

// The ID of the quote being synced.
// request.QuoteId = quoteId;

// You can set this to true if you want to consolidate estimate role requests by skills when generating resource requests.
// The estimate and the quote must both be primary to consolidate role requests.
request.AggregateBySkills = false;

// This is an optional setting that provides additional fields to consolidate estimate role requests by when generating resource requests.
// The estimate and the quote must both be primary to consolidate role requests.
request.AdditionalAggregationFieldPaths = new List<String>{
            'ffscpq__Estimate_Task__r.Name'
        };

// You can optionally specify the values of the estimate product instances to be created for each unsynced service quote line from the retrieveUnsyncedQuoteLines request. This is a mandatory step if there are multiple estimate products related to the product on the quote line.
List<ffscpqint.SyncEstimateAndQuoteService.EstimateProductInstanceDetails> estimateProductInstanceDetails = new List<ffscpqint.SyncEstimateAndQuoteService.EstimateProductInstanceDetails>();

for (ffscpqint.UnsyncedQuoteLineDetail unsyncedQuoteLineDetail : retrieveUnsyncedQuoteLinesResponses[0].UnsyncedQuoteLines) {
    ffscpqint.SyncEstimateAndQuoteService.EstimateProductInstanceDetails estimateProductInstanceDetail = new ffscpqint.SyncEstimateAndQuoteService.EstimateProductInstanceDetails(
        unsyncedQuoteLineDetail.QuoteLineId
    );

    // If there are multiple estimate products related to the service product, select the estimate product you want to use to sync with quote from the response list.
    estimateProductInstanceDetail.EstimateProductId = unsyncedQuoteLineDetail.EstimateProducts[1].Id;

    // This is an optional setting to specify the currency ISO code of each estimate product instance.
    estimateProductInstanceDetails[0].CurrencyIsoCode = 'USD';

    estimateProductInstanceDetails.add(estimateProductInstanceDetail);
}

// Add the list of estimate product instance details to the request.
request.EstimateProductInstancesDetails = estimateProductInstanceDetails;


List<ffscpqint.SyncEstimateAndQuoteService.SyncEstimateAndQuoteResponse> responses = ffscpqint.SyncEstimateAndQuoteService.syncEstimateAndQuote(
    new List<ffscpqint.SyncEstimateAndQuoteService.SyncEstimateAndQuoteRequest>{ request }
);

// Extract the response data
System.debug('The estimate ID: ' + responses[0].EstimateId);
System.debug('The quote ID: ' + responses[0].QuoteId);

// Extract errors
System.debug('Number of errors: ' + responses[0].Errors.size());
if (!responses[0].Errors.isEmpty()) {
    System.debug('Error message: ' + responses[0].Errors[0].Message);
}

retrieveUnsyncedQuoteLines

global static List<ffscpqint.SyncEstimateAndQuoteService.RetrieveUnsyncedQuoteLinesResponse> retrieveUnsyncedQuoteLines(List<ffscpqint.SyncEstimateAndQuoteService.RetrieveUnsyncedQuoteLinesRequest> requests)

A method that retrieves the details of unsynced service quote lines from their related quote.

Input Parameters

Name Type Description
requests List<ffscpqint.SyncEstimateAndQuoteService.RetrieveUnsyncedQuoteLinesRequest> The list of RetrieveUnsyncedQuoteLinesRequest objects.

Return Value

This service returns RetrieveUnsyncedQuoteLinesResponse in a list that parallels the input list.

Sample Code

//Note: This sample code is for demonstration purposes only. It is not intended for
//use in a production environment, is not guaranteed against defects or errors, and
//is in no way optimized or streamlined.

// Construct the request
ffscpqint.SyncEstimateAndQuoteService.RetrieveUnsyncedQuoteLinesRequest request = new ffscpqint.SyncEstimateAndQuoteService.RetrieveUnsyncedQuoteLinesRequest();

// You must specify either the ID of the quote or of the estimate. You can't specify both.

// The ID of the estimate associated with the quote that the unsynced service quote lines are retrieved from.
request.EstimateId = 'a6MDK000000L2fJ2AS';

// The ID of the quote to retrieve unsynced service quote lines from.
// request.QuoteId = 'a5Z6t000000EcEuEAK';

List<ffscpqint.SyncEstimateAndQuoteService.RetrieveUnsyncedQuoteLinesResponse> responses = ffscpqint.SyncEstimateAndQuoteService.retrieveUnsyncedQuoteLines(
    new List<ffscpqint.SyncEstimateAndQuoteService.RetrieveUnsyncedQuoteLinesRequest>{ request }
);

// Extract the response data
System.debug('The estimate ID: ' + responses[0].EstimateId);
System.debug('The quote ID: ' + responses[0].QuoteId);

// Extract the list of unsynced service quote line details
List<ffscpqint.UnsyncedQuoteLineDetail> unsyncedQuoteLines = responses[0].UnsyncedQuoteLines;

System.debug('Unsynced quote line ID: ' + unsyncedQuoteLines[0].QuoteLineId);
System.debug('Unsynced quote line currency: ' + unsyncedQuoteLines[0].CurrencyIsoCode);

// Extract the estimate products related to the service product on the unsynced quote line
List<ffscpq__Estimate_Product__c> estimateProducts = unsyncedQuoteLines[0].EstimateProducts;

// Extract the estimate product details
System.debug('Estimate product ID: ' + estimateProducts[0].Id);
System.debug('Estimate product Name: ' + estimateProducts[0].Name);
System.debug('Estimate product related product: ' + estimateProducts[0].ffscpq__Product__c);

// Extract errors
System.debug('Number of errors: ' + responses[0].Errors.size());
if (!responses[0].Errors.isEmpty()) {
    System.debug('Error message: ' + responses[0].Errors[0].Message);
}

ffscpqint.SyncEstimateAndQuoteService.SyncEstimateAndQuoteRequest

global with sharing class SyncEstimateAndQuoteRequest

The request structure for syncing an estimate to its related quote and vice versa.

Sample Code

//Note: This sample code is for demonstration purposes only. It is not intended for
//use in a production environment, is not guaranteed against defects or errors, and
//is in no way optimized or streamlined.

// Construct the request
ffscpqint.SyncEstimateAndQuoteService.SyncEstimateAndQuoteRequest request = new ffscpqint.SyncEstimateAndQuoteService.SyncEstimateAndQuoteRequest();

// You must specify either the ID of a quote or of a estimate. You can't specify both.

// The ID of the estimate being synced.
request.EstimateId = 'a6MDK000000L2fJ2AS';

// The ID of the quote being synced.
// request.QuoteId = 'a5Z6t000000EcEuEAK';

// You can set this to true if you want to consolidate estimate role requests by skills when generating resource requests.
// The estimate and the quote must both be primary to consolidate role requests.
request.AggregateBySkills = false;

// This is an optional setting that provides additional fields to consolidate estimate role requests by when generating resource requests.
// The estimate and the quote must both be primary to consolidate role requests.
request.AdditionalAggregationFieldPaths = new List<String>{
            'ffscpq__Estimate_Task__r.Name'
        };

// You can optionally list the details to add to each estimate product instance being created by newly synced quote lines.
// First, use the quote ID to get unsynced quote line IDs and the estimate product IDs associated with the same product as the quote lines.
ffscpq__Estimate__c estimate = [SELECT ffscpqint__Quote__c FROM ffscpq__Estimate__c WHERE Id = 'a6V6t000000t4AfEAI' LIMIT 1];
Id quoteId = estimate.ffscpqint__Quote__c;
List<SBQQ__QuoteLine__c> unsyncedQuoteLines = [
            SELECT Id, CurrencyIsoCode, SBQQ__Product__c
            FROM SBQQ__QuoteLine__c
            WHERE
                SBQQ__Quote__c = :quoteId
                AND SBQQ__Product__r.pse__IsServicesProduct__c = TRUE
                AND ffscpqint__Estimate__c = NULL
        ];

// Map the quote lines to their products IDs.
Map<Id, List<SBQQ__QuoteLine__c>> quoteLinesByProductId = new Map<Id, List<SBQQ__QuoteLine__c>>();

for (SBQQ__QuoteLine__c quoteLine : unsyncedQuoteLines) {
    List<SBQQ__QuoteLine__c> existingQuoteLines = quoteLinesByProductId.get(
        quoteLine.SBQQ__Product__c
    );

    if (existingQuoteLines == null) {
        existingQuoteLines = new List<SBQQ__QuoteLine__c>();
        quoteLinesByProductId.put(quoteLine.SBQQ__Product__c, existingQuoteLines);
    }

    existingQuoteLines.add(quoteLine);
}

// Select the estimate products related to the same product IDs as the unsynced quote lines.
Set<Id> productIds = quoteLinesByProductId.keySet();
List<ffscpq__Estimate_Product__c> estimateProducts =  [
            SELECT Id, ffscpq__Product__c, Name
            FROM ffscpq__Estimate_Product__c
            WHERE ffscpq__Product__c IN :productIds
        ];

// Map the estimate products to their product IDs.
Map<Id, List<ffscpq__Estimate_Product__c>> estimateProductsByProductId = new Map<Id, List<ffscpq__Estimate_Product__c>>();
for (ffscpq__Estimate_Product__c estimateProduct : estimateProducts) {
    List<ffscpq__Estimate_Product__c> existingEstimateProducts = estimateProductsByProductId.get(
        estimateProduct.ffscpq__Product__c
    );

    if (existingEstimateProducts == null) {
        existingEstimateProducts = new List<ffscpq__Estimate_Product__c>();
        estimateProductsByProductId.put(
            estimateProduct.ffscpq__Product__c,
            existingEstimateProducts
        );
    }

    existingEstimateProducts.add(estimateProduct);
}

// For each quote line, check if the related product is also related to an estimate product.
// If it does, add to an estimate product instance to the list with details of the quote line.
List<ffscpqint.SyncEstimateAndQuoteService.EstimateProductInstanceDetails> estimateProductInstanceDetails = new List<ffscpqint.SyncEstimateAndQuoteService.EstimateProductInstanceDetails>();
for (Id productId : estimateProductsByProductId.keySet()) {
    ffscpq__Estimate_Product__c estimateProduct = estimateProductsByProductId.get(
        productId
    )[0];

    for (SBQQ__QuoteLine__c quoteLine : quoteLinesByProductId.get(productId)) {
        ffscpqint.SyncEstimateAndQuoteService.EstimateProductInstanceDetails estimateProductInstanceDetail = new ffscpqint.SyncEstimateAndQuoteService.EstimateProductInstanceDetails(
            quoteLine.Id
        );
        estimateProductInstanceDetails.add(estimateProductInstanceDetail);
    }
}

// This is an optional setting to specify the estimate product ID of each estimate product instance.
estimateProductInstanceDetail[0].EstimateProductId = 'a6P6t000000Ip84EAC';
    
// This is an optional setting to specify the currency ISO code of each estimate product instance.
estimateProductInstanceDetails[0].CurrencyIsoCode = 'USD';

// This is an optional setting to add the estimate product instance details list to the request. 
request.EstimateProductInstancesDetails = estimateProductInstanceDetails

Properties

Name Type Description
EstimateId Id The ID of the estimate to sync with quote. You must specify either the ID of the quote or of the estimate. You can't specify both.
QuoteId Id The ID of the quote to sync with estimate. You must specify either the ID of the quote or of the estimate. You can't specify both.
AggregateBySkills Boolean [Optional] If true, role requests are consolidated by skills. The estimate and the quote must both be primary to consolidate role requests. The default value is false.
AdditionalAggregationFieldPaths List<String> [Optional] Additional fields to consolidate estimate role requests by when creating resource requests. The estimate and the quote must both be primary to consolidate role requests.
EstimateProductInstancesDetails List<ffscpqint.SyncEstimateAndQuoteService.EstimateProductInstanceDetails> [Optional] The list of details to add to each estimate product instance being created by newly synced quote lines.

Methods

SyncEstimateAndQuoteRequest

global SyncEstimateAndQuoteRequest()

ffscpqint.SyncEstimateAndQuoteService.RetrieveUnsyncedQuoteLinesRequest

global with sharing class RetrieveUnsyncedQuoteLinesRequest

The request structure for retrieving unsynced service quote lines from a quote.

Sample Code

//Note: This sample code is for demonstration purposes only. It is not intended for
//use in a production environment, is not guaranteed against defects or errors, and
//is in no way optimized or streamlined.

// Construct the request
ffscpqint.SyncEstimateAndQuoteService.RetrieveUnsyncedQuoteLinesRequest request = new ffscpqint.SyncEstimateAndQuoteService.RetrieveUnsyncedQuoteLinesRequest();

// You must specify either the ID of a quote or of a estimate. You can't specify both.

// The ID of the estimate.
request.EstimateId = 'a6MDK000000L2fJ2AS';

// The ID of the quote.
// request.QuoteId = 'a5Z6t000000EcEuEAK';

Properties

Name Type Description
EstimateId Id The ID of the estimate related to the quote to retrieve unsynced service quote lines from. You must specify either the ID of the quote or of the estimate. You can't specify both.
QuoteId Id The ID of the quote to retrieve unsynced service quote lines from. You must specify either the ID of the quote or of the estimate. You can't specify both.

Methods

RetrieveUnsyncedQuoteLinesRequest

global RetrieveUnsyncedQuoteLinesRequest()

ffscpqint.SyncEstimateAndQuoteService.SyncEstimateAndQuoteResponse

global with sharing class SyncEstimateAndQuoteResponse

The result returned after syncing an estimate with its related quote and vice versa.

Properties

Name Type Description
Errors List<ffscpqint.SyncEstimateAndQuoteService.SyncEstimateAndQuoteError> A list containing errors that occurred while processing the request.
EstimateId Id The ID of the estimate being synced.
QuoteId Id The ID of the quote being synced.

ffscpqint.SyncEstimateAndQuoteService.RetrieveUnsyncedQuoteLinesResponse

global with sharing class RetrieveUnsyncedQuoteLinesResponse

The result returned containing details of unsynced service quote lines.

Properties

Name Type Description
Errors List<ffscpqint.SyncEstimateAndQuoteService.SyncEstimateAndQuoteError> A list containing errors that occurred while processing the request.
EstimateId Id The ID of the estimate specified in the request.
QuoteId Id The ID of the quote specified in the request.
UnsyncedQuoteLines List<ffscpqint.UnsyncedQuoteLineDetail> A list of unsynced service quote line details.

ffscpqint.SyncEstimateAndQuoteService.SyncEstimateAndQuoteError

global with sharing class SyncEstimateAndQuoteError

The error that occurred while processing the request.

Properties

Name Type Description
Message String The error message.

ffscpqint.SyncEstimateAndQuoteService.EstimateProductInstanceDetails

global with sharing class EstimateProductInstanceDetails

The details of the estimate product instance being created by newly synced quote lines.

Properties

Name Type Description
QuoteLineId Id The ID of the quote line being synced.
EstimateProductId Id [Optional] The ID of the estimate product to be synced.
CurrencyIsoCode String [Optional] The currency ISO code of the estimate product instance.

Methods

EstimateProductInstanceDetails

global EstimateProductInstanceDetails(Id quoteLineId)

Input Parameters

Name Type Description
quoteLineId Id The ID of the quote line being synced.
© Copyright 2009–2024 Certinia Inc. All rights reserved. Various trademarks held by their respective owners.