gitlab_support_readiness 1.0.11 → 1.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/lib/support_readiness/calendly/client.rb +64 -0
  3. data/lib/support_readiness/calendly/configuration.rb +45 -0
  4. data/lib/support_readiness/calendly/organization_memberships.rb +67 -0
  5. data/lib/support_readiness/calendly/organizations.rb +123 -0
  6. data/lib/support_readiness/calendly/users.rb +105 -0
  7. data/lib/support_readiness/calendly.rb +16 -0
  8. data/lib/support_readiness/client.rb +88 -1
  9. data/lib/support_readiness/dates.rb +90 -0
  10. data/lib/support_readiness/gitlab/configuration.rb +0 -1
  11. data/lib/support_readiness/gitlab/groups.rb +35 -0
  12. data/lib/support_readiness/gitlab/markdown.rb +37 -0
  13. data/lib/support_readiness/gitlab/merge_requests.rb +127 -0
  14. data/lib/support_readiness/gitlab/namespaces.rb +22 -0
  15. data/lib/support_readiness/gitlab/projects.rb +36 -1
  16. data/lib/support_readiness/gitlab/repositories.rb +174 -0
  17. data/lib/support_readiness/gitlab/users.rb +24 -0
  18. data/lib/support_readiness/gitlab.rb +2 -0
  19. data/lib/support_readiness/google_calendar/client.rb +59 -0
  20. data/lib/support_readiness/google_calendar/configuration.rb +39 -0
  21. data/lib/support_readiness/google_calendar/events.rb +169 -0
  22. data/lib/support_readiness/google_calendar.rb +14 -0
  23. data/lib/support_readiness/mailgun/bounces.rb +103 -0
  24. data/lib/support_readiness/mailgun/client.rb +65 -0
  25. data/lib/support_readiness/mailgun/configuration.rb +46 -0
  26. data/lib/support_readiness/mailgun/emails.rb +95 -0
  27. data/lib/support_readiness/mailgun.rb +15 -0
  28. data/lib/support_readiness/pagerduty/escalation_policies.rb +1 -1
  29. data/lib/support_readiness/pagerduty/schedules.rb +27 -3
  30. data/lib/support_readiness/pagerduty/services.rb +1 -1
  31. data/lib/support_readiness/pagerduty/users.rb +197 -0
  32. data/lib/support_readiness/pagerduty.rb +1 -0
  33. data/lib/support_readiness/repos/articles.rb +335 -0
  34. data/lib/support_readiness/repos/automations.rb +247 -0
  35. data/lib/support_readiness/repos/groups.rb +188 -0
  36. data/lib/support_readiness/repos/macros.rb +224 -0
  37. data/lib/support_readiness/repos/organization_fields.rb +193 -0
  38. data/lib/support_readiness/repos/sla_policies.rb +192 -0
  39. data/lib/support_readiness/repos/ticket_fields.rb +200 -0
  40. data/lib/support_readiness/repos/ticket_forms.rb +200 -0
  41. data/lib/support_readiness/repos/triggers.rb +255 -0
  42. data/lib/support_readiness/repos/user_fields.rb +201 -0
  43. data/lib/support_readiness/repos/views.rb +362 -0
  44. data/lib/support_readiness/repos.rb +22 -0
  45. data/lib/support_readiness/salesforce/accounts.rb +109 -0
  46. data/lib/support_readiness/salesforce/cases.rb +109 -0
  47. data/lib/support_readiness/salesforce/client.rb +64 -0
  48. data/lib/support_readiness/salesforce/configuration.rb +49 -0
  49. data/lib/support_readiness/salesforce/queries.rb +62 -0
  50. data/lib/support_readiness/salesforce.rb +16 -0
  51. data/lib/support_readiness/slack/client.rb +63 -0
  52. data/lib/support_readiness/slack/configuration.rb +43 -0
  53. data/lib/support_readiness/slack/messages.rb +37 -0
  54. data/lib/support_readiness/slack.rb +14 -0
  55. data/lib/support_readiness/zendesk/app_job_statuses.rb +140 -0
  56. data/lib/support_readiness/zendesk/apps.rb +209 -0
  57. data/lib/support_readiness/zendesk/automations.rb +1 -2
  58. data/lib/support_readiness/zendesk/macros.rb +1 -3
  59. data/lib/support_readiness/zendesk/organization_fields.rb +1 -1
  60. data/lib/support_readiness/zendesk/theme_job_statuses.rb +136 -0
  61. data/lib/support_readiness/zendesk/themes.rb +303 -0
  62. data/lib/support_readiness/zendesk/ticket_field_options.rb +110 -0
  63. data/lib/support_readiness/zendesk/ticket_fields.rb +85 -16
  64. data/lib/support_readiness/zendesk/ticket_forms.rb +65 -2
  65. data/lib/support_readiness/zendesk/tickets.rb +77 -0
  66. data/lib/support_readiness/zendesk/triggers.rb +1 -2
  67. data/lib/support_readiness/zendesk/user_field_options.rb +110 -0
  68. data/lib/support_readiness/zendesk/user_fields.rb +257 -0
  69. data/lib/support_readiness/zendesk/views.rb +49 -2
  70. data/lib/support_readiness/zendesk.rb +7 -0
  71. data/lib/support_readiness.rb +16 -0
  72. metadata +120 -2
