peoplegroup-connectors 0.1.79 → 0.1.83

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: 385d25f529fc9ed922a8c747c4ccae2fedee02e72cdb5f22970f0286c915513b
4
- data.tar.gz: 3c6ea2c367e42dd265a9bb807fcb1d6a692a34d74e9c14eb355ce08ce6992864
3
+ metadata.gz: cca763ed8852ce618ef4c82006488515f46a562ab9ec1b286a84391dfa3c4565
4
+ data.tar.gz: 0a433378f060adb81dbfb5dc4d27260ba16c61206a6fd29d182091ed3709f6b2
5
5
  SHA512:
6
- metadata.gz: 9e6adf1ba7564a492ec135196b288f067b1402e2180aff5967c11f971fb384aeadd128da9b0b221edd42a9bdf69f64c0a080c0cd5663df69e63da9565bee239d
7
- data.tar.gz: 1f43250b83cf8108fcbf5a417632494ca5c8d530a893cac6a5e9fa3c33ceffd98d1f37a355f6bb10a2851ff123f20444ba50be7e0db6c44ea6a06fe15c38463c
6
+ metadata.gz: 2af490e0c3e0d8156ba79a8e99e0e06a04308f0bb9fd499bea7650b2067e7b5174e161f310c7825ed5cd4a2bba47cca3c1dfe63b33f661823c96492d90118955
7
+ data.tar.gz: 14ceec93579b4370fd7eb6189ce2ebba9ace211ab98798ce2841b311605c57996c4139d2ee4b76f4e3e1ed6df97c7443102bb1ab774a473ca4f08553649060d4
@@ -6,3 +6,5 @@
6
6
  bamboo_email: jporter
7
7
  - slack_email: mjacob
8
8
  bamboo_email: mgomez
9
+ - slack_email: nprecilla
10
+ bamboo_email: ngarcia
@@ -84,7 +84,7 @@ module PeopleGroup
84
84
  end
85
85
 
86
86
  def update_variable(project, key, value, **opts)
87
- retry_on_error { @client.update_variable(project, key, value, opts) }
87
+ retry_on_error { @client.update_variable(project, key, value, **opts) }
88
88
  end
89
89
 
90
90
  def find_or_create_epic(group_id, title, options = {})
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The HRIS module makes Workday responses look like BambooHR responses
4
+ module PeopleGroup
5
+ module Connectors
6
+ class Hris
7
+ EmployeeNotFoundError = Class.new(StandardError)
8
+
9
+ def initialize
10
+ @workday = Workday.new
11
+ end
12
+
13
+ def employees
14
+ @workday.workers.map { |worker| format_worker(worker) }
15
+ end
16
+
17
+ def get_employee_details(id)
18
+ employees.find { |emp| emp['id'] == id.to_s }
19
+ end
20
+ alias_method :get_team_member_details, :get_employee_details
21
+
22
+ def get_employee_details!(id)
23
+ employee_details = get_employee_details(id)
24
+ raise EmployeeNotFoundError, "No employee found with id #{id}" if employee_details.nil?
25
+
26
+ employee_details
27
+ end
28
+
29
+ def get_employee(id)
30
+ format_worker(@workday.get_worker(id))
31
+ end
32
+
33
+ def get_employee!(id)
34
+ employee = get_employee(id)
35
+ raise EmployeeNotFoundError, "No employee found with id #{id}" if employee.nil?
36
+
37
+ employee
38
+ end
39
+
40
+ private
41
+
42
+ # Convert Workday worker to BambooHR employee
43
+ def format_worker(worker)
44
+ return nil if worker.nil?
45
+
46
+ {
47
+ 'id' => worker.dig(:worker_data, :worker_id),
48
+ 'firstName' => worker.dig(:worker_data, :personal_data, :name_data, :legal_name_data, :name_detail_data, :first_name),
49
+ 'lastName' => worker.dig(:worker_data, :personal_data, :name_data, :legal_name_data, :name_detail_data, :last_name),
50
+ 'preferredName' => worker.dig(:worker_data, :personal_data, :name_data, :preferred_name_data, :name_detail_data, :first_name),
51
+ 'customPreferredLastName' => worker.dig(:worker_data, :personal_data, :name_data, :preferred_name_data, :name_detail_data, :last_name),
52
+ **format_emails(worker),
53
+ 'status' => worker.dig(:worker_data, :employment_data, :worker_status_data, :active) == '1' ? 'Active' : 'Inactive',
54
+ 'hireDate' => worker.dig(:worker_data, :employment_data, :worker_status_data, :hire_date).to_s,
55
+ 'jobTitle' => worker.dig(:worker_data, :employment_data, :worker_job_data, :position_data, :position_title)
56
+ }
57
+ end
58
+
59
+ def format_emails(worker)
60
+ formatted_emails = {
61
+ 'workEmail' => nil,
62
+ 'homeEmail' => nil
63
+ }
64
+
65
+ email_addresses = worker.dig(:worker_data, :personal_data, :contact_data, :email_address_data)
66
+
67
+ return formatted_emails if email_addresses.nil?
68
+
69
+ # If there is only one email, Workday returns a hash
70
+ # If there are more than one, Workday returns an array of hashes
71
+ # rubocop:disable Style/ArrayCoercion
72
+ email_addresses = [email_addresses] unless email_addresses.is_a?(Array)
73
+ # rubocop:enable Style/ArrayCoercion
74
+
75
+ email_addresses.each do |email_address_data|
76
+ email_type = email_address_data.dig(:usage_data, :type_data, :type_reference, :id).second
77
+ formatted_emails['workEmail'] = email_address_data[:email_address] if email_type == 'WORK'
78
+ formatted_emails['homeEmail'] = email_address_data[:email_address] if email_type == 'HOME'
79
+ end
80
+
81
+ formatted_emails
82
+ end
83
+ end
84
+ end
85
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module PeopleGroup
4
4
  module Connectors
