change_health 1.0.3 → 2.0.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 +4 -4
- data/CHANGELOG.md +32 -0
- data/README.md +115 -15
- data/lib/change_health/connection.rb +1 -1
- data/lib/change_health/models/claim/submission/claim_information.rb +31 -0
- data/lib/change_health/models/claim/submission/provider.rb +17 -0
- data/lib/change_health/models/claim/submission/service_line.rb +12 -0
- data/lib/change_health/models/claim/submission/submitter.rb +11 -0
- data/lib/change_health/models/claim/submission/subscriber.rb +15 -0
- data/lib/change_health/models/eligibility/encounter.rb +22 -0
- data/lib/change_health/models/eligibility/provider.rb +23 -0
- data/lib/change_health/models/eligibility/subscriber.rb +31 -0
- data/lib/change_health/models/error.rb +56 -0
- data/lib/change_health/models/model.rb +11 -0
- data/lib/change_health/models/{trading_partner.rb → trading_partner/trading_partner.rb} +0 -0
- data/lib/change_health/{models → request}/eligibility.rb +5 -5
- data/lib/change_health/request/submission.rb +38 -0
- data/lib/change_health/response/claim/submission/submission_data.rb +23 -0
- data/lib/change_health/{models → response/eligibility}/eligibility_benefit.rb +6 -6
- data/lib/change_health/{models → response/eligibility}/eligibility_benefits.rb +3 -3
- data/lib/change_health/response/eligibility/eligibility_data.rb +94 -0
- data/lib/change_health/response/response_data.rb +41 -0
- data/lib/change_health/response/{trading_partner_data.rb → trading_partner/trading_partner_data.rb} +0 -0
- data/lib/change_health/response/{trading_partners_data.rb → trading_partner/trading_partners_data.rb} +0 -0
- data/lib/change_health/version.rb +1 -1
- data/lib/change_health.rb +20 -11
- metadata +22 -14
- data/lib/change_health/models/eligibility_data.rb +0 -191
- data/lib/change_health/models/encounter.rb +0 -20
- data/lib/change_health/models/provider.rb +0 -21
- data/lib/change_health/models/subscriber.rb +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 984e07a44c15c8b628c8826d012e5acdee3695ba3a1b0bcdd000d07b0d9f920c
|
4
|
+
data.tar.gz: af752baf4e2d7e0fe73b77d7a9199feb1f24ea6d9a6be9163d7c87ef6484c8d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76641120792ba599030e2a3875696a2167dbf585095d0cafb7c5961a7f1a55a735769b91bea6cc098710adc418d819b5144ab8f9bbb1272add0f102c6dba2ad2
|
7
|
+
data.tar.gz: 269647d12a949fc69ec6e1e493d522a13cd7ffdf59fcc2510f285219d1dc7e4a52212b83fdce4fb33fd72b2bcbc75eefa5400df5e0f539dcb7403b1b760cf1a3
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,37 @@ 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
|
+
## [2.0.0] - [2021-10-08]
|
8
|
+
### Added
|
9
|
+
#### Models
|
10
|
+
* ResponseData - for responses from calling change healthcare api used by EligibilityData and SubmissionData
|
11
|
+
#### Claim Submission
|
12
|
+
Added the ability to hit professional claim submission API. For more details, see [Change Healthcare documentation here](https://developers.changehealthcare.com/eligibilityandclaims/docs/professional-claims-v3-getting-started)
|
13
|
+
* ClaimInformation
|
14
|
+
* Provider
|
15
|
+
* ServiceLine
|
16
|
+
* Submission
|
17
|
+
* SubmissionData
|
18
|
+
* Submitter
|
19
|
+
* Subscriber
|
20
|
+
### Changed
|
21
|
+
* Using new Change Healthcare url. From apis to apigw. For more info see [change log here](https://developers.changehealthcare.com/eligibilityandclaims/docs/change-logrelease-notes-1)
|
22
|
+
* PARSE_DATE moved from ChangeHealth::Models::EligibilityData to ChangeHealth::Models
|
23
|
+
* Moved Error class into its own file
|
24
|
+
#### Namespace
|
25
|
+
Many classes moved namespaces to be more consistent across the many endpoints in Change Healthcare
|
26
|
+
| Previous | Current |
|
27
|
+
|-|-|
|
28
|
+
|ChangeHealth::Models::Eligibility | ChangeHealth::Request::Eligibility |
|
29
|
+
| ChangeHealth::Models::Encounter | ChangeHealth::Models::Eligibility::Encounter|
|
30
|
+
| ChangeHealth::Models::Provider | ChangeHealth::Models::Eligibility::Provider|
|
31
|
+
| ChangeHealth::Models::Subscriber | ChangeHealth::Models::Eligibility::Subscriber|
|
32
|
+
| ChangeHealth::Models::EligibilityBenefit | ChangeHealth::Response::EligibilityBenefit|
|
33
|
+
| ChangeHealth::Models::EligibilityBenefits | ChangeHealth::Response::EligibilityBenefits|
|
34
|
+
| ChangeHealth::Models::EligibilityData | ChangeHealth::Response::EligibilityData|
|
35
|
+
### Fixed
|
36
|
+
* Eligibility#add_dependent actually works
|
37
|
+
|
7
38
|
## [1.0.3] - [2021-04-26]
|
8
39
|
### Added
|
9
40
|
- Model::Error#represents_down? - adds ability to distinguish error representing down state
|
@@ -132,6 +163,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
132
163
|
- Authentication
|
133
164
|
- Configuration
|
134
165
|
|
166
|
+
[Unreleased]: https://github.com/WeInfuse/change_health/compare/v1.0.3...HEAD
|
135
167
|
[1.0.3]: https://github.com/WeInfuse/change_health/compare/v1.0.2...v1.0.3
|
136
168
|
[1.0.2]: https://github.com/WeInfuse/change_health/compare/v1.0.1...v1.0.2
|
137
169
|
[1.0.1]: https://github.com/WeInfuse/change_health/compare/v1.0.0...v1.0.1
|
data/README.md
CHANGED
@@ -26,24 +26,25 @@ Or install it yourself as:
|
|
26
26
|
Make sure you're [configured](#configuration)!
|
27
27
|
|
28
28
|
### Eligibility
|
29
|
+
[Change Healthcare Eligibility Guide](https://developers.changehealthcare.com/eligibilityandclaims/docs)
|
29
30
|
```ruby
|
30
|
-
ChangeHealth::
|
31
|
+
ChangeHealth::Request::Eligibility.ping # Test your connection
|
31
32
|
|
32
|
-
encounter = ChangeHealth::Models::Encounter.new(date_of_service: Date.current, service_type_codes: ['98'])
|
33
|
-
provider = ChangeHealth::Models::Provider.new(npi: '0123456789', last_name: 'Bobson', first_name: 'Bob')
|
34
|
-
subscriber = ChangeHealth::Models::Subscriber.new(member_id: '0000000000', first_name: 'johnOne', last_name: 'doeOne', date_of_birth: '18800102')
|
33
|
+
encounter = ChangeHealth::Models::Eligibility::Encounter.new(date_of_service: Date.current, service_type_codes: ['98'])
|
34
|
+
provider = ChangeHealth::Models::Eligibility::Provider.new(npi: '0123456789', last_name: 'Bobson', first_name: 'Bob')
|
35
|
+
subscriber = ChangeHealth::Models::Eligibility::Subscriber.new(member_id: '0000000000', first_name: 'johnOne', last_name: 'doeOne', date_of_birth: '18800102')
|
35
36
|
|
36
|
-
edata = ChangeHealth::
|
37
|
+
edata = ChangeHealth::Request::Eligibility.new(tradingPartnerServiceId: '000050', provider: provider, subscriber: subscriber, encounter: encounter).query
|
37
38
|
|
38
39
|
edata.raw # Raw Hash of JSON response
|
39
40
|
```
|
40
41
|
|
41
|
-
|
42
|
+
#### Benefit(s) objects
|
42
43
|
Benefits extends Array and provides a query-like interface.
|
43
44
|
|
44
45
|
Benefit extends Hash and provides helpers for single-benefit.
|
45
46
|
|
46
|
-
```
|
47
|
+
```ruby
|
47
48
|
edata.benefits # Returns Benefits querying object (extends Array)
|
48
49
|
|
49
50
|
edata.benefits.individual # Only benefits matching the 'IND' identifier
|
@@ -57,7 +58,7 @@ edata.benefits.where(name: 'Co-Payment', code: 'B', benefitAmount: '30) # Generi
|
|
57
58
|
edata.benefits.find_by(name: 'Co-Payment', code: 'B', benefitAmount: '30) # Generic 'find_by' api returns first object found
|
58
59
|
```
|
59
60
|
|
60
|
-
|
61
|
+
#### Response
|
61
62
|
|
62
63
|
Response is EligibilityData object
|
63
64
|
|
@@ -77,16 +78,115 @@ true
|
|
77
78
|
|
78
79
|
### Trading Partners
|
79
80
|
```ruby
|
80
|
-
|
81
|
-
|
82
|
-
|
81
|
+
# Query trading partners using a wildcard search
|
82
|
+
# Returns Array of ChangeHealth::Models::TradingPartner Objects
|
83
|
+
trading_partners = ChangeHealth::Request::TradingPartner.query("Aetna")
|
84
|
+
|
85
|
+
trading_partners.first.name
|
86
|
+
"Aetna"
|
83
87
|
|
84
|
-
|
85
|
-
|
88
|
+
trading_partners.first.service_id
|
89
|
+
"ABC123"
|
90
|
+
```
|
86
91
|
|
87
|
-
|
88
|
-
|
92
|
+
### Claim Submission
|
93
|
+
[Change Healthcare Claim Submission Guide](https://developers.changehealthcare.com/eligibilityandclaims/docs/professional-claims-v3-getting-started)
|
94
|
+
```ruby
|
95
|
+
ChangeHealth::Request::Claim::Submission.ping # Test your connection
|
96
|
+
|
97
|
+
contact_information = { name: "SUBMITTER CONTACT INFO", phoneNumber: "123456789"}
|
98
|
+
claim_submitter = ChangeHealth::Models::Claim::Submitter.new(
|
99
|
+
organization_name: "REGIONAL PPO NETWORK",
|
100
|
+
contact_information: contact_information
|
101
|
+
)
|
102
|
+
|
103
|
+
receiver = { organizationName: "EXTRA HEALTHY INSURANCE"}
|
104
|
+
address = {
|
105
|
+
"address1": "123 address1",
|
106
|
+
"city": "city1",
|
107
|
+
"state": "wa",
|
108
|
+
"postalCode": "981010000"
|
109
|
+
}
|
110
|
+
subscriber = ChangeHealth::Models::Claim::Subscriber.new(
|
111
|
+
member_id: "0000000001",
|
112
|
+
payment_responsibility_level_code: "P",
|
113
|
+
first_name: "johnone",
|
114
|
+
last_name: "doetwo",
|
115
|
+
gender: "M",
|
116
|
+
date_of_birth: "02/01/1980",
|
117
|
+
address: address
|
118
|
+
)
|
119
|
+
provider = ChangeHealth::Models::Claim::Provider.new(
|
120
|
+
address: address,
|
121
|
+
employer_id: "000000000",
|
122
|
+
first_name: "johnone",
|
123
|
+
last_name: "doetwo",
|
124
|
+
npi: "1760854442",
|
125
|
+
provider_type: "BillingProvider"
|
126
|
+
)
|
127
|
+
|
128
|
+
health_care_code_information1 = {
|
129
|
+
"diagnosisTypeCode": "ABK",
|
130
|
+
"diagnosisCode": "S93401A"
|
131
|
+
}
|
132
|
+
health_care_code_information2 = {
|
133
|
+
"diagnosisTypeCode": "ABF",
|
134
|
+
"diagnosisCode": "S72044G"
|
135
|
+
|
136
|
+
}
|
137
|
+
service_line1 = ChangeHealth::Models::Claim::ServiceLine.new(
|
138
|
+
service_date: "2018-05-14",
|
139
|
+
professional_service: {
|
140
|
+
"procedureIdentifier": "HC",
|
141
|
+
"lineItemChargeAmount": "25",
|
142
|
+
"procedureCode": "E0570",
|
143
|
+
"measurementUnit": "UN",
|
144
|
+
"serviceUnitCount": "1",
|
145
|
+
"compositeDiagnosisCodePointers": {
|
146
|
+
"diagnosisCodePointers": ["1","2"]
|
147
|
+
}
|
148
|
+
}
|
149
|
+
)
|
150
|
+
service_line2 = ChangeHealth::Models::Claim::ServiceLine.new(
|
151
|
+
service_date: "20180514",
|
152
|
+
professional_service: {
|
153
|
+
"procedureIdentifier": "HC",
|
154
|
+
"lineItemChargeAmount": "3.75",
|
155
|
+
"procedureCode": "A7003",
|
156
|
+
"measurementUnit": "UN",
|
157
|
+
"serviceUnitCount": "1",
|
158
|
+
"compositeDiagnosisCodePointers": {
|
159
|
+
"diagnosisCodePointers": ["1"]
|
160
|
+
}
|
161
|
+
}
|
162
|
+
)
|
163
|
+
claim_information = ChangeHealth::Models::Claim::ClaimInformation.new(
|
164
|
+
benefits_assignment_certification_indicator: "Y",
|
165
|
+
claim_charge_amount: "28.75",
|
166
|
+
claim_filing_code: "CI",
|
167
|
+
claim_frequency_code: "1",
|
168
|
+
patient_control_number: "12345",
|
169
|
+
place_of_service_code: "11",
|
170
|
+
plan_participation_code: "A",
|
171
|
+
release_information_code: "Y",
|
172
|
+
signature_indicator: "Y",
|
173
|
+
health_care_code_information: [health_care_code_information1, health_care_code_information2],
|
174
|
+
service_lines: [service_line1, service_line2]
|
175
|
+
)
|
176
|
+
|
177
|
+
|
178
|
+
claim_submission = ChangeHealth::Request::Claim::Submission.new(
|
179
|
+
trading_partner_service_id: "9496",
|
180
|
+
submitter: claim_submitter,
|
181
|
+
receiver: receiver,
|
182
|
+
subscriber: subscriber,
|
183
|
+
providers: [provider],
|
184
|
+
claim_information: claim_information
|
185
|
+
)
|
186
|
+
|
187
|
+
claim_submission_data = claim_submission.submission
|
89
188
|
```
|
189
|
+
|
90
190
|
### Configuration
|
91
191
|
|
92
192
|
```ruby
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module ChangeHealth
|
2
2
|
class Connection
|
3
|
-
URI_BUILDER = ->(host) { "https://#{host}
|
3
|
+
URI_BUILDER = ->(host) { "https://#{host}apigw.changehealthcare.com/".freeze }
|
4
4
|
|
5
5
|
QA_ENDPOINT = URI_BUILDER.call('sandbox.')
|
6
6
|
PROD_ENDPOINT = URI_BUILDER.call('')
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module ChangeHealth
|
2
|
+
module Models
|
3
|
+
module Claim
|
4
|
+
class ClaimInformation < Hashie::Trash
|
5
|
+
property :benefitsAssignmentCertificationIndicator, from: :benefits_assignment_certification_indicator, required: false
|
6
|
+
property :claimChargeAmount, from: :claim_charge_amount, required: false
|
7
|
+
property :claimFilingCode, from: :claim_filing_code, required: false
|
8
|
+
property :claimFrequencyCode, from: :claim_frequency_code, required: false
|
9
|
+
property :claimSupplementalInformation, from: :claim_supplemental_information, required: false
|
10
|
+
property :healthCareCodeInformation, from: :health_care_code_information, required: false
|
11
|
+
property :patientControlNumber, from: :patient_control_number, required: false
|
12
|
+
property :placeOfServiceCode, from: :place_of_service_code, required: false
|
13
|
+
property :planParticipationCode, from: :plan_participation_code, required: false
|
14
|
+
property :releaseInformationCode, from: :release_information_code, required: false
|
15
|
+
property :serviceFacilityLocation, from: :service_facility_location, required: false
|
16
|
+
property :serviceLines, from: :service_lines, required: false
|
17
|
+
property :signatureIndicator, from: :signature_indicator, required: false
|
18
|
+
|
19
|
+
def add_service_line(service_line)
|
20
|
+
self[:serviceLines] ||= []
|
21
|
+
self[:serviceLines] << service_line
|
22
|
+
end
|
23
|
+
|
24
|
+
def add_health_care_code_information(health_care_code_information)
|
25
|
+
self[:healthCareCodeInformation] ||= []
|
26
|
+
self[:healthCareCodeInformation] << health_care_code_information
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ChangeHealth
|
2
|
+
module Models
|
3
|
+
module Claim
|
4
|
+
class Provider < Hashie::Trash
|
5
|
+
property :address, required: false
|
6
|
+
property :contactInformation, from: :contact_information, required: false
|
7
|
+
property :employerId, from: :employer_id, required: false # or ssn
|
8
|
+
property :firstName, from: :first_name, required: false
|
9
|
+
property :lastName, from: :last_name, required: false
|
10
|
+
property :organizationName, from: :organization_name, required: false
|
11
|
+
property :npi, required: false
|
12
|
+
property :providerType, from: :provider_type, required: false
|
13
|
+
property :ssn, required: false # or employer id
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module ChangeHealth
|
2
|
+
module Models
|
3
|
+
module Claim
|
4
|
+
class Submitter < Hashie::Trash
|
5
|
+
property :organizationName, from: :organization_name, required: false
|
6
|
+
# contact information has a name & phone number inside
|
7
|
+
property :contactInformation, from: :contact_information, required: false
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module ChangeHealth
|
2
|
+
module Models
|
3
|
+
module Claim
|
4
|
+
class Subscriber < Model
|
5
|
+
property :address, required: false
|
6
|
+
property :dateOfBirth, from: :date_of_birth, required: false
|
7
|
+
property :firstName, from: :first_name, required: false
|
8
|
+
property :gender, required: false
|
9
|
+
property :lastName, from: :last_name, required: false
|
10
|
+
property :memberId, from: :member_id, required: false
|
11
|
+
property :paymentResponsibilityLevelCode, from: :payment_responsibility_level_code, required: false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module ChangeHealth
|
2
|
+
module Models
|
3
|
+
module Eligibility
|
4
|
+
class Encounter < Model
|
5
|
+
property :beginningDateOfService, from: :beginning_date_of_service, required: false
|
6
|
+
property :dateOfService, from: :date_of_service, required: false
|
7
|
+
property :dateRange, from: :date_range, required: false, default: false
|
8
|
+
property :endDateOfService, from: :end_date_of_service, required: false
|
9
|
+
property :serviceTypeCodes, from: :service_type_codes, required: false
|
10
|
+
|
11
|
+
alias_method :dateRange?, :dateRange
|
12
|
+
alias_method :date_range?, :dateRange
|
13
|
+
alias_method :service_type_codes, :serviceTypeCodes
|
14
|
+
|
15
|
+
def add_service_type_code(code)
|
16
|
+
self[:serviceTypeCodes] ||= []
|
17
|
+
self[:serviceTypeCodes] << code
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ChangeHealth
|
2
|
+
module Models
|
3
|
+
module Eligibility
|
4
|
+
class Provider < Hashie::Trash
|
5
|
+
property :firstName, from: :first_name, required: false
|
6
|
+
property :lastName, from: :last_name, required: false
|
7
|
+
property :name, default: true, required: false
|
8
|
+
property :npi, required: false
|
9
|
+
property :organizationName, from: :organization_name, required: false
|
10
|
+
property :payorId, from: :payer_id, required: false
|
11
|
+
property :person, default: true, required: false
|
12
|
+
property :providerCode, from: :provider_code, required: false
|
13
|
+
property :providerName, from: :provider_name, required: false
|
14
|
+
property :providerType, from: :provider_type, required: false
|
15
|
+
property :referenceIdentification, from: :reference_identification, required: false
|
16
|
+
property :serviceProviderNumber, from: :service_provider_number, required: false
|
17
|
+
property :taxId, from: :tax_id, required: false
|
18
|
+
|
19
|
+
alias_method :name?, :name
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module ChangeHealth
|
2
|
+
module Models
|
3
|
+
module Eligibility
|
4
|
+
class Subscriber < Model
|
5
|
+
property :additionalIdentification, required: false
|
6
|
+
property :address, required: false
|
7
|
+
property :birthSequenceNumber, from: :birth_sequence_number, required: false
|
8
|
+
property :caseNumber, from: :case_number, required: false
|
9
|
+
property :dateOfBirth, from: :date_of_birth, required: false
|
10
|
+
property :firstName, from: :first_name, required: false
|
11
|
+
property :gender, required: false
|
12
|
+
property :groupNumber, from: :group_number, required: false
|
13
|
+
property :healthCareCodeInformation, from: :health_care_code_information, required: false
|
14
|
+
property :idCard, from: :id_card, required: false
|
15
|
+
property :idCardIssueDate, from: :id_card_issued_date, required: false
|
16
|
+
property :lastName, from: :last_name, required: false
|
17
|
+
property :medicaidRecipientIdentificationNumber, from: :medicaid_recipient_identification_number, required: false
|
18
|
+
property :memberId, from: :member_id, required: false
|
19
|
+
property :providerCode, from: :provider_code, required: false
|
20
|
+
property :providerIdentifier, from: :provider_identification, required: false
|
21
|
+
property :referenceIdentificationQualifier, from: :reference_identification_qualifier, required: false
|
22
|
+
property :ssn, required: false
|
23
|
+
|
24
|
+
def add_health_care_code_information(value)
|
25
|
+
self[:healthCareCodeInformation] ||= []
|
26
|
+
self[:healthCareCodeInformation] << value
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module ChangeHealth
|
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 = [
|
12
|
+
'resubmission not allowed',
|
13
|
+
'do not resubmit'
|
14
|
+
].freeze
|
15
|
+
|
16
|
+
DOWN_FIELD = 'Http Header'.freeze
|
17
|
+
|
18
|
+
DOWN_MESSAGE = 'Please review http headers for this API, please contact support if you are unsure how to resolve.'.freeze
|
19
|
+
|
20
|
+
def initialize(data)
|
21
|
+
@data = data
|
22
|
+
end
|
23
|
+
|
24
|
+
def message
|
25
|
+
field_message || code_message
|
26
|
+
end
|
27
|
+
|
28
|
+
def field_message
|
29
|
+
"#{field}: #{description}" if field?
|
30
|
+
end
|
31
|
+
|
32
|
+
def code_message
|
33
|
+
"#{code}: #{description}" if code?
|
34
|
+
end
|
35
|
+
|
36
|
+
def represents_down?
|
37
|
+
field == DOWN_FIELD && description == DOWN_MESSAGE
|
38
|
+
end
|
39
|
+
|
40
|
+
def retryable?
|
41
|
+
represents_down? ||
|
42
|
+
(code? && SIMPLE_RETRY_CODES.include?(code) && followupAction? && NO_RESUBMIT_MESSAGES.none? {|msg| followupAction.downcase.include?(msg) })
|
43
|
+
end
|
44
|
+
|
45
|
+
%w[field description code followupAction location].each do |method_name|
|
46
|
+
define_method("#{method_name}?") do
|
47
|
+
false == send(method_name).nil?
|
48
|
+
end
|
49
|
+
|
50
|
+
define_method("#{method_name}") do
|
51
|
+
@data[method_name]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -12,6 +12,17 @@ module ChangeHealth
|
|
12
12
|
d
|
13
13
|
}
|
14
14
|
|
15
|
+
PARSE_DATE = ->(d) {
|
16
|
+
begin
|
17
|
+
d = Date.strptime(d, ChangeHealth::Models::DATE_FORMAT)
|
18
|
+
rescue
|
19
|
+
end
|
20
|
+
|
21
|
+
d
|
22
|
+
}
|
23
|
+
|
24
|
+
CONTROL_NUMBER = ->() { '%09d' % rand(1_000_000_000) }
|
25
|
+
|
15
26
|
class Model < Hashie::Trash
|
16
27
|
def to_h
|
17
28
|
result = super.to_h
|
File without changes
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module ChangeHealth
|
2
|
-
module
|
2
|
+
module Request
|
3
3
|
class Eligibility < Hashie::Trash
|
4
4
|
ENDPOINT = '/medicalnetwork/eligibility/v3'.freeze
|
5
5
|
HEALTH_CHECK_ENDPOINT = ENDPOINT + '/healthcheck'.freeze
|
6
6
|
|
7
|
-
property :controlNumber, from: :control_number, required: true, default:
|
7
|
+
property :controlNumber, from: :control_number, required: true, default: ChangeHealth::Models::CONTROL_NUMBER
|
8
8
|
property :dependents, required: false
|
9
9
|
property :encounter, required: false
|
10
10
|
property :informationReceiverName, from: :information_receiver_name, required: false
|
@@ -20,12 +20,12 @@ module ChangeHealth
|
|
20
20
|
alias_method :partner_id?, :partnerId
|
21
21
|
|
22
22
|
def add_dependent(dependent)
|
23
|
-
self[:
|
24
|
-
self[:
|
23
|
+
self[:dependents] ||= []
|
24
|
+
self[:dependents] << dependent
|
25
25
|
end
|
26
26
|
|
27
27
|
def query
|
28
|
-
ChangeHealth::
|
28
|
+
ChangeHealth::Response::EligibilityData.new(response: ChangeHealth::Connection.new.request(endpoint: ENDPOINT, body: self.to_h))
|
29
29
|
end
|
30
30
|
|
31
31
|
def self.health_check
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module ChangeHealth
|
2
|
+
module Request
|
3
|
+
module Claim
|
4
|
+
class Submission < Hashie::Trash
|
5
|
+
ENDPOINT = '/medicalnetwork/professionalclaims/v3'.freeze
|
6
|
+
HEALTH_CHECK_ENDPOINT = ENDPOINT + '/healthcheck'.freeze
|
7
|
+
SUBMISSION_ENDPOINT = ENDPOINT + '/submission'.freeze
|
8
|
+
|
9
|
+
property :claimInformation, from: :claim_information, required: false
|
10
|
+
property :controlNumber, from: :control_number, required: true, default: ChangeHealth::Models::CONTROL_NUMBER
|
11
|
+
property :providers, required: false
|
12
|
+
property :receiver, required: false
|
13
|
+
property :submitter, required: false
|
14
|
+
property :subscriber, required: false
|
15
|
+
# Need one or the other, trading partner id or trading partner service id
|
16
|
+
property :tradingPartnerId, from: :trading_partner_id, required: false
|
17
|
+
property :tradingPartnerServiceId, from: :trading_partner_service_id, required: false
|
18
|
+
|
19
|
+
def add_provider(provider)
|
20
|
+
self[:providers] ||= []
|
21
|
+
self[:providers] << provider
|
22
|
+
end
|
23
|
+
|
24
|
+
def submission
|
25
|
+
ChangeHealth::Response::Claim::SubmissionData.new(response: ChangeHealth::Connection.new.request(endpoint: SUBMISSION_ENDPOINT, body: self.to_h))
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.health_check
|
29
|
+
ChangeHealth::Connection.new.request(endpoint: HEALTH_CHECK_ENDPOINT, verb: :get)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.ping
|
33
|
+
self.health_check
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ChangeHealth
|
2
|
+
module Response
|
3
|
+
module Claim
|
4
|
+
class SubmissionData < ChangeHealth::Response::ResponseData
|
5
|
+
|
6
|
+
%w(controlNumber status tradingPartnerId tradingPartnerServiceId).each do |v|
|
7
|
+
define_method(v) do
|
8
|
+
@raw.dig(v)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
alias_method :control_number, :controlNumber
|
13
|
+
alias_method :trading_partner_id, :tradingPartnerId
|
14
|
+
alias_method :trading_partner_service_id, :tradingPartnerServiceId
|
15
|
+
|
16
|
+
def trading_partner?(name)
|
17
|
+
self.trading_partner_id == name || trading_partner_service_id == name
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module ChangeHealth
|
2
|
-
module
|
2
|
+
module Response
|
3
3
|
class EligibilityBenefit < Hash
|
4
4
|
include Hashie::Extensions::MergeInitializer
|
5
5
|
include Hashie::Extensions::IndifferentAccess
|
@@ -54,7 +54,7 @@ module ChangeHealth
|
|
54
54
|
coverageLevelCode: COVERAGES,
|
55
55
|
code: CODES
|
56
56
|
}
|
57
|
-
|
57
|
+
|
58
58
|
HELPERS.each do |key, types|
|
59
59
|
types.each do |method, value|
|
60
60
|
define_method("#{method}?") do
|
@@ -99,13 +99,13 @@ module ChangeHealth
|
|
99
99
|
self.coinsurance? ? self.benefitPercent : self.benefitAmount
|
100
100
|
end
|
101
101
|
|
102
|
-
def services
|
102
|
+
def services
|
103
103
|
self['serviceTypeCodes']&.each_with_index&.map {|stc, i| [stc, self['serviceTypes']&.at(i)]} || []
|
104
104
|
end
|
105
105
|
|
106
106
|
%w(eligibilityBegin eligibilityEnd planBegin planEnd service).each do |f|
|
107
107
|
define_method(f) do
|
108
|
-
return ChangeHealth::Models::
|
108
|
+
return ChangeHealth::Models::PARSE_DATE.call(self.date_info&.dig(f))
|
109
109
|
end
|
110
110
|
end
|
111
111
|
alias_method :eligibility_begin_date, :eligibilityBegin
|
@@ -120,11 +120,11 @@ module ChangeHealth
|
|
120
120
|
end
|
121
121
|
|
122
122
|
def plan_date_range_start
|
123
|
-
ChangeHealth::Models::
|
123
|
+
ChangeHealth::Models::PARSE_DATE.call(self.plan_date_range[0])
|
124
124
|
end
|
125
125
|
|
126
126
|
def plan_date_range_end
|
127
|
-
ChangeHealth::Models::
|
127
|
+
ChangeHealth::Models::PARSE_DATE.call(self.plan_date_range[1])
|
128
128
|
end
|
129
129
|
|
130
130
|
private
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module ChangeHealth
|
2
|
-
module
|
2
|
+
module Response
|
3
3
|
class EligibilityBenefits < Array
|
4
4
|
def initialize(benefits)
|
5
|
-
super(benefits.map {|benefit| ChangeHealth::
|
5
|
+
super(benefits.map {|benefit| ChangeHealth::Response::EligibilityBenefit.new(benefit) })
|
6
6
|
end
|
7
7
|
|
8
8
|
def where(**kwargs)
|
@@ -25,7 +25,7 @@ module ChangeHealth
|
|
25
25
|
self.where(inPlanNetworkIndicatorCode: 'Y')
|
26
26
|
end
|
27
27
|
|
28
|
-
ChangeHealth::
|
28
|
+
ChangeHealth::Response::EligibilityBenefit::HELPERS.each do |key, types|
|
29
29
|
types.each do |method, value|
|
30
30
|
define_method("#{method}s") do
|
31
31
|
self.where(key => value)
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module ChangeHealth
|
2
|
+
module Response
|
3
|
+
class EligibilityData < ChangeHealth::Response::ResponseData
|
4
|
+
|
5
|
+
ACTIVE = '1'
|
6
|
+
INACTIVE = '6'
|
7
|
+
|
8
|
+
def active?(service_code: '30')
|
9
|
+
plan_status(service_code: service_code, single: false).any? {|status| ACTIVE == status['statusCode'] }
|
10
|
+
end
|
11
|
+
|
12
|
+
def inactive?(service_code: '30')
|
13
|
+
plan_status(service_code: service_code, single: false).any? {|status| INACTIVE == status['statusCode'] }
|
14
|
+
end
|
15
|
+
|
16
|
+
def dependents?
|
17
|
+
true == self.dependents&.any?
|
18
|
+
end
|
19
|
+
|
20
|
+
%w(planStatus benefitsInformation controlNumber planDateInformation dependents).each do |v|
|
21
|
+
define_method(v) do
|
22
|
+
@raw.dig(v)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
%w(eligibilityBegin planBegin service).each do |f|
|
27
|
+
define_method(f) do
|
28
|
+
return ChangeHealth::Models::PARSE_DATE.call(self.date_info&.dig(f))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
alias_method :eligibility_begin_date, :eligibilityBegin
|
32
|
+
alias_method :plan_begin_date, :planBegin
|
33
|
+
alias_method :service_date, :service
|
34
|
+
|
35
|
+
def plan_date_range
|
36
|
+
pd = self.date_info&.dig('plan') || ''
|
37
|
+
pd.split('-')
|
38
|
+
end
|
39
|
+
|
40
|
+
def plan_date_range_start
|
41
|
+
ChangeHealth::Models::PARSE_DATE.call(self.plan_date_range[0])
|
42
|
+
end
|
43
|
+
|
44
|
+
def plan_date_range_end
|
45
|
+
ChangeHealth::Models::PARSE_DATE.call(self.plan_date_range[1])
|
46
|
+
end
|
47
|
+
|
48
|
+
def plan_status(service_code: , single: true)
|
49
|
+
if true == single
|
50
|
+
self.planStatus&.find {|plan| plan.dig('serviceTypeCodes')&.include?(service_code) } || {}
|
51
|
+
else
|
52
|
+
self.planStatus&.select {|plan| plan.dig('serviceTypeCodes')&.include?(service_code) } || []
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def benefits
|
57
|
+
kname = "ChangeHealth::Response::EligibilityBenefits#{self.trading_partner_id&.upcase}"
|
58
|
+
klazz = Object.const_get(kname) if Module.const_defined?(kname)
|
59
|
+
klazz ||= ChangeHealth::Response::EligibilityBenefits
|
60
|
+
|
61
|
+
if klazz.respond_to?(:factory)
|
62
|
+
klazz = klazz.factory(self)
|
63
|
+
end
|
64
|
+
|
65
|
+
klazz.new(self.benefitsInformation || [])
|
66
|
+
end
|
67
|
+
|
68
|
+
def medicare?(**kwargs)
|
69
|
+
false == benefits.empty? && benefits.where(kwargs).all? {|b| b.medicare? }
|
70
|
+
end
|
71
|
+
|
72
|
+
def plan?(name)
|
73
|
+
self.plan_names.any? {|pname| name == pname }
|
74
|
+
end
|
75
|
+
|
76
|
+
def plan_names
|
77
|
+
self.planStatus&.map {|plan_status| plan_status['planDetails'] }&.compact || []
|
78
|
+
end
|
79
|
+
|
80
|
+
def trading_partner?(name)
|
81
|
+
self.trading_partner_id == name
|
82
|
+
end
|
83
|
+
|
84
|
+
def trading_partner_id
|
85
|
+
@raw['tradingPartnerServiceId']
|
86
|
+
end
|
87
|
+
|
88
|
+
alias_method :control_number, :controlNumber
|
89
|
+
alias_method :benefits_information, :benefitsInformation
|
90
|
+
alias_method :plan_statuses, :planStatus
|
91
|
+
alias_method :date_info, :planDateInformation
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module ChangeHealth
|
2
|
+
module Response
|
3
|
+
class ResponseData
|
4
|
+
attr_reader :response, :raw
|
5
|
+
|
6
|
+
def initialize(data: nil, response: nil)
|
7
|
+
@response = response
|
8
|
+
@raw = data
|
9
|
+
|
10
|
+
begin
|
11
|
+
@raw ||= response&.parsed_response
|
12
|
+
rescue JSON::ParserError
|
13
|
+
end
|
14
|
+
|
15
|
+
@raw ||= {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def errors?
|
19
|
+
self.errors.is_a?(Array) && false == self.errors.empty?
|
20
|
+
end
|
21
|
+
|
22
|
+
def errors
|
23
|
+
errors = @raw.dig('errors') || []
|
24
|
+
|
25
|
+
errors.flatten.map {|error| ChangeHealth::Models::Error.new(error) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def recommend_retry?
|
29
|
+
return false unless errors?
|
30
|
+
|
31
|
+
return true if errors.any?(&:represents_down?)
|
32
|
+
|
33
|
+
error_codes = errors.select(&:code?)
|
34
|
+
|
35
|
+
return false if error_codes.empty?
|
36
|
+
|
37
|
+
return error_codes.all?(&:retryable?)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/change_health/response/{trading_partner_data.rb → trading_partner/trading_partner_data.rb}
RENAMED
File without changes
|
File without changes
|
data/lib/change_health.rb
CHANGED
@@ -1,22 +1,31 @@
|
|
1
1
|
require 'httparty'
|
2
2
|
require 'hashie'
|
3
3
|
require 'change_health/version'
|
4
|
+
require 'change_health/authentication'
|
4
5
|
require 'change_health/change_health_exception'
|
5
6
|
require 'change_health/connection'
|
6
|
-
require 'change_health/authentication'
|
7
7
|
require 'change_health/extensions'
|
8
|
+
require 'change_health/models/error'
|
8
9
|
require 'change_health/models/model'
|
9
|
-
require 'change_health/models/
|
10
|
-
require 'change_health/models/
|
11
|
-
require 'change_health/models/
|
12
|
-
require 'change_health/models/
|
13
|
-
require 'change_health/models/
|
10
|
+
require 'change_health/models/claim/submission/claim_information'
|
11
|
+
require 'change_health/models/claim/submission/provider'
|
12
|
+
require 'change_health/models/claim/submission/service_line'
|
13
|
+
require 'change_health/models/claim/submission/submitter'
|
14
|
+
require 'change_health/models/claim/submission/subscriber'
|
15
|
+
require 'change_health/models/eligibility/encounter'
|
16
|
+
require 'change_health/models/eligibility/provider'
|
17
|
+
require 'change_health/models/eligibility/subscriber'
|
18
|
+
require 'change_health/models/trading_partner/trading_partner'
|
19
|
+
require 'change_health/request/eligibility'
|
20
|
+
require 'change_health/request/submission'
|
14
21
|
require 'change_health/request/trading_partner'
|
15
|
-
require 'change_health/response/
|
16
|
-
require 'change_health/response/
|
17
|
-
require 'change_health/
|
18
|
-
require 'change_health/
|
19
|
-
require 'change_health/
|
22
|
+
require 'change_health/response/response_data'
|
23
|
+
require 'change_health/response/claim/submission/submission_data'
|
24
|
+
require 'change_health/response/eligibility/eligibility_benefit'
|
25
|
+
require 'change_health/response/eligibility/eligibility_benefits'
|
26
|
+
require 'change_health/response/eligibility/eligibility_data'
|
27
|
+
require 'change_health/response/trading_partner/trading_partner_data'
|
28
|
+
require 'change_health/response/trading_partner/trading_partners_data'
|
20
29
|
|
21
30
|
module ChangeHealth
|
22
31
|
class Configuration
|
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:
|
4
|
+
version: 2.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: 2021-
|
11
|
+
date: 2021-10-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -147,18 +147,27 @@ files:
|
|
147
147
|
- lib/change_health/change_health_exception.rb
|
148
148
|
- lib/change_health/connection.rb
|
149
149
|
- lib/change_health/extensions.rb
|
150
|
-
- lib/change_health/models/
|
151
|
-
- lib/change_health/models/
|
152
|
-
- lib/change_health/models/
|
153
|
-
- lib/change_health/models/
|
154
|
-
- lib/change_health/models/
|
150
|
+
- lib/change_health/models/claim/submission/claim_information.rb
|
151
|
+
- lib/change_health/models/claim/submission/provider.rb
|
152
|
+
- lib/change_health/models/claim/submission/service_line.rb
|
153
|
+
- lib/change_health/models/claim/submission/submitter.rb
|
154
|
+
- lib/change_health/models/claim/submission/subscriber.rb
|
155
|
+
- lib/change_health/models/eligibility/encounter.rb
|
156
|
+
- lib/change_health/models/eligibility/provider.rb
|
157
|
+
- lib/change_health/models/eligibility/subscriber.rb
|
158
|
+
- lib/change_health/models/error.rb
|
155
159
|
- lib/change_health/models/model.rb
|
156
|
-
- lib/change_health/models/
|
157
|
-
- lib/change_health/
|
158
|
-
- lib/change_health/
|
160
|
+
- lib/change_health/models/trading_partner/trading_partner.rb
|
161
|
+
- lib/change_health/request/eligibility.rb
|
162
|
+
- lib/change_health/request/submission.rb
|
159
163
|
- lib/change_health/request/trading_partner.rb
|
160
|
-
- lib/change_health/response/
|
161
|
-
- lib/change_health/response/
|
164
|
+
- lib/change_health/response/claim/submission/submission_data.rb
|
165
|
+
- lib/change_health/response/eligibility/eligibility_benefit.rb
|
166
|
+
- lib/change_health/response/eligibility/eligibility_benefits.rb
|
167
|
+
- lib/change_health/response/eligibility/eligibility_data.rb
|
168
|
+
- lib/change_health/response/response_data.rb
|
169
|
+
- lib/change_health/response/trading_partner/trading_partner_data.rb
|
170
|
+
- lib/change_health/response/trading_partner/trading_partners_data.rb
|
162
171
|
- lib/change_health/version.rb
|
163
172
|
homepage: https://github.com/WeInfuse/change_health
|
164
173
|
licenses:
|
@@ -180,8 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
180
189
|
- !ruby/object:Gem::Version
|
181
190
|
version: '0'
|
182
191
|
requirements: []
|
183
|
-
|
184
|
-
rubygems_version: 2.7.6
|
192
|
+
rubygems_version: 3.1.6
|
185
193
|
signing_key:
|
186
194
|
specification_version: 4
|
187
195
|
summary: Ruby wrapper for the ChangeHealth API
|
@@ -1,191 +0,0 @@
|
|
1
|
-
module ChangeHealth
|
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 = [
|
12
|
-
'resubmission not allowed',
|
13
|
-
'do not resubmit'
|
14
|
-
].freeze
|
15
|
-
|
16
|
-
DOWN_FIELD = 'Http Header'.freeze
|
17
|
-
|
18
|
-
DOWN_MESSAGE = 'Please review http headers for this API, please contact support if you are unsure how to resolve.'.freeze
|
19
|
-
|
20
|
-
def initialize(data)
|
21
|
-
@data = data
|
22
|
-
end
|
23
|
-
|
24
|
-
def message
|
25
|
-
field_message || code_message
|
26
|
-
end
|
27
|
-
|
28
|
-
def field_message
|
29
|
-
"#{field}: #{description}" if field?
|
30
|
-
end
|
31
|
-
|
32
|
-
def code_message
|
33
|
-
"#{code}: #{description}" if code?
|
34
|
-
end
|
35
|
-
|
36
|
-
def represents_down?
|
37
|
-
field == DOWN_FIELD && description == DOWN_MESSAGE
|
38
|
-
end
|
39
|
-
|
40
|
-
def retryable?
|
41
|
-
represents_down? ||
|
42
|
-
(code? && SIMPLE_RETRY_CODES.include?(code) && followupAction? && NO_RESUBMIT_MESSAGES.none? {|msg| followupAction.downcase.include?(msg) })
|
43
|
-
end
|
44
|
-
|
45
|
-
%w[field description code followupAction location].each do |method_name|
|
46
|
-
define_method("#{method_name}?") do
|
47
|
-
false == send(method_name).nil?
|
48
|
-
end
|
49
|
-
|
50
|
-
define_method("#{method_name}") do
|
51
|
-
@data[method_name]
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
class EligibilityData
|
57
|
-
attr_reader :response, :raw
|
58
|
-
|
59
|
-
ACTIVE = '1'
|
60
|
-
INACTIVE = '6'
|
61
|
-
|
62
|
-
PARSE_DATE = ->(d) {
|
63
|
-
begin
|
64
|
-
d = Date.strptime(d, ChangeHealth::Models::DATE_FORMAT)
|
65
|
-
rescue
|
66
|
-
end
|
67
|
-
|
68
|
-
d
|
69
|
-
}
|
70
|
-
|
71
|
-
def initialize(data: nil, response: nil)
|
72
|
-
@response = response
|
73
|
-
@raw = data
|
74
|
-
|
75
|
-
begin
|
76
|
-
@raw ||= response&.parsed_response
|
77
|
-
rescue JSON::ParserError
|
78
|
-
end
|
79
|
-
|
80
|
-
@raw ||= {}
|
81
|
-
end
|
82
|
-
|
83
|
-
def active?(service_code: '30')
|
84
|
-
plan_status(service_code: service_code, single: false).any? {|status| ACTIVE == status['statusCode'] }
|
85
|
-
end
|
86
|
-
|
87
|
-
def inactive?(service_code: '30')
|
88
|
-
plan_status(service_code: service_code, single: false).any? {|status| INACTIVE == status['statusCode'] }
|
89
|
-
end
|
90
|
-
|
91
|
-
def errors?
|
92
|
-
self.errors.is_a?(Array) && false == self.errors.empty?
|
93
|
-
end
|
94
|
-
|
95
|
-
def errors
|
96
|
-
errors = @raw.dig('errors') || []
|
97
|
-
|
98
|
-
errors.flatten.map {|error| ChangeHealth::Models::Error.new(error) }
|
99
|
-
end
|
100
|
-
|
101
|
-
def recommend_retry?
|
102
|
-
return false unless errors?
|
103
|
-
|
104
|
-
return true if errors.any?(&:represents_down?)
|
105
|
-
|
106
|
-
error_codes = errors.select(&:code?)
|
107
|
-
|
108
|
-
return false if error_codes.empty?
|
109
|
-
|
110
|
-
return error_codes.all?(&:retryable?)
|
111
|
-
end
|
112
|
-
|
113
|
-
def dependents?
|
114
|
-
true == self.dependents&.any?
|
115
|
-
end
|
116
|
-
|
117
|
-
%w(planStatus benefitsInformation controlNumber planDateInformation dependents).each do |v|
|
118
|
-
define_method(v) do
|
119
|
-
@raw.dig(v)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
%w(eligibilityBegin planBegin service).each do |f|
|
124
|
-
define_method(f) do
|
125
|
-
return PARSE_DATE.call(self.date_info&.dig(f))
|
126
|
-
end
|
127
|
-
end
|
128
|
-
alias_method :eligibility_begin_date, :eligibilityBegin
|
129
|
-
alias_method :plan_begin_date, :planBegin
|
130
|
-
alias_method :service_date, :service
|
131
|
-
|
132
|
-
def plan_date_range
|
133
|
-
pd = self.date_info&.dig('plan') || ''
|
134
|
-
pd.split('-')
|
135
|
-
end
|
136
|
-
|
137
|
-
def plan_date_range_start
|
138
|
-
ChangeHealth::Models::EligibilityData::PARSE_DATE.call(self.plan_date_range[0])
|
139
|
-
end
|
140
|
-
|
141
|
-
def plan_date_range_end
|
142
|
-
ChangeHealth::Models::EligibilityData::PARSE_DATE.call(self.plan_date_range[1])
|
143
|
-
end
|
144
|
-
|
145
|
-
def plan_status(service_code: , single: true)
|
146
|
-
if true == single
|
147
|
-
self.planStatus&.find {|plan| plan.dig('serviceTypeCodes')&.include?(service_code) } || {}
|
148
|
-
else
|
149
|
-
self.planStatus&.select {|plan| plan.dig('serviceTypeCodes')&.include?(service_code) } || []
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
def benefits
|
154
|
-
kname = "ChangeHealth::Models::EligibilityBenefits#{self.trading_partner_id&.upcase}"
|
155
|
-
klazz = Object.const_get(kname) if Module.const_defined?(kname)
|
156
|
-
klazz ||= ChangeHealth::Models::EligibilityBenefits
|
157
|
-
|
158
|
-
if klazz.respond_to?(:factory)
|
159
|
-
klazz = klazz.factory(self)
|
160
|
-
end
|
161
|
-
|
162
|
-
klazz.new(self.benefitsInformation || [])
|
163
|
-
end
|
164
|
-
|
165
|
-
def medicare?(**kwargs)
|
166
|
-
false == benefits.empty? && benefits.where(kwargs).all? {|b| b.medicare? }
|
167
|
-
end
|
168
|
-
|
169
|
-
def plan?(name)
|
170
|
-
self.plan_names.any? {|pname| name == pname }
|
171
|
-
end
|
172
|
-
|
173
|
-
def plan_names
|
174
|
-
self.planStatus&.map {|plan_status| plan_status['planDetails'] }&.compact || []
|
175
|
-
end
|
176
|
-
|
177
|
-
def trading_partner?(name)
|
178
|
-
self.trading_partner_id == name
|
179
|
-
end
|
180
|
-
|
181
|
-
def trading_partner_id
|
182
|
-
@raw['tradingPartnerServiceId']
|
183
|
-
end
|
184
|
-
|
185
|
-
alias_method :control_number, :controlNumber
|
186
|
-
alias_method :benefits_information, :benefitsInformation
|
187
|
-
alias_method :plan_statuses, :planStatus
|
188
|
-
alias_method :date_info, :planDateInformation
|
189
|
-
end
|
190
|
-
end
|
191
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module ChangeHealth
|
2
|
-
module Models
|
3
|
-
class Encounter < Model
|
4
|
-
property :beginningDateOfService, from: :beginning_date_of_service, required: false
|
5
|
-
property :dateOfService, from: :date_of_service, required: false
|
6
|
-
property :dateRange, from: :date_range, required: false, default: false
|
7
|
-
property :endDateOfService, from: :end_date_of_service, required: false
|
8
|
-
property :serviceTypeCodes, from: :service_type_codes, required: false
|
9
|
-
|
10
|
-
alias_method :dateRange?, :dateRange
|
11
|
-
alias_method :date_range?, :dateRange
|
12
|
-
alias_method :service_type_codes, :serviceTypeCodes
|
13
|
-
|
14
|
-
def add_service_type_code(code)
|
15
|
-
self[:serviceTypeCodes] ||= []
|
16
|
-
self[:serviceTypeCodes] << code
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module ChangeHealth
|
2
|
-
module Models
|
3
|
-
class Provider < Hashie::Trash
|
4
|
-
property :firstName, from: :first_name, required: false
|
5
|
-
property :lastName, from: :last_name, required: false
|
6
|
-
property :name, default: true, required: false
|
7
|
-
property :npi, required: false
|
8
|
-
property :organizationName, from: :organization_name, required: false
|
9
|
-
property :payorId, from: :payer_id, required: false
|
10
|
-
property :person, default: true, required: false
|
11
|
-
property :providerCode, from: :provider_code, required: false
|
12
|
-
property :providerName, from: :provider_name, required: false
|
13
|
-
property :providerType, from: :provider_type, required: false
|
14
|
-
property :referenceIdentification, from: :reference_identification, required: false
|
15
|
-
property :serviceProviderNumber, from: :service_provider_number, required: false
|
16
|
-
property :taxId, from: :tax_id, required: false
|
17
|
-
|
18
|
-
alias_method :name?, :name
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module ChangeHealth
|
2
|
-
module Models
|
3
|
-
class Subscriber < Model
|
4
|
-
property :additionalIdentification, required: false
|
5
|
-
property :address, required: false
|
6
|
-
property :birthSequenceNumber, from: :birth_sequence_number, required: false
|
7
|
-
property :caseNumber, from: :case_number, required: false
|
8
|
-
property :dateOfBirth, from: :date_of_birth, required: false
|
9
|
-
property :firstName, from: :first_name, required: false
|
10
|
-
property :gender, required: false
|
11
|
-
property :groupNumber, from: :group_number, required: false
|
12
|
-
property :healthCareCodeInformation, from: :health_care_code_information, required: false
|
13
|
-
property :idCard, from: :id_card, required: false
|
14
|
-
property :idCardIssueDate, from: :id_card_issued_date, required: false
|
15
|
-
property :lastName, from: :last_name, required: false
|
16
|
-
property :medicaidRecipientIdentificationNumber, from: :medicaid_recipient_identification_number, required: false
|
17
|
-
property :memberId, from: :member_id, required: false
|
18
|
-
property :providerCode, from: :provider_code, required: false
|
19
|
-
property :providerIdentifier, from: :provider_identification, required: false
|
20
|
-
property :referenceIdentificationQualifier, from: :reference_identification_qualifier, required: false
|
21
|
-
property :ssn, required: false
|
22
|
-
|
23
|
-
def add_health_care_code_information(value)
|
24
|
-
self[:healthCareCodeInformation] ||= []
|
25
|
-
self[:healthCareCodeInformation] << value
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|