health-data-standards 3.3.0 → 3.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +16 -0
- data/lib/health-data-standards.rb +3 -0
- data/lib/health-data-standards/export/helper/cat1_view_helper.rb +1 -1
- data/lib/health-data-standards/export/rendering_context.rb +4 -2
- data/lib/health-data-standards/export/template_helper.rb +9 -3
- data/lib/health-data-standards/import/bulk_record_importer.rb +88 -0
- data/lib/health-data-standards/import/cat1/diagnostic_study_order_importer.rb +1 -1
- data/lib/health-data-standards/import/cat1/encounter_performed_importer.rb +38 -0
- data/lib/health-data-standards/import/cat1/patient_importer.rb +4 -4
- data/lib/health-data-standards/import/cat1/procedure_order_importer.rb +2 -2
- data/lib/health-data-standards/import/cat1/procedure_performed_importer.rb +1 -0
- data/lib/health-data-standards/import/cda/allergy_importer.rb +0 -2
- data/lib/health-data-standards/import/cda/encounter_importer.rb +24 -1
- data/lib/health-data-standards/import/cda/medical_equipment_importer.rb +8 -1
- data/lib/health-data-standards/import/cda/medication_importer.rb +0 -4
- data/lib/health-data-standards/import/cda/procedure_importer.rb +23 -2
- data/lib/health-data-standards/import/cda/result_importer.rb +1 -0
- data/lib/health-data-standards/import/cda/section_importer.rb +2 -5
- data/lib/health-data-standards/import/green_c32/encounter_importer.rb +0 -1
- data/lib/health-data-standards/import/green_c32/medication_importer.rb +0 -1
- data/lib/health-data-standards/import/green_c32/section_importer.rb +1 -5
- data/lib/health-data-standards/import/provider_import_utils.rb +15 -1
- data/lib/health-data-standards/models/cqm/aggregate_objects.rb +63 -20
- data/lib/health-data-standards/models/cqm/query_cache.rb +3 -26
- data/lib/health-data-standards/models/encounter.rb +3 -2
- data/lib/health-data-standards/models/entry.rb +8 -1
- data/lib/health-data-standards/models/insurance_provider.rb +0 -4
- data/lib/health-data-standards/models/provider.rb +10 -0
- data/lib/health-data-standards/models/record.rb +31 -8
- data/lib/health-data-standards/models/transfer.rb +8 -0
- data/templates/cat1/_2.16.840.1.113883.10.20.22.4.85.cat1.erb +1 -0
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.101.cat1.erb +6 -3
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.103.cat1.erb +1 -0
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.12.cat1.erb +1 -0
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.13.cat1.erb +1 -0
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.14.cat1.erb +1 -0
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.2.cat1.erb +1 -3
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.20.cat1.erb +6 -2
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.22.cat1.erb +1 -1
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.23.cat1.erb +21 -0
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.28.cat1.erb +6 -2
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.31.cat1.erb +1 -0
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.32.cat1.erb +1 -0
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.34.cat1.erb +1 -0
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.40.cat1.erb +6 -2
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.46.cat1.erb +1 -0
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.54.cat1.erb +1 -0
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.57.cat1.erb +7 -2
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.59.cat1.erb +5 -1
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.66.cat1.erb +3 -3
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.69.cat1.erb +4 -2
- data/templates/cat1/_2.16.840.1.113883.10.20.24.3.7.cat1.erb +1 -1
- data/templates/cat3/_continuous_variable_value.cat3.erb +2 -2
- data/templates/cat3/_measure_data.cat3.erb +19 -19
- data/templates/cat3/_performance_rate.cat3.erb +2 -2
- data/templates/cat3/show.cat3.erb +7 -5
- data/templates/gc32/_advance_directive.gc32.erb +1 -1
- data/templates/gc32/_entry_attributes.gc32.erb +1 -1
- data/templates/gc32/_insurance_provider.gc32.erb +2 -2
- metadata +10 -29
@@ -47,13 +47,10 @@ module HealthDataStandards
|
|
47
47
|
if @value_xpath
|
48
48
|
extract_value(entry_element, entry)
|
49
49
|
end
|
50
|
-
entry.
|
50
|
+
entry.description = entry_element.at_xpath("./cda:text").try("text")
|
51
51
|
if @status_xpath
|
52
52
|
extract_status(entry_element, entry)
|
53
53
|
end
|
54
|
-
if @description_xpath
|
55
|
-
extract_description(entry_element, entry, nrh)
|
56
|
-
end
|
57
54
|
entry
|
58
55
|
end
|
59
56
|
|
@@ -76,7 +73,7 @@ module HealthDataStandards
|
|
76
73
|
end
|
77
74
|
end
|
78
75
|
|
79
|
-
def
|
76
|
+
def extract_reason_description(parent_element, entry, nrh)
|
80
77
|
code_elements = parent_element.xpath(@description_xpath)
|
81
78
|
code_elements.each do |code_element|
|
82
79
|
tag = code_element['value']
|
@@ -17,7 +17,6 @@ module HealthDataStandards
|
|
17
17
|
extract_code(encounter_element, encounter, "./gc32:admissionType", :admit_type)
|
18
18
|
extract_code(encounter_element, encounter, "./gc32:reasonForVisit", :reason)
|
19
19
|
extract_code(encounter_element, encounter)
|
20
|
-
extract_free_text(encounter_element, encounter)
|
21
20
|
|
22
21
|
facility_element = encounter_element.at_xpath("./gc32:facility")
|
23
22
|
if facility_element
|
@@ -22,7 +22,6 @@ module HealthDataStandards
|
|
22
22
|
extract_med_code_attribute(med_element, medication, :vehicle)
|
23
23
|
extract_med_code_attribute(med_element, medication, :reaction)
|
24
24
|
extract_med_code_attribute(med_element, medication, :deliveryMethod)
|
25
|
-
extract_free_text(med_element, medication, "freeTextSig")
|
26
25
|
medication.fulfillment_instructions = extract_node_text(med_element.at_xpath("./gc32:patientInstructions"))
|
27
26
|
medication.dose_indicator = extract_node_text(med_element.at_xpath("./gc32:doseIndicator"))
|
28
27
|
medication.fulfillment_history = extract_fulfillment_history(med_element)
|
@@ -105,7 +105,7 @@ module HealthDataStandards
|
|
105
105
|
extract_status(element, entry)
|
106
106
|
extract_value(element, entry)
|
107
107
|
extract_effective_time(element, entry)
|
108
|
-
entry.
|
108
|
+
entry.description = element.at_xpath("./gc32:freeText").try(:inner_text)
|
109
109
|
entry
|
110
110
|
end
|
111
111
|
|
@@ -159,10 +159,6 @@ module HealthDataStandards
|
|
159
159
|
telecom.preferred = extract_node_attribute(telecom_element, :preferred)
|
160
160
|
telecom
|
161
161
|
end
|
162
|
-
|
163
|
-
def extract_free_text(element, entry, free_text_element="freeText")
|
164
|
-
entry.free_text = extract_node_text(element.at_xpath("./gc32:#{free_text_element}"))
|
165
|
-
end
|
166
162
|
|
167
163
|
private
|
168
164
|
|
@@ -7,7 +7,21 @@ module ProviderImportUtils
|
|
7
7
|
|
8
8
|
def find_or_create_provider(provider_hash)
|
9
9
|
provider = Provider.where(npi: provider_hash[:npi]).first if provider_hash[:npi] && !provider_hash[:npi].empty?
|
10
|
-
provider
|
10
|
+
unless provider
|
11
|
+
if provider_hash[:npi]
|
12
|
+
provider = Provider.create(provider_hash)
|
13
|
+
else
|
14
|
+
provider ||= Provider.resolve_provider(provider_hash) if Provider.respond_to? :resolve_provider
|
15
|
+
|
16
|
+
provider_query = {:title => provider_hash[:title],
|
17
|
+
:given_name => provider_hash[:given_name],
|
18
|
+
:family_name=> provider_hash[:family_name],
|
19
|
+
:specialty => provider_hash[:specialty]}
|
20
|
+
provider ||= Provider.where(provider_query).first
|
21
|
+
provider ||= Provider.create(provider_hash)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
provider
|
11
25
|
end
|
12
26
|
|
13
27
|
# Returns nil if result is an empty string, block allows text munging of result if there is one
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module HealthDataStandards
|
2
2
|
module CQM
|
3
|
-
|
4
3
|
module PopulationSelectors
|
5
4
|
def numerator
|
6
5
|
populations.find {|pop| pop.type == 'NUMER'}
|
@@ -51,42 +50,86 @@ module HealthDataStandards
|
|
51
50
|
population_groups.values.any? { |pops| pops.size > 1 }
|
52
51
|
end
|
53
52
|
end
|
54
|
-
|
55
53
|
class Population
|
56
|
-
attr_accessor :type, :value, :id
|
54
|
+
attr_accessor :type, :value, :id, :stratifications, :supplemental_data
|
55
|
+
|
56
|
+
def initialize
|
57
|
+
@stratifications = []
|
58
|
+
end
|
59
|
+
|
60
|
+
def add_stratification(id,value)
|
61
|
+
unless stratifications.find{|st| st.id == id}
|
62
|
+
stratifications << Stratification.new(id,value)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
57
66
|
end
|
58
67
|
|
59
68
|
class Stratification
|
60
|
-
attr_accessor :id, :
|
69
|
+
attr_accessor :id, :value
|
70
|
+
def initialize(id,value)
|
71
|
+
@id = id
|
72
|
+
@value = value
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
class PopulationGroup
|
61
78
|
include PopulationSelectors
|
79
|
+
attr_accessor :populations
|
80
|
+
def performance_rate
|
81
|
+
numerator_count.to_f /
|
82
|
+
(denominator_count - denominator_exclusions_count - denominator_exceptions_count)
|
83
|
+
end
|
62
84
|
|
63
|
-
def
|
64
|
-
|
85
|
+
def is_cv?
|
86
|
+
populations.any? {|pop| pop.type == 'MSRPOPL'}
|
65
87
|
end
|
88
|
+
|
66
89
|
end
|
67
90
|
|
68
91
|
class AggregateCount
|
69
|
-
attr_accessor :measure_id,
|
70
|
-
alias :populations :top_level_populations
|
71
|
-
include PopulationSelectors
|
92
|
+
attr_accessor :measure_id, :populations, :population_groups
|
72
93
|
|
73
|
-
def initialize
|
74
|
-
@
|
75
|
-
@
|
94
|
+
def initialize(measure_id)
|
95
|
+
@populations = []
|
96
|
+
@measure_id = measure_id
|
97
|
+
@population_groups = []
|
76
98
|
end
|
77
99
|
|
78
|
-
def
|
79
|
-
|
100
|
+
def add_entry(cache_entry)
|
101
|
+
entry_populations = []
|
102
|
+
cache_entry.population_ids.each do |population_type, population_id|
|
103
|
+
population = populations.find{|pop| pop.id == population_id}
|
104
|
+
if population.nil? && population_type != 'stratification'
|
105
|
+
population = Population.new
|
106
|
+
population.type = population_type
|
107
|
+
population.id = population_id
|
108
|
+
populations << population
|
109
|
+
end
|
110
|
+
unless population_type == 'stratification'
|
111
|
+
if cache_entry.is_stratification?
|
112
|
+
strat_id = cache_entry.population_ids['stratification']
|
113
|
+
population.add_stratification(strat_id,cache_entry[population_type])
|
114
|
+
else
|
115
|
+
population.value = cache_entry[population_type]
|
116
|
+
population.supplemental_data = cache_entry.supplemental_data[population_type]
|
117
|
+
end
|
118
|
+
end
|
119
|
+
entry_populations << population if population
|
120
|
+
end
|
121
|
+
pgroup = population_groups.find{|pg| pg.populations.collect{|p| p.id}.sort == entry_populations.collect{|p| p.id}.sort }
|
122
|
+
unless pgroup
|
123
|
+
pg = PopulationGroup.new
|
124
|
+
pg.populations = entry_populations
|
125
|
+
population_groups << pg
|
126
|
+
end
|
80
127
|
end
|
81
128
|
|
82
|
-
def
|
83
|
-
|
84
|
-
(denominator_count - denominator_exclusions_count - denominator_exceptions_count)
|
129
|
+
def is_cv?
|
130
|
+
populations.any? {|pop| pop.type == 'MSRPOPL'}
|
85
131
|
end
|
86
132
|
|
87
|
-
def supplemental_data_for(population_type, supplemental_data_type)
|
88
|
-
supplemental_data[population_type][supplemental_data_type]
|
89
|
-
end
|
90
133
|
end
|
91
134
|
end
|
92
135
|
end
|
@@ -23,20 +23,9 @@ module HealthDataStandards
|
|
23
23
|
|
24
24
|
def self.aggregate_measure(measure_id, effective_date, filter=nil, test_id=nil)
|
25
25
|
cache_entries = self.where(effective_date: effective_date, measure_id: measure_id, test_id: test_id, filter: filter)
|
26
|
-
aggregate_count = AggregateCount.new
|
27
|
-
aggregate_count.measure_id = measure_id
|
26
|
+
aggregate_count = AggregateCount.new(measure_id)
|
28
27
|
cache_entries.each do |cache_entry|
|
29
|
-
|
30
|
-
stratification = Stratification.new
|
31
|
-
stratification.populations = cache_entry.build_populations
|
32
|
-
stratification.id = cache_entry.population_ids['stratification']
|
33
|
-
aggregate_count.stratifications << stratification
|
34
|
-
else
|
35
|
-
aggregate_count.top_level_populations = cache_entry.build_populations
|
36
|
-
if cache_entry.supplemental_data.present?
|
37
|
-
aggregate_count.supplemental_data = cache_entry.supplemental_data
|
38
|
-
end
|
39
|
-
end
|
28
|
+
aggregate_count.add_entry(cache_entry)
|
40
29
|
end
|
41
30
|
aggregate_count
|
42
31
|
end
|
@@ -49,19 +38,7 @@ module HealthDataStandards
|
|
49
38
|
population_ids.has_key?('MSRPOPL')
|
50
39
|
end
|
51
40
|
|
52
|
-
|
53
|
-
populations = []
|
54
|
-
population_ids.each do |population_type, population_id|
|
55
|
-
unless population_type == 'stratification'
|
56
|
-
population = Population.new
|
57
|
-
population.type = population_type
|
58
|
-
population.id = population_id
|
59
|
-
population.value = self[population_type]
|
60
|
-
populations << population
|
61
|
-
end
|
62
|
-
end
|
63
|
-
populations
|
64
|
-
end
|
41
|
+
|
65
42
|
end
|
66
43
|
end
|
67
44
|
end
|
@@ -3,8 +3,9 @@ class Encounter < Entry
|
|
3
3
|
field :dischargeDisposition, type: Hash
|
4
4
|
field :admitTime, type: Integer
|
5
5
|
field :dischargeTime, type: Integer
|
6
|
-
|
7
|
-
|
6
|
+
|
7
|
+
embeds_one :transferTo, class_name: "Transfer"
|
8
|
+
embeds_one :transferFrom, class_name: "Transfer"
|
8
9
|
|
9
10
|
embeds_one :facility
|
10
11
|
embeds_one :reason, class_name: "Entry"
|
@@ -15,7 +15,6 @@ class Entry
|
|
15
15
|
field :start_time, type: Integer
|
16
16
|
field :end_time, type: Integer
|
17
17
|
field :status_code, type: Hash
|
18
|
-
field :free_text, type: String
|
19
18
|
field :mood_code, type: String, default: "EVN"
|
20
19
|
field :negationInd, type: Boolean
|
21
20
|
field :negationReason, type: Hash
|
@@ -206,4 +205,12 @@ class Entry
|
|
206
205
|
self.time = self.time.nil? ? nil : (self.time + date_diff)
|
207
206
|
end
|
208
207
|
|
208
|
+
def identifier
|
209
|
+
if respond_to?(:cda_identifier) && self.cda_identifier.present?
|
210
|
+
self.cda_identifier
|
211
|
+
else
|
212
|
+
self.id
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
209
216
|
end
|
@@ -8,14 +8,10 @@ class InsuranceProvider < Entry
|
|
8
8
|
embeds_one :subscriber, class_name: "Person"
|
9
9
|
|
10
10
|
field :type, type: String
|
11
|
-
field :time, type: Integer
|
12
|
-
field :start_time, type: Integer
|
13
|
-
field :end_time, type: Integer
|
14
11
|
field :member_id, type: String
|
15
12
|
field :relationship, type: Hash
|
16
13
|
field :financial_responsibility_type, type: Hash
|
17
14
|
field :name, type: String
|
18
|
-
field :free_text, type: String
|
19
15
|
|
20
16
|
|
21
17
|
def shift_dates(date_diff)
|
@@ -47,4 +47,14 @@ class Provider
|
|
47
47
|
|
48
48
|
return sum.to_s
|
49
49
|
end
|
50
|
+
|
51
|
+
#this is intentially left blank. When using the ProviderImporter class this method will be called
|
52
|
+
# if a parsed provider can not be found in the database if the parsed provider does not have an
|
53
|
+
# npi number associated with it. This allows applications to handle this how they see fit by redefining
|
54
|
+
# this method. If this method call return nil an attempt will be made to discover the Provider by name
|
55
|
+
# matching and if that fails a Provider will be created in the db based on the information in the parsed
|
56
|
+
# hase
|
57
|
+
def self.resolve_provider(provider_hash)
|
58
|
+
|
59
|
+
end
|
50
60
|
end
|
@@ -54,6 +54,17 @@ class Record
|
|
54
54
|
scope :by_provider, ->(prov, effective_date) { (effective_date) ? where(provider_queries(prov.id, effective_date)) : where('provider_performances.provider_id'=>prov.id) }
|
55
55
|
scope :by_patient_id, ->(id) { where(:medical_record_number => id) }
|
56
56
|
|
57
|
+
def self.update_or_create(data)
|
58
|
+
existing = Record.where(medical_record_number: data.medical_record_number).first
|
59
|
+
if existing
|
60
|
+
existing.update_attributes!(data.attributes.except('_id'))
|
61
|
+
existing
|
62
|
+
else
|
63
|
+
data.save!
|
64
|
+
data
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
57
68
|
def providers
|
58
69
|
provider_performances.map {|pp| pp.provider }
|
59
70
|
end
|
@@ -79,20 +90,32 @@ class Record
|
|
79
90
|
alias :clinical_trial_participant :clinicalTrialParticipant
|
80
91
|
alias :clinical_trial_participant= :clinicalTrialParticipant=
|
81
92
|
|
82
|
-
|
83
|
-
#
|
84
|
-
#
|
85
|
-
|
93
|
+
|
94
|
+
# Remove duplicate entries from a section based on cda_identifier or id.
|
95
|
+
# This method may lose information because it does not compare entries
|
96
|
+
# based on clinical content
|
97
|
+
def dedup_section_ignoring_content!(section)
|
86
98
|
unique_entries = self.send(section).uniq do |entry|
|
87
|
-
|
88
|
-
|
99
|
+
entry.identifier
|
100
|
+
end
|
101
|
+
self.send("#{section}=", unique_entries)
|
102
|
+
end
|
103
|
+
def dedup_section_merging_codes_and_values!(section)
|
104
|
+
unique_entries = {}
|
105
|
+
self.send(section).each do |entry|
|
106
|
+
if unique_entries[entry.identifier]
|
107
|
+
unique_entries[entry.identifier].codes = unique_entries[entry.identifier].codes.deep_merge(entry.codes)
|
108
|
+
unique_entries[entry.identifier].values.concat(entry.values)
|
89
109
|
else
|
90
|
-
entry.
|
110
|
+
unique_entries[entry.identifier] = entry
|
91
111
|
end
|
92
112
|
end
|
93
|
-
self.send("#{section}=", unique_entries)
|
113
|
+
self.send("#{section}=", unique_entries.values)
|
94
114
|
end
|
95
115
|
|
116
|
+
def dedup_section!(section)
|
117
|
+
[:results, :procedures].include?(section) ? dedup_section_merging_codes_and_values!(section) : dedup_section_ignoring_content!(section)
|
118
|
+
end
|
96
119
|
def dedup_record!
|
97
120
|
Record::Sections.each {|section| self.dedup_section!(section)}
|
98
121
|
end
|
@@ -13,13 +13,16 @@
|
|
13
13
|
<value xsi:type="PQ"
|
14
14
|
<% if entry.codes['SNOMED-CT'].include?('80487005')-%>
|
15
15
|
value="39"
|
16
|
-
<% elsif entry.codes['SNOMED-CT'].include?('
|
17
|
-
value="
|
16
|
+
<% elsif entry.codes['SNOMED-CT'].include?('13798002')-%>
|
17
|
+
value="38"
|
18
18
|
<% elsif entry.codes['SNOMED-CT'].include?('43697006')-%>
|
19
19
|
value="37"
|
20
|
+
<% elsif entry.codes['SNOMED-CT'].include?('931004')-%>
|
21
|
+
value="36"
|
20
22
|
<% else -%>
|
21
23
|
nullFlavor="UNK"
|
22
24
|
<% end -%>
|
23
|
-
unit="wk"/>
|
25
|
+
unit="wk"/>
|
26
|
+
<text><%= entry.description %></text>
|
24
27
|
</observation>
|
25
28
|
</entry>
|
@@ -8,5 +8,6 @@
|
|
8
8
|
<%== code_display(entry, 'preferred_code_sets' => ['SNOMED-CT'],
|
9
9
|
'tag_name' => 'value','value_set_map' => value_set_map,
|
10
10
|
'extra_content' => "xsi:type=\"CD\" sdtc:valueSet=\"#{value_set_oid}\"") %>
|
11
|
+
<text><%= entry.description %></text>
|
11
12
|
</observation>
|
12
13
|
</entry>
|
@@ -43,6 +43,7 @@
|
|
43
43
|
<%== code_display(entry, 'value_set_map' => value_set_map,'preferred_code_sets' => ['SNOMED-CT'],
|
44
44
|
'tag_name' => 'value',
|
45
45
|
'extra_content' => "xsi:type=\"CD\" sdtc:valueSet=\"#{value_set_oid}\"") %>
|
46
|
+
<text><%= entry.description %></text>
|
46
47
|
</observation>
|
47
48
|
</component>
|
48
49
|
</organizer>
|
@@ -18,6 +18,7 @@
|
|
18
18
|
<%== render(:partial => 'ordinality', :locals => {:entry => entry, :ordinality_oids=>field_oids["ORDINAL"]}) %>
|
19
19
|
|
20
20
|
<%== code_display(entry, 'value_set_map' => value_set_map,'tag_name' => 'value', 'preferred_code_sets' => ['SNOMED-CT', 'ICD-9-CM', 'ICD-10-CM', 'LOINC'], 'extra_content' => "xsi:type=\"CD\" sdtc:valueSet=\"#{value_set_oid}\"") %>
|
21
|
+
<text><%= entry.description %></text>
|
21
22
|
<!-- Status -->
|
22
23
|
<entryRelationship typeCode="REFR">
|
23
24
|
<observation classCode="OBS" moodCode="EVN">
|
@@ -18,6 +18,7 @@
|
|
18
18
|
|
19
19
|
<%== code_display(entry, 'value_set_map' => value_set_map,'tag_name' => 'value', 'preferred_code_sets' => ['SNOMED-CT', 'ICD-9-CM', 'ICD-10-CM', 'CPT'],
|
20
20
|
'extra_content' => "xsi:type=\"CD\" sdtc:valueSet=\"#{value_set_oid}\"") %>
|
21
|
+
<text><%= entry.description %></text>
|
21
22
|
<!-- Status -->
|
22
23
|
<entryRelationship typeCode="REFR">
|
23
24
|
<observation classCode="OBS" moodCode="EVN">
|