rightsignature 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,34 @@
1
+ module RightSignature
2
+ class OauthConnection
3
+
4
+ class << self
5
+ def oauth_consumer
6
+ @oauth_consumer ||= OAuth::Consumer.new(
7
+ RightSignature::configuration[:consumer_key],
8
+ RightSignature::configuration[:consumer_secret],
9
+ {
10
+ :site => "https://rightsignature.com",
11
+ :scheme => :header,
12
+ :http_method => :post,
13
+ :authorize_path =>'/oauth/authorize',
14
+ :access_token_path =>'/oauth/access_token',
15
+ :request_token_path=>'/oauth/request_token'
16
+ }
17
+ )
18
+ end
19
+
20
+ def access_token
21
+ @access_token ||= OAuth::AccessToken.new(oauth_consumer, RightSignature::configuration[:access_token], RightSignature::configuration[:access_secret])
22
+ end
23
+
24
+ def request(method, *options)
25
+ options.last ||= {}
26
+ options.last["Accept"] ||= "*/*"
27
+ options.last["content-type"] ||= "application/xml"
28
+
29
+ self.access_token.__send__(method, *options)
30
+ end
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,19 @@
1
+ module RightSignature
2
+ class TokenConnection
3
+ include HTTParty
4
+ base_uri 'https://rightsignature.com'
5
+ format :xml
6
+
7
+ class <<self
8
+ def request(method, url, options)
9
+ options[:headers] ||= {}
10
+ options[:headers]['api-token'] = RightSignature::configuration[:api_token]
11
+ options[:headers]["Accept"] ||= "*/*"
12
+ options[:headers]["content-type"] ||= "application/xml"
13
+ __send__(method, url, options)
14
+ end
15
+
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,216 @@
1
+ module RightSignature
2
+ class Document
3
+ extend RightSignature::Helpers
4
+
5
+ class << self
6
+
7
+ def list(options={})
8
+ options[:tags] = TagsHelper.mixed_array_to_string_array(options[:tags]) if options[:tags]
9
+ options[:state] = options[:state].join(',') if options[:state] && options[:state].is_a?(Array)
10
+ RightSignature::Connection.get "/api/documents.xml", options
11
+ end
12
+
13
+ def details(guid)
14
+ RightSignature::Connection.get "/api/documents/#{guid}.xml"
15
+ end
16
+
17
+ def batch_details(guids)
18
+ RightSignature::Connection.get "/api/documents/#{guids.join(',')}/batch_details.xml"
19
+ end
20
+
21
+ def send_reminder(guid)
22
+ RightSignature::Connection.post "/api/documents/#{guid}/send_reminders.xml", {}
23
+ end
24
+
25
+ def trash(guid)
26
+ RightSignature::Connection.post "/api/documents/#{guid}/trash.xml", {}
27
+ end
28
+
29
+ def extend_expiration(guid)
30
+ RightSignature::Connection.post "/api/documents/#{guid}/extend_expiration.xml", {}
31
+ end
32
+
33
+ # This will REPLACE the tags on a document
34
+ # tags are an array of 'tag_name' or {'tag_name' => 'value'}
35
+ # Hash style:
36
+ # {:name => value}
37
+ def update_tags(guid, tags)
38
+ RightSignature::Connection.post "/api/documents/#{guid}/update_tags.xml", { :tags => TagsHelper.array_to_xml_hash(tags) }
39
+ end
40
+
41
+ # Creates a document from a raw data
42
+ # * file: file binary. Ex. File.read('myfile.pdf')
43
+ # * filename: original filename
44
+ # * subject: subject of the document that'll appear in email
45
+ # * recipients: Recipients of the document, should be an array of hashes with :name, :email, and :role ('cc' or 'signer').
46
+ # An optional :is_sender (true/false) is used to referrence the API User and won't need to supply :name and :email
47
+ # Ex. CC to support@rightsignature.com, with sender and john@rightsignature.com as a signer
48
+ # [
49
+ # {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
50
+ # {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
51
+ # {'is_sender' => true, :role => 'signer'},
52
+ # ]
53
+ # * options: other optional values
54
+ # - description: document description that'll appear in the email
55
+ # - action: 'send' or 'redirect'. Redirect will return a token that will allow another person to send the document under API user's account
56
+ # - expires_in: number of days before expiring the document. API only allows 2,5,15, or 30.
57
+ # - tags: document tags, an array of string or hashes 'single_tag' (for simple tag) or {'tag_name' => 'tag_value'} (for tuples pairs)
58
+ # Ex. ['sent_from_api', {"user_id" => "32"}]
59
+ # - callback_url: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
60
+ # Ex. "http://yoursite/callback"
61
+ # - use_text_tags: Document has special Text Tags that RightSignature parse. true or false.
62
+ # More info: https://rightsignature.com/apidocs/text_tags
63
+ def send_document_from_data(file_data, filename, subject, recipients, options={})
64
+ send_document(subject, recipients, {:type => "base64", :filename => filename, :value => Base64::encode64(file_data)}, options)
65
+ end
66
+
67
+ # Creates a document from a File or path to file
68
+ # * file: Path to file or File object
69
+ # * subject: subject of the document that'll appear in email
70
+ # * recipients: Recipients of the document, should be an array of hashes with :name, :email, and :role ('cc' or 'signer').
71
+ # An optional :is_sender (true/false) is used to referrence the API User and won't need to supply :name and :email
72
+ # Ex. CC to support@rightsignature.com, with sender and john@rightsignature.com as a signer
73
+ # [
74
+ # {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
75
+ # {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
76
+ # {'is_sender' => true, :role => 'signer'},
77
+ # ]
78
+ # * options: other optional values
79
+ # - description: document description that'll appear in the email
80
+ # - action: 'send' or 'redirect'. Redirect will return a token that will allow another person to send the document under API user's account
81
+ # - expires_in: number of days before expiring the document. API only allows 2,5,15, or 30.
82
+ # - tags: document tags, an array of string or hashes 'single_tag' (for simple tag) or {'tag_name' => 'tag_value'} (for tuples pairs)
83
+ # Ex. ['sent_from_api', {"user_id" => "32"}]
84
+ # - callback_url: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
85
+ # Ex. "http://yoursite/callback"
86
+ # - use_text_tags: Document has special Text Tags that RightSignature parse. true or false.
87
+ # More info: https://rightsignature.com/apidocs/text_tags
88
+ def send_document_from_file(file, subject, recipients, options={})
89
+ send_document(subject, recipients, {:type => "base64", :filename => File.basename(file), :value => Base64::encode64(File.read(file)) }, options)
90
+ end
91
+
92
+ # Creates a document from URL
93
+ # * url: URL to file
94
+ # * subject: subject of the document that'll appear in email
95
+ # * recipients: Recipients of the document, should be an array of hashes with :name, :email, and :role ('cc' or 'signer').
96
+ # An optional :is_sender (true/false) is used to referrence the API User and won't need to supply :name and :email
97
+ # Ex. CC to support@rightsignature.com, with sender and john@rightsignature.com as a signer
98
+ # [
99
+ # {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
100
+ # {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
101
+ # {'is_sender' => true, :role => 'signer'},
102
+ # ]
103
+ # * options: other optional values
104
+ # - description: document description that'll appear in the email
105
+ # - action: 'send' or 'redirect'. Redirect will return a token that will allow another person to send the document under API user's account
106
+ # - expires_in: number of days before expiring the document. API only allows 2,5,15, or 30.
107
+ # - tags: document tags, an array of string or hashes 'single_tag' (for simple tag) or {'tag_name' => 'tag_value'} (for tuples pairs)
108
+ # Ex. ['sent_from_api', {"user_id" => "32"}]
109
+ # - callback_url: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
110
+ # Ex. "http://yoursite/callback"
111
+ # - use_text_tags: Document has special Text Tags that RightSignature parse. true or false.
112
+ # More info: https://rightsignature.com/apidocs/text_tags
113
+ def send_document_from_url(url, subject, recipients, options={})
114
+ send_document(subject, recipients, {:type => "url", :filename => File.basename(url), :value => url }, options)
115
+ end
116
+
117
+ # Creates a document from a base64 encoded file or publicly available URL
118
+ # * document_data: hash of document source :type ('base64' or 'url'), :filename to be used, :value of source (url or base64 encoded binary)
119
+ # * subject: subject of the document that'll appear in email
120
+ # * recipients: Recipients of the document, should be an array of hashes with :name, :email, and :role ('cc' or 'signer').
121
+ # An optional :is_sender (true/false) is used to referrence the API User and won't need to supply :name and :email
122
+ # Ex. CC to support@rightsignature.com, with sender and john@rightsignature.com as a signer
123
+ # [
124
+ # {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
125
+ # {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
126
+ # {'is_sender' => true, :role => 'signer'},
127
+ # ]
128
+ # * options: other optional values
129
+ # - description: document description that'll appear in the email
130
+ # - action: 'send' or 'redirect'. Redirect will return a token that will allow another person to send the document under API user's account
131
+ # - expires_in: number of days before expiring the document. API only allows 2,5,15, or 30.
132
+ # - tags: document tags, an array of string or hashes 'single_tag' (for simple tag) or {'tag_name' => 'tag_value'} (for tuples pairs)
133
+ # Ex. ['sent_from_api', {"user_id" => "32"}]
134
+ # - callback_url: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
135
+ # Ex. "http://yoursite/callback"
136
+ # - use_text_tags: Document has special Text Tags that RightSignature parse. true or false.
137
+ # More info: https://rightsignature.com/apidocs/text_tags
138
+ # Ex.
139
+ # recipients = [
140
+ # {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
141
+ # {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
142
+ # {'is_sender' => true, :role => 'signer'},
143
+ # ]
144
+ # document_data = {:type => 'base64', :filename => "originalfile.pdf", :value => Base64.encode64(File.read('myfile.pdf','r'))}
145
+ # options = {
146
+ # :tags => ['sent_from_api', 'user_id' => '12345'],
147
+ # :expires_in => '5 days',
148
+ # :action => "redirect",
149
+ # 'callback_location' => "http://example.com/doc_callback",
150
+ # 'use_text_tags' => false
151
+ # }
152
+ # RightSignature::send_document( "My Subject", recipients, document_data, options)
153
+ #
154
+ def send_document(subject, recipients, document_data, options={})
155
+ document_hash = {:document => {
156
+ :subject => subject,
157
+ :action => "send",
158
+ :document_data => document_data
159
+ }}
160
+
161
+ document_hash[:document][:recipients] = []
162
+ recipients.each do |recipient_hash|
163
+ document_hash[:document][:recipients] << { :recipient => recipient_hash}
164
+ end
165
+
166
+ document_hash[:document].merge!(options)
167
+ RightSignature::Connection.post "/api/documents.xml", document_hash
168
+ end
169
+
170
+ # Prefills a document from a base64 encoded file or publicly available URL and returns a url that allows someone to send as the API User
171
+ # * document_data: hash of document source :type ('base64' or 'url'), :filename to be used, :value of source (url or base64 encoded binary)
172
+ # * subject: subject of the document that'll appear in email
173
+ # * recipients: Recipients of the document, should be an array of hashes with :name, :email, and :role ('cc' or 'signer').
174
+ # An optional :is_sender (true/false) is used to referrence the API User and won't need to supply :name and :email
175
+ # Ex. CC to support@rightsignature.com, with sender and john@rightsignature.com as a signer
176
+ # [
177
+ # {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
178
+ # {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
179
+ # {'is_sender' => true, :role => 'signer'},
180
+ # ]
181
+ # * options: other optional values
182
+ # - description: document description that'll appear in the email
183
+ # - action: 'send' or 'redirect'. Redirect will return a token that will allow another person to send the document under API user's account
184
+ # - expires_in: number of days before expiring the document. API only allows 2,5,15, or 30.
185
+ # - tags: document tags, an array of string or hashes 'single_tag' (for simple tag) or {'tag_name' => 'tag_value'} (for tuples pairs)
186
+ # Ex. ['sent_from_api', {"user_id" => "32"}]
187
+ # - callback_url: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
188
+ # Ex. "http://yoursite/callback"
189
+ # - use_text_tags: Document has special Text Tags that RightSignature parse. true or false.
190
+ # More info: https://rightsignature.com/apidocs/text_tags
191
+ # Ex.
192
+ # recipients = [
193
+ # {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
194
+ # {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
195
+ # {'is_sender' => true, :role => 'signer'},
196
+ # ]
197
+ # document_data = {:type => 'base64', :filename => "originalfile.pdf", :value => Base64.encode64(File.read('myfile.pdf','r'))}
198
+ # options = {
199
+ # :tags => ['sent_from_api', 'user_id' => '12345'],
200
+ # :expires_in => '5 days',
201
+ # :action => "redirect",
202
+ # 'callback_location' => "http://example.com/doc_callback",
203
+ # 'use_text_tags' => false
204
+ # }
205
+ # RightSignature::generate_document_redirect_url( "My Subject", recipients, document_data, options)
206
+ #
207
+ def generate_document_redirect_url(subject, recipients, document_data, options={})
208
+ options[:action] = "redirect"
209
+ response = send_document(subject, recipients, document_data, options)
210
+
211
+ "#{RightSignature::Connection.site}/builder/new?rt=#{response['document']['redirect_token']}"
212
+ end
213
+
214
+ end
215
+ end
216
+ end
@@ -0,0 +1,28 @@
1
+ module RightSignature
2
+ class ResponseError < Exception
3
+ attr_reader :response
4
+
5
+ def initialize(response, message=nil)
6
+ self.set_backtrace(caller[1..-1]) if self.backtrace.nil?
7
+ @response = response
8
+ super((message || @response.message))
9
+ end
10
+
11
+ def code
12
+ @response.code
13
+ end
14
+
15
+ def common_solutions
16
+ if @response.code.to_i == 406
17
+ "Check the Content-Type and makes sure it's the correct type (usually application/json or application/xml), ensure url has .xml or .json at the end, check 'Accept' header to allow xml or json ('*/*' for anything)"
18
+ elsif @response.code.to_i == 401
19
+ "Check your credentials and make sure they are correct and not expired"
20
+ elsif @response.code.to_i >= 500 && @response.code.to_i < 600
21
+ "Check the format of your xml or json"
22
+ end
23
+ end
24
+ end
25
+
26
+ class TokenResponseError < Exception; end
27
+ class OAuthResponseError < Exception; end
28
+ end
@@ -0,0 +1,79 @@
1
+ module RightSignature::Helpers
2
+ module TagsHelper
3
+ class <<self
4
+ def mixed_array_to_string_array(array_of_tags)
5
+ return array_of_tags unless array_of_tags.is_a?(Array)
6
+
7
+ tags = []
8
+ array_of_tags.each_with_index do |tag, idx|
9
+ if tag.is_a? Hash
10
+ tags << tag.first.join(':')
11
+ elsif tag.is_a? String
12
+ tags << tag
13
+ else
14
+ raise "Tags should be an array of Strings ('tag_name') or Hashes ({'tag_name' => 'value'})"
15
+ end
16
+ end
17
+
18
+ tags.join(',')
19
+ end
20
+
21
+ def array_to_xml_hash(tags_array)
22
+ tags_array.map do |t|
23
+ if t.is_a? Hash
24
+ name, value = t.first
25
+ {:tag => {:name => name, :value => value}}
26
+ else
27
+ {:tag => {:name => t}}
28
+ end
29
+ end
30
+ end
31
+
32
+ end
33
+ end
34
+
35
+ module RolesHelper
36
+ class <<self
37
+ # Converts [{"Role Name" => {:name => "John", :email => "email@example.com"}}] to
38
+ # [{:role => {:name => "John", :email => "email@example.com", "@role_name" => "Role Name"} }]
39
+ def array_to_xml_hash(roles_array)
40
+ roles_hash_array = []
41
+ roles_array.each do |role_hash|
42
+ name, value = role_hash.first
43
+ raise "Hash '#{role_hash.inspect}' is malformed, should be something like {ROLE_NAME => {:name => \"a\", :email => \"a@a.com\"}}" unless value.is_a? Hash and name.is_a? String
44
+ roles_hash_array << {:role => value.merge({"@role_name" => name})}
45
+ end
46
+
47
+ roles_hash_array
48
+ end
49
+
50
+ end
51
+ end
52
+
53
+
54
+ module MergeFieldsHelper
55
+ class <<self
56
+ # Converts [{"Role Name" => {:name => "John", :email => "email@example.com"}}] to
57
+ # [{"role roles_name=\"Role Name\"" => {:role => {:name => "John", :email => "email@example.com"}} }]
58
+ def array_to_xml_hash(merge_fields_array)
59
+ merge_fields = []
60
+ merge_fields_array.each do |merge_field_hash|
61
+ name, value = merge_field_hash.first
62
+ merge_fields << { :merge_field => {:value => value, "@merge_field_name" => name}}
63
+ end
64
+
65
+ merge_fields
66
+ end
67
+
68
+ end
69
+ end
70
+
71
+ def array_to_acceptable_names_hash(acceptable_names)
72
+ converted_fields = []
73
+ acceptable_names.each do |name|
74
+ converted_fields << {:name => name}
75
+ end
76
+
77
+ converted_fields
78
+ end
79
+ end
@@ -0,0 +1,177 @@
1
+ module RightSignature
2
+ class Template
3
+ extend RightSignature::Helpers
4
+
5
+ class << self
6
+
7
+ # List Templates and passes in optional options.
8
+ # Options:
9
+ # * page: page number
10
+ # * per_page: number of templates to return per page.
11
+ # API only supports 10, 20, 30, 40, or 50. Default is 10.
12
+ # * tags: filter templates by given tags. Array of strings, for name/value tags colon (:) should separate name and value.
13
+ # Ex. "single_tag,tag_key:tag_value" would find templates with 'single_tag' and the name/value of 'tag_key' with value 'tag_value'.
14
+ # * search: term to search for in templates.
15
+ def list(options={})
16
+ options[:tags] = TagsHelper.mixed_array_to_string_array(options[:tags]) if options[:tags]
17
+ RightSignature::Connection.get "/api/templates.xml", options
18
+ end
19
+
20
+ def details(guid)
21
+ RightSignature::Connection.get "/api/templates/#{guid}.xml", {}
22
+ end
23
+
24
+ # Clones a template so it can be used for sending. Always first step in sending a template.
25
+ def prepackage(guid)
26
+ RightSignature::Connection.post "/api/templates/#{guid}/prepackage.xml", {}
27
+ end
28
+
29
+ # Prefills template.
30
+ # * guid: templates guid. Ex. a_1_zcfdidf8fi23
31
+ # * subject: subject of the document that'll appear in email
32
+ # * roles: Recipients of the document, should be an array of role names and emails in a hash with keys as role_names.
33
+ # Ex. [{"Employee" => {:name => "John Employee", :email => "john@employee.com"}}]
34
+ # is equivalent to
35
+ # <role role_name="Employee">
36
+ # <name>John Employee</name>
37
+ # <email>john@employee.com</email>
38
+ # </role>
39
+ # * options: other optional values
40
+ # - description: document description that'll appear in the email
41
+ # - merge_fields: document merge fields, should be an array of merge_field_values in a hash with the merge_field_name.
42
+ # Ex. [{"Salary" => "$1,000,000"}]
43
+ # is equivalent to
44
+ # <merge_field merge_field_name="Salary">
45
+ # <value>$1,000,000</value>
46
+ # </merge_field>
47
+ # - expires_in: number of days before expiring the document. API only allows 2,5,15, or 30.
48
+ # - tags: document tags, an array of string or hashes 'single_tag' (for simple tag) or {'tag_name' => 'tag_value'} (for tuples pairs)
49
+ # Ex. ['sent_from_api', {"user_id" => "32"}]
50
+ # - callback_url: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
51
+ # Ex. "http://yoursite/callback"
52
+ #
53
+ # Ex. call with all options used
54
+ # RightSignature::Template.prefill(
55
+ # "a_1_zcfdidf8fi23",
56
+ # "Your Employee Handbook",
57
+ # [{"employee" => {:name => "John Employee", :email => "john@employee.com"}}],
58
+ # {
59
+ # :description => "Please read over the handbook and sign it.",
60
+ # :merge_fields => [
61
+ # { "Department" => "Fun and games" },
62
+ # { "Salary" => "$1,000,000" }
63
+ # ],
64
+ # :expires_in => 5,
65
+ # :tags => [
66
+ # {:name => 'sent_from_api'},
67
+ # {:name => 'user_id', :value => '32'}
68
+ # ],
69
+ # :callback_url => "http://yoursite/callback"
70
+ # })
71
+ def prefill(guid, subject, roles, options={})
72
+ xml_hash = {
73
+ :template => {
74
+ :guid => guid,
75
+ :action => "prefill",
76
+ :subject => subject
77
+ }
78
+ }
79
+
80
+ xml_hash[:template][:roles] = RolesHelper.array_to_xml_hash(roles)
81
+
82
+ # Optional arguments
83
+ xml_hash[:template][:merge_fields] = MergeFieldsHelper.array_to_xml_hash(options[:merge_fields]) if options[:merge_fields]
84
+ xml_hash[:template][:tags] = TagsHelper.array_to_xml_hash(options[:tags]) if options[:tags]
85
+ [:expires_in, :description, :callback_url, :action].each do |other_option|
86
+ xml_hash[:template][other_option] = options[other_option] if options[other_option]
87
+ end
88
+
89
+ RightSignature::Connection.post "/api/templates.xml", xml_hash
90
+ end
91
+
92
+ def prepackage_and_send(guid, subject, roles, options={})
93
+ response = prepackage(guid)
94
+ new_guid = response["template"]["guid"]
95
+ send_template(new_guid, subject, roles, options)
96
+ end
97
+
98
+ # Sends template.
99
+ # * guid: templates guid. Ex. a_1_zcfdidf8fi23
100
+ # * subject: subject of the document that'll appear in email
101
+ # * roles: Recipients of the document, should be an array of role names and emails in a hash with keys as role_names.
102
+ # Ex. [{"Employee" => {:name => "John Employee", :email => "john@employee.com"}}]
103
+ # is equivalent to
104
+ # <role role_name="Employee">
105
+ # <name>John Employee</name>
106
+ # <email>john@employee.com</email>
107
+ # </role>
108
+ # * options: other optional values
109
+ # - description: document description that'll appear in the email
110
+ # - merge_fields: document merge fields, should be an array of merge_field_values in a hash with the merge_field_name.
111
+ # Ex. [{"Salary" => "$1,000,000"}]
112
+ # is equivalent to
113
+ # <merge_field merge_field_name="Salary">
114
+ # <value>$1,000,000</value>
115
+ # </merge_field>
116
+ # - expires_in: number of days before expiring the document. API only allows 2,5,15, or 30.
117
+ # - tags: document tags, an array of {:name => 'tag_name'} (for simple tag) or {:name => 'tag_name', :value => 'value'} (for tuples pairs)
118
+ # Ex. [{:name => 'sent_from_api'}, {:name => "user_id", :value => "32"}]
119
+ # - callback_url: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
120
+ # Ex. "http://yoursite/callback"
121
+ #
122
+ # Ex. call with all options used
123
+ # RightSignature::Template.prefill(
124
+ # "a_1_zcfdidf8fi23",
125
+ # "Your Employee Handbook",
126
+ # [{"employee" => {:name => "John Employee", :email => "john@employee.com"}}],
127
+ # {
128
+ # :description => "Please read over the handbook and sign it.",
129
+ # :merge_fields => [
130
+ # { "Department" => "Fun and games" },
131
+ # { "Salary" => "$1,000,000" }
132
+ # ],
133
+ # :expires_in => 5,
134
+ # :tags => [
135
+ # {:name => 'sent_from_api'},
136
+ # {:name => 'user_id', :value => '32'}
137
+ # ],
138
+ # :callback_url => "http://yoursite/callback"
139
+ # })
140
+ def send_template(guid, subject, roles, options={})
141
+ prefill(guid, subject, roles, options.merge({:action => 'send'}))
142
+ end
143
+
144
+ # Creates a URL that give person ability to create a template in your account.
145
+ # * options: optional options for redirected person
146
+ # - callback_location: URI encoded URL that specifies the location we will POST a callback notification to when the template has been created.
147
+ # - redirect_location: A URI encoded URL that specifies the location we will redirect the user to, after they have created a template.
148
+ # - tags: tags to add to the template. an array of 'tag_name' (for simple tag) or {'tag_name' => 'value'} (for tuples pairs)
149
+ # Ex. ['created_from_api', {"user_id" => "123"}]
150
+ # - acceptabled_role_names: The user creating the Template will be forced to select one of the values provided.
151
+ # There will be no free-form name entry when adding roles to the Template. An array of strings.
152
+ # Ex. ["Employee", "Employeer"]
153
+ # - acceptable_merge_field_names: The user creating the Template will be forced to select one of the values provided.
154
+ # There will be no free-form name entry when adding merge fields to the Template.
155
+ # Ex. ["Location", "Tax ID", "Company Name"]
156
+ def generate_build_url(options={})
157
+ xml_hash = {:template => {}}
158
+ xml_hash[:template][:tags] = TagsHelper.array_to_xml_hash(options[:tags]) if options[:tags]
159
+
160
+ [:acceptable_merge_field_names, :acceptabled_role_names].each do |option|
161
+ xml_hash[:template][option] = array_to_acceptable_names_hash(options[option]) if options[option]
162
+ end
163
+
164
+ [:callback_location, :redirect_location].each do |other_option|
165
+ xml_hash[:template][other_option] = options[other_option] if options[other_option]
166
+ end
167
+
168
+ response = RightSignature::Connection.post "/api/templates/generate_build_token.xml", xml_hash
169
+
170
+ redirect_token = response["token"]["redirect_token"]
171
+
172
+ "#{RightSignature::Connection.site}/builder/new?rt=#{redirect_token}"
173
+ end
174
+
175
+ end
176
+ end
177
+ end