1public with sharing class MultiRootPolicyIssuanceInvocable {
2
3 /**
4 * Execute Multi-Root Policy Issuance with parameters map
5 * Usage: MultiRootPolicyIssuanceInvocable.executeMultiRootIssuance(paramsMap);
6 *
7 * @param params Map of parameters:
8 * - contextId (String, REQUIRED)
9 * - policyName (String, optional)
10 * - policyNumber (String, optional)
11 * - referencePolicyNumber (String, optional)
12 * - effectiveFromDate (String, optional)
13 * - effectiveToDate (String, optional)
14 * - transactionName (String, optional)
15 * - additionalFields (Map<String, Map<String, String>>, optional)
16 */
17 public static void executeMultiRootIssuance(Map<String, Object> params) {
18 // Extract and validate contextId (REQUIRED)
19 String contextId = (String) params.get('contextId');
20 if (String.isBlank(contextId)) {
21 System.debug('ERROR: contextId is required');
22 return;
23 }
24
25 // Multi-Root Issue Policy IA - Create the standard Invocable Action
26 Invocable.Action action = Invocable.Action.createStandardAction('issueMultiRootInsurancePolicy');
27
28 // Instantiate the IA input object for Multi-Root Policy Issuance
29 // IMPORTANT: Use IssueMultiRootPolicyInputRep, NOT IssuePolicyIAInputRep
30 ConnectApi.IssueMultiRootPolicyInputRep policyInput =
31 new ConnectApi.IssueMultiRootPolicyInputRep();
32
33 // Set context ID (REQUIRED)
34 policyInput.contextId = contextId;
35
36 // Extract optional parameters
37 String policyName = (String) params.get('policyName');
38 String policyNumber = (String) params.get('policyNumber');
39 String referencePolicyNumber = (String) params.get('referencePolicyNumber');
40 String effectiveFromDate = (String) params.get('effectiveFromDate');
41 String effectiveToDate = (String) params.get('effectiveToDate');
42 String transactionName = (String) params.get('transactionName');
43 Map<String, Map<String, String>> additionalFields =
44 (Map<String, Map<String, String>>) params.get('additionalFields');
45
46 // Populate Insurance Policy details (using IA classes) - all optional
47 if (!String.isBlank(policyName) || !String.isBlank(policyNumber) ||
48 !String.isBlank(referencePolicyNumber) || !String.isBlank(effectiveFromDate) ||
49 !String.isBlank(effectiveToDate)) {
50
51 ConnectApi.InsPolicyIAInputRep insurancePolicy =
52 new ConnectApi.InsPolicyIAInputRep();
53
54 if (!String.isBlank(policyName)) {
55 insurancePolicy.policyName = policyName;
56 }
57 if (!String.isBlank(policyNumber)) {
58 insurancePolicy.policyNumber = policyNumber;
59 }
60 if (!String.isBlank(referencePolicyNumber)) {
61 insurancePolicy.referencePolicyNumber = referencePolicyNumber;
62 }
63 if (!String.isBlank(effectiveFromDate)) {
64 insurancePolicy.effectiveFromDate = effectiveFromDate;
65 }
66 if (!String.isBlank(effectiveToDate)) {
67 insurancePolicy.effectiveToDate = effectiveToDate;
68 }
69
70 policyInput.insurancePolicy = insurancePolicy;
71 }
72
73 // Populate Transaction record (using IA transaction representation) - optional
74 if (!String.isBlank(transactionName)) {
75 ConnectApi.InsPolicyTrxnIAInputRep transactionRecord =
76 new ConnectApi.InsPolicyTrxnIAInputRep();
77 transactionRecord.name = transactionName;
78 policyInput.transactionRecord = transactionRecord;
79 }
80
81 // Populate additional input for multi-root policies - optional
82 if (additionalFields != null && !additionalFields.isEmpty()) {
83 List<ConnectApi.InsPolicyAddlInputIARep> additionalInputList = new List<ConnectApi.InsPolicyAddlInputIARep>();
84
85 for (String instanceKey : additionalFields.keySet()) {
86 ConnectApi.InsPolicyAddlInputIARep additionalInput =
87 new ConnectApi.InsPolicyAddlInputIARep();
88
89 // Set instance key (e.g., "AutoSilver", "FamilyHealth")
90 additionalInput.instanceKey = instanceKey;
91
92 // Build additional fields list for this instance
93 Map<String, String> fieldsMap = additionalFields.get(instanceKey);
94 if (fieldsMap != null && !fieldsMap.isEmpty()) {
95 List<ConnectApi.AdditionalFieldIARep> fieldsList = new List<ConnectApi.AdditionalFieldIARep>();
96
97 for (String fieldKey : fieldsMap.keySet()) {
98 ConnectApi.AdditionalFieldIARep field = new ConnectApi.AdditionalFieldIARep();
99 field.key = fieldKey;
100 field.value = fieldsMap.get(fieldKey);
101 fieldsList.add(field);
102 }
103
104 additionalInput.additionalFieldsList = fieldsList;
105 }
106
107 additionalInputList.add(additionalInput);
108 }
109
110 policyInput.additionalInput = additionalInputList;
111 }
112
113 // Set invocation parameters
114 // IMPORTANT: Parameter name is issueMultiRootPolicyInputRep (camelCase)
115 action.setInvocationParameter('issueMultiRootPolicyInputRep', policyInput);
116
117 System.debug('Starting Multi-Root Policy Issuance Invocable Action (issueMultiRootInsurancePolicy)...');
118 System.debug('Context ID: ' + contextId);
119 if (!String.isBlank(policyName)) {
120 System.debug('Policy Name: ' + policyName);
121 }
122
123 try {
124 // Invoke the action
125 List<Invocable.Action.Result> results = action.invoke();
126
127 System.debug('Multi-Root Policy Issuance IA result = ' + results);
128
129 // Process results
130 for (Invocable.Action.Result result : results) {
131 if (result.isSuccess()) {
132 System.debug('SUCCESS: Multi-Root Policy Issuance completed successfully!');
133 Object outputValue = result.getOutputParameters().get('jobIdentifier');
134 if (outputValue != null) {
135 System.debug('Job Identifier: ' + outputValue);
136 } else {
137 System.debug('Multi-Root Policy Issuance job started - result: ' + result.getOutputParameters());
138 }
139 } else {
140 System.debug('ERROR: Multi-Root Policy Issuance failed');
141 System.debug('Error Details: ' + result.getErrors());
142 }
143 }
144
145 } catch (Exception e) {
146 System.debug('EXCEPTION in Multi-Root Policy Issuance Invocable Action: ' + e.getMessage());
147 System.debug('Stack Trace: ' + e.getStackTraceString());
148 }
149 }
150}
151
152
153/*
154 * USAGE EXAMPLE:
155 * Copy and paste this code into Developer Console Execute Anonymous Window
156 */
157Map<String, Object> params = new Map<String, Object>();
158params.put('contextId', <your-context-id-here>);
159params.put('policyName', 'James Multi-Root Policy');
160params.put('policyNumber', 'James Multi-Root Policy');
161params.put('referencePolicyNumber', 'James1234');
162params.put('effectiveFromDate', '2026-01-01');
163params.put('effectiveToDate', '2026-10-31');
164params.put('transactionName', 'Sold Policy Transaction');
165
166// Build additional fields configuration
167Map<String, Map<String, String>> additionalFields = new Map<String, Map<String, String>>();
168
169// Configuration for AutoSilver instance
170Map<String, String> autoFields = new Map<String, String>();
171autoFields.put('PolicyName', 'James Auto Policy');
172autoFields.put('Name', 'James Auto Policy');
173additionalFields.put(<your-instanceKey-goes-here>, autoFields);
174
175// Configuration for FamilyHealth instance
176Map<String, String> healthFields = new Map<String, String>();
177healthFields.put('PolicyName', 'James Medical Policy');
178healthFields.put('Name', 'James Medical Policy');
179additionalFields.put(<your-instanceKey-goes-here>, healthFields);
180
181params.put('additionalFields', additionalFields);
182
183MultiRootPolicyIssuanceInvocable.executeMultiRootIssuance(params);