Services CPQ API Developer Reference

ffscpq.RateCardMatcherPlugin

global with sharing class RateCardMatcherPlugin

A class that contains plugins for rate card matching.

ffscpq.RateCardMatcherPlugin.IFinalRateCardChoicePlugin

global interface IFinalRateCardChoicePlugin

Provides an interface that can be used to create plugins to be executed during the matching of rate cards. The plugins customize how the best matching rate cards are chosen. To set up a plugin, create a fferpcore__Plugin__mdt record with a fferpcore__ExtensionPoint__c of ffscpq.RateCardMatcherPlugin.IFinalRateCardChoicePlugin, and a fferpcore__ClassName__c that matches an Apex class that implements that interface.

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.

/**
 * This final rate card choice plugin example uses a custom Level field on the Estimate Role Request and Rate Card
 * objects to choose the rate card to match to each estimate role request. It will only use an exact match for
 * the Level field.
 */
global with sharing class RateCardLevelPlugin implements ffscpq.RateCardMatcherPlugin.IFinalRateCardChoicePlugin {
    global List<ffscpq.RateCardMatcherPlugin.FinalRateCardChoiceResponse> chooseRateCards(
        List<ffscpq.RateCardMatcherPlugin.FinalRateCardChoiceRequest> requests
    ) {
        // Gather the rate cards and role requests to query for the custom Level field.
        // Custom fields are not included on the rate cards and records passed into the plugin
        // so they must be queried.
        Set<Id> rateCardIds = new Set<Id>();
        Set<Id> estimateRoleRequestIds = new Set<Id>();
        for (ffscpq.RateCardMatcherPlugin.FinalRateCardChoiceRequest request : requests) {
            for (pse__Rate_Card__c rateCard : request.getRateCardsToChooseFrom()) {
                rateCardIds.add(rateCard.Id);
            }

            switch on request.getRecord() {
                when ffscpq__Estimate_Role_Request__c estimateRoleRequest {
                    estimateRoleRequestIds.add(estimateRoleRequest.Id);
                }
            }
        }

        // Select the custom Level__c fields on both rate card and role request to use them
        // to find a match.
        Map<Id, pse__Rate_Card__c> rateCardWithLevelById = new Map<Id, pse__Rate_Card__c>(
            [SELECT Id, Level__c FROM pse__Rate_Card__c WHERE Id IN :rateCardIds]
        );
        Map<Id, ffscpq__Estimate_Role_Request__c> estimateRoleRequestsWithLevelById = new Map<Id, ffscpq__Estimate_Role_Request__c>(
            [
                SELECT Id, Level__c
                FROM ffscpq__Estimate_Role_Request__c
                WHERE Id IN :estimateRoleRequestIds
            ]
        );

        List<ffscpq.RateCardMatcherPlugin.FinalRateCardChoiceResponse> responses = new List<ffscpq.RateCardMatcherPlugin.FinalRateCardChoiceResponse>();

        for (ffscpq.RateCardMatcherPlugin.FinalRateCardChoiceRequest request : requests) {
            // Add a response to the list for every request so that the response list matches the
            // request list. Responses that do not have a chosen rate card set will not populate
            // the rates on the record.
            ffscpq.RateCardMatcherPlugin.FinalRateCardChoiceResponse response = new ffscpq.RateCardMatcherPlugin.FinalRateCardChoiceResponse();
            responses.add(response);

            switch on request.getRecord() {
                when ffscpq__Estimate_Role_Request__c estimateRoleRequest {
                    // If the estimate role request in the request has a Level use that.
                    // Otherwise use the Level value of the saved version of the record.
                    String estimateRoleRequestLevel = estimateRoleRequest.isSet(
                            ffscpq__Estimate_Role_Request__c.Level__c
                        )
                        ? estimateRoleRequest.Level__c
                        : estimateRoleRequestsWithLevelById.get(estimateRoleRequest.Id)?.Level__c;

                    for (pse__Rate_Card__c rateCard : request.getRateCardsToChooseFrom()) {
                        // All other matching parameters including Start Date, Resource Role,
                        // Account, Region, Practice, and Group have already been applied. The rate
                        // cards to choose from are equally matched according to those parameters.
                        String rateCardLevel = rateCardWithLevelById.get(rateCard.Id).Level__c;

                        if (estimateRoleRequestLevel == rateCardLevel) {
                            // If there is an exact match on the Level field choose the rate card.
                            response.setChosenRateCard(rateCard);

                            // Assume there will only be one rate card that matches for each role request.
                            break;
                        }
                    }
                }
            }
        }

        return responses;
    }
}

Methods

chooseRateCards

List<FinalRateCardChoiceResponse> chooseRateCards(List<ffscpq.RateCardMatcherPlugin.FinalRateCardChoiceRequest> requests)

A method that chooses the best rate card for a record from a set of rate cards.

Input Parameters

Name Type Description
requests List<ffscpq.RateCardMatcherPlugin.FinalRateCardChoiceRequest> A list of RateCardMatcherPlugin.FinalRateCardChoiceRequest.

Return Value

A list of RateCardMatcherPlugin.FinalRateCardChoiceResponse that parallels the list of requests.

ffscpq.RateCardMatcherPlugin.FinalRateCardChoiceRequest

global with sharing class FinalRateCardChoiceRequest

MaxDependencyCount(1)

Methods

getRecord

global SObject getRecord()

Returns the record that rate cards are being matched to.

Return Value

The record to match rate cards to.

getRateCardsToChooseFrom

global Set<pse__Rate_Card__c> getRateCardsToChooseFrom()

Returns the set of rate cards to choose from to match to the record.

Return Value

The set of rate cards to choose from to match to the record.

ffscpq.RateCardMatcherPlugin.FinalRateCardChoiceResponse

global with sharing class FinalRateCardChoiceResponse

MaxDependencyCount(1)

Methods

FinalRateCardChoiceResponse

global FinalRateCardChoiceResponse()

setChosenRateCard

global void setChosenRateCard(pse__Rate_Card__c chosenRateCard)

Sets the rate card chosen from the set of rate cards provided in the request.

Input Parameters

Name Type Description
chosenRateCard pse__Rate_Card__c The rate card chosen from the set of rate cards.
© Copyright 2009–2023 Certinia Inc. All rights reserved. Various trademarks held by their respective owners.