change_health 1.0.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +32 -0
  3. data/README.md +115 -15
  4. data/lib/change_health/connection.rb +1 -1
  5. data/lib/change_health/models/claim/submission/claim_information.rb +31 -0
  6. data/lib/change_health/models/claim/submission/provider.rb +17 -0
  7. data/lib/change_health/models/claim/submission/service_line.rb +12 -0
  8. data/lib/change_health/models/claim/submission/submitter.rb +11 -0
  9. data/lib/change_health/models/claim/submission/subscriber.rb +15 -0
  10. data/lib/change_health/models/eligibility/encounter.rb +22 -0
  11. data/lib/change_health/models/eligibility/provider.rb +23 -0
  12. data/lib/change_health/models/eligibility/subscriber.rb +31 -0
  13. data/lib/change_health/models/error.rb +56 -0
  14. data/lib/change_health/models/model.rb +11 -0
  15. data/lib/change_health/models/{trading_partner.rb → trading_partner/trading_partner.rb} +0 -0
  16. data/lib/change_health/{models → request}/eligibility.rb +5 -5
  17. data/lib/change_health/request/submission.rb +38 -0
  18. data/lib/change_health/response/claim/submission/submission_data.rb +23 -0
  19. data/lib/change_health/{models → response/eligibility}/eligibility_benefit.rb +6 -6
  20. data/lib/change_health/{models → response/eligibility}/eligibility_benefits.rb +3 -3
  21. data/lib/change_health/response/eligibility/eligibility_data.rb +94 -0
  22. data/lib/change_health/response/response_data.rb +41 -0
  23. data/lib/change_health/response/{trading_partner_data.rb → trading_partner/trading_partner_data.rb} +0 -0
  24. data/lib/change_health/response/{trading_partners_data.rb → trading_partner/trading_partners_data.rb} +0 -0
  25. data/lib/change_health/version.rb +1 -1
  26. data/lib/change_health.rb +20 -11
  27. metadata +22 -14
  28. data/lib/change_health/models/eligibility_data.rb +0 -191
  29. data/lib/change_health/models/encounter.rb +0 -20
  30. data/lib/change_health/models/provider.rb +0 -21
  31. data/lib/change_health/models/subscriber.rb +0 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 69bacf8024e568af3c7dbbdfe638ede842f44392fc870128a7da9242ce7a7094
4
- data.tar.gz: d1e9b4d07f32e0631b75820cfe31e0aa4a6f37f77ccebe8e63cdbf826a29ea90
3
+ metadata.gz: 984e07a44c15c8b628c8826d012e5acdee3695ba3a1b0bcdd000d07b0d9f920c
4
+ data.tar.gz: af752baf4e2d7e0fe73b77d7a9199feb1f24ea6d9a6be9163d7c87ef6484c8d6
5
5
  SHA512:
6
- metadata.gz: aa7f24775ab4760c110a0b3977a51170c4d465651753b184c65be967a1d48708d3564b63357db110ea8d538be2bece70bb07282623c85c35dc5d789fa68c0703
7
- data.tar.gz: 8307d1353765e881915c50ee02b3c280c5abb73e42f94f9f814f3089c004b6e7d0c4c70130070f964f9922f5496f5b46a8b582956d945cac2d4ddbb6a561cc0d
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::Models::Eligibility.ping # Test your connection
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::Models::Eligibility.new(tradingPartnerServiceId: '000050', provider: provider, subscriber: subscriber, encounter: encounter).query
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
- ### Benefit(s) objects
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
- ### Response
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
- # Query trading partners using a wildcard search
81
- # Returns Array of ChangeHealth::Models::TradingPartner Objects
82
- trading_partners = ChangeHealth::Request::TradingPartner.query("Aetna")
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
- trading_partners.first.name
85
- "Aetna"
88
+ trading_partners.first.service_id
89
+ "ABC123"
90
+ ```
86
91
 
87
- trading_partners.first.service_id
88
- "ABC123"
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}apis.changehealthcare.com/".freeze }
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,12 @@
1
+ module ChangeHealth
2
+ module Models
3
+ module Claim
4
+ class ServiceLine < Model
5
+
6
+ property :serviceDate, from: :service_date, required: false
7
+ property :professionalService, from: :professional_service, required: false
8
+
9
+ end
10
+ end
11
+ end
12
+ 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
@@ -1,10 +1,10 @@
1
1
  module ChangeHealth
2
- module Models
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: ->() { '%09d' % rand(1_000_000_000) }
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[:dependent] ||= []
24
- self[:dependent] << dependent
23
+ self[:dependents] ||= []
24
+ self[:dependents] << dependent
25
25
  end
26
26
 
27
27
  def query
28
- ChangeHealth::Models::EligibilityData.new(response: ChangeHealth::Connection.new.request(endpoint: ENDPOINT, body: self.to_h))
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 Models
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::EligibilityData::PARSE_DATE.call(self.date_info&.dig(f))
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::EligibilityData::PARSE_DATE.call(self.plan_date_range[0])
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::EligibilityData::PARSE_DATE.call(self.plan_date_range[1])
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 Models
2
+ module Response
3
3
  class EligibilityBenefits < Array
4
4
  def initialize(benefits)
5
- super(benefits.map {|benefit| ChangeHealth::Models::EligibilityBenefit.new(benefit) })
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::Models::EligibilityBenefit::HELPERS.each do |key, types|
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
@@ -1,3 +1,3 @@
1
1
  module ChangeHealth
2
- VERSION = '1.0.3'.freeze
2
+ VERSION = '2.0.0'.freeze
3
3
  end
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/eligibility'
10
- require 'change_health/models/eligibility_data'
11
- require 'change_health/models/eligibility_benefit'
12
- require 'change_health/models/eligibility_benefits'
13
- require 'change_health/models/trading_partner'
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/trading_partner_data'
16
- require 'change_health/response/trading_partners_data'
17
- require 'change_health/models/encounter'
18
- require 'change_health/models/provider'
19
- require 'change_health/models/subscriber'
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: 1.0.3
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-04-26 00:00:00.000000000 Z
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/eligibility.rb
151
- - lib/change_health/models/eligibility_benefit.rb
152
- - lib/change_health/models/eligibility_benefits.rb
153
- - lib/change_health/models/eligibility_data.rb
154
- - lib/change_health/models/encounter.rb
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/provider.rb
157
- - lib/change_health/models/subscriber.rb
158
- - lib/change_health/models/trading_partner.rb
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/trading_partner_data.rb
161
- - lib/change_health/response/trading_partners_data.rb
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
- rubyforge_project:
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