peoplegroup-connectors 0.1.80 → 0.1.84

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: 1657c1be5b83e1b2d1f0a1e84a3c624a5ab0a83c3225501c3f4d07e38ac7f8c4
4
- data.tar.gz: b5a16f29f83019c45e384cbb82b3cf97f67d6684b113073d870ea9d6d3ce4e85
3
+ metadata.gz: d7b209e2b46bd29b7be1271663fd28481fbe7daacbef93cb3aa03b8dc347fbd3
4
+ data.tar.gz: 6b706bf6f0832fe48e0c1ef6f87930df6cab343283eda0278107d5de4f17a97c
5
5
  SHA512:
6
- metadata.gz: cbf02b91924e3bad79e6bcbcd03f9894e41cf28d7778d0e0086f0c9b5e319c880f8cd7b9e1a62fbf0f6f003d79826d352fb238cea291a1968a72bb2983fcabc0
7
- data.tar.gz: 4a51bfe8a81f8ebd01c3ed80b5ca638a1a7488634a77c48e8cd50c5459d20c80d4a1232a2843f6e2313b18ddaa4b125209330f04900429ce3bedb85e1adee7aa
6
+ metadata.gz: 227ca7a129132f47d14dfaea54126658f4f387fa108f7e6cc518f95f27f49467e146e453e6e2c8c5975034b1a0cc60718347b6f40fe64c2e8a0f880b1cb9468b
7
+ data.tar.gz: 4e391bac4beb51a6342b660ded941cace9a32a48ad2924c1b1ab176aeab663d33b464d7efb06393d559455f97c0edfb387a5299696776dafb12e855744991b78
@@ -1,7 +1,5 @@
1
1
  - slack_email: cristiano
2
2
  bamboo_email: ccasella
3
- - slack_email: kencjohnston
4
- bamboo_email: kjohnston
5
3
  - slack_email: jmeshell
6
4
  bamboo_email: jporter
7
5
  - slack_email: mjacob
@@ -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.80'
5
+ VERSION = '0.1.84'
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.80
4
+ version: 0.1.84
5
5
  platform: ruby
6
6
  authors:
7
7
  - lien van den steen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-11 00:00:00.000000000 Z
11
+ date: 2022-01-19 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: