noyo 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.circleci/config.yml +57 -0
- data/.codecov.yml +13 -0
- data/.gitignore +12 -0
- data/.rspec +3 -0
- data/.rubocop.yml +73 -0
- data/.ruby-version +1 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +89 -0
- data/README.md +176 -0
- data/Rakefile +6 -0
- data/bin/console +7 -0
- data/bin/setup +8 -0
- data/lib/noyo.rb +3 -0
- data/lib/noyo_accounts.rb +4 -0
- data/lib/noyo_accounts/client.rb +6 -0
- data/lib/noyo_accounts/client/services.rb +8 -0
- data/lib/noyo_accounts/client/services/auth_service.rb +45 -0
- data/lib/noyo_api.rb +6 -0
- data/lib/noyo_api/api.rb +13 -0
- data/lib/noyo_api/client.rb +9 -0
- data/lib/noyo_api/client/services.rb +8 -0
- data/lib/noyo_api/client/services/base_service.rb +37 -0
- data/lib/noyo_api/client/user_agent.rb +15 -0
- data/lib/noyo_api/client/version.rb +5 -0
- data/lib/noyo_api/configuration.rb +28 -0
- data/lib/noyo_fulfillment.rb +5 -0
- data/lib/noyo_fulfillment/api_response.rb +32 -0
- data/lib/noyo_fulfillment/models.rb +25 -0
- data/lib/noyo_fulfillment/models/api_resource.rb +191 -0
- data/lib/noyo_fulfillment/models/api_resource_collection.rb +41 -0
- data/lib/noyo_fulfillment/models/base_model.rb +115 -0
- data/lib/noyo_fulfillment/models/contact.rb +19 -0
- data/lib/noyo_fulfillment/models/demographic_change.rb +8 -0
- data/lib/noyo_fulfillment/models/dependent.rb +15 -0
- data/lib/noyo_fulfillment/models/employee.rb +108 -0
- data/lib/noyo_fulfillment/models/group.rb +25 -0
- data/lib/noyo_fulfillment/models/group_enrollment.rb +20 -0
- data/lib/noyo_fulfillment/models/group_plans.rb +15 -0
- data/lib/noyo_fulfillment/models/group_plans/add.rb +11 -0
- data/lib/noyo_fulfillment/models/group_plans/base.rb +22 -0
- data/lib/noyo_fulfillment/models/group_plans/dental.rb +13 -0
- data/lib/noyo_fulfillment/models/group_plans/life.rb +11 -0
- data/lib/noyo_fulfillment/models/group_plans/long_term_disability.rb +11 -0
- data/lib/noyo_fulfillment/models/group_plans/medical.rb +12 -0
- data/lib/noyo_fulfillment/models/group_plans/short_term_disability.rb +11 -0
- data/lib/noyo_fulfillment/models/group_plans/vision.rb +11 -0
- data/lib/noyo_fulfillment/models/individual_enrollment.rb +32 -0
- data/lib/noyo_fulfillment/models/location.rb +16 -0
- data/lib/noyo_fulfillment/models/member_request.rb +40 -0
- data/lib/noyo_fulfillment/models/member_transaction.rb +27 -0
- data/lib/noyo_fulfillment/models/mixins.rb +9 -0
- data/lib/noyo_fulfillment/models/mixins/has_person.rb +29 -0
- data/lib/noyo_fulfillment/models/mixins/nested_under.rb +64 -0
- data/lib/noyo_fulfillment/models/new_hire.rb +7 -0
- data/lib/noyo_fulfillment/models/open_enrollment.rb +7 -0
- data/lib/noyo_fulfillment/models/person.rb +18 -0
- data/lib/noyo_fulfillment/models/qualifying_life_event.rb +8 -0
- data/lib/noyo_fulfillment/models/termination.rb +9 -0
- data/noyo.gemspec +47 -0
- metadata +232 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
# Used for pluralize
|
2
|
+
require 'active_support/inflector'
|
3
|
+
require 'httparty'
|
4
|
+
|
5
|
+
module NoyoFulfillment
|
6
|
+
class ApiResourceCollection < NoyoFulfillment::BaseModel
|
7
|
+
attr_accessor :records, :page_number
|
8
|
+
|
9
|
+
delegate :map, to: :records
|
10
|
+
delegate :each, to: :records
|
11
|
+
delegate :detect, to: :records
|
12
|
+
|
13
|
+
def initialize(records, page_number = 0)
|
14
|
+
@records = records
|
15
|
+
@page_number = page_number
|
16
|
+
super(records: records, page_number: page_number)
|
17
|
+
end
|
18
|
+
|
19
|
+
def next_page
|
20
|
+
raise "Invalid number of records: #{records.size}" if !records.size.positive?
|
21
|
+
|
22
|
+
klass = records.first.class
|
23
|
+
next_page_number = page_number + 1
|
24
|
+
klass.all(next_page_number)
|
25
|
+
end
|
26
|
+
|
27
|
+
def [](key)
|
28
|
+
records[key]
|
29
|
+
end
|
30
|
+
|
31
|
+
def first
|
32
|
+
records.first
|
33
|
+
end
|
34
|
+
|
35
|
+
def size
|
36
|
+
records.size
|
37
|
+
end
|
38
|
+
alias count size
|
39
|
+
alias length size
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
module NoyoFulfillment
|
2
|
+
class BaseModel
|
3
|
+
def self.class_name
|
4
|
+
name.split('::')[-1]
|
5
|
+
end
|
6
|
+
|
7
|
+
def initialize(options = nil)
|
8
|
+
return if options.nil?
|
9
|
+
|
10
|
+
options.keys.each do |key|
|
11
|
+
if respond_to?("#{key}=")
|
12
|
+
send("#{key}=", options[key])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def inspect
|
18
|
+
string = "#<#{self.class.name}:#{object_id} "
|
19
|
+
fields = []
|
20
|
+
|
21
|
+
id_field = :@id
|
22
|
+
if instance_variables.include?(id_field)
|
23
|
+
fields << "#{id_field}: #{send(:id)}"
|
24
|
+
end
|
25
|
+
non_id_fields = instance_variables.reject{ |x| x == id_field }
|
26
|
+
fields += non_id_fields.map{ |field| "#{field}: #{send(field.to_s.tr('@', ''))}" }
|
27
|
+
string << fields.join(', ') << '>'
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
# Probably should be overriden in a subclass, if there's any excluded
|
32
|
+
# attributes from API interaction
|
33
|
+
def excluded_attributes
|
34
|
+
[ ]
|
35
|
+
end
|
36
|
+
|
37
|
+
# only those that should be imported to and exported from the API
|
38
|
+
def synced_attributes
|
39
|
+
exclusions = excluded_attributes.dup
|
40
|
+
exclusions.map!{ |item| "@#{item}".to_sym }
|
41
|
+
instance_variables - exclusions
|
42
|
+
end
|
43
|
+
|
44
|
+
# Updates this instance's variables with cooresponding ones on the updated_resource object.
|
45
|
+
# Does so deeply.
|
46
|
+
def update_attrs(updated_resource)
|
47
|
+
attributes_set = synced_attributes.to_set
|
48
|
+
attributes_set.merge(updated_resource.synced_attributes)
|
49
|
+
attributes_set.each do |var|
|
50
|
+
str = var.to_s.gsub(/^@/, '')
|
51
|
+
if !respond_to?("#{str}=") ||
|
52
|
+
!updated_resource.respond_to?(str) ||
|
53
|
+
updated_resource.send(str).nil?
|
54
|
+
next
|
55
|
+
end
|
56
|
+
|
57
|
+
the_attr = send(str)
|
58
|
+
|
59
|
+
# get deep attrs, whether or not it's a part of an array
|
60
|
+
if the_attr.respond_to?(:update_attrs)
|
61
|
+
the_attr.update_attrs(updated_resource.send(str))
|
62
|
+
else
|
63
|
+
instance_variable_set(var, updated_resource.send(str))
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Returns a hash of settable attributes, including deep hashes of children
|
69
|
+
def attributes(options = {})
|
70
|
+
attrs = {}
|
71
|
+
|
72
|
+
synced_attributes.each do |var|
|
73
|
+
attr_name_str = var.to_s.gsub(/^@/, '')
|
74
|
+
next if !respond_to?(attr_name_str)
|
75
|
+
|
76
|
+
attr_value = send(attr_name_str)
|
77
|
+
|
78
|
+
# get deep attrs, whether or not it's a part of an array
|
79
|
+
if attr_value.respond_to?(:attributes)
|
80
|
+
attr_value = attr_value.attributes(options)
|
81
|
+
end
|
82
|
+
|
83
|
+
if attr_value.is_a?(Array)
|
84
|
+
attr_value = map_nested_attr(attr_value, options)
|
85
|
+
end
|
86
|
+
|
87
|
+
if !attr_value.nil?
|
88
|
+
attrs[attr_name_str.to_sym] = attr_value
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
attrs
|
93
|
+
end
|
94
|
+
|
95
|
+
def to_h
|
96
|
+
Hash[instance_variables.map{ |var| [ var.to_s[1..-1], instance_variable_get(var) ] }]
|
97
|
+
end
|
98
|
+
|
99
|
+
def ==(other)
|
100
|
+
!other.nil? && self.class.name == other.class.name && id == other.id
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
def map_nested_attr(the_attr, options)
|
106
|
+
the_attr.map do |inner_attr|
|
107
|
+
if inner_attr.respond_to?(:attributes)
|
108
|
+
inner_attr.attributes(options)
|
109
|
+
else
|
110
|
+
inner_attr
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module NoyoFulfillment
|
2
|
+
class Contact < NoyoFulfillment::ApiResource
|
3
|
+
include NoyoFulfillment::Mixins::NestedUnder
|
4
|
+
nested_under NoyoFulfillment::Group
|
5
|
+
|
6
|
+
attr_accessor(
|
7
|
+
:id,
|
8
|
+
:version,
|
9
|
+
:group_id,
|
10
|
+
:first_name,
|
11
|
+
:last_name,
|
12
|
+
:title,
|
13
|
+
:email,
|
14
|
+
:phone_number,
|
15
|
+
:types,
|
16
|
+
:primary_contact,
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'active_support/core_ext/hash'
|
2
|
+
|
3
|
+
module NoyoFulfillment
|
4
|
+
class Dependent < NoyoFulfillment::ApiResource
|
5
|
+
include NoyoFulfillment::Mixins::HasPerson
|
6
|
+
include NoyoFulfillment::Mixins::NestedUnder
|
7
|
+
nested_under NoyoFulfillment::Employee
|
8
|
+
|
9
|
+
attr_accessor(
|
10
|
+
:id,
|
11
|
+
:relationship,
|
12
|
+
:employee_id,
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'active_support/core_ext/hash'
|
2
|
+
|
3
|
+
module NoyoFulfillment
|
4
|
+
class Employee < NoyoFulfillment::ApiResource
|
5
|
+
include NoyoFulfillment::Mixins::HasPerson
|
6
|
+
|
7
|
+
attr_accessor(
|
8
|
+
:id,
|
9
|
+
:employment,
|
10
|
+
:group_id,
|
11
|
+
:location_id,
|
12
|
+
)
|
13
|
+
|
14
|
+
def individual_enrollments
|
15
|
+
IndividualEnrollment.all(employee_id: id)
|
16
|
+
end
|
17
|
+
|
18
|
+
def check_id!
|
19
|
+
if id.nil? || id.empty?
|
20
|
+
raise 'Must have an employee ID before creating a member request. Is this employee created?'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def new_hire_request_attrs(options = {})
|
25
|
+
check_id!
|
26
|
+
|
27
|
+
body = NoyoFulfillment::NewHire.new(options).attributes
|
28
|
+
{
|
29
|
+
employee_id: id,
|
30
|
+
body: body,
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def termination_request_attrs(options = {})
|
35
|
+
check_id!
|
36
|
+
|
37
|
+
options.merge(employee_id: id)
|
38
|
+
body = NoyoFulfillment::Termination.new(options).attributes
|
39
|
+
{
|
40
|
+
employee_id: id,
|
41
|
+
body: body,
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def demographic_change_request_attrs(options = {})
|
46
|
+
check_id!
|
47
|
+
|
48
|
+
options.merge(employee_id: id)
|
49
|
+
body = NoyoFulfillment::DemographicChange.new(options).attributes
|
50
|
+
{
|
51
|
+
employee_id: id,
|
52
|
+
body: body,
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
def open_enrollment_request_attrs(options = {})
|
57
|
+
check_id!
|
58
|
+
|
59
|
+
options.merge(employee_id: id)
|
60
|
+
body = NoyoFulfillment::OpenEnrollment.new(options).attributes
|
61
|
+
{
|
62
|
+
employee_id: id,
|
63
|
+
body: body,
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
def qualifying_life_event_request_attrs(options = {})
|
68
|
+
check_id!
|
69
|
+
|
70
|
+
options.merge(employee_id: id)
|
71
|
+
body = NoyoFulfillment::QualifyingLifeEvent.new(options).attributes
|
72
|
+
{
|
73
|
+
employee_id: id,
|
74
|
+
body: body,
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
def create_new_hire_request(options = {})
|
79
|
+
member_request_attrs = new_hire_request_attrs(options)
|
80
|
+
member_request = MemberRequest.new_hire_request(member_request_attrs)
|
81
|
+
member_request.create
|
82
|
+
end
|
83
|
+
|
84
|
+
def create_termination_request(options = {})
|
85
|
+
member_request_attrs = termination_request_attrs(options)
|
86
|
+
member_request = MemberRequest.termination_request(member_request_attrs)
|
87
|
+
member_request.create
|
88
|
+
end
|
89
|
+
|
90
|
+
def create_demographic_change_request(options = {})
|
91
|
+
member_request_attrs = demographic_change_request_attrs(options)
|
92
|
+
member_request = MemberRequest.demographic_request(member_request_attrs)
|
93
|
+
member_request.create
|
94
|
+
end
|
95
|
+
|
96
|
+
def create_open_enrollment_request(options = {})
|
97
|
+
member_request_attrs = open_enrollment_request_attrs(options)
|
98
|
+
member_request = MemberRequest.open_enrollment_request(member_request_attrs)
|
99
|
+
member_request.create
|
100
|
+
end
|
101
|
+
|
102
|
+
def create_qualifying_life_event_request(options = {})
|
103
|
+
member_request_attrs = qualifying_life_event_request_attrs(options)
|
104
|
+
member_request = MemberRequest.qualifying_life_event_request(member_request_attrs)
|
105
|
+
member_request.create
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module NoyoFulfillment
|
2
|
+
class Group < NoyoFulfillment::ApiResource
|
3
|
+
attr_accessor(
|
4
|
+
:id,
|
5
|
+
:version,
|
6
|
+
:created,
|
7
|
+
:modified,
|
8
|
+
:organization_id,
|
9
|
+
:name,
|
10
|
+
:sic_code,
|
11
|
+
)
|
12
|
+
|
13
|
+
def contacts
|
14
|
+
Contact.all(group_id: id)
|
15
|
+
end
|
16
|
+
|
17
|
+
def locations
|
18
|
+
Location.all(group_id: id)
|
19
|
+
end
|
20
|
+
|
21
|
+
def group_enrollments
|
22
|
+
GroupEnrollment.all(group_id: id)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module NoyoFulfillment
|
2
|
+
class GroupEnrollment < NoyoFulfillment::ApiResource
|
3
|
+
include NoyoFulfillment::Mixins::NestedUnder
|
4
|
+
nested_under NoyoFulfillment::Group, required: false # Sometimes this is root level
|
5
|
+
|
6
|
+
attr_accessor(
|
7
|
+
:id,
|
8
|
+
:version,
|
9
|
+
:created,
|
10
|
+
:modified,
|
11
|
+
:group_id,
|
12
|
+
:carrier_id,
|
13
|
+
:line_of_coverage,
|
14
|
+
)
|
15
|
+
|
16
|
+
def plans
|
17
|
+
NoyoFulfillment::GroupPlans::Base.all(group_enrollment_id: id)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'noyo_fulfillment/models/group_plans/base'
|
2
|
+
require 'noyo_fulfillment/models/group_plans/add'
|
3
|
+
require 'noyo_fulfillment/models/group_plans/dental'
|
4
|
+
require 'noyo_fulfillment/models/group_plans/life'
|
5
|
+
require 'noyo_fulfillment/models/group_plans/long_term_disability'
|
6
|
+
require 'noyo_fulfillment/models/group_plans/medical'
|
7
|
+
require 'noyo_fulfillment/models/group_plans/short_term_disability'
|
8
|
+
require 'noyo_fulfillment/models/group_plans/vision'
|
9
|
+
|
10
|
+
module NoyoFulfillment
|
11
|
+
module Models
|
12
|
+
module GroupPlans
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module NoyoFulfillment
|
2
|
+
module GroupPlans
|
3
|
+
class Base < NoyoFulfillment::ApiResource
|
4
|
+
include NoyoFulfillment::Mixins::NestedUnder
|
5
|
+
nested_under NoyoFulfillment::GroupEnrollment
|
6
|
+
|
7
|
+
attr_accessor(
|
8
|
+
:id,
|
9
|
+
:version,
|
10
|
+
:group_enrollment_id,
|
11
|
+
:name,
|
12
|
+
:code,
|
13
|
+
:created,
|
14
|
+
:modified,
|
15
|
+
)
|
16
|
+
|
17
|
+
def self.resource_path_name
|
18
|
+
'plans'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|