5
- VERSION = '0.1.79'
5
+ VERSION = '0.1.83'
6
6
  end
7
7
  end
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'savon'
4
+
5
+ module PeopleGroup
6
+ module Connectors
7
+ class Workday
8
+ attr_accessor :client, :subdomain, :tenant
9
+
10
+ API_VERSION = 'v37.0'
11
+ MAX_RESULTS_PER_PAGE = 999
12
+
13
+ EmployeeNotFoundError = Class.new(StandardError)
14
+
15
+ def initialize
16
+ @subdomain = ENV['WORKDAY_SUBDOMAIN']
17
+ @tenant = ENV['WORKDAY_TENANT']
18
+ isu_username = ENV['WORKDAY_ISU_USERNAME']
19
+ isu_password = ENV['WORKDAY_ISU_PASSWORD']
20
+ soap_debug_logs_enabled = ENV['WORKDAY_SOAP_DEBUG_LOGS'].present?
21
+
22
+ @client = Savon.client(
23
+ wsdl: "https://#{@subdomain}.workday.com/ccx/service/#{@tenant}/Human_Resources/#{API_VERSION}?wsdl",
24
+ log: soap_debug_logs_enabled,
25
+ wsse_auth: ["#{isu_username}@#{@tenant}", isu_password],
26
+ pretty_print_xml: true,
27
+ convert_request_keys_to: :camelcase,
28
+ env_namespace: :env,
29
+ namespace_identifier: nil,
30
+ namespaces: {
31
+ 'xmlns' => nil,
32
+ 'xmlns:env' => 'http://schemas.xmlsoap.org/soap/envelope/',
33
+ 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
34
+ 'xmlns:wsse' => 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'
35
+ }
36
+ )
37
+ end
38
+
39
+ def workers
40
+ retry_on_error do
41
+ @workers ||= auto_paginated_call(:get_workers, { message_tag: 'wd:Get_Workers_Request', attributes: attributes })
42
+ end
43
+ end
44
+
45
+ def get_worker(id)
46
+ message = {
47
+ 'wd:Request_References' => {
48
+ 'wd:Worker_Reference' => {
49
+ 'wd:ID' => id,
50
+ attributes!: {
51
+ 'wd:ID' => {
52
+ 'wd:type' => 'Employee_ID'
53
+ }
54
+ }
55
+ }
56
+ },
57
+ attributes!: {
58
+ 'wd:Request_References' => {
59
+ 'wd:Skip_Non_Existing_Instances' => 'true',
60
+ 'wd:Ignore_Invalid_References' => 'true'
61
+ }
62
+ }
63
+ }
64
+
65
+ retry_on_error do
66
+ auto_paginated_call(:get_workers, { message_tag: 'wd:Get_Workers_Request', message: message, attributes: attributes })
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def retry_on_error(&block)
73
+ Utils.retry_on_error(errors: [Net::ReadTimeout], delay: 3, &block)
74
+ end
75
+
76
+ def auto_paginated_call(operation_name, locals = {}, &block)
77
+ data = nil
78
+ page = 1
79
+
80
+ loop do
81
+ message = locals[:message] || {}
82
+ message_with_pagination_parameters = { **message, **pagination_parameters(page) }
83
+ response = @client.call(operation_name, { **locals, message: message_with_pagination_parameters }, &block)
84
+
85
+ # The response hash contains only one key named after the operation performed
86
+ # eg. get_workers_response
87
+ _operation_response_name, operation_result = response.to_hash.first
88
+
89
+ page = operation_result.dig(:response_results, :page).to_i
90
+ total_pages = operation_result.dig(:response_results, :total_pages).to_i
91
+
92
+ # The operation data hash contains only one key named after the Workday object(s) retrieved
93
+ # eg. worker
94
+ _object_label, partial_data = operation_result[:response_data].first
95
+
96
+ if page == 1
97
+ data = partial_data
98
+ else
99
+ data.concat(partial_data)
100
+ end
101
+
102
+ break if page == total_pages
103
+
104
+ page += 1
105
+ end
106
+
107
+ data
108
+ end
109
+
110
+ def pagination_parameters(page = 1, results_per_page = MAX_RESULTS_PER_PAGE)
111
+ {
112
+ 'wd:Response_Filter' => {
113
+ 'wd:Page' => page,
114
+ 'wd:Count' => results_per_page
115
+ }
116
+ }
117
+ end
118
+
119
+ def attributes
120
+ {
121
+ 'xmlns:wd' => 'urn:com.workday/bsvc',
122
+ 'wd:version' => API_VERSION
123
+ }
124
+ end
125
+ end
126
+ end
127
+ end
@@ -7,6 +7,8 @@ require_relative 'connectors/slack'
7
7
  require_relative 'connectors/pto_roots'
