qrda_generator 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. data/Gemfile +12 -0
  2. data/Rakefile +12 -0
  3. data/lib/qrda_generator/export/cat_1.rb +136 -0
  4. data/lib/qrda_generator/export/entry_template_resolver.rb +29 -0
  5. data/lib/qrda_generator/railtie.rb +7 -0
  6. data/lib/qrda_generator.rb +20 -0
  7. data/templates/_2.16.840.1.113883.10.20.24.3.1.cat1.erb +14 -0
  8. data/templates/_2.16.840.1.113883.10.20.24.3.101.cat1.erb +25 -0
  9. data/templates/_2.16.840.1.113883.10.20.24.3.103.cat1.erb +12 -0
  10. data/templates/_2.16.840.1.113883.10.20.24.3.105.cat1.erb +60 -0
  11. data/templates/_2.16.840.1.113883.10.20.24.3.11.cat1.erb +40 -0
  12. data/templates/_2.16.840.1.113883.10.20.24.3.12.cat1.erb +50 -0
  13. data/templates/_2.16.840.1.113883.10.20.24.3.13.cat1.erb +37 -0
  14. data/templates/_2.16.840.1.113883.10.20.24.3.14.cat1.erb +35 -0
  15. data/templates/_2.16.840.1.113883.10.20.24.3.17.cat1.erb +22 -0
  16. data/templates/_2.16.840.1.113883.10.20.24.3.18.cat1.erb +21 -0
  17. data/templates/_2.16.840.1.113883.10.20.24.3.2.cat1.erb +28 -0
  18. data/templates/_2.16.840.1.113883.10.20.24.3.20.cat1.erb +20 -0
  19. data/templates/_2.16.840.1.113883.10.20.24.3.22.cat1.erb +21 -0
  20. data/templates/_2.16.840.1.113883.10.20.24.3.23.cat1.erb +47 -0
  21. data/templates/_2.16.840.1.113883.10.20.24.3.28.cat1.erb +20 -0
  22. data/templates/_2.16.840.1.113883.10.20.24.3.3.cat1.erb +24 -0
  23. data/templates/_2.16.840.1.113883.10.20.24.3.31.cat1.erb +20 -0
  24. data/templates/_2.16.840.1.113883.10.20.24.3.32.cat1.erb +15 -0
  25. data/templates/_2.16.840.1.113883.10.20.24.3.34.cat1.erb +58 -0
  26. data/templates/_2.16.840.1.113883.10.20.24.3.37.cat1.erb +20 -0
  27. data/templates/_2.16.840.1.113883.10.20.24.3.38.cat1.erb +16 -0
  28. data/templates/_2.16.840.1.113883.10.20.24.3.4.cat1.erb +27 -0
  29. data/templates/_2.16.840.1.113883.10.20.24.3.40.cat1.erb +17 -0
  30. data/templates/_2.16.840.1.113883.10.20.24.3.41.cat1.erb +46 -0
  31. data/templates/_2.16.840.1.113883.10.20.24.3.42.cat1.erb +37 -0
  32. data/templates/_2.16.840.1.113883.10.20.24.3.43.cat1.erb +24 -0
  33. data/templates/_2.16.840.1.113883.10.20.24.3.44.cat1.erb +24 -0
  34. data/templates/_2.16.840.1.113883.10.20.24.3.45.cat1.erb +26 -0
  35. data/templates/_2.16.840.1.113883.10.20.24.3.46.cat1.erb +30 -0
  36. data/templates/_2.16.840.1.113883.10.20.24.3.47.cat1.erb +26 -0
  37. data/templates/_2.16.840.1.113883.10.20.24.3.51.cat1.erb +13 -0
  38. data/templates/_2.16.840.1.113883.10.20.24.3.54.cat1.erb +16 -0
  39. data/templates/_2.16.840.1.113883.10.20.24.3.55.cat1.erb +10 -0
  40. data/templates/_2.16.840.1.113883.10.20.24.3.57.cat1.erb +19 -0
  41. data/templates/_2.16.840.1.113883.10.20.24.3.59.cat1.erb +17 -0
  42. data/templates/_2.16.840.1.113883.10.20.24.3.62.cat1.erb +36 -0
  43. data/templates/_2.16.840.1.113883.10.20.24.3.63.cat1.erb +23 -0
  44. data/templates/_2.16.840.1.113883.10.20.24.3.64.cat1.erb +29 -0
  45. data/templates/_2.16.840.1.113883.10.20.24.3.66.cat1.erb +34 -0
  46. data/templates/_2.16.840.1.113883.10.20.24.3.69.cat1.erb +23 -0
  47. data/templates/_2.16.840.1.113883.10.20.24.3.7.cat1.erb +29 -0
  48. data/templates/_2.16.840.1.113883.10.20.24.3.76.cat1.erb +32 -0
  49. data/templates/_measures.cat1.erb +68 -0
  50. data/templates/_ordinality.cat1.erb +4 -0
  51. data/templates/_patient_data.cat1.erb +14 -0
  52. data/templates/_reason.cat1.erb +16 -0
  53. data/templates/_record_target.cat1.erb +39 -0
  54. data/templates/_reporting_parameters.cat1.erb +24 -0
  55. data/templates/_result_value.cat1.erb +16 -0
  56. data/templates/show.cat1.erb +125 -0
  57. metadata +197 -0
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'pry'
6
+ gem 'pry-nav'
7
+ gem 'rake'
8
+
9
+ group :test do
10
+ gem 'mocha'
11
+ gem 'simplecov', :require => false
12
+ end
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ require 'rake/testtask'
2
+ require "simplecov"
3
+
4
+ Rake::TestTask.new(:test_unit) do |t|
5
+ t.libs << "test"
6
+ t.test_files = FileList['test/**/*_test.rb']
7
+ t.verbose = true
8
+ end
9
+
10
+ task :test => [:test_unit] do
11
+ system("open coverage/index.html")
12
+ end
@@ -0,0 +1,136 @@
1
+ module QrdaGenerator
2
+ module Export
3
+ module Cat1
4
+ include HealthDataStandards::Export::TemplateHelper
5
+ include HealthDataStandards::Util
6
+ include HealthDataStandards::SVS
7
+
8
+ @@vs_map = nil
9
+ def export(patient, measures, start_date, end_date)
10
+ self.template_format = "cat1"
11
+ self.template_directory = File.dirname(__FILE__)
12
+ render(:template => 'show', :locals => {:patient => patient, :measures => measures,
13
+ :start_date => start_date, :end_date => end_date})
14
+ end
15
+
16
+ def value_set_map
17
+ @@vs_map ||= Hash[*ValueSet.all.map{ |p| [p.oid, p] }.flatten]
18
+ end
19
+
20
+ # Find all of the entries on a patient that match the given data criteria
21
+ def entries_for_data_criteria(data_criteria, patient)
22
+ data_criteria_oid = HQMFTemplateHelper.template_id_by_definition_and_status(data_criteria.definition,
23
+ data_criteria.status || '',
24
+ data_criteria.negation)
25
+ filtered_entries = []
26
+ case data_criteria_oid
27
+ when '2.16.840.1.113883.3.560.1.404'
28
+ filtered_entries = handle_patient_expired(patient)
29
+ when '2.16.840.1.113883.3.560.1.401'
30
+ filtered_entries = handle_clinical_trial_participant(patient)
31
+ else
32
+ entries = patient.entries_for_oid(data_criteria_oid)
33
+ codes = []
34
+ vs = value_set_map[data_criteria.code_list_id]
35
+ if vs
36
+ codes = vs.code_set_map
37
+ else
38
+ QrdaGenerator.logger.warn("No codes for #{data_criteria.code_list_id}")
39
+ end
40
+ filtered_entries = entries.find_all do |entry|
41
+ # This special case is for when the code list is a reason
42
+ if data_criteria.code_list_id =~ /2\.16\.840\.1\.113883\.3\.526\.3\.100[7-9]/
43
+ entry.negation_reason.present? && codes.first['values'].include?(entry.negation_reason['code'])
44
+ else
45
+ # The !! hack makes sure that negation_ind is a boolean
46
+ entry.is_in_code_set?(codes) && !!entry.negation_ind == data_criteria.negation
47
+ end
48
+ end
49
+ end
50
+ if filtered_entries.empty?
51
+ QrdaGenerator.logger.debug("No entries for #{data_criteria.title}")
52
+ end
53
+
54
+ filtered_entries
55
+ end
56
+
57
+ # Given a set of measures, find the data criteria/value set pairs that are unique across all of them
58
+ # Returns an Array of Hashes. Hashes will have a three key/value pairs. One for the data criteria oid,
59
+ # one for the value set oid and one for the data criteria itself
60
+ def unique_data_criteria(measures)
61
+ all_data_criteria = measures.map {|measure| measure.all_data_criteria}.flatten
62
+ dc_oids_and_vs_oids = all_data_criteria.map do |data_criteria|
63
+ data_criteria_oid = HQMFTemplateHelper.template_id_by_definition_and_status(data_criteria.definition,
64
+ (data_criteria.status || ""),
65
+ data_criteria.negation)
66
+ value_set_oid = data_criteria.code_list_id
67
+ {'data_criteria_oid' => data_criteria_oid, 'value_set_oid' => value_set_oid, 'data_criteria' => data_criteria}
68
+ end
69
+ dc_oids_and_vs_oids.uniq_by {|thingy| [thingy['data_criteria_oid'], thingy['value_set_oid']]}
70
+ end
71
+
72
+ def render_data_criteria(dc_oid, vs_oid, entries)
73
+ html_array = entries.map do |entry|
74
+ if dc_oid == '2.16.840.1.113883.3.560.1.1001'
75
+ # This is a special case. This HQMF OID maps to more than one QRDA OID.
76
+ # So we need to try to figure out what template we should use based on the
77
+ # content of the entry
78
+ if vs_oid == '2.16.840.1.113883.3.526.3.1279'
79
+ # Patient Characteristic Observation Assertion template for
80
+ # Patient Characteristic: ECOG Performance Status-Poor
81
+ render(:partial => '2.16.840.1.113883.10.20.24.3.103', :locals => {:entry => entry,
82
+ :value_set_oid => vs_oid})
83
+ elsif vs_oid == "2.16.840.1.113883.3.117.1.7.1.402" || vs_oid == "2.16.840.1.113883.3.117.1.7.1.403"
84
+ # Patient Charasteristic Gestational Age
85
+ render(:partial => '2.16.840.1.113883.10.20.24.3.101', :locals => {:entry => entry,
86
+ :value_set_oid => vs_oid})
87
+ end
88
+ else
89
+ render(:partial => EntryTemplateResolver.partial_for(dc_oid), :locals => {:entry => entry,
90
+ :value_set_oid => vs_oid})
91
+ end
92
+ end
93
+ html_array.join("\n")
94
+ end
95
+
96
+ def render_patient_data(patient, measures)
97
+ udcs = unique_data_criteria(measures)
98
+ data_criteria_html = udcs.map do |udc|
99
+ entries = entries_for_data_criteria(udc['data_criteria'], patient)
100
+ render_data_criteria(udc['data_criteria_oid'], udc['value_set_oid'], entries)
101
+ end
102
+ data_criteria_html.compact.join("\n")
103
+ end
104
+
105
+ def negation_indicator(entry)
106
+ if entry.negation_ind
107
+ 'negationInd="true"'
108
+ else
109
+ ''
110
+ end
111
+ end
112
+
113
+ def handle_clinical_trial_participant(patient)
114
+ if patient.clinical_trial_participant
115
+ [{dummy_entry: true}]
116
+ else
117
+ []
118
+ end
119
+ end
120
+
121
+ def handle_patient_expired(patient)
122
+ if patient.expired
123
+ [OpenStruct.new(start_date: patient.deathdate)]
124
+ else
125
+ []
126
+ end
127
+ end
128
+
129
+ extend self
130
+ end
131
+ end
132
+ end
133
+
134
+ HealthDataStandards::Export::RenderingContext.class_eval do
135
+ include QrdaGenerator::Export::Cat1
136
+ end
@@ -0,0 +1,29 @@
1
+ module QrdaGenerator
2
+ module Export
3
+ module EntryTemplateResolver
4
+ def hqmf_qrda_oid_map
5
+ if @hqmf_qrda_oid_map.blank?
6
+ template_id_file = File.expand_path('../hqmf-qrda-oids.json', __FILE__)
7
+ @hqmf_qrda_oid_map = JSON.parse(File.read(template_id_file))
8
+ end
9
+ @hqmf_qrda_oid_map
10
+ end
11
+
12
+ def qrda_oid_exist?(oid)
13
+ hqmf_qrda_oid_map.any? {|map_tuple| map_tuple['qrda_oid'] == oid}
14
+ end
15
+
16
+ def qrda_oid_for_hqmf_oid(hqmf_oid)
17
+ oid_tuple = hqmf_qrda_oid_map.find {|map_tuple| map_tuple['hqmf_oid'] == hqmf_oid }
18
+ if oid_tuple.nil?
19
+ puts "no qrda oid for #{hqmf_oid}"
20
+ end
21
+ oid_tuple['qrda_oid']
22
+ end
23
+
24
+ alias :partial_for :qrda_oid_for_hqmf_oid
25
+
26
+ extend self
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,7 @@
1
+ module QrdaGenerator
2
+ class Railtie < Rails::Railtie
3
+ initializer 'Rails logger' do
4
+ QrdaGenerator.logger = Rails.logger
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,20 @@
1
+ require 'health-data-standards'
2
+ require 'hqmf-parser'
3
+ require 'ostruct'
4
+ require 'log4r'
5
+
6
+ require_relative 'qrda_generator/export/cat_1'
7
+ require_relative 'qrda_generator/export/entry_template_resolver'
8
+
9
+ module QrdaGenerator
10
+ class << self
11
+ attr_accessor :logger
12
+ end
13
+ end
14
+
15
+ if defined?(Rails)
16
+ require_relative 'qrda_generator/railtie'
17
+ else
18
+ QrdaGenerator.logger = Log4r::Logger.new("QRDA Generator")
19
+ QrdaGenerator.logger.outputters = Log4r::Outputter.stdout
20
+ end
@@ -0,0 +1,14 @@
1
+ <entry>
2
+ <observation classCode="OBS" moodCode="GOL">
3
+ <!-- 2.16.840.1.113883.10.20.22.4.44 Plan of Care Activity Observation -->
4
+ <templateId root="2.16.840.1.113883.10.20.22.4.44"/>
5
+ <templateId root="2.16.840.1.113883.10.20.24.3.1"/>
6
+ <id root="<%= entry.id %>"/>
7
+ <%== code_display(entry, :extra_content => "sdtc:valueSet=\"#{value_set_oid}\"") %>
8
+ <text><%= entry.description %></text>
9
+ <statusCode code="active"/>
10
+ <effectiveTime>
11
+ <low <%= value_or_null_flavor(entry.start_time) %>/>
12
+ </effectiveTime>
13
+ </observation>
14
+ </entry>
@@ -0,0 +1,25 @@
1
+ <entry>
2
+ <observation classCode="OBS" moodCode="EVN">
3
+ <templateId root="2.16.840.1.113883.10.20.24.3.101"/>
4
+ <id root="<%= entry.id %>"/>
5
+ <code code="57036006"
6
+ codeSystem="2.16.840.1.113883.6.96"
7
+ codeSystemName="SNOMED-CT"
8
+ displayName="length of gestation"/>
9
+
10
+ <statusCode code="completed"/>
11
+ <effectiveTime <%= value_or_null_flavor(entry.as_point_in_time) %>/>
12
+ <!-- ?Note: valueSet of PQ "d" and "wk"-->
13
+ <value xsi:type="PQ"
14
+ <% if entry.codes['SNOMED-CT'].include?('80487005')-%>
15
+ value="39"
16
+ <% elsif entry.codes['SNOMED-CT'].include?('931004')-%>
17
+ value="36"
18
+ <% elsif entry.codes['SNOMED-CT'].include?('43697006')-%>
19
+ value="37"
20
+ <% else -%>
21
+ nullFlavor="UNK"
22
+ <% end -%>
23
+ unit="wk"/>
24
+ </observation>
25
+ </entry>
@@ -0,0 +1,12 @@
1
+ <entry>
2
+ <observation classCode="OBS" moodCode="EVN">
3
+ <templateId root="2.16.840.1.113883.10.20.24.3.103"/>
4
+ <id root="<%= entry.id %>"/>
5
+ <code code="ASSERTION" codeSystem="2.16.840.1.113883.5.4" />
6
+ <statusCode code="completed" />
7
+ <effectiveTime <%= value_or_null_flavor(entry.start_time) %>/>
8
+ <%== code_display(entry, 'preferred_code_sets' => ['SNOMED-CT'],
9
+ 'tag_name' => 'value',
10
+ 'extra_content' => "xsi:type=\"CD\" sdtc:valueSet=\"#{value_set_oid}\"") %>
11
+ </observation>
12
+ </entry>
@@ -0,0 +1,60 @@
1
+ <entry>
2
+ <act classCode="ACT" moodCode="EVN">
3
+ <!-- Discharge Medication Entry -->
4
+ <templateId root="2.16.840.1.113883.10.20.24.4.105"/>
5
+ <id root="<%= entry.id %>"/>
6
+ <code code="10183-2"
7
+ codeSystem="2.16.840.1.113883.6.1"
8
+ codeSystemName="LOINC"
9
+ displayName="Discharge medication"/>
10
+ <statusCode code="active"/>
11
+ <effectiveTime>
12
+ <low <%= value_or_null_flavor(entry.start_time) %>/>
13
+ </effectiveTime>
14
+ <entryRelationship typeCode="SUBJ">
15
+ <substanceAdministration moodCode="EVN" classCode="SBADM">
16
+ <!-- Medication Activity (consolidation) template -->
17
+ <templateId root="2.16.840.1.113883.10.20.22.4.16"/>
18
+ <!-- Medication, Active template -->
19
+ <templateId root="2.16.840.1.113883.10.20.24.3.41"/>
20
+
21
+ <id root="<%= UUID.generate %>"/>
22
+ <text><%= entry.description %></text>
23
+ <statusCode code="active"/>
24
+ <effectiveTime xsi:type="IVL_TS">
25
+ <low <%= value_or_null_flavor(entry.start_time) %>/>
26
+ <high <%= value_or_null_flavor(entry.end_time) %>/>
27
+ </effectiveTime>
28
+
29
+ <% if entry.route.present? -%>
30
+ <!-- Attribute: route -->
31
+ <routeCode code="<%= entry.route['code'] %>" codeSystem="<%= entry.route['codeSystem'] %>"/>
32
+ <% end -%>
33
+
34
+ <!-- Attribute: dose -->
35
+ <% if entry.dose.present? -%>
36
+ <doseQuantity value="<%= entry.dose['value']%>"/>
37
+ <% end -%>
38
+
39
+
40
+ <% if entry.product_form.present? -%>
41
+ <administrationUnitCode code="<%= entry.product_form['code'] %>" codeSystem="<%= entry.product_form['codeSystem'] %>"/>
42
+ <% end -%>
43
+
44
+ <consumable>
45
+ <manufacturedProduct classCode="MANU">
46
+ <!-- Medication Information (consolidation) template -->
47
+ <templateId root="2.16.840.1.113883.10.20.22.4.23"/>
48
+ <id root="<%= UUID.generate %>"/>
49
+ <manufacturedMaterial>
50
+ <%== code_display(entry, :extra_content => "sdtc:valueSet=\"#{value_set_oid}\"") %>
51
+ </manufacturedMaterial>
52
+ <manufacturerOrganization>
53
+ <name>Medication Factory Inc.</name>
54
+ </manufacturerOrganization>
55
+ </manufacturedProduct>
56
+ </consumable>
57
+ </substanceAdministration>
58
+ </entryRelationship>
59
+ </act>
60
+ </entry>
@@ -0,0 +1,40 @@
1
+ <entry>
2
+ <!--Diagnosis active: diabetes-->
3
+ <observation classCode="OBS" moodCode="EVN">
4
+ <!-- Problem observation template -->
5
+ <templateId root="2.16.840.1.113883.10.20.22.4.4"/>
6
+ <!-- Diagnosis active template -->
7
+ <templateId root="2.16.840.1.113883.10.20.24.3.11"/>
8
+ <id root="<%= entry.id %>"/>
9
+ <code code="282291009" displayName="diagnosis" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED-CT"/>
10
+ <text><%= entry.description %></text>
11
+ <statusCode code="completed"/>
12
+ <effectiveTime>
13
+ <!-- Attribute: admission datetime -->
14
+ <low <%= value_or_null_flavor(entry.start_time) %>/>
15
+ <!-- Attribute: discharge datetime -->
16
+ <high <%= value_or_null_flavor(entry.end_time) %>/>
17
+ </effectiveTime>
18
+ <%== code_display(entry, {'tag_name' => 'value', 'preferred_code_sets' => ['LOINC', 'SNOMED-CT', 'ICD-9-CM', 'ICD-10-CM'],
19
+ 'extra_content' => "xsi:type=\"CD\" sdtc:valueSet=\"#{value_set_oid}\""}) %>
20
+
21
+ <entryRelationship typeCode="REFR">
22
+ <observation classCode="OBS" moodCode="EVN">
23
+ <!-- Problem Status (consolidation) template -->
24
+ <templateId root="2.16.840.1.113883.10.20.22.4.6"/>
25
+ <!-- Problem Status, Active template -->
26
+ <templateId root="2.16.840.1.113883.10.20.24.3.94"/>
27
+ <id root="<%= UUID.generate %>"/>
28
+ <code code="33999-4"
29
+ codeSystem="2.16.840.1.113883.6.1"
30
+ codeSystemName="LOINC"
31
+ displayName="status"/>
32
+ <statusCode code="completed"/>
33
+ <value xsi:type="CD" code="55561003"
34
+ displayName="active"
35
+ codeSystem="2.16.840.1.113883.6.96"
36
+ codeSystemName="SNOMED CT"/>
37
+ </observation>
38
+ </entryRelationship>
39
+ </observation>
40
+ </entry>
@@ -0,0 +1,50 @@
1
+ <entry typeCode="DRIV">
2
+ <organizer moodCode="EVN" classCode="CLUSTER">
3
+ <templateId root="2.16.840.1.113883.10.20.22.4.45"/>
4
+ <!-- Family history organizer template -->
5
+ <templateId root="2.16.840.1.113883.10.20.24.3.12"/>
6
+ <statusCode code="completed"/>
7
+ <effectiveTime>
8
+ <low <%= value_or_null_flavor(entry.start_time) %>/>
9
+ <high <%= value_or_null_flavor(entry.end_time) %>/>
10
+ </effectiveTime>
11
+ <!-- The subject is currently hardcoded to father -->
12
+ <subject>
13
+ <relatedSubject classCode="PRS">
14
+ <code code="FTH" displayName="Father"
15
+ codeSystemName="HL7RoleCode"
16
+ codeSystem="2.16.840.1.113883.5.111">
17
+ <translation code="9947008"
18
+ displayName="Biological father"
19
+ codeSystemName="SNOMED CT"
20
+ codeSystem="2.16.840.1.113883.6.96"/>
21
+ </code>
22
+ <subject>
23
+ <administrativeGenderCode
24
+ code="M" codeSystem="2.16.840.1.113883.5.1"
25
+ codeSystemName="HL7AdministrativeGender"
26
+ displayName="Male"/>
27
+ <birthTime value="1912"/>
28
+ </subject>
29
+ </relatedSubject>
30
+ </subject>
31
+ <component>
32
+ <observation classCode="OBS" moodCode="EVN">
33
+ <templateId root="2.16.840.1.113883.10.20.22.4.46"/>
34
+ <id root="<%= entry.id %>"/>
35
+ <code code="55607006" displayName="Problem"
36
+ codeSystemName="SNOMED CT"
37
+ codeSystem="2.16.840.1.113883.6.96"/>
38
+ <statusCode code="completed"/>
39
+ <effectiveTime>
40
+ <low <%= value_or_null_flavor(entry.start_time) %>/>
41
+ <high <%= value_or_null_flavor(entry.end_time) %>/>
42
+ </effectiveTime>
43
+ <%== code_display(entry, 'preferred_code_sets' => ['SNOMED-CT'],
44
+ 'tag_name' => 'value',
45
+ 'extra_content' => "xsi:type=\"CD\" sdtc:valueSet=\"#{value_set_oid}\"") %>
46
+ </observation>
47
+ </component>
48
+ </organizer>
49
+ </entry>
50
+
@@ -0,0 +1,37 @@
1
+ <entry>
2
+ <observation classCode="OBS" moodCode="EVN">
3
+ <!-- Problem observation template -->
4
+ <templateId root="2.16.840.1.113883.10.20.22.4.4"/>
5
+ <!-- Diagnosis, inactive template -->
6
+ <templateId root="2.16.840.1.113883.10.20.24.3.13"/>
7
+ <id root="<%= entry.id %>"/>
8
+ <code code="282291009" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED CT" displayName="diagnosis"/>
9
+
10
+ <statusCode code="completed"/>
11
+
12
+ <effectiveTime>
13
+ <!-- Attribute: Start Datetime -->
14
+ <low <%= value_or_null_flavor(entry.start_time) %>/>
15
+ <!-- Attribute: Stop Datetime -->
16
+ <high <%= value_or_null_flavor(entry.end_time) %>/>
17
+ </effectiveTime>
18
+ <%== render(:partial => 'ordinality', :locals => {:entry => entry}) %>
19
+
20
+ <%== code_display(entry, '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
+ <!-- Status -->
22
+ <entryRelationship typeCode="REFR">
23
+ <observation classCode="OBS" moodCode="EVN">
24
+ <!-- Problem Status (consolidation) template -->
25
+ <templateId root="2.16.840.1.113883.10.20.22.4.6"/>
26
+ <!-- Problem Status, Inactive template -->
27
+ <templateId root="2.16.840.1.113883.10.20.24.3.95"/>
28
+ <id root="<%= UUID.generate %>"/>
29
+ <code code="33999-4" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="status"/>
30
+ <statusCode code="completed"/>
31
+ <value code="73425007" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED CT" displayName="inactive" xsi:type="CD"/>
32
+ </observation>
33
+
34
+ </entryRelationship>
35
+
36
+ </observation>
37
+ </entry>
@@ -0,0 +1,35 @@
1
+ <entry>
2
+ <observation classCode="OBS" moodCode="EVN">
3
+ <!-- Problem observation template -->
4
+ <templateId root="2.16.840.1.113883.10.20.22.4.4"/>
5
+ <!-- Diagnosis, resolved template -->
6
+ <templateId root="2.16.840.1.113883.10.20.24.3.14"/>
7
+ <id root="<%= entry.id %>"/>
8
+ <code code="282291009" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED CT" displayName="diagnosis"/>
9
+
10
+ <statusCode code="completed"/>
11
+ <effectiveTime>
12
+ <!-- Attribute: Start Datetime -->
13
+ <low <%= value_or_null_flavor(entry.start_time) %>/>
14
+ <!-- Attribute: Stop Datetime -->
15
+ <high <%= value_or_null_flavor(entry.end_time) %>/>
16
+ </effectiveTime>
17
+ <%== render(:partial => 'ordinality', :locals => {:entry => entry}) %>
18
+
19
+ <%== code_display(entry, 'tag_name' => 'value', 'preferred_code_sets' => ['SNOMED-CT', 'ICD-9-CM', 'ICD-10-CM', 'CPT'],
20
+ 'extra_content' => "xsi:type=\"CD\" sdtc:valueSet=\"#{value_set_oid}\"") %>
21
+ <!-- Status -->
22
+ <entryRelationship typeCode="REFR">
23
+ <observation classCode="OBS" moodCode="EVN">
24
+ <!-- Problem Status (consolidation) template -->
25
+ <templateId root="2.16.840.1.113883.10.20.22.4.6"/>
26
+ <!-- Problem Status, Resolved template -->
27
+ <templateId root="2.16.840.1.113883.10.20.24.3.96"/>
28
+ <id root="<%= UUID.generate %>"/>
29
+ <code code="33999-4" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="status"/>
30
+ <statusCode code="completed"/>
31
+ <value code="413322009" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED CT" displayName="resolved" xsi:type="CD"/>
32
+ </observation>
33
+ </entryRelationship>
34
+ </observation>
35
+ </entry>
@@ -0,0 +1,22 @@
1
+ <entry>
2
+ <observation classCode="OBS" moodCode="RQO">
3
+ <!-- Consolidated Plan of Care Activity Observation
4
+ templateId (Implied Template) -->
5
+ <templateId root="2.16.840.1.113883.10.20.22.4.44"/>
6
+ <!-- Diagnostic Study, Order template -->
7
+ <templateId root="2.16.840.1.113883.10.20.24.3.17"/>
8
+ <id root="<%= entry.id %>"/>
9
+ <%== code_display(entry, 'preferred_code_sets' => ['LOINC'], 'extra_content' => "sdtc:valueSet=\"#{value_set_oid}\"") %>
10
+ <text><%= entry.description %></text>
11
+ <statusCode code="new"/>
12
+
13
+ <!-- Attribute: datetime -->
14
+ <author>
15
+ <time <%= value_or_null_flavor(entry.as_point_in_time) %>/>
16
+ <assignedAuthor>
17
+ <id nullFlavor="NA" root="<%= UUID.generate %>"/>
18
+ </assignedAuthor>
19
+ </author>
20
+
21
+ </observation>
22
+ </entry>
@@ -0,0 +1,21 @@
1
+ <entry>
2
+ <observation classCode="OBS" moodCode="EVN" <%== negation_indicator(entry) %>>
3
+ <!-- Consolidated Procedure Activity Observation templateId
4
+ (Implied Template) -->
5
+ <templateId root="2.16.840.1.113883.10.20.22.4.13"/>
6
+ <!-- Diagnostic Study, Performed template -->
7
+ <templateId root="2.16.840.1.113883.10.20.24.3.18"/>
8
+ <id root="<%= entry.id %>"/>
9
+ <%== code_display(entry, 'preferred_code_sets' => ['SNOMED-CT', 'ICD-9-CM', 'ICD-10-CM'], 'extra_content' => "sdtc:valueSet=\"#{value_set_oid}\"") %>
10
+ <text><%= entry.description %></text>
11
+ <statusCode code="completed"/>
12
+ <effectiveTime>
13
+ <!-- Attribute: Start Datetime -->
14
+ <low <%= value_or_null_flavor(entry.start_time) %>/>
15
+ <!-- Attribute: End Datetime -->
16
+ <high <%= value_or_null_flavor(entry.end_time) %>/>
17
+ </effectiveTime>
18
+ <%== render(:partial => 'result_value', :locals => {:entry => entry}) %>
19
+ <%== render(:partial => 'reason', :locals => {:entry => entry}) %>
20
+ </observation>
21
+ </entry>
@@ -0,0 +1,28 @@
1
+ <entry>
2
+ <act classCode="ACT" moodCode="EVN">
3
+ <!-- Communication from patient to provider -->
4
+ <templateId root="2.16.840.1.113883.10.20.24.3.2"/>
5
+ <id root="<%= entry.id %>"/>
6
+ <%== code_display(entry, :extra_content => "sdtc:valueSet=\"#{value_set_oid}\"") %>
7
+ <text>
8
+ <%= entry.description %>
9
+ </text>
10
+ <statusCode code="completed"/>
11
+ <effectiveTime>
12
+ <low <%= value_or_null_flavor(entry.start_time) %>/>
13
+ </effectiveTime>
14
+
15
+ <participant typeCode="AUT">
16
+ <participantRole classCode="PAT">
17
+ <code code="116154003" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED CT" displayName="Patient"/>
18
+ </participantRole>
19
+ </participant>
20
+
21
+ <participant typeCode="IRCP">
22
+ <participantRole classCode="ASSIGNED">
23
+ <code code="158965000" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED CT" displayName="Medical Practitioner"/>
24
+ </participantRole>
25
+ </participant>
26
+
27
+ </act>
28
+ </entry>
@@ -0,0 +1,20 @@
1
+ <entry>
2
+ <observation classCode="OBS" moodCode="EVN" <%== negation_indicator(entry) %>>
3
+ <!-- Consolidated Result Observation templateId (Implied Template) -->
4
+ <templateId root="2.16.840.1.113883.10.20.22.4.2"/>
5
+ <!-- Diagnostic Study, Result template -->
6
+ <templateId root="2.16.840.1.113883.10.20.24.3.20"/>
7
+ <id root="<%= entry.id %>"/>
8
+ <%== code_display(entry, 'preferred_code_sets' => ['SNOMED-CT', 'LOINC'],
9
+ 'extra_content' => "xsi:type=\"CD\" sdtc:valueSet=\"#{value_set_oid}\"") %>
10
+ <text><%= entry.description %></text>
11
+ <statusCode code="completed"/>
12
+
13
+ <effectiveTime>
14
+ <low <%= value_or_null_flavor(entry.start_time) %>/>
15
+ <high <%= value_or_null_flavor(entry.end_time) %>/>
16
+ </effectiveTime>
17
+ <%== render(:partial => 'result_value', :locals => {:entry => entry}) %>
18
+ <%== render(:partial => 'reason', :locals => {:entry => entry}) %>
19
+ </observation>
20
+ </entry>
@@ -0,0 +1,21 @@
1
+ <entry>
2
+ <encounter classCode="ENC" moodCode="RQO">
3
+ <!-- Plan of Care Activity Encounter template -->
4
+ <templateId root="2.16.840.1.113883.10.20.22.4.40"/>
5
+ <!-- Encounter order template -->
6
+ <templateId root="2.16.840.1.113883.10.20.24.3.22"/>
7
+ <id root="<%= entry.id %>"/>
8
+ <%== code_display(entry, :extra_content => "sdtc:valueSet=\"#{value_set_oid}\"") %>
9
+ <text><%= entry.description %></text>
10
+ <statusCode code="new"/>
11
+
12
+ <!-- Attribute: datetime -->
13
+ <author>
14
+ <time <%= value_or_null_flavor(entry.start_time) %>/>
15
+ <assignedAuthor>
16
+ <id root="<%= UUID.generate %>"/>
17
+ </assignedAuthor>
18
+ </author>
19
+
20
+ </encounter>
21
+ </entry>