diff --git a/composite-envelope-builder/force-app/main/default/classes/DocusignCompositeEnvelopeBuilder.cls b/composite-envelope-builder/force-app/main/default/classes/DocusignCompositeEnvelopeBuilder.cls index 854578a..de6f2d6 100644 --- a/composite-envelope-builder/force-app/main/default/classes/DocusignCompositeEnvelopeBuilder.cls +++ b/composite-envelope-builder/force-app/main/default/classes/DocusignCompositeEnvelopeBuilder.cls @@ -48,7 +48,8 @@ global with sharing class DocusignCompositeEnvelopeBuilder { List sortedTemplateIds = new List(new Set(req.templateIds)); sortedTemplateIds.sort(); - // Query template names and short names for document labels and email subject + // Query template names for document labels (shows in Docusign Status) + // Uses Short_Name__c if populated, otherwise falls back to Name (with language suffix stripped) Map templateNames = new Map(); Map templateShortNames = new Map(); for (dfsle__EnvelopeConfiguration__c config : [ @@ -64,11 +65,15 @@ global with sharing class DocusignCompositeEnvelopeBuilder { List documents = new List(); List docNames = new List(); - List subjectNames = new List(); for (String templateId : sortedTemplateIds) { - String label = templateNames.containsKey(templateId) - ? stripLanguageSuffix(templateNames.get(templateId)) - : templateId; + String label; + if (templateShortNames.containsKey(templateId)) { + label = templateShortNames.get(templateId); + } else if (templateNames.containsKey(templateId)) { + label = stripLanguageSuffix(templateNames.get(templateId)); + } else { + label = templateId; + } documents.add( dfsle.Document.fromTemplate( dfsle.UUID.parse(templateId), @@ -76,12 +81,6 @@ global with sharing class DocusignCompositeEnvelopeBuilder { ) ); docNames.add(label); - - // Use short name for email subject if available, otherwise use regular name - String subjectName = templateShortNames.containsKey(templateId) - ? templateShortNames.get(templateId) - : label; - subjectNames.add(subjectName); } myEnvelope = myEnvelope.withDocuments(documents); @@ -104,15 +103,31 @@ global with sharing class DocusignCompositeEnvelopeBuilder { List recipients = resolveRecipients(req.recordId); myEnvelope = myEnvelope.withRecipients(recipients); - // Set email subject to combined template short names (or custom subject if provided) - String emailSubject = String.isNotBlank(req.emailSubject) - ? req.emailSubject - : String.join(subjectNames, ', '); - // Truncate to 100 characters maximum as required by Docusign - if (emailSubject.length() > 100) { - emailSubject = emailSubject.left(97) + '...'; + // Set envelope subject to combined template names and body to concatenated template email messages + // Query for EmailMessage__c + Map templateBodies = new Map(); + for (dfsle__EnvelopeConfiguration__c config : [ + SELECT dfsle__DocuSignId__c, dfsle__EmailMessage__c + FROM dfsle__EnvelopeConfiguration__c + WHERE dfsle__DocuSignId__c IN :sortedTemplateIds + ]) { + if (String.isNotBlank(config.dfsle__EmailMessage__c)) { + templateBodies.put(config.dfsle__DocuSignId__c, config.dfsle__EmailMessage__c); + } } - myEnvelope = myEnvelope.withEmail(emailSubject, ''); + List bodyParts = new List(); + for (String templateId : sortedTemplateIds) { + if (templateBodies.containsKey(templateId)) { + bodyParts.add(templateBodies.get(templateId)); + } + } + String envelopeSubject = combinedName; + // Truncate subject to 100 characters maximum as required by Docusign + if (envelopeSubject.length() > 100) { + envelopeSubject = envelopeSubject.left(97) + '...'; + } + String envelopeBody = bodyParts.isEmpty() ? '' : String.join(bodyParts, '\n\n'); + myEnvelope = myEnvelope.withEmail(envelopeSubject, envelopeBody); // Send the envelope myEnvelope = dfsle.EnvelopeService.sendEnvelope(myEnvelope, true); diff --git a/composite-envelope-builder/force-app/main/default/classes/DocusignCompositeEnvelopeBuilderTest.cls b/composite-envelope-builder/force-app/main/default/classes/DocusignCompositeEnvelopeBuilderTest.cls index caa313f..cf6db52 100644 --- a/composite-envelope-builder/force-app/main/default/classes/DocusignCompositeEnvelopeBuilderTest.cls +++ b/composite-envelope-builder/force-app/main/default/classes/DocusignCompositeEnvelopeBuilderTest.cls @@ -221,14 +221,14 @@ private class DocusignCompositeEnvelopeBuilderTest { } @isTest - static void testCustomEmailSubject() { + static void testWithEmailSubject() { // Arrange dfsle.TestUtils.setMock(new dfsle.ESignatureAPIMock()); DocusignEnvelopeRequest req = new DocusignEnvelopeRequest(); req.templateIds = new List{'01234567-abcd-ef01-2345-6789abcdef01'}; req.recordId = '001000000ABC123'; - req.emailSubject = 'Custom: Please review and sign'; // Custom subject overrides template names + req.emailSubject = 'Custom: Please review and sign'; // Act Test.startTest(); @@ -243,14 +243,14 @@ private class DocusignCompositeEnvelopeBuilderTest { } @isTest - static void testEmailSubjectFromTemplateNames() { + static void testWithoutEmailSubject() { // Arrange dfsle.TestUtils.setMock(new dfsle.ESignatureAPIMock()); DocusignEnvelopeRequest req = new DocusignEnvelopeRequest(); req.templateIds = new List{'01234567-abcd-ef01-2345-6789abcdef01'}; req.recordId = '001000000ABC123'; - req.emailSubject = null; // No custom subject provided - should use combined template names + req.emailSubject = null; // Act Test.startTest(); @@ -261,7 +261,7 @@ private class DocusignCompositeEnvelopeBuilderTest { Test.stopTest(); // Assert - System.assertEquals(true, results[0].success, 'Should succeed with auto-generated subject from template names'); + System.assertEquals(true, results[0].success, 'Should succeed without subject'); } @isTest @@ -270,11 +270,15 @@ private class DocusignCompositeEnvelopeBuilderTest { dfsle.TestUtils.setMock(new dfsle.ESignatureAPIMock()); DocusignEnvelopeRequest req = new DocusignEnvelopeRequest(); - req.templateIds = new List{'01234567-abcd-ef01-2345-6789abcdef01'}; + // Create multiple templates to make combined name > 100 chars + req.templateIds = new List{ + '01234567-abcd-ef01-2345-6789abcdef01', + '01234567-abcd-ef01-2345-6789abcdef02', + '01234567-abcd-ef01-2345-6789abcdef03', + '01234567-abcd-ef01-2345-6789abcdef04', + '01234567-abcd-ef01-2345-6789abcdef05' + }; req.recordId = '001000000ABC123'; - // Create a subject longer than 100 characters - req.emailSubject = 'This is a very long email subject that exceeds the one hundred character limit imposed by Docusign API requirements and should be truncated appropriately to prevent errors during envelope creation.'; - System.assert(req.emailSubject.length() > 100, 'Test setup: subject should be > 100 chars'); // Act Test.startTest(); @@ -286,7 +290,5 @@ private class DocusignCompositeEnvelopeBuilderTest { // Assert System.assertEquals(true, results[0].success, 'Should succeed with truncated subject'); - // Note: We cannot easily test the actual truncation in this mock-based test, - // but the code change ensures truncation happens before the API call } }