change_health 0.11.0 → 1.0.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: 767cc901793797d00ab0ad05891f50875a58cc4e872a0a40f6c5624c458c2187
4
- data.tar.gz: f8e2abe6dc0bdd724dfa36c0fbaa793ef693380d1e92bee62c883c0f1d807262
3
+ metadata.gz: e3aefe8f92bcd2320ffd7cf26a436144b7a76b5e90d6d3f56377b37d0278a705
4
+ data.tar.gz: 25d4efc4c61e6356408d9df77fb9daecc93aadd10d687c0fcce530f51ea3fe30
5
5
  SHA512:
6
- metadata.gz: 6b4f26498031de59b118145015e3219712f2cb9d80e1aa671ac0cff4708db92406b7a234c9c885584bb1bab7ae6fe2011e868a4c554c51992028699966db5add
7
- data.tar.gz: 279f7b1032b48d196e72614ffd41c79519026b9dac34c83d8413806e48f115c915442259783e6db0399e7bbe8b5f7e3345fb2186015bad653c5a7789bd1d3039
6
+ metadata.gz: 892a5e89e6204506c34eeb696ef52717441e3a15e9cc0c64461af2ec9fe5203ff884a8ff9919ebff0c4a4d13330d7ecbb9600d727514ab53a1f066f7f55204d6
7
+ data.tar.gz: 2b05c1ba8a94cf1d9a299476b8faf673ae3ab8f41337913159a068e724e3bbf37db57803e1e674b7fb065dc6fc7169f2d8abf2f72ef5348b4a7dffe7ad354b6a
data/CHANGELOG.md CHANGED
@@ -4,7 +4,35 @@ 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.11.0] - [2020-04-23]
7
+ ## [1.0.0] - [2021-03-17]
8
+ ### Added
9
+ - Model::Error - help with error codes
10
+ - EligibilityData#recommend_retry? - if it looks like you can retry the exact same request
11
+ - EligibilityData#inactive? - looks for plan status 6
12
+
13
+ ## [0.15.0] - [2020-06-12]
14
+ ### Added
15
+ - Extensions - InNetworkMissing for plans that don't provide in network indicators.
16
+
17
+ ### Fixed
18
+ - Bug where active codes with no service codes cause exception.
19
+
20
+ ## [0.14.0] - [2020-05-07]
21
+ ### Added
22
+ - Extensions - mixins for common overrides
23
+
24
+ ## [0.13.0] - [2020-05-05]
25
+ ### Changed
26
+ - Removed `alias_method` for `where` helpers so you can override a single method
27
+ - Added type Year to Date type 24
28
+ - Added type Day type 7
29
+
30
+ ## [0.12.0] - [2020-04-30]
31
+ ### Added
32
+ - EligibilityData#errors
33
+ - EligibilityData#errors?
34
+
35
+ ## [0.11.0] - [2020-04-24]
8
36
  ### Added
9
37
  - EligibilityData#medicare?
10
38
  - EligibilityData#plan\_id
@@ -89,6 +117,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
89
117
  - Authentication
90
118
  - Configuration
91
119
 
120
+ [0.15.0]: https://github.com/WeInfuse/change_health/compare/v0.14.0...v0.15.0
121
+ [0.14.0]: https://github.com/WeInfuse/change_health/compare/v0.13.0...v0.14.0
122
+ [0.13.0]: https://github.com/WeInfuse/change_health/compare/v0.12.0...v0.13.0
123
+ [0.12.0]: https://github.com/WeInfuse/change_health/compare/v0.11.0...v0.12.0
92
124
  [0.11.0]: https://github.com/WeInfuse/change_health/compare/v0.10.0...v0.11.0
93
125
  [0.10.0]: https://github.com/WeInfuse/change_health/compare/v0.9.0...v0.10.0
94
126
  [0.9.0]: https://github.com/WeInfuse/change_health/compare/v0.8.0...v0.9.0
data/lib/change_health.rb CHANGED
@@ -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
@@ -18,7 +18,10 @@ module ChangeHealth
18
18
  EMPLOYEE_AND_SPOUSE = 'ESP'
19
19
 
20
20
  VISIT = '27'
21
+ SERVICE_YEAR = '22'
21
22
  YEAR = '23'
23
+ YTD = '24'
24
+ DAY = '7'
22
25
  REMAINING = '29'
23
26
 
