MultiRootIssuePolicy(IssuePolicyInput)

Asynchronously create a multi-root insurance policy along with its child policies.

API Version 

66.0

Requires Chatter 

No

Signature 

public static ConnectApi.PolicyAsyncRepresentation MultiRootIssuePolicy(ConnectApi.IssuePolicyInputRepresentation IssuePolicyInput)

Parameters 

IssuePolicyInput

Return Value 

Type: ConnectApi.PolicyAsyncRepresentation

Example 

This is a sample code that calls the Multi-Root Issue Policy API from Apex.

1public with sharing class MultiRootPolicyIssuance implements System.Callable {
2
3    public Object call(String action, Map<String, Object> args) {
4        // Retrieve the input and output maps from the arguments
5        Map<String, Object> inputMap = (Map<String, Object>) args.get('input');
6        Map<String, Object> outputMap = (Map<String, Object>) args.get('output');
7
8        // Check the action type
9        if (action == 'multiRootIssuePolicy') {
10            System.debug('Start of connect API call to multi-root issue policy');
11
12            // Get input parameters from the input map
13            String contextId = (String) inputMap.get('contextId');
14            String policyName = (String) inputMap.get('policyName');
15            String policyNumber = (String) inputMap.get('policyNumber');
16            String referencePolicyNumber = (String) inputMap.get('referencePolicyNumber');
17            String effectiveFromDate = (String) inputMap.get('effectiveFromDate');
18            String effectiveToDate = (String) inputMap.get('effectiveToDate');
19            String transactionName = (String) inputMap.get('transactionName');
20            Map<String, Object> additionalFields = (Map<String, Object>) inputMap.get('additionalFields');
21
22            System.debug('Context ID: ' + contextId);
23            System.debug('Policy Name: ' + policyName);
24            System.debug('Policy Number: ' + policyNumber);
25            System.debug('Reference Policy Number: ' + referencePolicyNumber);
26            System.debug('Effective From Date: ' + effectiveFromDate);
27            System.debug('Effective To Date: ' + effectiveToDate);
28            System.debug('Transaction Name: ' + transactionName);
29            System.debug('Additional Fields: ' + additionalFields);
30
31            // Initialize the job identifier
32            String jobIdentifier = null;
33
34            // Validate required parameters
35            if (String.isBlank(contextId)) {
36                System.debug('ERROR: Context ID is required');
37                outputMap.put('error', 'Context ID is required');
38                return null;
39            }
40
41            try {
42
43                // Step 1: Create Multi-Root Policy Issuance input using the provided context ID
44                ConnectApi.IssuePolicyInputRepresentation policyInput =
45                    new ConnectApi.IssuePolicyInputRepresentation();
46
47                // Populate fields for InsurancePolicyInputRepresentation
48                ConnectApi.InsurancePolicyInputRepresentation insurancePolicy =
49                    new ConnectApi.InsurancePolicyInputRepresentation();
50
51                // Set policy basic fields (all optional except contextId)
52                if (!String.isBlank(policyName)) {
53                    insurancePolicy.policyName = policyName;
54                }
55                if (!String.isBlank(policyNumber)) {
56                    insurancePolicy.policyNumber = policyNumber;
57                }
58                if (!String.isBlank(referencePolicyNumber)) {
59                    insurancePolicy.referencePolicyNumber = referencePolicyNumber;
60                }
61                if (!String.isBlank(effectiveFromDate)) {
62                    insurancePolicy.effectiveFromDate = effectiveFromDate;
63                }
64                if (!String.isBlank(effectiveToDate)) {
65                    insurancePolicy.effectiveToDate = effectiveToDate;
66                }
67
68                policyInput.insurancePolicy = insurancePolicy;
69
70                // Populate transaction record (optional)
71                if (!String.isBlank(transactionName)) {
72                    ConnectApi.InsurancePolicyTransactionInputRepresentation transactionRecord =
73                        new ConnectApi.InsurancePolicyTransactionInputRepresentation();
74                    transactionRecord.name = transactionName;
75                    policyInput.transactionRecord = transactionRecord;
76                }
77
78                // Use the provided context ID (REQUIRED)
79                policyInput.contextId = contextId;
80
81                // Populate additional fields for child policies
82                if (additionalFields != null && !additionalFields.isEmpty()) {
83                    System.debug('Processing additional fields for child policies');
84                    policyInput.additionalFields = buildAdditionalFieldsList(additionalFields);
85                }
86
87                // Step 2: Execute Multi-Root Policy Issuance with the provided context ID
88                System.debug('Executing Multi-Root Policy Issuance with context ID: ' + contextId);
89
90                // Call the Connect API - Multi-Root Issuance is ASYNCHRONOUS and returns a job identifier
91                ConnectApi.PolicyAsyncRepresentation issuanceResult =
92                    ConnectApi.InsurancePolicyAdminFamily.multiRootIssuePolicy(policyInput);
93
94                // Get the job identifier
95                jobIdentifier = issuanceResult.jobIdentifier;
96
97                // Log success
98                System.debug('Multi-root policy issuance job started successfully. Job ID: ' + jobIdentifier);
99                System.debug('Context: ' + contextId);
100                if (!String.isBlank(policyName)) {
101                    System.debug('Policy Name: ' + policyName);
102                }
103
104                // Put the job identifier in the output map
105                outputMap.put('jobIdentifier', jobIdentifier);
106                outputMap.put('issuanceResult', issuanceResult);
107
108            } catch (Exception e) {
109                System.debug('Error while executing multi-root policy issuance: ' + e.getMessage());
110                System.debug('Stack Trace: ' + e.getStackTraceString());
111                outputMap.put('error', e.getMessage());
112            }
113
114            // Return the job identifier
115            return jobIdentifier;
116        }
117
118        // If the action is not recognized, return null
119        return null;
120    }
121
122    /**
123     * Build additional fields list for multi-root policies
124     * Converts from Map structure to List<ConnectApi.AdditionalFieldsMapValue>
125     *
126     * Input structure:
127     * {
128     *   "additionalFieldsList": [
129     *     {
130     *       "additionalFieldsMapValue": {
131     *         "instanceKey": "AutoSilver",
132     *         "fields": { "PolicyName": "James Auto Policy"}
133     *       }
134     *     }
135     *   ]
136     * }
137     */
138    private static List<ConnectApi.AdditionalFieldsMapValue> buildAdditionalFieldsList(Map<String, Object> additionalFieldsInput) {
139        List<ConnectApi.AdditionalFieldsMapValue> fieldsList = new List<ConnectApi.AdditionalFieldsMapValue>();
140
141        // Get the additionalFieldsList array
142        List<Object> additionalFieldsList = (List<Object>) additionalFieldsInput.get('additionalFieldsList');
143
144        if (additionalFieldsList != null && !additionalFieldsList.isEmpty()) {
145            for (Object item : additionalFieldsList) {
146                Map<String, Object> itemMap = (Map<String, Object>) item;
147                Object mapValue = itemMap.get('additionalFieldsMapValue');
148
149                if (mapValue != null) {
150                    // Create ConnectApi.AdditionalFieldsMapValue instance
151                    ConnectApi.AdditionalFieldsMapValue fieldMapValue = new ConnectApi.AdditionalFieldsMapValue();
152
153                    // Set the additionalFieldsMapValue property
154                    // This property accepts Object type which will be the Map containing instanceKey and fields
155                    fieldMapValue.additionalFieldsMapValue = mapValue;
156
157                    fieldsList.add(fieldMapValue);
158                }
159            }
160        }
161
162        return fieldsList;
163    }
164}
165
166/*
167 * USAGE EXAMPLE:
168 * Multi-Root Policy Issuance with Additional Fields
169 */
170
171// Create instance of the callable class
172MultiRootPolicyIssuance callable = new MultiRootPolicyIssuance();
173
174// Prepare the input arguments with additional fields
175Map<String, Object> input = new Map<String, Object>();
176input.put('contextId', <your-context-id-here>); // REQUIRED - Replace with your context ID
177input.put('policyName', 'James Multi-Root Policy');
178input.put('policyNumber', 'James Multi-Root Policy');
179input.put('referencePolicyNumber', 'James1234');
180input.put('effectiveFromDate', '2026-01-01');
181input.put('effectiveToDate', '2026-10-31');
182input.put('transactionName', 'Sold Policy Transaction');
183
184// Build additional fields for child policies
185// Structure matches the JSON payload exactly
186Map<String, Object> additionalFields = new Map<String, Object>();
187List<Object> additionalFieldsList = new List<Object>();
188
189// Child Policy 1: Auto Insurance
190Map<String, Object> autoPolicy = new Map<String, Object>();
191Map<String, Object> autoMapValue = new Map<String, Object>();
192autoMapValue.put('instanceKey', <instance-key>);
193Map<String, Object> autoFields = new Map<String, Object>();
194autoFields.put('PolicyName', 'James Auto Policy');
195autoFields.put('Name', 'James Auto Policy');
196autoMapValue.put('fields', autoFields);
197autoPolicy.put('additionalFieldsMapValue', autoMapValue);
198additionalFieldsList.add(autoPolicy);
199
200// Child Policy 2: Health Insurance
201Map<String, Object> healthPolicy = new Map<String, Object>();
202Map<String, Object> healthMapValue = new Map<String, Object>();
203healthMapValue.put('instanceKey', <instance-key>);
204
205Map<String, Object> healthFields = new Map<String, Object>();
206healthFields.put('PolicyName', 'James Medical Policy');
207healthFields.put('Name', 'James Medical Policy');
208healthMapValue.put('fields', healthFields);
209healthPolicy.put('additionalFieldsMapValue', healthMapValue);
210additionalFieldsList.add(healthPolicy);
211
212additionalFields.put('additionalFieldsList', additionalFieldsList);
213input.put('additionalFields', additionalFields);
214
215// Prepare the output map
216Map<String, Object> output = new Map<String, Object>();
217
218// Prepare the args map
219Map<String, Object> args = new Map<String, Object>();
220args.put('input', input);
221args.put('output', output);
222
223// Call the 'multiRootIssuePolicy' action
224Object result = callable.call('multiRootIssuePolicy', args);
225
226// Check results
227System.debug('Job Identifier: ' + result);
228if (output.containsKey('error')) {
229    System.debug('ERROR: ' + output.get('error'));
230} else if (output.containsKey('jobIdentifier')) {
231    System.debug('SUCCESS: Multi-root policy issuance job started with ID: ' + output.get('jobIdentifier'));
232    System.debug('This job will create a parent policy and child policies for Auto and Health insurance.');
233    System.debug('Monitor this job ID for completion status.');
234}