@@ -0,0 +1,362 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the module Readiness.
4
+ module Readiness
5
+ # Defines the module Repos
6
+ module Repos
7
+ ##
8
+ # Defines the class Views within the module {Readiness::Repos}.
9
+ #
10
+ # @author Jason Colyer
11
+ # @since 1.0.12
12
+ class Views < Readiness::Client
13
+ ##
14
+ # Compares the repo view files to the Zendesk instance Views
15
+ #
16
+ # @author Jason Colyer
17
+ # @since 1.0.12
18
+ # @param config [Object] An instance of {Readiness::Zendesk::Configuration}
19
+ # @param zendesk_client [Object] An instance of {Readiness::Zendesk::Client}
20
+ # @param location [String] The location (relative or absolute) of the repo's data folder
21
+ # @param verbose [Boolean] Whether you want a detailed report or not
22
+ # @return [Hash]
23
+ # @example
24
+ # require 'support_readiness'
25
+ # config = Readiness::Zendesk::Configuration.new
26
+ # config.username = 'alice@example.com'
27
+ # config.token = 'test123abc'
28
+ # config.url = 'https://example.zendesk.com/api/v2'
29
+ # client = Readiness::Zendesk::Client.new(config)
30
+ # diffs = Readiness::Repos::Views.compare(config, client, 'views/data', false)
31
+ # pp diffs[:updates.count]
32
+ # # => 5
33
+ # @example
34
+ # require 'support_readiness'
35
+ # config = Readiness::Zendesk::Configuration.new
36
+ # config.username = 'alice@example.com'
37
+ # config.token = 'test123abc'
38
+ # config.url = 'https://example.zendesk.com/api/v2'
39
+ # client = Readiness::Zendesk::Client.new(config)
40
+ # diffs = Readiness::Repos::Views.compare(config, client, 'views/data', true)
41
+ # # => Detailed diff of Status::Close::Close solved tickets after 7 days
42
+ # # => - @default Repo:
43
+ # # => false
44
+ # # => @default Zendesk:
45
+ # # => true
46
+ # # => Compare report:
47
+ # # => - Creates: 0
48
+ # # => - Updates: 1
49
+ # pp diffs[:updates.count]
50
+ # # => 1
51
+ def self.compare(config, zendesk_client, location = 'data', verbose = false)
52
+ diffs = {
53
+ updates: [],
54
+ creates: []
55
+ }
56
+ from_repo = gather(config, location)
57
+ from_zendesk = Zendesk::Views.list(zendesk_client)
58
+ from_repo.each do |repo|
59
+ zd = from_zendesk.detect { |z| z.title == repo.title }
60
+ if zd.nil?
61
+ diffs[:creates].push(repo)
62
+ else
63
+ comparable = zd.dup
64
+ comparable.id = nil
65
+ diffs[:updates].push(update_object(repo, zd)) if to_clean_json(repo) != to_clean_json(comparable)
66
+ detailed_diff(repo, comparable) if verbose && to_clean_json(repo) != to_clean_json(comparable)
67
+ end
68
+ end
69
+ report_diffs(diffs) if verbose
70
+ diffs
71
+ end
72
+
73
+ ##
74
+ # Outputs a comparison report
75
+ #
76
+ # @author Jason Colyer
77
+ # @since 1.0.12
78
+ # @param diffs [Hash] The returned value of {compare}
79
+ def self.report_diffs(diffs)
80
+ puts 'Compare report:'
81
+ puts "- Creates: #{diffs[:creates].count}"
82
+ puts "- Updates: #{diffs[:updates].count}"
83
+ end
84
+
85
+ ##
86
+ # Outputs a comparison report
87
+ #
88
+ # @author Jason Colyer
89
+ # @since 1.0.12
90
+ # @param repo [Object] An instance of {Readiness::Zendesk::Views}
91
+ # @param zendesk [Object] An instance of {Readiness::Zendesk::Views}
92
+ def self.detailed_diff(repo, zendesk)
93
+ puts "Detailed diff of #{repo.title}"
94
+ repo.instance_variables.each do |v|
95
+ next if v == :@id
96
+
97
+ if repo.instance_variable_get(v) != zendesk.instance_variable_get(v)
98
+ puts "- #{v} Repo:"
99
+ pp repo.instance_variable_get(v)
100
+ puts " #{v} Zendesk:"
101
+ pp zendesk.instance_variable_get(v)
102
+ end
103
+ end
104
+ end
105
+
106
+ ##
107
+ # Creates an instance of {Readiness::Zendesk::Views} to use for updates
108
+ #
109
+ # @author Jason Colyer
110
+ # @since 1.0.12
111
+ # @param repo [Object] An instance of {Readiness::Zendesk::Views}
112
+ # @param zendesk [Object] An instance of {Readiness::Zendesk::Views}
113
+ # @return [Object]
114
+ def self.update_object(repo, zendesk)
115
+ object = repo
116
+ object.id = zendesk.id
117
+ object
118
+ end
119
+
120
+ ##
121
+ # Parses repo view files
122
+ #
123
+ # @author Jason Colyer
124
+ # @since 1.0.12
125
+ # @param config [Object] An instance of {Readiness::Zendesk::Configuration}
126
+ # @param location [String] The location (relative or absolute) of the repo's data folder
127
+ # @return [Array]
128
+ # @example
129
+ # require 'support_readiness'
130
+ # config = Readiness::Zendesk::Configuration.new
131
+ # config.username = 'alice@example.com'
132
+ # config.token = 'test123abc'
133
+ # config.url = 'https://example.zendesk.com/api/v2'
134
+ # repo = Readiness::Repos::Views.gather(config, 'views/data')
135
+ # pp repo.count
136
+ # # => 35
137
+ def self.gather(config, location = 'data')
138
+ @errors = []
139
+ @location = location
140
+ array = []
141
+ Dir["#{@location}/{active,inactive}/*.yaml"].each do |f|
142
+ object = YAML.safe_load_file(f)
143
+ object = convert_managed_content(config, object)
144
+ validity_check(f, object)
145
+ object['id'] = nil
146
+ array.push(Zendesk::Views.new(object))
147
+ end
148
+ repo_check(array)
149
+ report_errors unless @errors.count.zero?
150
+ array
151
+ end
152
+
153
+ ##
154
+ # Outputs an error report and exits with a status code of 1
155
+ #
156
+ # @author Jason Colyer
157
+ # @since 1.0.12
158
+ def self.report_errors
159
+ puts 'The following errors were found in the repo files:'
160
+ @errors.each do |e|
161
+ puts "- #{e}"
162
+ end
163
+ puts 'Rectify the errors and retry. We cannot proceed with those errors occurring.'
164
+ exit 1
165
+ end
166
+
167
+ ##
168
+ # Performs basic checks on a repo file
169
+ #
170
+ # @author Jason Colyer
171
+ # @since 1.0.12
172
+ # @param file [String] The path to the repo file
173
+ # @param object [Hash] The Hash derived from parsing a YAML file
174
+ def self.validity_check(file, object)
175
+ folder = file.split("#{@location}/").last.split('/').first
176
+ @errors.push("Missing position: #{file}") if object['position'].nil?
177
+ @errors.push("Missing title: #{file}") if object['title'].nil?
178
+ @errors.push("Inactive view in active folder: #{file}") if folder == 'active' && !object['active']
179
+ @errors.push("Active view in inactive folder: #{file}") if folder == 'inactive' && object['active']
180
+ end
181
+
182
+ ##
183
+ # Performs basic checks on the repo
184
+ #
185
+ # @author Jason Colyer
186
+ # @since 1.0.12
187
+ # @param objects [Array] The Array of Hashes derived from parsing the repo files
188
+ def self.repo_check(objects)
189
+ duplicate_names = objects.group_by { |o| o.title }.select { |k, v| v.size > 1 }.map(&:first)
190
+ unless duplicate_names.count.zero?
191
+ duplicate_names.each do |d|
192
+ @errors.push("The title '#{d}' is used in multiple files")
193
+ end
194
+ end
195
+ end
196
+
197
+ ##
198
+ # Performs conversions for a repo file if using managed content
199
+ #
200
+ # @author Jason Colyer
201
+ # @since 1.0.12
202
+ # @param config [Object] An instance of {Readiness::Zendesk::Configuration}
203
+ # @param object [Hash] The Hash derived from parsing a YAML file
204
+ def self.convert_managed_content(config, object)
205
+ path = "#{@location}/managed_content/#{object['active'] ? '' : 'in'}active/#{object['title'].gsub('/', '_')}.yaml"
206
+ handle_request_error(1, 'Repos', 404, { action: 'Get managed content', id: object['title'] }) unless File.exist?(path)
207
+ conversion = YAML.safe_load_file("#{@location}/managed_content/fields.yaml")
208
+ data = YAML.safe_load_file(path)
209
+ object['execution'] = {
210
+ "group_by" => (data['group_by'].nil? ? nil : conversion.detect { |c| c['name'] == data['group_by'] }['id'].to_s),
211
+ "group_order" => data['group_order'],
212
+ "sort_by" => (data['sort_by'].nil? ? nil : conversion.detect { |c| c['name'] == data['sort_by'] }['id'].to_s),
213
+ "sort_order" => data['sort_order'],
214
+ "group" => convert_group(config, data, conversion),
215
+ "sort" => convert_sort(config, data, conversion),
216
+ "columns" => convert_columns(config, data, conversion),
217
+ "fields" => convert_fields(data, conversion),
218
+ "custom_fields" => convert_custom_fields(config, data, conversion),
219
+ }
220
+ object
221
+ end
222
+
223
+ ##
224
+ # Performs conversions for a repo file using managed content
225
+ #
226
+ # @author Jason Colyer
227
+ # @since 1.0.12
228
+ def self.convert_columns(config, object, conversion)
229
+ array = []
230
+ object['fields'].each do |f|
231
+ c = conversion.detect { |c| c['name'] == f }
232
+ o = {
233
+ "id" => c['id'],
234
+ "title" => c['name'],
235
+ "type" => nil,
236
+ "url" => nil,
237
+ "filterable" => filterable?(c),
238
+ "sortable" => sortable?(c),
239
+ }
240
+ o['type'] = c['type'] if c['custom']
241
+ o['url'] = "#{config.url}/ticket_fields/#{c['id']}.json" if c['custom']
242
+ array.push(o.compact)
243
+ end
244
+ array
245
+ end
246
+
247
+ ##
248
+ # Performs conversions for a repo file using managed content
249
+ #
250
+ # @author Jason Colyer
251
+ # @since 1.0.12
252
+ def self.convert_fields(object, conversion)
253
+ array = []
254
+ object['fields'].each do |f|
255
+ c = conversion.detect { |c| c['name'] == f }
256
+ next if c['custom']
257
+ o = {
258
+ "id" => c['id'],
259
+ "title" => c['name'],
260
+ "filterable" => filterable?(c),
261
+ "sortable" => sortable?(c),
262
+ }
263
+ array.push(o)
264
+ end
265
+ array
266
+ end
267
+
268
+ ##
269
+ # Performs conversions for a repo file using managed content
270
+ #
271
+ # @author Jason Colyer
272
+ # @since 1.0.12
273
+ def self.convert_custom_fields(config, object, conversion)
274
+ array = []
275
+ object['fields'].each do |f|
276
+ c = conversion.detect { |c| c['name'] == f }
277
+ next unless c['custom']
278
+ o = {
279
+ "id" => c['id'],
280
+ "title" => c['name'],
281
+ "type" => c['type'],
282
+ "url" => "#{config.url}/ticket_fields/#{c['id']}.json",
283
+ "filterable" => filterable?(c),
284
+ "sortable" => sortable?(c)
285
+ }
286
+ array.push(o.compact)
287
+ end
288
+ array.sort_by { |a| a['id'] }
289
+ end
290
+
291
+ ##
292
+ # Performs conversions for a repo file using managed content
293
+ #
294
+ # @author Jason Colyer
295
+ # @since 1.0.12
296
+ def self.convert_sort(config, object, conversion)
297
+ return nil if object['sort_by'].nil?
298
+
299
+ c = conversion.detect { |c| c['name'] == object['sort_by'] }
300
+ sort = {
301
+ "id" => c['id'],
302
+ "title" => c['name'],
303
+ "type" => nil,
304
+ "url" => nil,
305
+ "filterable" => filterable?(c),
306
+ "sortable" => sortable?(c),
307
+ "order" => object['sort_order']
308
+ }
309
+ sort['type'] = c['type'] if c['custom']
310
+ sort['url'] = "#{config.url}/ticket_fields/#{c['id']}.json" if c['custom']
311
+ sort.compact
312
+ end
313
+
314
+ ##
315
+ # Performs conversions for a repo file using managed content
316
+ #
317
+ # @author Jason Colyer
318
+ # @since 1.0.12
319
+ def self.convert_group(config, object, conversion)
320
+ return nil if object['group_by'].nil?
321
+
322
+ c = conversion.detect { |c| c['name'] == object['group_by'] }
323
+ group = {
324
+ "id" => c['id'],
325
+ "title" => c['name'],
326
+ "type" => nil,
327
+ "url" => nil,
328
+ "filterable" => filterable?(c),
329
+ "sortable" => sortable?(c),
330
+ "order" => object['group_order']
331
+ }
332
+ group['type'] = c['type'] if c['custom']
333
+ group['url'] = "#{config.url}/ticket_fields/#{c['id']}.json" if c['custom']
334
+ group.compact
335
+ end
336
+
337
+ ##
338
+ # Performs conversions for a repo file using managed content
339
+ #
340
+ # @author Jason Colyer
341
+ # @since 1.0.12
342
+ def self.sortable?(data)
343
+ return false if data['name'] == 'Subject'
344
+
345
+ true
346
+ end
347
+
348
+ ##
349
+ # Performs conversions for a repo file using managed content
350
+ #
351
+ # @author Jason Colyer
352
+ # @since 1.0.12
353
+ def self.filterable?(data)
354
+ return false if data['name'] == 'Subject'
355
+ return false if data['name'] == 'Requested'
356
+ return false if data['type'] == 'text'
357
+
358
+ true
359
+ end
360
+ end
361
+ end
362
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the module Readiness.
4
+ module Readiness
5
+ ##
6
+ # Defines the module Repos
7
+ # @author Jason Colyer
8
+ # @since 1.0.12
9
+ module Repos
10
+ require "#{__dir__}/repos/articles"
11
+ require "#{__dir__}/repos/automations"
12
+ require "#{__dir__}/repos/groups"
13
+ require "#{__dir__}/repos/macros"
14
+ require "#{__dir__}/repos/organization_fields"
15
+ require "#{__dir__}/repos/sla_policies"
16
+ require "#{__dir__}/repos/ticket_fields"
17
+ require "#{__dir__}/repos/ticket_forms"
18
+ require "#{__dir__}/repos/triggers"
19
+ require "#{__dir__}/repos/user_fields"
20
+ require "#{__dir__}/repos/views"
21
+ end
22
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the module Readiness.
4
+ module Readiness
5
+ # Defines the module Salesforce
6
+ module Salesforce
7
+ ##
8
+ # Defines the class Accounts within the module {Readiness::Salesforce}.
9
+ #
10
+ # @author Jason Colyer
11
+ # @since 1.0.12
12
+ class Accounts < Readiness::Client
13
+ ##
14
+ # Updates an Account in Salesforce. This will exit on error
15
+ #
16
+ # @author Jason Colyer
17
+ # @since 1.0.12
18
+ # @param client [Object] An instance of {Readiness::Salesforce::Client}
19
+ # @param aid [String] The ID of the Account to update
20
+ # @param args [Various] This allows for multiple 'key: value' entries when calling the function
21
+ # @return [Boolean]
22
+ # @example
23
+ # config = Readiness::Salesforce::Configuration.new
24
+ # config.api_version = '58.0'
25
+ # config.client_id = ENV.fetch('SFDC_CLIENTID')
26
+ # config.client_secret = ENV.fetch('SFDC_CLIENTSECRET')
27
+ # config.password = ENV.fetch('SFDC_PASSWORD')
28
+ # config.security_token = ENV.fetch('SFDC_SECURITYTOKEN')
29
+ # config.username = ENV.fetch('SFDC_USERNAME')
30
+ # client = Readiness::Salesforce::Client.new(config)
31
+ # result = Readiness::Salesforce::Client.update!(client, '0016100000AYvx9', Support_Hold__c: false, Support_Instance__c: 'federal-support')
32
+ # pp result
33
+ # # => true
34
+ # result = Readiness::Salesforce::Client.update!(client, '0016100000AYvx9', Restricted_Account__c: nil)
35
+ # pp result
36
+ # # => true
37
+ def self.update!(client, aid, **args)
38
+ client.connection.update!('Account', Id: aid, **args)
39
+ true
40
+ end
41
+
42
+ ##
43
+ # Determines if a SFDC Account is US Government enabled.
44
+ #
45
+ # @author Jason Colyer
46
+ # @since 1.0.12
47
+ # @param client [Object] An instance of {Readiness::Salesforce::Client}
48
+ # @param aid [String] The ID of the Account to check
49
+ # @return [Boolean]
50
+ # @example
51
+ # config = Readiness::Salesforce::Configuration.new
52
+ # config.api_version = '58.0'
53
+ # config.client_id = ENV.fetch('SFDC_CLIENTID')
54
+ # config.client_secret = ENV.fetch('SFDC_CLIENTSECRET')
55
+ # config.password = ENV.fetch('SFDC_PASSWORD')
56
+ # config.security_token = ENV.fetch('SFDC_SECURITYTOKEN')
57
+ # config.username = ENV.fetch('SFDC_USERNAME')
58
+ # client = Readiness::Salesforce::Client.new(config)
59
+ # pp Readiness::Salesforce::Client.us_gover_enabled?(client, '0016100000AYvx9')
60
+ # # => false
61
+ def self.us_gov_enabled?(client, aid)
62
+ query = Queries.new(us_gov_check_query_string(aid))
63
+ results = Queries.run!(client, query)
64
+ return false if results.count.zero?
65
+ return false if results.first.Support_Hold__c
66
+ return false unless results.first.Restricted_Account__c.nil?
67
+ return true if results.first.Support_Instance__c == 'federal-support'
68
+
69
+ if results.first.Account_Demographics_Territory__c =~ /^PUBSEC/
70
+ if results.first.Account_Demographics_Territory__c != 'PUBSEC_'
71
+ return true unless results.first.Account_Demographics_Territory__c =~ /SLED/
72
+ end
73
+ end
74
+ false
75
+ end
76
+
77
+ ##
78
+ # Provides the String needed to make a specific type of SOQL query
79
+ #
80
+ # @author Jason Colyer
81
+ # @since 1.0.12
82
+ # @param aid [String] The ID of the Account to check
83
+ # @return [String]
84
+ def self.us_gov_check_query_string(aid)
85
+ <<~STRING
86
+ SELECT
87
+ Restricted_Account__c,
88
+ Support_Hold__c,
89
+ Support_Instance__c,
90
+ Account_Demographics_Territory__c,
91
+ (
92
+ SELECT
93
+ Id,
94
+ Name,
95
+ Zuora__ProductName__c,
96
+ Zuora__EffectiveEndDate__c,
97
+ Zuora__Quantity__c,
98
+ Zuora__TotalContractValue__c,
99
+ Subscription_Status__c
100
+ FROM Zuora__R00N40000001lGjTEAU__r
101
+ )
102
+ FROM Account
103
+ WHERE
104
+ Account_ID_18__c = '#{aid}'
105
+ STRING
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the module Readiness.
4
+ module Readiness
5
+ # Defines the module Salesforce
6
+ module Salesforce
7
+ ##
8
+ # Defines the class Cases within the module {Readiness::Salesforce}.
9
+ #
10
+ # @author Jason Colyer
11
+ # @since 1.0.12
12
+ class Cases < Readiness::Client
13
+ attr_accessor :AccountId, :Description, :Id, :OwnerId, :Priority, :RecordTypeId, :Status, :Subject, :Zendesk_Support_Ticket_ID__c, :Zendesk_Support_Ticket_Requester_Email__c, :Zendesk_Support_Ticket_URL__c
14
+
15
+ ##
16
+ # Creates a new {Readiness::Salesforce::Cases} instance
17
+ #
18
+ # @author Jason Colyer
19
+ # @since 1.0.12
20
+ # @param object [Object] An instance of {Readiness::Salesforce::Cases}
21
+ # @example
22
+ # require 'support_readiness'
23
+ # item = Readiness::Salesforce::Cases.new
24
+ def initialize(object = {})
25
+ @AccountId = object['AccountId']
26
+ @Description = object['Description']
27
+ @Id = object['Id']
28
+ @OwnerId = object['OwnerId']
29
+ @Priority = object['Priority']
30
+ @RecordTypeId = object['RecordTypeId']
31
+ @Status = object['Status']
32
+ @Subject = object['Subject']
33
+ @Zendesk_Support_Ticket_ID__c = object['Zendesk_Support_Ticket_ID__c']
34
+ @Zendesk_Support_Ticket_Requester_Email__c = object['Zendesk_Support_Ticket_Requester_Email__c']
35
+ @Zendesk_Support_Ticket_URL__c = object['Zendesk_Support_Ticket_URL__c']
36
+ end
37
+
38
+ ##
39
+ # Creates a Case in Salesforce. This will exit on error
40
+ #
41
+ # @author Jason Colyer
42
+ # @since 1.0.12
43
+ # @param client [Object] An instance of {Readiness::Salesforce::Client}
44
+ # @param object [Object] An instance of {Readiness::Salesforce::Cases}
45
+ # @return [Boolean]
46
+ # @example
47
+ # config = Readiness::Salesforce::Configuration.new
48
+ # config.api_version = '58.0'
49
+ # config.client_id = ENV.fetch('SFDC_CLIENTID')
50
+ # config.client_secret = ENV.fetch('SFDC_CLIENTSECRET')
51
+ # config.password = ENV.fetch('SFDC_PASSWORD')
52
+ # config.security_token = ENV.fetch('SFDC_SECURITYTOKEN')
53
+ # config.username = ENV.fetch('SFDC_USERNAME')
54
+ # client = Readiness::Salesforce::Client.new(config)
55
+ # item = Readiness::Salesforce::Cases.new
56
+ # item.AccountId = '001ABC123'
57
+ # item.Description = 'Test description'
58
+ # item.Id = '500ABC123'
59
+ # item.OwnerId = '0054ABC123'
60
+ # item.Priority = 'Normal'
61
+ # item.Status = 'Closed'
62
+ # item.Subject = 'Test subject'
63
+ # item.Zendesk_Support_Ticket_ID__c = '123456'
64
+ # item.Zendesk_Support_Ticket_Requester_Email__c = 'alice@example.com'
65
+ # item.Zendesk_Support_Ticket_URL__c = 'https://gitlab.zendesk.com/agent/tickets/123456'
66
+ # pp Readiness::Salesforce::Cases.update!(client, item)
67
+ # # => true
68
+ # returns case ID as String
69
+ def self.create!(client, object)
70
+ client.connection.create!('Case', to_clean_json(object))
71
+ end
72
+
73
+ ##
74
+ # Updates a Case in Salesforce. This will exit on error
75
+ #
76
+ # @author Jason Colyer
77
+ # @since 1.0.12
78
+ # @param client [Object] An instance of {Readiness::Salesforce::Client}
79
+ # @param object [Object] An instance of {Readiness::Salesforce::Cases}
80
+ # @return [Boolean]
81
+ # @example
82
+ # config = Readiness::Salesforce::Configuration.new
83
+ # config.api_version = '58.0'
84
+ # config.client_id = ENV.fetch('SFDC_CLIENTID')
85
+ # config.client_secret = ENV.fetch('SFDC_CLIENTSECRET')
86
+ # config.password = ENV.fetch('SFDC_PASSWORD')
87
+ # config.security_token = ENV.fetch('SFDC_SECURITYTOKEN')
88
+ # config.username = ENV.fetch('SFDC_USERNAME')
89
+ # client = Readiness::Salesforce::Client.new(config)
90
+ # item = Readiness::Salesforce::Cases.new
91
+ # item.AccountId = '001ABC123'
92
+ # item.Description = 'Test description'
93
+ # item.Id = '500ABC123'
94
+ # item.OwnerId = '0054ABC123'
95
+ # item.Priority = 'Normal'
96
+ # item.RecordTypeId: '012123ABC'
97
+ # item.Status = 'Closed'
98
+ # item.Subject = 'Test subject'
99
+ # item.Zendesk_Support_Ticket_ID__c = '123456'
100
+ # item.Zendesk_Support_Ticket_Requester_Email__c = 'alice@example.com'
101
+ # item.Zendesk_Support_Ticket_URL__c = 'https://gitlab.zendesk.com/agent/tickets/123456'
102
+ # pp Readiness::Salesforce::Cases.update!(client, item)
103
+ # # => true
104
+ def self.update!(client, object)
105
+ client.connection.update!('Case', to_hash(object))
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the module Readiness.
4
+ module Readiness
5
+ ##
6
+ # Defines the module Salesforce
7
+ module Salesforce
8
+ ##
9
+ # Defines the class Client within the module {Readiness::Salesforce}.
10
+ #
11
+ # @author Jason Colyer
12
+ # @since 1.0.12
13
+ class Client
14
+ attr_accessor :connection
15
+
16
+ ##
17
+ # Creates a new {Readiness::Salesforce::Client} instance
18
+ #
19
+ # @author Jason Colyer
20
+ # @since 1.0.12
21
+ # @param config [Object] An instance of {Readiness::Salesforce::Configuration}
22
+ # @example
23
+ # require 'support_readiness'
24
+ # config = Readiness::Salesforce::Configuration.new
25
+ # config.api_version = '58.0'
26
+ # config.client_id = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'
27
+ # config.client_secret = 'XYZ789'
28
+ # config.password = 'p@ssw0rd!'
29
+ # config.security_token = 'ABC123'
30
+ # config.username = 'alice@example.com'
31
+ # client = Readiness::Salesforce::Client.new(config)
32
+ def initialize(config = Readiness::Salesforce::Configuration.new)
33
+ @connection = generate_connection(config)
34
+ end
35
+
36
+ ##
37
+ # Generates a connection to Salesforce
38
+ #
39
+ # @author Jason Colyer
40
+ # @since 1.0.12
41
+ # @param config [Object] An instance of {Readiness::Salesforce::Configuration}
42
+ # @example
43
+ # require 'support_readiness'
44
+ # config = Readiness::Salesforce::Configuration.new
45
+ # config.api_version = '58.0'
46
+ # config.client_id = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'
47
+ # config.client_secret = 'XYZ789'
48
+ # config.password = 'p@ssw0rd!'
49
+ # config.security_token = 'ABC123'
50
+ # config.username = 'alice@example.com'
51
+ # connection = Readiness::Salesforce::Client.generate_connection(config)
52
+ def generate_connection(config)
53
+ Restforce.new(
54
+ api_version: config.api_version,
55
+ client_id: config.client_id,
56
+ client_secret: config.client_secret,
57
+ password: config.password,
58
+ security_token: config.security_token,
59
+ username: config.username
60
+ )
61
+ end
62
+ end
63
+ end
64
+ end