/** * @description Builds CLM-ready JSON payload for Appraiser Case with related Deficiencies. * Used to transform Salesforce data into DocuSign CLM merge field structure. */ public class AppraiserCasePayloadBuilder { /** * @description Generates CLM merge payload for a given Appraiser Case. * @param caseId Appraiser_Case__c record Id * @return Map CLM merge data ready for template rendering */ public static Map buildPayload(String caseId) { // Query parent case with all child deficiencies Appraiser_Case__c appraiserCase = queryAppraiserCase(caseId); if (appraiserCase == null) { throw new IllegalArgumentException('Appraiser Case not found: ' + caseId); } // Build CLM payload structure Map payload = new Map(); payload.put('AppraiserCaseNumber', appraiserCase.Name); payload.put('AppraiserFieldReviewDate', formatDate(appraiserCase.Appraiser_Field_Review_Date__c)); payload.put('PropertyAddress', appraiserCase.Property_Address__c); // Transform child deficiencies into DeficiencyList array List> deficiencyList = new List>(); if (appraiserCase.Deficiencies__r != null && !appraiserCase.Deficiencies__r.isEmpty()) { for (Appraiser_Case_Deficiency__c deficiency : appraiserCase.Deficiencies__r) { Map defMap = new Map(); defMap.put('deficiencyNumber', deficiency.Deficiency_Number__c); defMap.put('description', deficiency.Description__c); defMap.put('resolution', deficiency.Resolution__c); deficiencyList.add(defMap); } } payload.put('DeficiencyList', deficiencyList); return payload; } /** * @description Returns CLM payload as JSON string for API transmission. * @param caseId Appraiser_Case__c record Id * @return String JSON representation of payload */ public static String buildPayloadJson(String caseId) { Map payload = buildPayload(caseId); return JSON.serialize(payload); } /** * @description Query Appraiser Case with related Deficiencies ordered by number. * @param caseId Appraiser_Case__c record Id * @return Appraiser_Case__c Record with Deficiencies__r populated */ private static Appraiser_Case__c queryAppraiserCase(String caseId) { List results = [ SELECT Id, Name, Appraiser_Field_Review_Date__c, Property_Address__c, (SELECT Id, Deficiency_Number__c, Description__c, Resolution__c FROM Deficiencies__r ORDER BY Deficiency_Number__c ASC) FROM Appraiser_Case__c WHERE Id = :caseId LIMIT 1 ]; return results.isEmpty() ? null : results.get(0); } /** * @description Format date for CLM merge (YYYY-MM-DD or null). * @param dt Date field value * @return String Formatted date or null */ private static String formatDate(Date dt) { return dt != null ? dt.format() : null; } }