gitlab_support_readiness 1.0.27 → 1.0.28

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1e0aa877d565ca7a4a041592019b2249d0d65416461b6fd98236ac8afacf801f
4
- data.tar.gz: 3cd603b24a283aa772e12f13b105012434a846e7d24febea4eb1353579547f83
3
+ metadata.gz: c5d01a922cd60d9bf388892d58416853d41b222bdde7d239ad09d30af317cdf1
4
+ data.tar.gz: 66757babab7cd3b77b87ca30241411a39b08da2992970810854a3eac4682fc1d
5
5
  SHA512:
6
- metadata.gz: 6aed7c494fa99b0590a99cafa0d75ddea51ba1a501d0e93c600ddbe308d2b42d79e31cc1fd9b38eef31abbd18beb43355b7fa0f33e766030fb3a90f60c8256f2
7
- data.tar.gz: 0cb0269cbcadbce90a9617f451e80418475e4599400c960d2ee6fb9df8a971a55263383ec4829c480460a2640743edbe164241d5e7ff4e4d2b9bd705cf0679f0
6
+ metadata.gz: e0417f8933df32fbbca9bd4f0a010e2640db67df871c68991eea905689eb2d58136a19d40b4bece974756fc296e391201d611fb974224acfb6243dc63190a0ad
7
+ data.tar.gz: 26d03850f65288ab7d90a79ad3535045dda6ebd05c8e88dc3cb184ec2eb15ba1c38903b73a455316205ced22622357ed1db7c769d1309681154b159a6530c367
@@ -0,0 +1,1079 @@
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 ZendeskSalesforceSync within the module {Readiness::Repos}.
9
+ #
10
+ # @author Jason Colyer
11
+ # @since 1.0.28
12
+ class ZendeskSalesforceSync < Readiness::Client
13
+ def self.usgov_user_sync(redis_client, zendesk_client, salesforce_client)
14
+ print 'Determining differences...'
15
+ differences = compare_usgov_users(redis_client, zendesk_client, salesforce_client, false)
16
+ puts 'done'
17
+ differences[:creates].each do |user|
18
+ print "Creating #{user.email}..."
19
+ create = Readiness::Zendesk::Users.create!(zendesk_client, user)
20
+ puts 'done'
21
+ @zd_users.push(usgov_zd_user_sync_object(create))
22
+ end
23
+ differences[:updates].each do |user|
24
+ print "Updating #{user.email}..."
25
+ update = Readiness::Zendesk::Users.update!(zendesk_client, user)
26
+ puts 'done'
27
+ index = @zd_users.index { |u| u['id'] == update.id }
28
+ @zd_users[index] = usgov_zd_user_sync_object(update) unless index.nil?
29
+ end
30
+ differences[:not_in_sfdc].each do |diff|
31
+ user = Readiness::Zendesk::Users.find!(zendesk_client, diff['id'])
32
+ print "Marking #{user.email} as not being in SFDC..."
33
+ user.user_fields['not_in_sfdc'] = true
34
+ update = Readiness::Zendesk::Users.update!(zendesk_client, user)
35
+ puts 'done'
36
+ index = @zd_users.index { |u| u['id'] == update.id }
37
+ @zd_users[index] = usgov_zd_user_sync_object(update) unless index.nil?
38
+ end
39
+ print 'Updating Redis cache...'
40
+ Readiness::Redis.set(redis_client, 'usgov_users', @zd_users)
41
+ puts 'done'
42
+ end
43
+
44
+ ##
45
+ # Perform a Zendesk-Salesforce Sync for Zendesk US Government
46
+ #
47
+ # @author Jason Colyer
48
+ # @since 1.0.28
49
+ # @param redis_client [Object] An instance of {Readiness::Redis}
50
+ # @param zendesk_client [Object] An instance of {Readiness::Zendesk::Client}
51
+ # @param salesforce_client [Object] An instance of {Readiness::Salesforce::Client}
52
+ # @example
53
+ # require 'support_readiness'
54
+ # zendesk_config = Readiness::Zendesk::Configuration.new
55
+ # zendesk_config.username = ENV.fetch('US_ZD_USERNAME')
56
+ # zendesk_config.token = ENV.fetch('US_ZD_TOKEN')
57
+ # zendesk_config.url = ENV.fetch('US_ZD_URL')
58
+ # zendesk_client = Readiness::Zendesk::Client.new(zendesk_config)
59
+ #
60
+ # sfdc_config = Readiness::Salesforce::Configuration.new
61
+ # sfdc_config.api_version = '58.0'
62
+ # sfdc_config.client_id = ENV.fetch('SFDC_CLIENTID')
63
+ # sfdc_config.client_secret = ENV.fetch('SFDC_CLIENTSECRET')
64
+ # sfdc_config.password = ENV.fetch('SFDC_PASSWORD')
65
+ # sfdc_config.security_token = ENV.fetch('SFDC_SECURITYTOKEN')
66
+ # sfdc_config.username = ENV.fetch('SFDC_USERNAME')
67
+ # sfdc_client = Readiness::Salesforce::Client.new(sfdc_config)
68
+ #
69
+ # redis_client = Readiness::Redis.new(ENV.fetch('REDIS_HOST'), ENV.fetch('REDIS_PORT'), ENV.fetch('REDIS_PASSWORD'))
70
+ #
71
+ # Readiness::Repos::ZendeskSalesforceSync.usgov_org_sync(redis_client, zendesk_client, salesforce_client)
72
+ def self.usgov_org_sync(redis_client, zendesk_client, salesforce_client)
73
+ print 'Determining differences...'
74
+ differences = compare_usgov_organizations(redis_client, zendesk_client, salesforce_client)
75
+ puts 'done'
76
+ differences[:creates].each do |org|
77
+ puts "Creating #{org.name}..."
78
+ create = Readiness::Zendesk::Organizations.create!(zendesk_client, org)
79
+ puts '- Organization created'
80
+ @organizations.push(usgov_zd_org_sync_object(create))
81
+ end
82
+ differences[:updates].each do |org|
83
+ print "Updating #{org.name}..."
84
+ update = Readiness::Zendesk::Organizations.update!(zendesk_client, org)
85
+ puts 'done'
86
+ index = @organizations.index { |o| o['id'] == update.id }
87
+ @organizations[index] = usgov_zd_org_sync_object(update) unless index.nil?
88
+ end
89
+ differences[:not_in_sfdc].each do |diff|
90
+ org = Readiness::Zendesk::Organizations.find!(zendesk_client, diff['id'])
91
+ print "Marking #{org.name} as not being in SFDC..."
92
+ org.organization_fields['not_in_sfdc'] = true
93
+ update = Readiness::Zendesk::Organizations.update!(zendesk_client, org)
94
+ puts 'done'
95
+ index = @organizations.index { |o| o['id'] == update.id }
96
+ @organizations[index] = usgov_zd_org_sync_object(update) unless index.nil?
97
+ end
98
+ print 'Updating Redis cache...'
99
+ Readiness::Redis.set(redis_client, 'usgov_organizations', @organizations)
100
+ puts 'done'
101
+ print 'Adding to Redis creation log...'
102
+ current = Readiness::Redis.get(redis_client, 'usgov_org_creations_log')
103
+ timestamp = Time.now.utc.strftime('%Y-%m-%dT%H:%MZ')
104
+ current[timestamp] = differences[:creates].map { |c| c.organization_fields['salesforce_id'] }
105
+ Readiness::Redis.set(redis_client, 'usgov_org_creations_log', current)
106
+ puts 'done'
107
+ end
108
+
109
+ ##
110
+ # Perform a Zendesk-Salesforce Sync for Zendesk Global
111
+ #
112
+ # @author Jason Colyer
113
+ # @since 1.0.28
114
+ # @param redis_client [Object] An instance of {Readiness::Redis}
115
+ # @param zendesk_client [Object] An instance of {Readiness::Zendesk::Client}
116
+ # @param salesforce_client [Object] An instance of {Readiness::Salesforce::Client}
117
+ # @param slack_client [Object] An instance of {Readiness::Slack::Client}
118
+ # @example
119
+ # require 'support_readiness'
120
+ # zendesk_config = Readiness::Zendesk::Configuration.new
121
+ # zendesk_config.username = ENV.fetch('ZD_USERNAME')
122
+ # zendesk_config.token = ENV.fetch('ZD_TOKEN')
123
+ # zendesk_config.url = ENV.fetch('ZD_URL')
124
+ # zendesk_client = Readiness::Zendesk::Client.new(zendesk_config)
125
+ #
126
+ # sfdc_config = Readiness::Salesforce::Configuration.new
127
+ # sfdc_config.api_version = '58.0'
128
+ # sfdc_config.client_id = ENV.fetch('SFDC_CLIENTID')
129
+ # sfdc_config.client_secret = ENV.fetch('SFDC_CLIENTSECRET')
130
+ # sfdc_config.password = ENV.fetch('SFDC_PASSWORD')
131
+ # sfdc_config.security_token = ENV.fetch('SFDC_SECURITYTOKEN')
132
+ # sfdc_config.username = ENV.fetch('SFDC_USERNAME')
133
+ # sfdc_client = Readiness::Salesforce::Client.new(sfdc_config)
134
+ #
135
+ # slack_config = Readiness::Slack::Configuration.new
136
+ # slack_config.url = ENV.fetch('SLACK_URL')
137
+ # slack_client = Readiness::Slack::Client.new(slack_config)
138
+ #
139
+ # redis_client = Readiness::Redis.new(ENV.fetch('REDIS_HOST'), ENV.fetch('REDIS_PORT'), ENV.fetch('REDIS_PASSWORD'))
140
+ #
141
+ # Readiness::Repos::ZendeskSalesforceSync.global_sync(redis_client, zendesk_client, salesforce_client, slack_client)
142
+ def self.global_sync(redis_client, zendesk_client, salesforce_client, slack_client)
143
+ print 'Determining differences...'
144
+ differences = compare_global_organizations(redis_client, zendesk_client, salesforce_client)
145
+ puts 'done'
146
+ differences[:creates].each do |org|
147
+ puts "Creating #{org.name}..."
148
+ create = Readiness::Zendesk::Organizations.create!(zendesk_client, org)
149
+ puts '- Organization created'
150
+ if create_global_contact?(create)
151
+ print '- Setting up contact for org...'
152
+ contact = differences[:contacts].detect { |c| ['salesforce_id'] == org.organization_fields['salesforce_id'] }
153
+ if contact.nil?
154
+ Readiness::Slack::Messages.create!(slack_client, global_slack_message(create))
155
+ puts 'error'
156
+ else
157
+ search = Readiness::Zendesk::Search..users(client, "email:#{contact['email']}")
158
+ if search.count == 1
159
+ if search.first.organization_id.nil?
160
+ user = search.first
161
+ user.organization_id = create.id
162
+ Readiness::Zendesk::Users.update!(zendesk_client, user)
163
+ puts 'done'
164
+ else
165
+ Readiness::Slack::Messages.create!(slack_client, global_slack_message(create))
166
+ puts 'error'
167
+ end
168
+ elsif search.count.zero?
169
+ user = Readiness::Zendesk::Users.new
170
+ user.email = contact['email']
171
+ user.name = contact['name']
172
+ user.organization_id = create.id
173
+ Readiness::Zendesk::Users.create!(zendesk_client, user)
174
+ puts 'done'
175
+ else
176
+ Readiness::Slack::Messages.create!(slack_client, global_slack_message(create))
177
+ puts 'error'
178
+ end
179
+ end
180
+ end
181
+ @organizations.push(global_zd_sync_object(org))
182
+ end
183
+ differences[:updates].each do |org|
184
+ print "Updating #{org.name}..."
185
+ update = Readiness::Zendesk::Organizations.update!(zendesk_client, org)
186
+ puts 'done'
187
+ index = @organizations.index { |o| o['id'] == update.id }
188
+ @organizations[index] = global_zd_sync_object(update) unless index.nil?
189
+ end
190
+ differences[:not_in_sfdc].each do |diff|
191
+ org = Readiness::Zendesk::Organizations.find!(zendesk_client, diff['id'])
192
+ print "Marking #{org.name} as not being in SFDC"
193
+ org.organization_fields['not_in_sfdc'] = true
194
+ update = Readiness::Zendesk::Organizations.update!(zendesk_client, org)
195
+ puts 'done'
196
+ index = @organizations.index { |o| o['id'] == update.id }
197
+ @organizations[index] = global_zd_sync_object(update) unless index.nil?
198
+ end
199
+ print 'Updating Redis cache...'
200
+ Readiness::Redis.set(redis_client, 'global_organizations', @organizations)
201
+ puts 'done'
202
+ print 'Adding to Redis creation log...'
203
+ current = Readiness::Redis.get(redis_client, 'global_org_creations_log')
204
+ timestamp = Time.now.utc.strftime('%Y-%m-%dT%H:%MZ')
205
+ current[timestamp] = differences[:creates].map { |c| c.organization_fields['salesforce_id'] }
206
+ Readiness::Redis.set(redis_client, 'global_org_creations_log', current)
207
+ puts 'done'
208
+ end
209
+
210
+ ##
211
+ # Determines if a support contact should be created for Zendesk Global
212
+ #
213
+ # @author Jason Colyer
214
+ # @since 1.0.28
215
+ # @param org [Object] An instance of {Readiness::Zendesk::Organizations}
216
+ # @return [Boolean]
217
+ def self.create_global_contact?(org)
218
+ return false if org.organization_fields['account_type'].downcase =~ /_partner$/
219
+ return false if org.organization_fields['partner_customer']
220
+
221
+ true
222
+ end
223
+
224
+ ##
225
+ # Generate a comparison hash for Zendesk Global
226
+ #
227
+ # @author Jason Colyer
228
+ # @since 1.0.28
229
+ # @param redis_client [Object] An instance of {Readiness::Redis}
230
+ # @param zendesk_client [Object] An instance of {Readines::Zendesk::Client}
231
+ # @param salesforce_client [Object] An instance of {Readines::Salesforce::Client}
232
+ # @param verbose [Boolean] If you want verbose output or not
233
+ # @return [Hash]
234
+ # @example
235
+ # require 'support_readiness'
236
+ # zendesk_config = Readiness::Zendesk::Configuration.new
237
+ # zendesk_config.username = ENV.fetch('ZD_USERNAME')
238
+ # zendesk_config.token = ENV.fetch('ZD_TOKEN')
239
+ # zendesk_config.url = ENV.fetch('ZD_URL')
240
+ # zendesk_client = Readiness::Zendesk::Client.new(zendesk_config)
241
+ #
242
+ # sfdc_config = Readiness::Salesforce::Configuration.new
243
+ # sfdc_config.api_version = '58.0'
244
+ # sfdc_config.client_id = ENV.fetch('SFDC_CLIENTID')
245
+ # sfdc_config.client_secret = ENV.fetch('SFDC_CLIENTSECRET')
246
+ # sfdc_config.password = ENV.fetch('SFDC_PASSWORD')
247
+ # sfdc_config.security_token = ENV.fetch('SFDC_SECURITYTOKEN')
248
+ # sfdc_config.username = ENV.fetch('SFDC_USERNAME')
249
+ # sfdc_client = Readiness::Salesforce::Client.new(sfdc_config)
250
+ #
251
+ # redis_client = Readiness::Redis.new(ENV.fetch('REDIS_HOST'), ENV.fetch('REDIS_PORT'), ENV.fetch('REDIS_PASSWORD'))
252
+ #
253
+ # diffs = Readiness::Repos::ZendeskSalesforceSync.compare_global_organizations(redis_client, zendesk_client, sfdc_client, verbose = true)
254
+ # # => Gathering from Salesforce...done
255
+ # # => Gathering Organizations...received from Redis cache.
256
+ # # => Determining differences...
257
+ # # => - Differences for 123abc45 Example Org (123456789 / 001ABC123456)
258
+ # # => - account_owner
259
+ # # => - ZD: Alice
260
+ # # => - SFDC: Bob
261
+ # # => done determining differences
262
+ # # => Determining organizations not in SFDC to tag...done
263
+ # # => Comparison report:
264
+ # # => - Organization Creates: 0
265
+ # # => - Contacts to create: 0
266
+ # # => - Organization Updates: 1
267
+ # # => - Orgs Not in SFDC to tag: 0
268
+ def self.compare_global_organizations(redis_client, zendesk_client, salesforce_client, verbose = false)
269
+ differences = {
270
+ creates: [],
271
+ updates: [],
272
+ not_in_sfdc: [],
273
+ contacts: []
274
+ }
275
+ @redis_client = redis_client
276
+ @zendesk_client = zendesk_client
277
+ @salesforce_client = salesforce_client
278
+ @verbose = verbose
279
+ @accounts = determine_global_accounts
280
+ @organizations = determine_global_organizations
281
+ puts 'Determining differences...' if @verbose
282
+ (comparable_accounts - global_comparable_orgs).each do |diff|
283
+ org = @organizations.detect { |o| o['salesforce_id'] == diff['salesforce_id'] }
284
+ if org.nil?
285
+ unless diff['greatly_expired']
286
+ puts "- Need to create #{diff['name']} (#{diff['salesforce_id']})" if @verbose
287
+ differences[:creates].push(global_org_creation_object(diff))
288
+ acc = @accounts.detect { |a| a['salesforce_id'] == diff['salesforce_id'] }
289
+ differences[:contacts].push(acc['sold_to']) unless acc.nil?
290
+ end
291
+ else
292
+ if @verbose
293
+ puts "- Differences for #{diff['name']} (#{org['id']} / #{diff['salesforce_id']})"
294
+ diff.keys.each do |k|
295
+ next if diff[k] == org[k]
296
+
297
+ puts " - #{k}"
298
+ puts " - ZD: #{org[k]}"
299
+ puts " - SFDC: #{diff[k]}"
300
+ end
301
+ end
302
+ differences[:updates].push(global_org_update_object(diff, org))
303
+ end
304
+ end
305
+ print 'Determining organizations not in SFDC to tag...' if @verbose
306
+ accounts_ids = @accounts.map { |a| a['salesforce_id'] }
307
+ differences[:not_in_sfdc] = @organizations.reject { |o| accounts_ids.include?(o['salesforce_id']) || o['not_in_sfdc'] }
308
+ puts 'done' if @verbose
309
+ global_report(differences) if @verbose
310
+ differences
311
+ end
312
+
313
+ ##
314
+ # Generate a comparison hash for Zendesk US Government organizations
315
+ #
316
+ # @author Jason Colyer
317
+ # @since 1.0.28
318
+ # @param redis_client [Object] An instance of {Readiness::Redis}
319
+ # @param zendesk_client [Object] An instance of {Readines::Zendesk::Client}
320
+ # @param salesforce_client [Object] An instance of {Readines::Salesforce::Client}
321
+ # @param verbose [Boolean] If you want verbose output or not
322
+ # @return [Hash]
323
+ # @example
324
+ # require 'support_readiness'
325
+ # zendesk_config = Readiness::Zendesk::Configuration.new
326
+ # zendesk_config.username = ENV.fetch('ZD_US_USERNAME')
327
+ # zendesk_config.token = ENV.fetch('ZD_US_TOKEN')
328
+ # zendesk_config.url = ENV.fetch('ZD_US_URL')
329
+ # zendesk_client = Readiness::Zendesk::Client.new(zendesk_config)
330
+ #
331
+ # sfdc_config = Readiness::Salesforce::Configuration.new
332
+ # sfdc_config.api_version = '58.0'
333
+ # sfdc_config.client_id = ENV.fetch('SFDC_CLIENTID')
334
+ # sfdc_config.client_secret = ENV.fetch('SFDC_CLIENTSECRET')
335
+ # sfdc_config.password = ENV.fetch('SFDC_PASSWORD')
336
+ # sfdc_config.security_token = ENV.fetch('SFDC_SECURITYTOKEN')
337
+ # sfdc_config.username = ENV.fetch('SFDC_USERNAME')
338
+ # sfdc_client = Readiness::Salesforce::Client.new(sfdc_config)
339
+ #
340
+ # redis_client = Readiness::Redis.new(ENV.fetch('REDIS_HOST'), ENV.fetch('REDIS_PORT'), ENV.fetch('REDIS_PASSWORD'))
341
+ #
342
+ # diffs = Readiness::Repos::ZendeskSalesforceSync.compare_usgov_organizations(redis_client, zendesk_client, sfdc_client, verbose = true)
343
+ # # => Gathering from Salesforce...done
344
+ # # => Gathering Organizations...received from Redis cache.
345
+ # # => Determining differences...
346
+ # # => - Differences for 123abc45 Example Org (123456789 / 001ABC123456)
347
+ # # => - account_owner
348
+ # # => - ZD: Alice
349
+ # # => - SFDC: Bob
350
+ # # => done determining differences
351
+ # # => Determining organizations not in SFDC to tag...done
352
+ # # => Comparison report:
353
+ # # => - Organizations
354
+ # # => - Creates: 0
355
+ # # => - Updates: 1
356
+ # # => - Not in SFDC to tag: 0
357
+ def self.compare_usgov_organizations(redis_client, zendesk_client, salesforce_client, verbose = false)
358
+ differences = {
359
+ creates: [],
360
+ updates: [],
361
+ not_in_sfdc: []
362
+ }
363
+ @redis_client = redis_client
364
+ @zendesk_client = zendesk_client
365
+ @salesforce_client = salesforce_client
366
+ @verbose = verbose
367
+ @accounts = determine_usgov_accounts
368
+ @organizations = determine_usgov_organizations
369
+ puts 'Determining differences...' if @verbose
370
+ (comparable_accounts - usgov_comparable_orgs).each do |diff|
371
+ org = @organizations.detect { |o| o['salesforce_id'] == diff['salesforce_id'] }
372
+ if org.nil?
373
+ unless diff['greatly_expired']
374
+ puts "- Need to create #{diff['name']} (#{diff['salesforce_id']})" if @verbose
375
+ differences[:creates].push(usgov_org_creation_object(diff))
376
+ acc = @accounts.detect { |a| a['salesforce_id'] == diff['salesforce_id'] }
377
+ differences[:contacts].push(acc['sold_to']) unless acc.nil?
378
+ end
379
+ else
380
+ if @verbose
381
+ puts "- Differences for #{diff['name']} (#{org['id']} / #{diff['salesforce_id']})"
382
+ diff.keys.each do |k|
383
+ next if diff[k] == org[k]
384
+
385
+ puts " - #{k}"
386
+ puts " - ZD: #{org[k]}"
387
+ puts " - SFDC: #{diff[k]}"
388
+ end
389
+ end
390
+ differences[:updates].push(usgov_org_update_object(diff, org))
391
+ end
392
+ end
393
+ print 'Determining organizations not in SFDC to tag...' if @verbose
394
+ accounts_ids = @accounts.map { |a| a['salesforce_id'] }
395
+ differences[:not_in_sfdc] = @organizations.reject { |o| accounts_ids.include?(o['salesforce_id']) || o['not_in_sfdc'] }
396
+ puts 'done' if @verbose
397
+ usgov_org_report(differences) if @verbose
398
+ differences
399
+ end
400
+
401
+ ##
402
+ # Generate a comparison hash for Zendesk US Government users
403
+ #
404
+ # @author Jason Colyer
405
+ # @since 1.0.28
406
+ # @param redis_client [Object] An instance of {Readiness::Redis}
407
+ # @param zendesk_client [Object] An instance of {Readines::Zendesk::Client}
408
+ # @param salesforce_client [Object] An instance of {Readines::Salesforce::Client}
409
+ # @param verbose [Boolean] If you want verbose output or not
410
+ # @return [Hash]
411
+ # @example
412
+ # require 'support_readiness'
413
+ # zendesk_config = Readiness::Zendesk::Configuration.new
414
+ # zendesk_config.username = ENV.fetch('ZD_US_USERNAME')
415
+ # zendesk_config.token = ENV.fetch('ZD_US_TOKEN')
416
+ # zendesk_config.url = ENV.fetch('ZD_US_URL')
417
+ # zendesk_client = Readiness::Zendesk::Client.new(zendesk_config)
418
+ #
419
+ # sfdc_config = Readiness::Salesforce::Configuration.new
420
+ # sfdc_config.api_version = '58.0'
421
+ # sfdc_config.client_id = ENV.fetch('SFDC_CLIENTID')
422
+ # sfdc_config.client_secret = ENV.fetch('SFDC_CLIENTSECRET')
423
+ # sfdc_config.password = ENV.fetch('SFDC_PASSWORD')
424
+ # sfdc_config.security_token = ENV.fetch('SFDC_SECURITYTOKEN')
425
+ # sfdc_config.username = ENV.fetch('SFDC_USERNAME')
426
+ # sfdc_client = Readiness::Salesforce::Client.new(sfdc_config)
427
+ #
428
+ # redis_client = Readiness::Redis.new(ENV.fetch('REDIS_HOST'), ENV.fetch('REDIS_PORT'), ENV.fetch('REDIS_PASSWORD'))
429
+ #
430
+ # diffs = Readiness::Repos::ZendeskSalesforceSync.compare_usgov_users(redis_client, zendesk_client, sfdc_client, verbose = true)
431
+ # # => Gathering from Salesforce...done
432
+ # # => Gathering Users...received from Redis cache.
433
+ # # => Determining differences...
434
+ # # => - Differences for alice@example.com (123456789)
435
+ # # => - name
436
+ # # => - ZD: Alice
437
+ # # => - SFDC: Alice Example
438
+ # # => done determining differences
439
+ # # => Determining organizations not in SFDC to tag...done
440
+ # # => Comparison report:
441
+ # # => - Users
442
+ # # => - Creates: 0
443
+ # # => - Updates: 1
444
+ # # => - Not in SFDC to tag: 0
445
+ def self.compare_usgov_users(redis_client, zendesk_client, salesforce_client, verbose = false)
446
+ differences = {
447
+ creates: [],
448
+ updates: [],
449
+ not_in_sfdc: []
450
+ }
451
+ @redis_client = redis_client
452
+ @zendesk_client = zendesk_client
453
+ @salesforce_client = salesforce_client
454
+ @verbose = verbose
455
+ @organizations = determine_usgov_organizations
456
+ @zd_users = determine_usgov_users
457
+ @contacts = determine_usgov_contacts
458
+ puts 'Determining differences...' if @verbose
459
+ (@contacts - usgov_comparable_users).each do |diff|
460
+ user = @zd_users.detect { |u| u['email'] == diff['email'] }
461
+ if user.nil?
462
+ puts "- Need to create #{diff['email']} (#{diff['name']})" if @verbose
463
+ differences[:creates].push(usgov_user_creation_object(diff))
464
+ else
465
+ if @verbose
466
+ puts "- Differences for #{diff['email']} (#{user['id']})"
467
+ diff.keys.each do |k|
468
+ next if diff[k] == user[k]
469
+
470
+ puts " - #{k}"
471
+ puts " - ZD: #{user[k]}"
472
+ puts " - SFDC: #{diff[k]}"
473
+ end
474
+ end
475
+ differences[:updates].push(usgov_user_update_object(diff, user))
476
+ end
477
+ end
478
+ differences[:creates].compact!
479
+ differences[:updates].compact!
480
+ print 'Determining users not in SFDC to tag...' if @verbose
481
+ emails = @contacts.map { |c| c['email'].downcase.strip }
482
+ differences[:not_in_sfdc] = @zd_users.reject { |u| usgov_exclude_from_tagging(u, emails) }
483
+ puts 'done' if @verbose
484
+ usgov_user_report(differences) if @verbose
485
+ differences
486
+ end
487
+
488
+ def self.usgov_exclude_from_tagging(user, emails)
489
+ return true if emails.include? user['email']
490
+ return true if user['not_in_sfdc']
491
+
492
+ false
493
+ end
494
+
495
+ ##
496
+ # Print a comparison report for Zendesk Global
497
+ #
498
+ # @author Jason Colyer
499
+ # @since 1.0.28
500
+ # @param differences [Hash]
501
+ def self.global_report(differences)
502
+ puts 'Comparison report:'
503
+ puts "- Organization Creates: #{differences[:creates].count}"
504
+ puts " - Contacts to create: #{differences[:contacts].count}"
505
+ puts "- Organization Updates: #{differences[:updates].count}"
506
+ puts "- Orgs Not in SFDC to tag: #{differences[:not_in_sfdc].count}"
507
+ end
508
+
509
+ ##
510
+ # Print a organization comparison report for Zendesk US Government
511
+ #
512
+ # @author Jason Colyer
513
+ # @since 1.0.28
514
+ # @param differences [Hash]
515
+ def self.usgov_org_report(differences)
516
+ puts 'Comparison report:'
517
+ puts '- Organizations'
518
+ puts " - Creates: #{differences[:creates].count}"
519
+ puts " - Updates: #{differences[:updates].count}"
520
+ puts " - Not in SFDC to tag: #{differences[:not_in_sfdc].count}"
521
+ end
522
+
523
+ ##
524
+ # Print an user comparison report for Zendesk US Government
525
+ #
526
+ # @author Jason Colyer
527
+ # @since 1.0.28
528
+ # @param differences [Hash]
529
+ def self.usgov_user_report(differences)
530
+ puts 'Comparison report:'
531
+ puts '- Users'
532
+ puts " - Creates: #{differences[:creates].count}"
533
+ puts " - Updates: #{differences[:updates].count}"
534
+ puts " - Not in SFDC to tag: #{differences[:not_in_sfdc].count}"
535
+ end
536
+
537
+ ##
538
+ # Gather SFDC Accounts for Zendesk Global
539
+ #
540
+ # @author Jason Colyer
541
+ # @since 1.0.28
542
+ # @return [Array]
543
+ def self.determine_global_accounts
544
+ print 'Gathering from Salesforce...' if @verbose
545
+ accs = Readiness::Salesforce::Accounts.global_accounts(@salesforce_client)
546
+ puts 'done' if @verbose
547
+ accs
548
+ end
549
+
550
+ ##
551
+ # Gather SFDC Accounts for Zendesk US Government
552
+ #
553
+ # @author Jason Colyer
554
+ # @since 1.0.28
555
+ # @return [Array]
556
+ def self.determine_usgov_accounts
557
+ print 'Gathering from Salesforce...' if @verbose
558
+ accs = Readiness::Salesforce::Accounts.usgov_accounts(@salesforce_client)
559
+ puts 'done' if @verbose
560
+ accs
561
+ end
562
+
563
+ ##
564
+ # Gather SFDC Contacts for Zendesk US Government
565
+ #
566
+ # @author Jason Colyer
567
+ # @since 1.0.28
568
+ # @return [Array]
569
+ def self.determine_usgov_contacts
570
+ print 'Gathering from Salesforce...' if @verbose
571
+ users = Readiness::Salesforce::Contacts.usgov_contacts(@salesforce_client)
572
+ puts 'done' if @verbose
573
+ users
574
+ end
575
+
576
+ ##
577
+ # Gather Zendesk Global organizations, either from Redis or Zendesk
578
+ #
579
+ # @author Jason Colyer
580
+ # @since 1.0.28
581
+ # @return [Array]
582
+ def self.determine_global_organizations
583
+ print 'Gathering Organizations...' if @verbose
584
+ orgs = Readiness::Redis.get(@redis_client, 'global_organizations')
585
+ unless orgs.nil?
586
+ puts 'received from Redis cache.' if @verbose
587
+ return orgs
588
+ end
589
+ print 'needing to gather from Zendesk...' if @verbose
590
+ orgs = Readiness::Zendesk::Organizations.list_many(@zendesk_client)
591
+ puts 'done' if @verbose
592
+ orgs.map { |o| global_zd_sync_object(o) }
593
+ end
594
+
595
+ ##
596
+ # Gather Zendesk US Government organizations, either from Redis or Zendesk
597
+ #
598
+ # @author Jason Colyer
599
+ # @since 1.0.28
600
+ # @return [Array]
601
+ def self.determine_usgov_organizations
602
+ print 'Gathering Organizations...' if @verbose
603
+ orgs = Readiness::Redis.get(@redis_client, 'usgov_organizations')
604
+ unless orgs.nil?
605
+ puts 'received from Redis cache.' if @verbose
606
+ return orgs
607
+ end
608
+ print 'needing to gather from Zendesk...' if @verbose
609
+ orgs = Readiness::Zendesk::Organizations.list_many(@zendesk_client)
610
+ puts 'done' if @verbose
611
+ orgs.map { |o| usgov_zd_org_sync_object(o) }
612
+ end
613
+
614
+ ##
615
+ # Gather Zendesk US Government users, either from Redis or Zendesk
616
+ #
617
+ # @author Jason Colyer
618
+ # @since 1.0.28
619
+ # @return [Array]
620
+ def self.determine_usgov_users
621
+ print 'Gathering Users...' if @verbose
622
+ users = Readiness::Redis.get(@redis_client, 'usgov_users')
623
+ unless users.nil?
624
+ puts 'received from Redis cache.' if @verbose
625
+ return users
626
+ end
627
+ print 'needing to gather from Zendesk...' if @verbose
628
+ users = Readiness::Zendesk::Users.list_many(@zendesk_client, 0, false, ['end-user'])
629
+ puts 'done' if @verbose
630
+ users.map { |u| usgov_zd_user_sync_object(u) }.compact
631
+ end
632
+
633
+ ##
634
+ # Create a comparable account object
635
+ #
636
+ # @author Jason Colyer
637
+ # @since 1.0.28
638
+ # @param org [Hash]
639
+ # @return [Hash]
640
+ def self.comparable_accounts
641
+ new_accounts = Marshal.load(Marshal.dump(@accounts))
642
+ new_accounts.map { |a| a.delete('sold_to') }
643
+ new_accounts
644
+ end
645
+
646
+ ##
647
+ # Modify Zendesk Global organizations into a comparable Array
648
+ #
649
+ # @author Jason Colyer
650
+ # @since 1.0.28
651
+ # @return [Array]
652
+ def self.global_comparable_orgs
653
+ new_orgs = Marshal.load(Marshal.dump(@organizations))
654
+ new_orgs.map { |zd| global_comparable_org(zd) }
655
+ end
656
+
657
+ ##
658
+ # Modify Zendesk US Government organizations into a comparable Array
659
+ #
660
+ # @author Jason Colyer
661
+ # @since 1.0.28
662
+ # @return [Array]
663
+ def self.usgov_comparable_orgs
664
+ new_orgs = Marshal.load(Marshal.dump(@organizations))
665
+ new_orgs.map { |zd| usgov_comparable_org(zd) }
666
+ end
667
+
668
+ ##
669
+ # Modify Zendesk US Government users into a comparable Array
670
+ #
671
+ # @author Jason Colyer
672
+ # @since 1.0.28
673
+ # @return [Array]
674
+ def self.usgov_comparable_users
675
+ new_users = Marshal.load(Marshal.dump(@zd_users))
676
+ new_users.map { |zd| usgov_comparable_user(zd) }
677
+ end
678
+
679
+ ##
680
+ # Create a comparable org object for Zendesk Global
681
+ #
682
+ # @author Jason Colyer
683
+ # @since 1.0.28
684
+ # @param org [Hash]
685
+ # @return [Hash]
686
+ def self.global_comparable_org(org)
687
+ zd = org.dup
688
+ zd.delete('id')
689
+ zd['aar'] = zd['aar'].to_f
690
+ zd['seats_decimal'] = zd['seats_decimal'].to_f
691
+ zd
692
+ end
693
+
694
+ ##
695
+ # Create a comparable org object for Zendesk US Government
696
+ #
697
+ # @author Jason Colyer
698
+ # @since 1.0.28
699
+ # @param org [Hash]
700
+ # @return [Hash]
701
+ def self.usgov_comparable_org(org)
702
+ zd = org.dup
703
+ zd.delete('id')
704
+ zd['arr'] = zd['arr'].to_f
705
+ zd['number_of_seats'] = zd['number_of_seats'].to_f
706
+ zd
707
+ end
708
+
709
+ ##
710
+ # Create a comparable user object for Zendesk US Government
711
+ #
712
+ # @author Jason Colyer
713
+ # @since 1.0.28
714
+ # @param org [Hash]
715
+ # @return [Hash]
716
+ def self.usgov_comparable_user(user)
717
+ zd = user.dup
718
+ zd.delete('id')
719
+ zd.delete('org_id')
720
+ zd
721
+ end
722
+
723
+ ##
724
+ # Generate a sync object from Zendesk Global information for comparison purposes
725
+ #
726
+ # @author Jason Colyer
727
+ # @since 1.0.28
728
+ # @param org [Object] An instance of {Readiness::Zendesk::Organizations}
729
+ # @return [Hash]
730
+ def self.global_zd_sync_object(org)
731
+ {
732
+ 'id' => org.id,
733
+ 'name' => org.name,
734
+ 'salesforce_id' => org.organization_fields['salesforce_id'],
735
+ 'sfdc_short_id' => org.organization_fields['sfdc_short_id'],
736
+ 'support_level' => org.organization_fields['support_level'],
737
+ 'aar' => org.organization_fields['aar'],
738
+ 'sales_segmentation' => org.organization_fields['sales_segmentation'],
739
+ 'account_owner' => org.organization_fields['account_owner'],
740
+ 'type' => org.organization_fields['account_type'],
741
+ 'technical_account_manager' => org.organization_fields['technical_account_manager'],
742
+ 'solutions_architect' => org.organization_fields['solutions_architect'],
743
+ 'seats_decimal' => org.organization_fields['seats_decimal'],
744
+ 'org_region' => org.organization_fields['org_region'],
745
+ 'health_score' => org.organization_fields['health_score'],
746
+ 'expiration_date' => org.organization_fields['expiration_date'],
747
+ 'restricted_account' => org.organization_fields['restricted_account'],
748
+ 'greatly_expired' => org.organization_fields['greatly_expired'],
749
+ 'sub_consumption_ai' => org.organization_fields['sub_consumption_ai'],
750
+ 'sub_consumption_cicd_minutes' => org.organization_fields['sub_consumption_cicd_minutes'],
751
+ 'sub_consumption_eap' => org.organization_fields['sub_consumption_eap'],
752
+ 'sub_consumption_storage' => org.organization_fields['sub_consumption_storage'],
753
+ 'sub_proserv' => org.organization_fields['sub_proserv'],
754
+ 'sub_dotcom_premium' => org.organization_fields['sub_dotcom_premium'],
755
+ 'sub_dotcom_ultimate' => org.organization_fields['sub_dotcom_ultimate'],
756
+ 'sub_sm_starter' => org.organization_fields['sub_sm_starter'],
757
+ 'sub_sm_premium' => org.organization_fields['sub_sm_premium'],
758
+ 'sub_sm_ultimate' => org.organization_fields['sub_sm_ultimate'],
759
+ 'sub_usgov_12x5' => org.organization_fields['sub_usgov_12x5'],
760
+ 'sub_usgov_24x7' => org.organization_fields['sub_usgov_24x7'],
761
+ 'sub_gitlab_dedicated' => org.organization_fields['sub_gitlab_dedicated'],
762
+ 'sub_edu' => org.organization_fields['sub_edu'],
763
+ 'sub_oss' => org.organization_fields['sub_oss'],
764
+ 'sub_community_other' => org.organization_fields['sub_community_other'],
765
+ 'sub_ss_ase' => org.organization_fields['sub_ss_ase'],
766
+ 'sub_other' => org.organization_fields['sub_other'],
767
+ 'partner_customer' => org.organization_fields['partner_customer'],
768
+ 'not_in_sfdc' => org.organization_fields['not_in_sfdc'],
769
+ 'support_hold' => org.organization_fields['support_hold']
770
+ }
771
+ end
772
+
773
+ ##
774
+ # Generate a sync object from Zendesk US Government organization information for comparison purposes
775
+ #
776
+ # @author Jason Colyer
777
+ # @since 1.0.28
778
+ # @param org [Object] An instance of {Readiness::Zendesk::Organizations}
779
+ # @return [Hash]
780
+ def self.usgov_zd_org_sync_object(org)
781
+ {
782
+ 'id' => org.id,
783
+ 'name' => org.name,
784
+ 'salesforce_id' => org.organization_fields['salesforce_id'],
785
+ 'sfdc_short_id' => org.organization_fields['sfdc_short_id'],
786
+ 'support_level' => org.organization_fields['support_level'],
787
+ 'arr' => org.organization_fields['arr'],
788
+ 'market_segment' => org.organization_fields['market_segment'],
789
+ 'account_owner' => org.organization_fields['account_owner'],
790
+ 'type' => org.organization_fields['account_type'],
791
+ 'technical_account_manager' => org.organization_fields['technical_account_manager'],
792
+ 'solutions_architect' => org.organization_fields['solutions_architect'],
793
+ 'number_of_seats' => org.organization_fields['number_of_seats'],
794
+ 'health_score' => org.organization_fields['health_score'],
795
+ 'expiration_date' => org.organization_fields['expiration_date'],
796
+ 'restricted_account' => org.organization_fields['restricted_account'],
797
+ 'greatly_expired' => org.organization_fields['greatly_expired'],
798
+ 'emergency_support_24x7' => org.organization_fields['emergency_support_24x7'],
799
+ 'sub_consumption_ai' => org.organization_fields['sub_consumption_ai'],
800
+ 'sub_consumption_cicd_minutes' => org.organization_fields['sub_consumption_cicd_minutes'],
801
+ 'sub_consumption_eap' => org.organization_fields['sub_consumption_eap'],
802
+ 'sub_consumption_storage' => org.organization_fields['sub_consumption_storage'],
803
+ 'sub_proserv' => org.organization_fields['sub_proserv'],
804
+ 'sub_dotcom_premium' => org.organization_fields['sub_dotcom_premium'],
805
+ 'sub_dotcom_ultimate' => org.organization_fields['sub_dotcom_ultimate'],
806
+ 'sub_sm_starter' => org.organization_fields['sub_sm_starter'],
807
+ 'sub_sm_premium' => org.organization_fields['sub_sm_premium'],
808
+ 'sub_sm_ultimate' => org.organization_fields['sub_sm_ultimate'],
809
+ 'sub_usgov_12x5' => org.organization_fields['sub_usgov_12x5'],
810
+ 'sub_usgov_24x7' => org.organization_fields['sub_usgov_24x7'],
811
+ 'sub_gitlab_dedicated' => org.organization_fields['sub_gitlab_dedicated'],
812
+ 'sub_edu' => org.organization_fields['sub_edu'],
813
+ 'sub_oss' => org.organization_fields['sub_oss'],
814
+ 'sub_community_other' => org.organization_fields['sub_community_other'],
815
+ 'sub_ss_ase' => org.organization_fields['sub_ss_ase'],
816
+ 'sub_other' => org.organization_fields['sub_other'],
817
+ 'not_in_sfdc' => org.organization_fields['not_in_sfdc'],
818
+ 'support_hold' => org.organization_fields['support_hold']
819
+ }
820
+ end
821
+
822
+ ##
823
+ # Generate a sync object from Zendesk US Government user information for comparison purposes
824
+ #
825
+ # @author Jason Colyer
826
+ # @since 1.0.28
827
+ # @param user [Object] An instance of {Readiness::Zendesk::Users}
828
+ # @return [Hash]
829
+ def self.usgov_zd_user_sync_object(user)
830
+ return nil if user.email =~ /gitlab.com$/
831
+
832
+ org = locate_org_from_user(user)
833
+ if org.nil?
834
+ return {
835
+ "id" => user.id,
836
+ "name" => user.name,
837
+ "email" => user.email,
838
+ "org" => nil,
839
+ "org_id" => nil,
840
+ "salesforce_id" => nil,
841
+ "not_in_sfdc" => user.user_fields['not_in_sfdc']
842
+ }
843
+ end
844
+ {
845
+ "id" => user.id,
846
+ "name" => user.name,
847
+ "email" => user.email,
848
+ "org" => (org.is_a?(Hash) ? org['name'] : org.name),
849
+ "org_id" => user.organization_id,
850
+ "salesforce_id" => (org.is_a?(Hash) ? org['salesforce_id'] : org.organization_fields['salesforce_id']),
851
+ "not_in_sfdc" => user.user_fields['not_in_sfdc']
852
+ }
853
+ end
854
+
855
+ ##
856
+ # Locate a Zendesk organization either via the Redis values or from Zendesk
857
+ #
858
+ # @author Jason Colyer
859
+ # @since 1.0.28
860
+ # @param oid [Integer] The organization ID
861
+ def self.locate_org_from_user(user)
862
+ return nil if user.organization_id.nil?
863
+
864
+ detect = @organizations.detect { |o| o['id'] == user.organization_id }
865
+ return detect unless detect.nil?
866
+
867
+ Readiness::Zendesk::Organizations.find!(@zendesk_client, user.organization_id)
868
+ end
869
+
870
+ ##
871
+ # Create an instance of {Readiness::Zendesk::Organizations} for Zendesk Global creation purposes
872
+ #
873
+ # @author Jason Colyer
874
+ # @since 1.0.28
875
+ # @param account [Hash]
876
+ # @return [Object]
877
+ def self.global_org_creation_object(account)
878
+ org = Readiness::Zendesk::Organizations.new
879
+ org.name = account['name']
880
+ org.organization_fields = global_custom_fields_from_account(account)
881
+ org
882
+ end
883
+
884
+ ##
885
+ # Create an instance of {Readiness::Zendesk::Organizations} for Zendesk US Government creation purposes
886
+ #
887
+ # @author Jason Colyer
888
+ # @since 1.0.28
889
+ # @param account [Hash]
890
+ # @return [Object]
891
+ def self.usgov_org_creation_object(account)
892
+ org = Readiness::Zendesk::Organizations.new
893
+ org.name = account['name']
894
+ org.organization_fields = usgov_custom_fields_from_account(account)
895
+ org
896
+ end
897
+
898
+ ##
899
+ # Create an instance of {Readiness::Zendesk::Users} for Zendesk US Government creation purposes
900
+ #
901
+ # @author Jason Colyer
902
+ # @since 1.0.28
903
+ # @param contact [Hash]
904
+ # @return [Object]
905
+ def self.usgov_user_creation_object(contact)
906
+ org = @organizations.detect { |o| o['salesforce_id'] == contact['salesforce_id'] }
907
+ return nil if org.nil?
908
+
909
+ user = Readiness::Zendesk::Users.new
910
+ user.email = contact['email']
911
+ user.name = contact['name']
912
+ user.organization_id = org['id']
913
+ user
914
+ end
915
+
916
+ ##
917
+ # Create an instance of {Readiness::Zendesk::Organizations} for Zendesk Global update purposes
918
+ #
919
+ # @author Jason Colyer
920
+ # @since 1.0.28
921
+ # @param account [Hash]
922
+ # @param organization [Hash]
923
+ # @return [Object]
924
+ def self.global_org_update_object(account, organization)
925
+ org = Readiness::Zendesk::Organizations.find!(@zendesk_client, organization['id'])
926
+ org.name = account['name']
927
+ org.organization_fields = global_custom_fields_from_account(account)
928
+ org
929
+ end
930
+
931
+ ##
932
+ # Create an instance of {Readiness::Zendesk::Organizations} for Zendesk US Government update purposes
933
+ #
934
+ # @author Jason Colyer
935
+ # @since 1.0.28
936
+ # @param account [Hash]
937
+ # @param organization [Hash]
938
+ # @return [Object]
939
+ def self.usgov_org_update_object(account, organization)
940
+ org = Readiness::Zendesk::Organizations.find!(@zendesk_client, organization['id'])
941
+ org.name = account['name']
942
+ org.organization_fields = usgov_custom_fields_from_account(account)
943
+ org
944
+ end
945
+
946
+ ##
947
+ # Create an instance of {Readiness::Zendesk::Users} for Zendesk US Government update purposes
948
+ #
949
+ # @author Jason Colyer
950
+ # @since 1.0.28
951
+ # @param contact [Hash]
952
+ # @param user [Hash]
953
+ # @return [Object]
954
+ def self.usgov_user_update_object(contact, zd_user)
955
+ user = Readiness::Zendesk::Users.find!(@zendesk_client, zd_user['id'])
956
+ org = @organizations.detect { |o| o['salesforce_id'] == contact['salesforce_id'] }
957
+ return nil if org.nil?
958
+
959
+ user.email = contact['email']
960
+ user.name = contact['name']
961
+ user.organization_id = org['id']
962
+ user.user_fields['not_in_sfdc'] = contact['not_in_sfdc']
963
+ user
964
+ end
965
+
966
+ ##
967
+ # Translate SFDC account information into the custom field s Hash for Zendesk Global information
968
+ #
969
+ # @author Jason Colyer
970
+ # @since 1.0.28
971
+ # @param acc [Hash]
972
+ # @return [Hash]
973
+ def self.global_custom_fields_from_account(account)
974
+ {
975
+ 'aar' => account['aar'],
976
+ 'account_owner' => account['account_owner'],
977
+ 'account_type' => account['type'],
978
+ 'expiration_date' => account['expiration_date'],
979
+ 'greatly_expired' => account['greatly_expired'],
980
+ 'health_score' => account['health_score'],
981
+ 'not_in_sfdc' => account['not_in_sfdc'],
982
+ 'org_region' => account['org_region'],
983
+ 'partner_customer' => account['partner_customer'],
984
+ 'restricted_account' => account['restricted_account'],
985
+ 'salesforce_id' => account['salesforce_id'],
986
+ 'sales_segmentation' => account['sales_segmentation'],
987
+ 'seats_decimal' => account['seats_decimal'],
988
+ 'sfdc_short_id' => account['sfdc_short_id'],
989
+ 'solutions_architect' => account['solutions_architect'],
990
+ 'sub_community_other' => account['sub_community_other'],
991
+ 'sub_consumption_ai' => account['sub_consumption_ai'],
992
+ 'sub_consumption_cicd_minutes' => account['sub_consumption_cicd_minutes'],
993
+ 'sub_consumption_eap' => account['sub_consumption_eap'],
994
+ 'sub_consumption_storage' => account['sub_consumption_storage'],
995
+ 'sub_dotcom_premium' => account['sub_dotcom_premium'],
996
+ 'sub_dotcom_ultimate' => account['sub_dotcom_ultimate'],
997
+ 'sub_edu' => account['sub_edu'],
998
+ 'sub_gitlab_dedicated' => account['sub_gitlab_dedicated'],
999
+ 'sub_oss' => account['sub_oss'],
1000
+ 'sub_other' => account['sub_other'],
1001
+ 'sub_proserv' => account['sub_proserv'],
1002
+ 'sub_sm_premium' => account['sub_sm_premium'],
1003
+ 'sub_sm_starter' => account['sub_sm_starter'],
1004
+ 'sub_sm_ultimate' => account['sub_sm_ultimate'],
1005
+ 'sub_ss_ase' => account['sub_ss_ase'],
1006
+ 'sub_usgov_12x5' => account['sub_usgov_12x5'],
1007
+ 'sub_usgov_24x7' => account['sub_usgov_24x7'],
1008
+ 'support_hold' => account['support_hold'],
1009
+ 'support_level' => account['support_level'],
1010
+ 'technical_account_manager' => account['technical_account_manager']
1011
+ }
1012
+ end
1013
+
1014
+ ##
1015
+ # Translate SFDC account information into the custom field s Hash for Zendesk Global information
1016
+ #
1017
+ # @author Jason Colyer
1018
+ # @since 1.0.28
1019
+ # @param acc [Hash]
1020
+ # @return [Hash]
1021
+ def self.usgov_custom_fields_from_account(account)
1022
+ {
1023
+ 'arr' => account['arr'],
1024
+ 'account_owner' => account['account_owner'],
1025
+ 'account_type' => account['type'],
1026
+ 'emergency_support_24x7' => account['emergency_support_24x7'],
1027
+ 'expiration_date' => account['expiration_date'],
1028
+ 'greatly_expired' => account['greatly_expired'],
1029
+ 'health_score' => account['health_score'],
1030
+ 'not_in_sfdc' => account['not_in_sfdc'],
1031
+ 'restricted_account' => account['restricted_account'],
1032
+ 'salesforce_id' => account['salesforce_id'],
1033
+ 'sales_segmentation' => account['sales_segmentation'],
1034
+ 'number_of_seats' => account['number_of_seats'].to_i,
1035
+ 'sfdc_short_id' => account['sfdc_short_id'],
1036
+ 'solutions_architect' => account['solutions_architect'],
1037
+ 'sub_community_other' => account['sub_community_other'],
1038
+ 'sub_consumption_ai' => account['sub_consumption_ai'],
1039
+ 'sub_consumption_cicd_minutes' => account['sub_consumption_cicd_minutes'],
1040
+ 'sub_consumption_eap' => account['sub_consumption_eap'],
1041
+ 'sub_consumption_storage' => account['sub_consumption_storage'],
1042
+ 'sub_dotcom_premium' => account['sub_dotcom_premium'],
1043
+ 'sub_dotcom_ultimate' => account['sub_dotcom_ultimate'],
1044
+ 'sub_edu' => account['sub_edu'],
1045
+ 'sub_gitlab_dedicated' => account['sub_gitlab_dedicated'],
1046
+ 'sub_oss' => account['sub_oss'],
1047
+ 'sub_other' => account['sub_other'],
1048
+ 'sub_proserv' => account['sub_proserv'],
1049
+ 'sub_sm_premium' => account['sub_sm_premium'],
1050
+ 'sub_sm_starter' => account['sub_sm_starter'],
1051
+ 'sub_sm_ultimate' => account['sub_sm_ultimate'],
1052
+ 'sub_ss_ase' => account['sub_ss_ase'],
1053
+ 'sub_usgov_12x5' => account['sub_usgov_12x5'],
1054
+ 'sub_usgov_24x7' => account['sub_usgov_24x7'],
1055
+ 'support_hold' => account['support_hold'],
1056
+ 'support_level' => account['support_level'],
1057
+ 'technical_account_manager' => account['technical_account_manager']
1058
+ }
1059
+ end
1060
+
1061
+ def self.sfdc_links(sfdc_id)
1062
+ [
1063
+ "<https://gitlab.my.salesforce.com/#{sfdc_id}|Classic>",
1064
+ "<https://gitlab.lightning.force.com/lightning/r/Account/#{sfdc_id}/view|Lightning>"
1065
+ ].join(' | ')
1066
+ end
1067
+
1068
+ def self.global_slack_message(org)
1069
+ <<~STRING
1070
+ :double-exclaimation: Attention Support Readiness! :double-exclaimation:
1071
+
1072
+ An organization (<https://gitlab.zendesk.com/agent/organizations/{#org.id}|#{org.id}>) was created for SFDC account #{org.organization_fields['salesforce_id']} (#{sfdc_links(org.organization_fields['salesforce_id'])}) but it had no corresponsing contacts.
1073
+
1074
+ Please investigate this manually. If you are able to locate a contact to use for the created organization, please add/associate them manually.
1075
+ STRING
1076
+ end
1077
+ end
1078
+ end
1079
+ end
@@ -19,5 +19,6 @@ module Readiness
19
19
  require "#{__dir__}/repos/triggers"
20
20
  require "#{__dir__}/repos/user_fields"
21
21
  require "#{__dir__}/repos/views"
22
+ require "#{__dir__}/repos/zendesk_salesforce_sync"
22
23
  end
23
24
  end
@@ -202,6 +202,7 @@ module Readiness
202
202
  "expiration_date" => expiration,
203
203
  "restricted_account" => (account.Restricted_Account__c == 'Restricted Party'),
204
204
  "greatly_expired" => (partner ? false : Date.parse(expiration) <= Date.today.years_ago(3)),
205
+ "emergency_support_24x7" => subscriptions.include?('sub_usgov_24x7'),
205
206
  "sub_consumption_ai" => subscriptions.include?('sub_consumption_ai'),
206
207
  "sub_consumption_cicd_minutes" => subscriptions.include?('sub_consumption_cicd_minutes'),
207
208
  "sub_consumption_eap" => subscriptions.include?('sub_consumption_eap'),
@@ -364,6 +365,7 @@ module Readiness
364
365
  def self.account_is_partner_customer?(account, type)
365
366
  return false if account.Latest_Sold_To_Contact__r.nil?
366
367
  return false if type != 'customer'
368
+ return false if account.Account_ID_18__c == '0016100000g04oWAAQ'
367
369
  return true if account.Latest_Sold_To_Contact__r.Email == 'ecopo@us.ibm.com'
368
370
 
369
371
  false
@@ -64,6 +64,7 @@ module Readiness
64
64
  Name,
65
65
  Email,
66
66
  Account.Account_ID_18__c,
67
+ Account.Type,
67
68
  Account.Name,
68
69
  Role__c
69
70
  FROM Contact
@@ -75,6 +76,7 @@ module Readiness
75
76
  (
76
77
  NOT Email LIKE '%gitlab.com'
77
78
  ) AND
79
+ Account.Type IN ('Customer', 'Former Customer') AND
78
80
  (
79
81
  (
80
82
  Account.Account_Demographics_Territory__c LIKE 'PUBSEC%' AND
@@ -600,7 +600,11 @@ module Readiness
600
600
  'Self-Managed - Success Plan Services - 1 Year',
601
601
  'Self-Managed - Success Plan Services - 2 Year',
602
602
  'Self-Managed - Success Plan Services - 3 Year',
603
- 'Self-Managed - Success Plan Services - Monthly'
603
+ 'Self-Managed - Success Plan Services - Monthly',
604
+ 'Success Essentials - Monthly',
605
+ 'Success Essentials - 3 Year',
606
+ 'Success Essentials - 2 Year',
607
+ 'Success Essentials - 1 Year'
604
608
  ]
605
609
  end
606
610
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab_support_readiness
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.27
4
+ version: 1.0.28
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Colyer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-22 00:00:00.000000000 Z
11
+ date: 2024-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -284,6 +284,7 @@ files:
284
284
  - lib/support_readiness/repos/triggers.rb
285
285
  - lib/support_readiness/repos/user_fields.rb
286
286
  - lib/support_readiness/repos/views.rb
287
+ - lib/support_readiness/repos/zendesk_salesforce_sync.rb
287
288
  - lib/support_readiness/salesforce.rb
288
289
  - lib/support_readiness/salesforce/accounts.rb
289
290
  - lib/support_readiness/salesforce/cases.rb