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 +4 -4
- data/data/email_mapper.yml +2 -0
- data/lib/peoplegroup/connectors/gitlab.rb +1 -1
- data/lib/peoplegroup/connectors/hris.rb +85 -0
- data/lib/peoplegroup/connectors/version.rb +1 -1
- data/lib/peoplegroup/connectors/workday.rb +127 -0
- data/lib/peoplegroup/connectors.rb +2 -0
- metadata +22 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cca763ed8852ce618ef4c82006488515f46a562ab9ec1b286a84391dfa3c4565
|
4
|
+
data.tar.gz: 0a433378f060adb81dbfb5dc4d27260ba16c61206a6fd29d182091ed3709f6b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2af490e0c3e0d8156ba79a8e99e0e06a04308f0bb9fd499bea7650b2067e7b5174e161f310c7825ed5cd4a2bba47cca3c1dfe63b33f661823c96492d90118955
|
7
|
+
data.tar.gz: 14ceec93579b4370fd7eb6189ce2ebba9ace211ab98798ce2841b311605c57996c4139d2ee4b76f4e3e1ed6df97c7443102bb1ab774a473ca4f08553649060d4
|
data/data/email_mapper.yml
CHANGED
@@ -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
|
@@ -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.
|
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-
|
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.
|
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: []
|