8
8
  require_relative 'connectors/bamboo'
9
9
  require_relative 'connectors/greenhouse'
10
+ require_relative 'connectors/workday'
11
+ require_relative 'connectors/hris'
10
12
  require_relative 'utils'
11
13
 
12
14
  module PeopleGroup
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: peoplegroup-connectors
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.79
4
+ version: 0.1.83
5
5
  platform: ruby
6
6
  authors:
7
7
  - lien van den steen
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-25 00:00:00.000000000 Z
11
+ date: 2021-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gitlab
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '2.5'
97
+ - !ruby/object:Gem::Dependency
98
+ name: savon
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 2.12.1
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 2.12.1
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: rspec
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -179,9 +193,11 @@ files:
179
193
  - lib/peoplegroup/connectors/gitlab.rb
180
194
  - lib/peoplegroup/connectors/google_sheets.rb
181
195
  - lib/peoplegroup/connectors/greenhouse.rb
196
+ - lib/peoplegroup/connectors/hris.rb
182
197
  - lib/peoplegroup/connectors/pto_roots.rb
183
198
  - lib/peoplegroup/connectors/slack.rb
184
199
  - lib/peoplegroup/connectors/version.rb
200
+ - lib/peoplegroup/connectors/workday.rb
185
201
  - lib/peoplegroup/utils.rb
186
202
  homepage: https://gitlab.com/gitlab-com/people-group/peopleops-eng/connectors-gem
187
203
  licenses:
@@ -190,7 +206,7 @@ metadata:
190
206
  homepage_uri: https://gitlab.com/gitlab-com/people-group/peopleops-eng/connectors-gem
191
207
  source_code_uri: https://gitlab.com/gitlab-com/people-group/peopleops-eng/connectors-gem
192
208
  changelog_uri: https://gitlab.com/gitlab-com/people-group/peopleops-eng/connectors-gem
193
- post_install_message:
209
+ post_install_message:
194
210
  rdoc_options: []
195
211
  require_paths:
196
212
  - lib
@@ -205,8 +221,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
205
221
  - !ruby/object:Gem::Version
206
222
  version: '0'
207
223
  requirements: []
208
- rubygems_version: 3.1.4
209
- signing_key:
224
+ rubygems_version: 3.2.3
225
+ signing_key:
210
226
  specification_version: 4
211
227
  summary: Library for our shared connectors.
212
228
  test_files: []