Customize the Retail Order Proposal List Creation Process

To customize the order proposal list creation process, create a callable Apex class as a customization hook.
  1. Log in to your Salesforce org, and go to Developer Console.
  2. Create a global Apex class that implements the System.Callable interface.
  3. Override the global call method that has these parameters.
    • action: String. The behavior for the method to exhibit.
    • params: Map<String,Object>. Arguments to be used by the specified action.

    Here’s the Apex class structure.

    1global class <Your Callable APEX Class> implements System.Callable {
    2  global Object call(String action, Map<String, Object> params) {
    3    // Retrieve the list of proposed products from the parameters
    4    List<Product2> products = (List<Product2>) params.get('products');
    5    
    6    // Retrieve the account ID and order ID from the parameters
    7    Id accountId = (Id) params.get('accountId');
    8    Id orderId = (Id) params.get('orderId');
    9    
    10    // Initialize a list to store product IDs
    11    List<Id> productIdList = new List<Id>();
    12 
    13    // Custom code to add or remove products
    14    // Add or remove product IDs to/from productIdList as needed
    15 
    16    // Return the productIdList in JSON string format
    17    return JSON.serialize(productIdList);
    18  }
    19}
  4. Modify the list of products displayed on the order proposal list UI based on your custom logic.
    Here’s a sample Apex code that adds additional product IDs from a custom object, Proposed_Products__c, and the IDs that belong to the beverages product category to the list of proposed products.
    1global class OrderProposalListCustomization implements System.Callable {
    2  public class CustomizationException extends Exception {
    3  }
    4 
    5  public Object call(String m, Map<String, Object> params) {
    6    List<Product2> products = (List<Product2>) params.get('products');
    7    Id accountId = (Id) params.get('accountId');
    8    Id orderId = (Id) params.get('orderId');
    9    List<Id> productIdList = new List<Id>();
    10    Integer productListSize = 4;
    11 
    12    // Get the account name
    13    List<Account> accountList = [
    14      SELECT Id, Name
    15      FROM Account
    16      WHERE Id = :accountId
    17      LIMIT 1
    18    ];
    19 
    20    if (!accountList.isEmpty()) {
    21      Account account = accountList[0];
    22 
    23      // If the account name contains 'NTO', display a higher number of products.
    24      if (account.Name.contains('NTO')) {
    25        productListSize = 12;
    26      }
    27    }
    28 
    29    for (Integer i = 0; i < productListSize; i++) {
    30      productIdList.add(products.get(i).Id);
    31    }
    32 
    33    return JSON.serialize(productIdList);
    34  }
    35}
  5. From Setup, in the Quick Find box, enter Custom Metadata Types, and then expand Custom Metadata Types.
  6. Click Manage Records on the CGCloud Process Customization row.
  7. Click New, fill in these details, and then save your work.
    • Label: RE_Order_Proposal_List
    • DeveloperName: RE_Order_Proposal_List
    • Class: <Your Callable APEX Class>
    • Method: proposalList
    • Enabled: Select the checkbox

    Before invoking the customization hook, ensure that the Consider Listing setting in Order Template is set to Yes.

    Note

Your Apex customization hook is enabled. When an order proposal list is created, the call method modifies the proposed product list based on your custom logic.