New classes:
- CLMAdminService: UI-facing orchestration — account/letter settings from
metadata, document generation, task status polling, file attachment,
folder browsing; persists all CLM results to Appraiser_Case__c
- DocusignESignatureService: eSignature API browsing (accounts, templates,
envelopes, login info, user info)
- CLMAdminServiceTest, CLMDocGenCalloutTest, DocusignESignatureServiceTest
Updated classes (AppraiserCasePayloadBuilder, CLMDocGenCallout):
- CLMDocGenCallout: full XML merge callout stack, task status polling,
document download, recursive document href discovery, account-based
endpoint building; HTTP_TIMEOUT made public
- AppraiserCasePayloadBuilder: formatMailingAddress made public so
CLMAdminService can reuse it rather than duplicating the logic
Code review bug fixes:
- Fix null fields emitting literal "null" in generated XML — add safeValue()
helper; String.valueOf(null) returns "null" so escapeXml's null guard
never fired
- Fix unguarded inline SOQL in getCaseContext and getDocGenPreview — throws
QueryException for missing records instead of AuraHandledException; now
uses list query with isEmpty guard
- Remove duplicate formatAddress in CLMAdminService; delegate to
AppraiserCasePayloadBuilder.formatMailingAddress
- Replace hardcoded 30000 timeout in performGet with CLMDocGenCallout.HTTP_TIMEOUT
- Remove duplicate JSDoc on getTaskStatus
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>