Skip to content

Commit dbd834d

Browse files
authored
Send envelope with multiple delivery channels (#172)
* Send envelope with multiple delivery channels
1 parent dc68440 commit dbd834d

File tree

5 files changed

+406
-2
lines changed

5 files changed

+406
-2
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.docusign.controller.eSignature.examples;
2+
3+
import com.docusign.DSConfiguration;
4+
import com.docusign.common.WorkArguments;
5+
import com.docusign.controller.eSignature.services.MultipleDeliveryService;
6+
import com.docusign.controller.eSignature.services.SMSDeliveryService;
7+
import com.docusign.core.common.Utils;
8+
import com.docusign.core.model.DoneExample;
9+
import com.docusign.core.model.Session;
10+
import com.docusign.core.model.User;
11+
import com.docusign.esign.api.EnvelopesApi;
12+
import com.docusign.esign.client.ApiException;
13+
import com.docusign.esign.model.EnvelopeDefinition;
14+
import com.docusign.esign.model.EnvelopeSummary;
15+
import org.springframework.stereotype.Controller;
16+
import org.springframework.ui.ModelMap;
17+
import org.springframework.web.bind.annotation.RequestMapping;
18+
19+
import javax.servlet.http.HttpServletResponse;
20+
21+
import java.io.IOException;
22+
23+
/**
24+
* Send an envelope with a remote signer and cc recipient o be notified via multiple
25+
* delivery channels (Email and SMS or WhatsApp).<br />
26+
* The envelope includes a pdf, Word, and HTML document. Anchor text is used to
27+
* position the signing fields in the documents.
28+
*/
29+
@Controller
30+
@RequestMapping("/eg046")
31+
public class EG046ControllerMultipleDelivery extends AbstractEsignatureController {
32+
33+
public EG046ControllerMultipleDelivery(DSConfiguration config, Session session, User user) {
34+
super(config, "eg046", session, user);
35+
}
36+
37+
@Override
38+
protected void onInitModel(WorkArguments args, ModelMap model) throws Exception {
39+
super.onInitModel(args, model);
40+
if (Utils.isCfr(session.getBasePath(), user.getAccessToken(), session.getAccountId())) {
41+
session.setStatusCFR("enabled");
42+
throw new Exception(config.getCodeExamplesText().getSupportingTexts().getCFRError());
43+
}
44+
}
45+
46+
@Override
47+
protected Object doWork(WorkArguments args, ModelMap model,
48+
HttpServletResponse response) throws ApiException, IOException {
49+
args.setStatus(EnvelopeHelpers.ENVELOPE_STATUS_SENT);
50+
EnvelopesApi envelopesApi = createEnvelopesApi(session.getBasePath(), user.getAccessToken());
51+
52+
try{
53+
EnvelopeDefinition envelope = MultipleDeliveryService.makeEnvelope(
54+
args.getSignerName(),
55+
args.getSignerEmail(),
56+
args.getCountryCode(),
57+
args.getPhoneNumber(),
58+
args.getCcName(),
59+
args.getCcEmail(),
60+
args.getCcCountryCode(),
61+
args.getCcPhoneNumber(),
62+
args.getDeliveryMethod(),
63+
args.getStatus());
64+
65+
EnvelopeSummary envelopeSummary = SMSDeliveryService.smsDelivery(
66+
envelopesApi,
67+
session.getAccountId(),
68+
envelope);
69+
70+
session.setEnvelopeId(envelopeSummary.getEnvelopeId());
71+
DoneExample.createDefault(getTextForCodeExampleByApiType().ExampleName)
72+
.withMessage(getTextForCodeExampleByApiType().ResultsPageText
73+
.replaceFirst("\\{0}", envelopeSummary.getEnvelopeId())
74+
)
75+
.addToModel(model, config);
76+
return DONE_EXAMPLE_PAGE;
77+
} catch (ApiException e) {
78+
new DoneExample()
79+
.withTitle(exampleName)
80+
.withName(title)
81+
.withFixingInstructions(getTextForCodeExampleByApiType().CustomErrorTexts.get(0).ErrorMessage)
82+
.addToModel(model, config);
83+
84+
return ERROR_PAGE;
85+
}
86+
}
87+
}
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
package com.docusign.controller.eSignature.services;
2+
3+
import com.docusign.controller.eSignature.examples.EnvelopeHelpers;
4+
import com.docusign.esign.api.EnvelopesApi;
5+
import com.docusign.esign.client.ApiException;
6+
import com.docusign.esign.model.*;
7+
8+
import java.io.IOException;
9+
import java.time.Instant;
10+
import java.util.Arrays;
11+
import java.util.List;
12+
import java.util.Map;
13+
14+
public final class MultipleDeliveryService {
15+
private static final String EMAIL_DELIVERY = "Email";
16+
17+
private static final String PDF_DOCUMENT_FILE_NAME = "World_Wide_Corp_lorem.pdf";
18+
19+
private static final String PDF_DOCUMENT_NAME = "Lorem Ipsum";
20+
21+
private static final String DOCX_DOCUMENT_FILE_NAME = "World_Wide_Corp_Battle_Plan_Trafalgar.docx";
22+
23+
private static final String DOCX_DOCUMENT_NAME = "Battle Plan";
24+
25+
private static final int ANCHOR_OFFSET_Y = 10;
26+
27+
private static final int ANCHOR_OFFSET_X = 20;
28+
29+
private static final String SIGNER_ID = "1";
30+
31+
private static final String CC_ID = "2";
32+
33+
public static EnvelopeSummary smsDelivery(
34+
EnvelopesApi envelopesApi,
35+
String accountId,
36+
EnvelopeDefinition envelope) throws ApiException {
37+
var createEnvelopeResponse = envelopesApi.createEnvelopeWithHttpInfo(
38+
accountId,
39+
envelope,
40+
envelopesApi.new CreateEnvelopeOptions()
41+
);
42+
43+
Map<String, List<String>> headers = createEnvelopeResponse.getHeaders();
44+
java.util.List<String> remaining = headers.get("X-RateLimit-Remaining");
45+
java.util.List<String> reset = headers.get("X-RateLimit-Reset");
46+
47+
if (remaining != null & reset != null) {
48+
Instant resetInstant = Instant.ofEpochSecond(Long.parseLong(reset.get(0)));
49+
System.out.println("API calls remaining: " + remaining);
50+
System.out.println("Next Reset: " + resetInstant);
51+
}
52+
53+
return createEnvelopeResponse.getData();
54+
}
55+
56+
//ds-snippet-start:eSign46Step2
57+
public static EnvelopeDefinition makeEnvelope(
58+
String signerName,
59+
String signerEmail,
60+
String countryCode,
61+
String signersPhoneNumber,
62+
String ccName,
63+
String ccEmail,
64+
String ccCountryCode,
65+
String carbonCopyPhoneNumber,
66+
String deliveryMethod,
67+
String status) throws IOException {
68+
69+
Tabs signerTabs = EnvelopeHelpers.createSignerTabs(
70+
EnvelopeHelpers.createSignHere(
71+
"/sn1/",
72+
ANCHOR_OFFSET_Y,
73+
ANCHOR_OFFSET_X
74+
));
75+
76+
Signer signer = new Signer();
77+
signer.setName(signerName);
78+
signer.setEmail(signerEmail);
79+
signer.setRecipientId(SIGNER_ID);
80+
signer.setRoutingOrder("1");
81+
signer.setTabs(signerTabs);
82+
signer.setDeliveryMethod(EMAIL_DELIVERY);
83+
signer.setAdditionalNotifications(Arrays.asList(
84+
createAdditionalNotification(countryCode, signersPhoneNumber, deliveryMethod)
85+
));
86+
87+
CarbonCopy cc = new CarbonCopy();
88+
cc.setName(ccName);
89+
cc.setEmail(ccEmail);
90+
cc.setRecipientId(CC_ID);
91+
cc.setRoutingOrder("2");
92+
cc.setDeliveryMethod(EMAIL_DELIVERY);
93+
cc.setAdditionalNotifications(Arrays.asList(
94+
createAdditionalNotification(ccCountryCode, carbonCopyPhoneNumber, deliveryMethod)
95+
));
96+
97+
EnvelopeDefinition envelope = new EnvelopeDefinition();
98+
envelope.setEmailSubject("Please sign this document set");
99+
envelope.setDocuments(
100+
Arrays.asList(
101+
EnvelopeHelpers.createDocumentFromFile(
102+
DOCX_DOCUMENT_FILE_NAME,
103+
DOCX_DOCUMENT_NAME,
104+
"2"
105+
),
106+
EnvelopeHelpers.createDocumentFromFile(
107+
PDF_DOCUMENT_FILE_NAME,
108+
PDF_DOCUMENT_NAME,
109+
"3"
110+
)
111+
)
112+
);
113+
envelope.setRecipients(EnvelopeHelpers.createRecipients(signer, cc));
114+
envelope.setStatus(status);
115+
116+
return envelope;
117+
}
118+
119+
private static RecipientAdditionalNotification createAdditionalNotification(
120+
String countryCode,
121+
String phoneNumber,
122+
String deliveryMethod) {
123+
124+
RecipientPhoneNumber phone = new RecipientPhoneNumber();
125+
phone.setCountryCode(countryCode);
126+
phone.setNumber(phoneNumber);
127+
128+
RecipientAdditionalNotification notification = new RecipientAdditionalNotification();
129+
notification.setSecondaryDeliveryMethod(deliveryMethod);
130+
notification.setPhoneNumber(phone);
131+
132+
return notification;
133+
}
134+
//ds-snippet-end:eSign46Step2
135+
}

src/main/java/com/docusign/controller/eSignature/services/SMSDeliveryService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public final class SMSDeliveryService {
2525
private static final int ANCHOR_OFFSET_X = 20;
2626

2727
//ds-snippet-start:eSign37Step3
28+
//ds-snippet-start:eSign46Step3
2829
public static EnvelopeSummary smsDelivery(
2930
EnvelopesApi envelopesApi,
3031
String accountId,
@@ -43,6 +44,7 @@ public static EnvelopeSummary smsDelivery(
4344
return createEnvelopeResponse.getData();
4445
}
4546
//ds-snippet-end:eSign37Step3
47+
//ds-snippet-end:eSign46Step3
4648

4749
//ds-snippet-start:eSign37Step2
4850
// document 2 (docx) has tag /sn1/

src/main/webapp/WEB-INF/templates/views/error.jsp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
<c:if test="${done.fixingInstructions != null }">
1414
<h2>Problem: an error occurred</h2>
1515

16-
<p>Error information:</p>
17-
<p><em>Message: </em>${done.message}</p>
16+
<c:if test="${done.message != null }">
17+
<p>Error information:</p>
18+
<p><em>Message: </em>${done.message}</p>
19+
</c:if>
1820
<p>${done.fixingInstructions}</p>
1921
</c:if>
2022
<c:if test="${done.fixingInstructions == null }">

0 commit comments

Comments
 (0)