Skip to content

Commit 1ce94d0

Browse files
annahiletaAaronWDS
andauthored
Added a document generation code example (#99)
* added a document generation code example * fixed code review comments * added more constants * updated the userflow * fixes after code review * fixes for a controller file * small fixes * Revert "small fixes" This reverts commit b08e8ae. * pr feedback --------- Co-authored-by: AaronWDS <aaron.wilde@docusign.com>
1 parent b0fc24b commit 1ce94d0

7 files changed

Lines changed: 411 additions & 6 deletions

File tree

‎pom.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<java.version>11</java.version>
2424
<oauth2.version>2.5.6</oauth2.version>
2525
<commonsio.version>2.11.0</commonsio.version>
26-
<esignature.version>4.0.0-RC1</esignature.version>
26+
<esignature.version>4.1.0</esignature.version>
2727
<rooms.version>1.1.0</rooms.version>
2828
<click.version> 1.2.2</click.version>
2929
<monitor.version>1.1.0</monitor.version>

‎src/main/java/com/docusign/common/WorkArguments.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,9 @@ public class WorkArguments {
7777
private String company;
7878
private String title;
7979
private String date;
80+
private String candidateEmail;
81+
private String candidateName;
82+
private String managerName;
83+
private String jobTitle;
84+
private String salary;
8085
}

‎src/main/java/com/docusign/controller/eSignature/examples/AbstractEsignatureController.java‎

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.docusign.core.controller.AbstractController;
55
import com.docusign.esign.api.AccountsApi;
66
import com.docusign.esign.api.EnvelopesApi;
7+
import com.docusign.esign.api.TemplatesApi;
78
import com.docusign.esign.client.ApiClient;
89
import com.docusign.esign.client.ApiException;
910
import com.docusign.esign.client.auth.OAuth;
@@ -35,7 +36,7 @@ protected String getExamplePagesPath() {
3536
* @param userAccessToken user's access token
3637
* @return an instance of the {@link ApiClient}
3738
*/
38-
protected static ApiClient createApiClient(String basePath, String userAccessToken) {
39+
protected ApiClient createApiClient(String basePath, String userAccessToken) {
3940
ApiClient apiClient = new ApiClient(basePath);
4041
apiClient.addDefaultHeader(HttpHeaders.AUTHORIZATION, BEARER_AUTHENTICATION + userAccessToken);
4142
return apiClient;
@@ -48,19 +49,31 @@ protected static ApiClient createApiClient(String basePath, String userAccessTok
4849
* @param userAccessToken user's access token
4950
* @return an instance of the {@link EnvelopesApi}
5051
*/
51-
protected static EnvelopesApi createEnvelopesApi(String basePath, String userAccessToken) {
52+
protected EnvelopesApi createEnvelopesApi(String basePath, String userAccessToken) {
5253
ApiClient apiClient = createApiClient(basePath, userAccessToken);
5354
return new EnvelopesApi(apiClient);
5455
}
5556

57+
/**
58+
* Creates a new instance of the eSignature TemplatesApi. This method
59+
* creates an instance of the ApiClient class silently.
60+
* @param basePath URL to eSignature REST API
61+
* @param userAccessToken user's access token
62+
* @return an instance of the {@link TemplatesApi}
63+
*/
64+
protected TemplatesApi createTemplatesApi(String basePath, String userAccessToken) {
65+
ApiClient apiClient = createApiClient(basePath, userAccessToken);
66+
return new TemplatesApi(apiClient);
67+
}
68+
5669
/**
5770
* Creates a new instance of the eSignature AccountsApi. This method
5871
* creates an instance of the ApiClient class silently.
5972
* @param basePath URL to eSignature REST API
6073
* @param userAccessToken user's access token
6174
* @return an instance of the {@link AccountsApi}
6275
*/
63-
protected static AccountsApi createAccountsApi(String basePath, String userAccessToken) {
76+
protected AccountsApi createAccountsApi(String basePath, String userAccessToken) {
6477
ApiClient apiClient = createApiClient(basePath, userAccessToken);
6578
return new AccountsApi(apiClient);
6679
}
@@ -71,7 +84,7 @@ protected static AccountsApi createAccountsApi(String basePath, String userAcces
7184
* @param userAccessToken user's access token
7285
* @return users email address
7386
*/
74-
protected static String getAuthenticatedUserEmail(String basePath, String userAccessToken) throws ApiException {
87+
protected String getAuthenticatedUserEmail(String basePath, String userAccessToken) throws ApiException {
7588
ApiClient apiClient = createApiClient(basePath, userAccessToken);
7689
OAuth.UserInfo userInfo = apiClient.getUserInfo(userAccessToken);
7790

@@ -84,7 +97,7 @@ protected static String getAuthenticatedUserEmail(String basePath, String userAc
8497
* @param userAccessToken user's access token
8598
* @return users email address
8699
*/
87-
protected static String getAuthenticatedUserName(String basePath, String userAccessToken) throws ApiException {
100+
protected String getAuthenticatedUserName(String basePath, String userAccessToken) throws ApiException {
88101
ApiClient apiClient = createApiClient(basePath, userAccessToken);
89102
OAuth.UserInfo userInfo = apiClient.getUserInfo(userAccessToken);
90103

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
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.DocumentGenerationService;
6+
import com.docusign.core.model.DoneExample;
7+
import com.docusign.core.model.Session;
8+
import com.docusign.core.model.User;
9+
import com.docusign.esign.api.EnvelopesApi;
10+
import com.docusign.esign.api.TemplatesApi;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.stereotype.Controller;
13+
import org.springframework.ui.ModelMap;
14+
import org.springframework.web.bind.annotation.RequestMapping;
15+
import javax.servlet.http.HttpServletResponse;
16+
17+
import static com.docusign.controller.eSignature.examples.EG042ControllerDocumentGeneration.EG_042;
18+
19+
@Controller
20+
@RequestMapping(EG_042)
21+
public class EG042ControllerDocumentGeneration extends AbstractEsignatureController {
22+
public static final String EG_042 = "/eg042";
23+
private static final String DOCUMENT_FILE_NAME = "Offer_Letter_Demo.docx";
24+
private final Session session;
25+
private final User user;
26+
27+
@Autowired
28+
public EG042ControllerDocumentGeneration(DSConfiguration config, Session session, User user) {
29+
super(config, EG_042);
30+
this.session = session;
31+
this.user = user;
32+
}
33+
34+
@Override
35+
protected Object doWork(WorkArguments args, ModelMap model,
36+
HttpServletResponse response) throws Exception {
37+
String basePath = session.getBasePath();
38+
String accessToken = user.getAccessToken();
39+
40+
EnvelopesApi envelopesApi = createEnvelopesApi(basePath, accessToken);
41+
TemplatesApi templatesApi = createTemplatesApi(basePath, accessToken);
42+
43+
String envelopeId = (new DocumentGenerationService()).generateDocument(
44+
session.getAccountId(),
45+
args.getCandidateEmail(),
46+
args.getCandidateName(),
47+
args.getManagerName(),
48+
args.getJobTitle(),
49+
args.getSalary(),
50+
args.getStartDate(),
51+
DOCUMENT_FILE_NAME,
52+
envelopesApi,
53+
templatesApi);
54+
55+
DoneExample.createDefault(getTextForCodeExampleByApiType().ExampleName)
56+
.withMessage(getTextForCodeExampleByApiType().ResultsPageText
57+
.replaceFirst("\\{0}", envelopeId)
58+
)
59+
.addToModel(model, config);
60+
return DONE_EXAMPLE_PAGE;
61+
}
62+
}
Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
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.api.TemplatesApi;
6+
import com.docusign.esign.client.ApiException;
7+
import com.docusign.esign.model.DocGenFormFieldResponse;
8+
import com.docusign.esign.model.DocGenFormFields;
9+
import com.docusign.esign.model.EnvelopeSummary;
10+
import com.docusign.esign.model.TemplateSummary;
11+
import com.docusign.esign.model.DocGenFormFieldRequest;
12+
import com.docusign.esign.model.Envelope;
13+
import com.docusign.esign.model.EnvelopeUpdateSummary;
14+
import com.docusign.esign.model.TemplateTabs;
15+
import com.docusign.esign.model.SignHere;
16+
import com.docusign.esign.model.DateSigned;
17+
import com.docusign.esign.model.DocGenFormField;
18+
import com.docusign.esign.model.EnvelopeDefinition;
19+
import com.docusign.esign.model.TemplateRole;
20+
import com.docusign.esign.model.EnvelopeTemplate;
21+
import com.docusign.esign.model.Signer;
22+
import com.docusign.esign.model.Recipients;
23+
import com.docusign.esign.model.Document;
24+
25+
import java.io.IOException;
26+
import java.util.Arrays;
27+
import java.util.Collections;
28+
29+
/**
30+
* Document generation code example
31+
*/
32+
public final class DocumentGenerationService {
33+
public static final String CANDIDATE_NAME = "Candidate_Name";
34+
public static final String MANAGER_NAME = "Manager_Name";
35+
public static final String JOB_TITLE = "Job_Title";
36+
public static final String SALARY = "Salary";
37+
public static final String START_DATE = "Start_Date";
38+
public static final String TEXT_BOX = "TextBox";
39+
public static final String STRING_TRUE = "true";
40+
public static final String ANCHOR_UNITS = "pixels";
41+
public static final String DEFAULT_ID = "1";
42+
43+
public String generateDocument(
44+
String accountId,
45+
String candidateEmail,
46+
String candidateName,
47+
String managerName,
48+
String jobTitle,
49+
String salary,
50+
String startDate,
51+
String offerDocDocx,
52+
EnvelopesApi envelopesApi,
53+
TemplatesApi templatesApi
54+
) throws ApiException, IOException {
55+
TemplateSummary template = templatesApi.createTemplate(accountId, makeTemplate());
56+
String templateId = template.getTemplateId();
57+
58+
templatesApi.updateDocument(accountId, templateId, DEFAULT_ID, addDocumentTemplate(offerDocDocx));
59+
templatesApi.createTabs(accountId, templateId, DEFAULT_ID, prepareTabs());
60+
61+
EnvelopeSummary envelopeSummary = envelopesApi.createEnvelope(
62+
accountId,
63+
makeEnvelope(candidateEmail, candidateName, template.getTemplateId()));
64+
String envelopeId = envelopeSummary.getEnvelopeId();
65+
66+
DocGenFormFieldResponse formFieldResponse = envelopesApi.getEnvelopeDocGenFormFields(accountId, envelopeId);
67+
String documentId = "";
68+
if (!formFieldResponse.getDocGenFormFields().isEmpty()) {
69+
DocGenFormFields docGenFormFields = formFieldResponse.getDocGenFormFields().get(0);
70+
if (docGenFormFields != null){
71+
documentId = docGenFormFields.getDocumentId();
72+
}
73+
}
74+
75+
DocGenFormFieldRequest formFields = getFormFields(
76+
documentId,
77+
candidateName,
78+
managerName,
79+
jobTitle,
80+
salary,
81+
startDate);
82+
83+
envelopesApi.updateEnvelopeDocGenFormFields(accountId, envelopeId, formFields);
84+
85+
Envelope envelope = new Envelope();
86+
envelope.setStatus(EnvelopeHelpers.ENVELOPE_STATUS_SENT);
87+
88+
EnvelopeUpdateSummary envelopeUpdateSummary = envelopesApi.update(accountId, envelopeId, envelope);
89+
90+
return envelopeUpdateSummary.getEnvelopeId();
91+
}
92+
93+
private TemplateTabs prepareTabs() {
94+
SignHere signHere = createSignHere();
95+
DateSigned dateSigned = createDateSigned();
96+
97+
TemplateTabs templateTabs = new TemplateTabs();
98+
templateTabs.setSignHereTabs(Collections.singletonList(signHere));
99+
templateTabs.setDateSignedTabs(Collections.singletonList(dateSigned));
100+
101+
return templateTabs;
102+
}
103+
104+
private SignHere createSignHere() {
105+
SignHere signHere = new SignHere();
106+
107+
signHere.setAnchorString("Employee Signature");
108+
signHere.setAnchorUnits(ANCHOR_UNITS);
109+
signHere.setAnchorXOffset("5");
110+
signHere.setAnchorYOffset("-22");
111+
112+
return signHere;
113+
}
114+
115+
public static DateSigned createDateSigned() {
116+
DateSigned dateSigned = new DateSigned();
117+
118+
dateSigned.setAnchorString("Date");
119+
dateSigned.setAnchorUnits(ANCHOR_UNITS);
120+
dateSigned.setAnchorYOffset("-22");
121+
122+
return dateSigned;
123+
}
124+
125+
private DocGenFormFieldRequest getFormFields(
126+
String documentId,
127+
String candidateName,
128+
String managerName,
129+
String jobTitle,
130+
String salary,
131+
String startDate) {
132+
DocGenFormField candidateNameField = new DocGenFormField();
133+
candidateNameField.setName(CANDIDATE_NAME);
134+
candidateNameField.setValue(candidateName);
135+
136+
DocGenFormField managerNameField = new DocGenFormField();
137+
managerNameField.setName(MANAGER_NAME);
138+
managerNameField.setValue(managerName);
139+
140+
DocGenFormField jobTitleField = new DocGenFormField();
141+
jobTitleField.setName(JOB_TITLE);
142+
jobTitleField.setValue(jobTitle);
143+
144+
DocGenFormField salaryField = new DocGenFormField();
145+
salaryField.setName(SALARY);
146+
salaryField.setValue(salary);
147+
148+
DocGenFormField startDateField = new DocGenFormField();
149+
startDateField.setName(START_DATE);
150+
startDateField.setValue(startDate);
151+
152+
DocGenFormFields formFields = new DocGenFormFields();
153+
formFields.setDocGenFormFieldList(Arrays.asList(
154+
candidateNameField,
155+
managerNameField,
156+
jobTitleField,
157+
salaryField,
158+
startDateField));
159+
formFields.setDocumentId(documentId);
160+
161+
DocGenFormFieldRequest docGenFormFieldRequest = new DocGenFormFieldRequest();
162+
docGenFormFieldRequest.setDocGenFormFields(Collections.singletonList(formFields));
163+
164+
return docGenFormFieldRequest;
165+
}
166+
167+
private EnvelopeDefinition makeEnvelope(String candidateEmail, String candidateName, String templateId) {
168+
TemplateRole signerRole = new TemplateRole();
169+
signerRole.setName(candidateName);
170+
signerRole.setEmail(candidateEmail);
171+
signerRole.setRoleName(EnvelopeHelpers.SIGNER_ROLE_NAME);
172+
173+
EnvelopeDefinition envelopeDefinition = new EnvelopeDefinition();
174+
envelopeDefinition.setTemplateRoles(Collections.singletonList(signerRole));
175+
envelopeDefinition.setStatus(EnvelopeHelpers.ENVELOPE_STATUS_CREATED);
176+
envelopeDefinition.setTemplateId(templateId);
177+
178+
return envelopeDefinition;
179+
}
180+
181+
private EnvelopeTemplate makeTemplate() {
182+
Signer signer = new Signer();
183+
signer.setRoleName(EnvelopeHelpers.SIGNER_ROLE_NAME);
184+
signer.setRecipientId(DEFAULT_ID);
185+
signer.setRoutingOrder("1");
186+
187+
Recipients recipients = new Recipients();
188+
recipients.setSigners(Collections.singletonList(signer));
189+
190+
EnvelopeTemplate template = new EnvelopeTemplate();
191+
template.setEmailSubject("Please sign this document");
192+
template.setName("Example Template");
193+
template.setDescription("Example template created via the API");
194+
template.setRecipients(recipients);
195+
template.setStatus(EnvelopeHelpers.ENVELOPE_STATUS_CREATED);
196+
197+
return template;
198+
}
199+
200+
private static EnvelopeDefinition addDocumentTemplate(String offerDocDocx) throws IOException {
201+
String documentName = "OfferLetterDemo.docx";
202+
Document document = EnvelopeHelpers.createDocumentFromFile(offerDocDocx, documentName,DEFAULT_ID);
203+
document.setOrder("1");
204+
document.pages("1");
205+
206+
EnvelopeDefinition envelopeDefinition = new EnvelopeDefinition();
207+
envelopeDefinition.setDocuments(Collections.singletonList(document));
208+
209+
return envelopeDefinition;
210+
}
211+
}
36.3 KB
Binary file not shown.

0 commit comments

Comments
 (0)