Skip to content

Instantly share code, notes, and snippets.

@rohanmendon
Created July 8, 2022 04:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rohanmendon/44e21e3a991ae06e916a3208f7ab8199 to your computer and use it in GitHub Desktop.
Save rohanmendon/44e21e3a991ae06e916a3208f7ab8199 to your computer and use it in GitHub Desktop.
DocuSign Blog Sample Code
module DocuSign
class CreateEnvelopeDefinition < ActiveInteraction::Base
record :consumer, class: 'Consumer'
record :dealer, class: 'Dealer'
object :templates_hash, class: 'Hash'
def execute
envelope_definition = DocuSign_eSign::EnvelopeDefinition.new(status: 'sent', compositeTemplates: build_composite_templates)
# envelope level webhook notification https://developers.docusign.com/platform/webhooks/connect/create-webhook-listener/
envelope_definition.event_notification = event_notification
envelope_definition
end
private
def build_composite_templates
# more details about Composite Templates
# https://developers.docusign.com/docs/esign-rest-api/esign101/concepts/templates/composite/
composite_templates = []
templates_hash.each do |template_id, parameters|
tabs = populated_tabs(parameters) if parameters.present?
consumer_signer = DocuSign_eSign::Signer.new(embedded_signer(consumer))
dealer_signer = DocuSign_eSign::Signer.new(embedded_signer(dealer))
dealer_signer.tabs = consumer_signer.tabs = tabs if tabs.present?
recipients_server_template = DocuSign_eSign::Recipients.new('signers' => [consumer_signer, dealer_signer])
# detailed processing rules are provided here https://www.docusign.com/blog/dsdev-why-use-composite-templates
composite_templates << DocuSign_eSign::CompositeTemplate.new(
serverTemplates: [DocuSign_eSign::ServerTemplate.new(sequence: '1', templateId: DocuSign::Template.find(template_id).docusign_template_id)],
inlineTemplates: [DocuSign_eSign::InlineTemplate.new(sequence: '2', recipients: recipients_server_template)]
)
end
composite_templates
end
def populated_tabs(parameters)
# more details about tabs
# https://developers.docusign.com/docs/esign-rest-api/esign101/concepts/tabs/
tab_list = parameters.map do |parameter|
if parameter.template_parameter.boolean?
DocuSign_eSign::Checkbox.new.tap do |checkbox|
checkbox.tab_label = parameter.template_parameter.name
checkbox.selected = parameter.value == 'true' ? true : false
end
else
DocuSign_eSign::Text.new.tap do |text|
text.tab_label = parameter.template_parameter.name
text.value = parameter.value
end
end
end
tabs = DocuSign_eSign::Tabs.new
tabs.text_tabs = tab_list.select { |tab| tab.is_a?(DocuSign_eSign::Text) }
tabs.checkbox_tabs = tab_list.select { |tab| tab.is_a?(DocuSign_eSign::Checkbox) }
tabs
end
def embedded_signer(signer)
{
email: signer.is_a?(Consumer) ? signer.profile.email_address : signer.email,
name: signer.is_a?(Consumer) ? signer.profile.full_name : signer.full_name,
roleName: signer.is_a?(Consumer) ? 'Consumer' : 'Dealer',
clientUserId: signer.id.to_s, # passing clientUserId makes the signer an embedded signer https://developers.docusign.com/docs/esign-rest-api/esign101/concepts/embedding/
recipientId: signer.id.to_s,
}
end
def event_notification
event_data = DocuSign_eSign::ConnectEventData.new
event_data.version = 'restv2.1'
event_data.format = 'json'
event_data.include_data = %w[custom_fields recipients tabs attachments]
event_notification = DocuSign_eSign::EventNotification.new
event_notification.event_data = event_data
event_notification.include_hmac = true
event_notification.url = 'https://www.company.com/docusign/events'
event_notification.require_acknowledgment = 'true'
event_notification.logging_enabled = 'true'
envelope_events = %w[completed declined delivered sent voided].map do |status|
envelope_event = DocuSign_eSign::EnvelopeEvent.new
envelope_event.envelope_event_status_code = status
envelope_event
end
recipient_events = %w[completed declined delivered sent authenticationfailed autoresponded].map do |status|
recipient_event = DocuSign_eSign::RecipientEvent.new
recipient_event.recipient_event_status_code = status
recipient_event
end
event_notification.envelope_events = envelope_events
event_notification.recipient_events = recipient_events
event_notification
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment