noyo 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|