change_health 0.10.0 → 0.15.0

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: e8173937050afec203ed5a5caa16d4f4f692b74c0c4e73ce3a2b1688e09c8347
4
- data.tar.gz: 6a06f31bdb81ac01808138026049b98b699a1196979788baba791234d87fdb61
3
+ metadata.gz: 23b7246464a9cee50b55cda5e50f5f39360f12ab3185bead7d17d1138b7be6d6
4
+ data.tar.gz: 4642b90b2cea31a84180093211abba8017fb690a53077e8b563f52fc153eeb00
5
5
  SHA512:
6
- metadata.gz: e9d975e4e0086910b68d995cf29ff74c9dd94698c61b8607aa829a58aaa5e56d0f526565d7c4eff9cd7d379c1870b45e0e0491cb321d8624ceb37ba4ed6a2060
7
- data.tar.gz: 1a52136f240f4a689627f99e36b60477542312bd49c1fc37388ebbeccbc7755b615ff8f48ee317a4485a578e0e764ed0700d37eea4bb3a9b72da08bbcb94ff43
6
+ metadata.gz: 0cdcd134c67d6e935da27de8db74a3371368477d2548cd9252ca5d6b1ee62d6469a6db473f0454cf457564513d6bb2570a4af1bc438d1ea0995a81b019d6ff5f
7
+ data.tar.gz: 9bdbc8f2cc8373896c07c614ea954f43a7684ddfa9e95d13842055158b86c16bee6871111e212b400c5a9f8f65739f35c1a8d988cbc9c2dc960441fb5c6a3713
@@ -4,6 +4,43 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
5
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.15.0] - [2020-06-12]
8
+ ### Added
9
+ - Extensions - InNetworkMissing for plans that don't provide in network indicators.
10
+
11
+ ### Fixed
12
+ - Bug where active codes with no service codes cause exception.
13
+
14
+ ## [0.14.0] - [2020-05-07]
15
+ ### Added
16
+ - Extensions - mixins for common overrides
17
+
18
+ ## [0.13.0] - [2020-05-05]
19
+ ### Changed
20
+ - Removed `alias_method` for `where` helpers so you can override a single method
21
+ - Added type Year to Date type 24
22
+ - Added type Day type 7
23
+
24
+ ## [0.12.0] - [2020-04-30]
25
+ ### Added
26
+ - EligibilityData#errors
27
+ - EligibilityData#errors?
28
+
29
+ ## [0.11.0] - [2020-04-24]
30
+ ### Added
31
+ - EligibilityData#medicare?
32
+ - EligibilityData#plan\_id
33
+ - EligibilityData#plan?
34
+ - EligibilityBenefits#where\_not
35
+ - EligibilityBenefits#+
36
+ - EligibilityBenefit#additional\_info
37
+ - EligibilityBenefit#descriptions
38
+
39
+ ### Changed
40
+ - EligibilityData initialize now checks for sub-classes of EligibilityBenefits with trading partner
41
+ - EligibilityData initialize now checks for sub-classes of EligibilityBenefits with trading partner responds to `factory` to choose sub-class
42
+ - EligibilityBenefits initializes `self.class` type in case it's a subclass
43
+
7
44
  ## [0.10.0] - [2020-04-09]
8
45
  ### Added
9
46
  - Add Trading Partner API querying capability
@@ -74,6 +111,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
74
111
  - Authentication
75
112
  - Configuration
76
113
 
114
+ [0.15.0]: https://github.com/WeInfuse/change_health/compare/v0.14.0...v0.15.0
115
+ [0.14.0]: https://github.com/WeInfuse/change_health/compare/v0.13.0...v0.14.0
116
+ [0.13.0]: https://github.com/WeInfuse/change_health/compare/v0.12.0...v0.13.0
117
+ [0.12.0]: https://github.com/WeInfuse/change_health/compare/v0.11.0...v0.12.0
118
+ [0.11.0]: https://github.com/WeInfuse/change_health/compare/v0.10.0...v0.11.0
77
119
  [0.10.0]: https://github.com/WeInfuse/change_health/compare/v0.9.0...v0.10.0
78
120
  [0.9.0]: https://github.com/WeInfuse/change_health/compare/v0.8.0...v0.9.0
79
121
  [0.8.0]: https://github.com/WeInfuse/change_health/compare/v0.7.0...v0.8.0
@@ -4,6 +4,7 @@ require 'change_health/version'
4
4
  require 'change_health/change_health_exception'
5
5
  require 'change_health/connection'
6
6
  require 'change_health/authentication'
7
+ require 'change_health/extensions'
7
8
  require 'change_health/models/model'
8
9
  require 'change_health/models/eligibility'
9
10
  require 'change_health/models/eligibility_data'