24
27
  CODES = {
@@ -34,33 +34,48 @@ module ChangeHealth
34
34
  end
35
35
 
36
36
  %w(family individual employee child employee_and_child).each do |method|
37
- alias_method method, "#{method}s"
37
+ define_method(method) do
38
+ self.send("#{method}s")
39
+ end
38
40
 
39
41
  %w(copayment coinsurance).each do |type_mod|
40
42
  method_name = "#{method}_#{type_mod}"
41
- alias_name = method_name.gsub('copayment', 'copay')
42
43
 
43
44
  define_method(method_name) do |**kwargs|
44
45
  self.send(method).send("#{type_mod}s").where(kwargs).first
45
46
  end
46
47
 
47
- alias_method alias_name, method_name if alias_name != method_name
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
48
53
  end
49
54
 
50
55
  %w(deductible out_of_pocket).each do |type_mod|
51
56
  %w(year remaining).each do |time_mod|
52
57
  method_name = "#{method}_#{type_mod}_#{time_mod}"
53
- alias_name = method_name.gsub('out_of_pocket', 'oop')
54
58
 
55
59
  define_method(method_name) do |**kwargs|
56
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
57
61
  end
58
62
 
59
- 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
60
74
 
61
- if method_name.include?('year')
62
- alias_method method_name.gsub('year', 'total'), method_name
63
- 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
64
79
  end
65
80
  end
66
81
  end
@@ -1,8 +1,55 @@
1
1
  module ChangeHealth
2
2
  module Models
3
+ class Error
4
+ attr_reader :data
5
+
6
+ SIMPLE_RETRY_CODES = %w[
7
+ 42
8
+ 80
9
+ ].freeze
10
+
11
+ NO_RESUBMIT_MESSAGES = %w[
12
+ resubmission not allowed
13
+ do not resubmit
14
+ ].freeze
15
+
16
+ def initialize(data)
17
+ @data = data
18
+ end
19
+
20
+ def message
21
+ field_message || code_message
22
+ end
23
+
24
+ def field_message
25
+ "#{field}: #{description}" if field?
26
+ end
27
+
28
+ def code_message
29
+ "#{code}: #{description}" if code?
30
+ end
31
+
32
+ def retryable?
33
+ code? && SIMPLE_RETRY_CODES.include?(code) && followupAction? && NO_RESUBMIT_MESSAGES.none? {|msg| followupAction.downcase.include?(msg) }
34
+ end
35
+
36
+ %w[field description code followupAction location].each do |method_name|
37
+ define_method("#{method_name}?") do
38
+ false == send(method_name).nil?
39
+ end
40
+
41
+ define_method("#{method_name}") do
42
+ @data[method_name]
43
+ end
44
+ end
45
+ end
46
+
3
47
  class EligibilityData
4
48
  attr_reader :response, :raw
5
49
 
50
+ ACTIVE = '1'
51
+ INACTIVE = '6'
52
+
6
53
  PARSE_DATE = ->(d) {
7
54
  begin
8
55
  d = Date.strptime(d, ChangeHealth::Models::DATE_FORMAT)
@@ -25,7 +72,31 @@ module ChangeHealth
25
72
  end
26
73
 
27
74
  def active?(service_code: '30')
28
- return '1' == plan_status(service_code: service_code).dig('statusCode')
75
+ return ACTIVE == plan_status(service_code: service_code).dig('statusCode')
76
+ end
77
+
78
+ def inactive?(service_code: '30')
79
+ return INACTIVE == plan_status(service_code: service_code).dig('statusCode')
80
+ end
81
+
82
+ def errors?
83
+ self.errors.is_a?(Array) && false == self.errors.empty?
84
+ end
85
+
86
+ def errors
87
+ errors = @raw.dig('errors') || []
88
+
89
+ errors.flatten.map {|error| ChangeHealth::Models::Error.new(error) }
90
+ end
91
+
92
+ def recommend_retry?
93
+ return false if errors.empty?
94
+
95
+ error_codes = errors.select(&:code?)
96
+
97
+ return false if error_codes.empty?
98
+
99
+ return error_codes.all?(&:retryable?)
29
100
  end
30
101
 
31
102
  def dependents?
@@ -61,7 +132,7 @@ module ChangeHealth
61
132
  end
62
133
 
63
134
  def plan_status(service_code: )
64
- self.planStatus&.find {|plan| plan.dig('serviceTypeCodes').include?(service_code) } || {}
135
+ self.planStatus&.find {|plan| plan.dig('serviceTypeCodes')&.include?(service_code) } || {}
65
136
  end
66
137
 
67
138
  def benefits
@@ -1,3 +1,3 @@
1
1
  module ChangeHealth
2
- VERSION = '0.11.0'.freeze
2
+ VERSION = '1.0.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.11.0
4
+ version: 1.0.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-24 00:00:00.000000000 Z
11
+ date: 2021-03-17 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
@@ -179,8 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
179
180
  - !ruby/object:Gem::Version
180
181
  version: '0'
181
182
  requirements: []
182
- rubyforge_project:
183
- rubygems_version: 2.7.6
183
+ rubygems_version: 3.1.4
184
184
  signing_key:
185
185
  specification_version: 4
186
186
  summary: Ruby wrapper for the ChangeHealth API