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.
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