@@ -0,0 +1,39 @@
1
+ module ChangeHealth
2
+ module Extensions
3
+ module InNetworkW
4
+ def in_network
5
+ self.where(inPlanNetworkIndicatorCode: 'Y') + self.where(inPlanNetworkIndicatorCode: 'W')
6
+ end
7
+ end
8
+
9
+ module InNetworkMissing
10
+ def in_network
11
+ self.where_not(inPlanNetworkIndicatorCode: 'N')
12
+ end
13
+ end
14
+
15
+ module DeductiblesIgnoreSpecialistZero
16
+ def deductibles
17
+ super.where_not(serviceTypeCodes: '98', benefitAmount: '0')
18
+ end
19
+ end
20
+
21
+ module CopaymentsIgnoreSpecialistZero
22
+ def copayments
23
+ super.where_not(serviceTypeCodes: '98', benefitAmount: '0')
24
+ end
25
+ end
26
+
27
+ module CoinsurancesIgnoreSpecialistZero
28
+ def coinsurances
29
+ super.where_not(serviceTypeCodes: '98', benefitPercent: '0')
30
+ end
31
+ end
32
+
33
+ module IndividualsAllNonFamily
34
+ def individuals
35
+ self.where_not(coverageLevelCode: 'FAM')
36
+ end
37
+ end
38
+ end
39
+ end
@@ -14,10 +14,14 @@ module ChangeHealth
14
14
  CHILD = 'CHD'
15
15
  EMPLOYEE = 'EMP'
16
16
  FAMILY = 'FAM'
17
- EMPLOYEE_AND_CHILD = 'ECH'
17
+ EMPLOYEE_AND_CHILD = 'ECH'
18
+ EMPLOYEE_AND_SPOUSE = 'ESP'
18
19
 
19
20
  VISIT = '27'
21
+ SERVICE_YEAR = '22'
20
22
  YEAR = '23'
23
+ YTD = '24'
24
+ DAY = '7'
21
25
  REMAINING = '29'
22
26
 
23
27
  CODES = {
@@ -32,7 +36,8 @@ module ChangeHealth
32
36
  child: CHILD,
33
37
  employee: EMPLOYEE,
34
38
  family: FAMILY,
35
- employee_and_child: EMPLOYEE_AND_CHILD
39
+ employee_and_child: EMPLOYEE_AND_CHILD,
40
+ employee_and_spouse: EMPLOYEE_AND_SPOUSE
36
41
  }
37
42
  TIMEFRAMES = {
38
43
  visit: VISIT,
@@ -68,7 +73,7 @@ module ChangeHealth
68
73
  end
69
74
  end
70
75
 
71
- %w(insuranceType insuranceTypeCode benefitsDateInformation).each do |method|
76
+ %w(insuranceType insuranceTypeCode benefitsDateInformation additionalInformation).each do |method|
72
77
  define_method("#{method}") do
73
78
  self[method]
74
79
  end
@@ -76,6 +81,13 @@ module ChangeHealth
76
81
  alias_method :date_info, :benefitsDateInformation
77
82
  alias_method :insurance_type, :insuranceType
78
83
  alias_method :insurance_type_code, :insuranceTypeCode
84
+ alias_method :additional_info, :additionalInformation
85
+
86
+ def descriptions
87
+ data = self.additionalInformation || []
88
+
89
+ data.map {|info| info['description'] }.compact
90
+ end
79
91
 
80
92
  def in_plan_network?
81
93
  return 'Y' == self[:inPlanNetworkIndicatorCode] || self[:inPlanNetworkIndicatorCode].nil? && self.medicare?
@@ -6,7 +6,15 @@ module ChangeHealth
6
6
  end
7
7
 
8
8
  def where(**kwargs)
9
- EligibilityBenefits.new(self.select {|benefit| kwargs.all? {|k,v| benefit_matches?(benefit, k, v) } })
9
+ self.class.new(self.select {|benefit| kwargs.all? {|k,v| benefit_matches?(benefit, k, v) } })
10
+ end
11
+
12
+ def where_not(**kwargs)
13
+ self.class.new(self.reject {|benefit| kwargs.all? {|k,v| benefit_matches?(benefit, k, v) } })
14
+ end
15
+
16
+ def +(other_obj)
17
+ self.class.new(self.to_a + other_obj.to_a)
10
18
  end
11
19
 
12
20
  def find_by(**kwargs)
@@ -25,27 +33,49 @@ module ChangeHealth
25
33
  end
26
34
  end
27
35
 
28
- def individual_coinsurance_visit(**kwargs)
29
- self.individual.coinsurances.visits.where(kwargs).first
30
- end
31
-
32
36
  %w(family individual employee child employee_and_child).each do |method|
33
- alias_method method, "#{method}s"
37
+ define_method(method) do
38
+ self.send("#{method}s")
39
+ end
40
+
41
+ %w(copayment coinsurance).each do |type_mod|
42
+ method_name = "#{method}_#{type_mod}"
34
43
 
35
- %w(copayment deductible out_of_pocket).each do |type_mod|
36
- %w(year remaining visit).each do |time_mod|
44
+ define_method(method_name) do |**kwargs|
45
+ self.send(method).send("#{type_mod}s").where(kwargs).first
46
+ end
47
+
48
+ if ('copayment' == type_mod)
49
+ define_method(method_name.gsub('copayment', 'copay')) do |**kwargs|
50
+ self.send(method_name, kwargs)
51
+ end
52
+ end
53
+ end
54
+
55
+ %w(deductible out_of_pocket).each do |type_mod|
56
+ %w(year remaining).each do |time_mod|
37
57
  method_name = "#{method}_#{type_mod}_#{time_mod}"
38
- alias_name = method_name.gsub('copayment', 'copay').gsub('out_of_pocket', 'oop')
39
58
 
40
59
  define_method(method_name) do |**kwargs|
41
60
  self.send(method).send("#{type_mod}s").send("#{time_mod}s").where(kwargs).first || self.send(method).send("#{type_mod}s").where(kwargs).first
42
61
  end
43
62
 
44
- alias_method alias_name, method_name if alias_name != method_name
63
+ if ('out_of_pocket' == type_mod)
64
+ define_method(method_name.gsub('out_of_pocket', 'oop')) do |**kwargs|
65
+ self.send(method_name, kwargs)
66
+ end
67
+
68
+ if ('year' == time_mod)
69
+ define_method(method_name.gsub('out_of_pocket', 'oop').gsub('year', 'total')) do |**kwargs|
70
+ self.send(method_name, kwargs)
71
+ end
72
+ end
73
+ end
45
74
 
46
- if method_name.include?('year')
47
- alias_method method_name.gsub('year', 'total'), method_name
48
- alias_method alias_name.gsub('year', 'total'), method_name
75
+ if ('year' == time_mod)
76
+ define_method(method_name.gsub('year', 'total')) do |**kwargs|
77
+ self.send(method_name, kwargs)
78
+ end
49
79
  end
50
80
  end
51
81
  end
@@ -28,7 +28,15 @@ module ChangeHealth
28
28
  return '1' == plan_status(service_code: service_code).dig('statusCode')
29
29
  end
30
30
 
31
- %w(planStatus benefitsInformation controlNumber planDateInformation).each do |v|
31
+ def errors?
32
+ self.errors.is_a?(Array) && false == self.errors.empty?
33
+ end
34
+
35
+ def dependents?
36
+ true == self.dependents&.any?
37
+ end
38
+
39
+ %w(planStatus benefitsInformation controlNumber planDateInformation dependents errors).each do |v|
32
40
  define_method(v) do
33
41
  @raw.dig(v)
34
42
  end
@@ -56,17 +64,40 @@ module ChangeHealth
56
64
  ChangeHealth::Models::EligibilityData::PARSE_DATE.call(self.plan_date_range[1])
57
65
  end
58
66
 
59
-
60
67
  def plan_status(service_code: )
61
- self.planStatus&.find {|plan| plan.dig('serviceTypeCodes').include?(service_code) } || {}
68
+ self.planStatus&.find {|plan| plan.dig('serviceTypeCodes')&.include?(service_code) } || {}
62
69
  end
63
70
 
64
71
  def benefits
65
- ChangeHealth::Models::EligibilityBenefits.new(self.benefitsInformation || [])
72
+ kname = "ChangeHealth::Models::EligibilityBenefits#{self.trading_partner_id&.upcase}"
73
+ klazz = Object.const_get(kname) if Module.const_defined?(kname)
74
+ klazz ||= ChangeHealth::Models::EligibilityBenefits
75
+
76
+ if klazz.respond_to?(:factory)
77
+ klazz = klazz.factory(self)
78
+ end
79
+
80
+ klazz.new(self.benefitsInformation || [])
81
+ end
82
+
83
+ def medicare?(**kwargs)
84
+ false == benefits.empty? && benefits.where(kwargs).all? {|b| b.medicare? }
85
+ end
86
+
87
+ def plan?(name)
88
+ self.plan_names.any? {|pname| name == pname }
89
+ end
90
+
91
+ def plan_names
92
+ self.planStatus&.map {|plan_status| plan_status['planDetails'] }&.compact || []
93
+ end
94
+
95
+ def trading_partner?(name)
96
+ self.trading_partner_id == name
66
97
  end
67
98
 
68
- def medicare?
69
- false == benefits.empty? && benefits.all? {|b| b.medicare? }
99
+ def trading_partner_id
100
+ @raw['tradingPartnerServiceId']
70
101
  end
71
102
 
72
103
  alias_method :control_number, :controlNumber
@@ -1,3 +1,3 @@
1
1
  module ChangeHealth
2
- VERSION = '0.10.0'.freeze
2
+ VERSION = '0.15.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: change_health
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Crockett
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-09 00:00:00.000000000 Z
11
+ date: 2020-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -146,6 +146,7 @@ files:
146
146
  - lib/change_health/authentication.rb
147
147
  - lib/change_health/change_health_exception.rb
148
148
  - lib/change_health/connection.rb
149
+ - lib/change_health/extensions.rb
149
150
  - lib/change_health/models/eligibility.rb
150
151
  - lib/change_health/models/eligibility_benefit.rb
151
152
  - lib/change_health/models/eligibility_benefits.rb