health-data-standards 2.1.1 → 2.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/templates/ccda/_allergies.ccda.erb +52 -0
- data/templates/ccda/_allergies_no_current.ccda.erb +33 -0
- data/templates/ccda/_care_goals.ccda.erb +10 -0
- data/templates/ccda/_code_with_reference.ccda.erb +13 -0
- data/templates/ccda/_conditions.ccda.erb +59 -0
- data/templates/ccda/_conditions_no_current.ccda.erb +31 -0
- data/templates/ccda/_encounters.ccda.erb +25 -0
- data/templates/ccda/_immunizations.ccda.erb +37 -0
- data/templates/ccda/_medical_equipment.ccda.erb +38 -0
- data/templates/ccda/_medications.ccda.erb +34 -0
- data/templates/ccda/_medications_no_current.ccda.erb +23 -0
- data/templates/ccda/_narrative_block.ccda.erb +46 -0
- data/templates/ccda/_procedures.ccda.erb +26 -0
- data/templates/ccda/_procedures_no_current.ccda.erb +20 -0
- data/templates/ccda/_results.ccda.erb +61 -0
- data/templates/ccda/_results_no_current.ccda.erb +31 -0
- data/templates/ccda/_social_history.ccda.erb +22 -0
- data/templates/ccda/_vital_signs.ccda.erb +47 -0
- data/templates/ccda/show.ccda.erb +120 -0
- data/templates/html/_entries_by_encounter.html.erb +54 -0
- data/templates/html/_entries_by_section.html.erb +16 -0
- data/templates/html/_entry.html.erb +67 -0
- data/templates/html/_header.html.erb +58 -0
- data/templates/html/_section.html.erb +20 -0
- data/templates/html/show.html.erb +124 -0
- metadata +26 -1
@@ -0,0 +1,52 @@
|
|
1
|
+
|
2
|
+
<component>
|
3
|
+
<!--Allergies/Reactions-->
|
4
|
+
<section>
|
5
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.6"/>
|
6
|
+
<!--Allergies/Reactions section template-->
|
7
|
+
<code code="48765-2" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Allergies"/>
|
8
|
+
<title>Allergies and Adverse Reactions</title>
|
9
|
+
<%== render :partial => 'narrative_block', :locals => {:entries => entries, :section => 'allergies'} %>
|
10
|
+
<% entries.each_with_index do |entry, i| -%>
|
11
|
+
<entry typeCode="DRIV">
|
12
|
+
<act classCode="ACT" moodCode="EVN">
|
13
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.30"/>
|
14
|
+
<!--Allergy act template -->
|
15
|
+
<id root="<%= UUID.generate %>"/>
|
16
|
+
<code nullFlavor="NA"/>
|
17
|
+
<statusCode code="active"/>
|
18
|
+
<effectiveTime>
|
19
|
+
<low <%= value_or_null_flavor(entry.as_point_in_time) %>/>
|
20
|
+
</effectiveTime>
|
21
|
+
<entryRelationship typeCode="SUBJ" inversionInd="false">
|
22
|
+
<observation classCode="OBS" moodCode="EVN">
|
23
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.7"/>
|
24
|
+
<id root="<%= UUID.generate %>"/>
|
25
|
+
<code code="416098002" codeSystem="2.16.840.1.113883.6.96" displayName="drug allergy" codeSystemName="SNOMED CT">
|
26
|
+
<originalText><reference value="#allergies-desc-<%= i %>"/></originalText>
|
27
|
+
</code>
|
28
|
+
<text>
|
29
|
+
<reference value="#allergies-desc-<%= i %>"/>
|
30
|
+
</text>
|
31
|
+
<statusCode code="completed"/>
|
32
|
+
<effectiveTime>
|
33
|
+
<low <%= value_or_null_flavor(entry.as_point_in_time) %>/>
|
34
|
+
</effectiveTime>
|
35
|
+
<value xsi:type="CD" nullFlavor="UNK"/>
|
36
|
+
<participant typeCode="CSM">
|
37
|
+
<participantRole classCode="MANU">
|
38
|
+
<playingEntity classCode="MMAT">
|
39
|
+
<%== render :partial => 'code_with_reference',
|
40
|
+
:locals => {:entry => entry, :i => i, :section => 'allergies',
|
41
|
+
:preferred_code_sets => ['RxNorm']} %>
|
42
|
+
<name><%= entry.description %></name>
|
43
|
+
</playingEntity>
|
44
|
+
</participantRole>
|
45
|
+
</participant>
|
46
|
+
</observation>
|
47
|
+
</entryRelationship>
|
48
|
+
</act>
|
49
|
+
</entry>
|
50
|
+
<% end -%>
|
51
|
+
</section>
|
52
|
+
</component>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<component>
|
2
|
+
<!-- Allergies: patient has no allergies -->
|
3
|
+
<section>
|
4
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.6"/>
|
5
|
+
<code code="48765-2" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Allergy List"/>
|
6
|
+
<title>Allergies</title>
|
7
|
+
<text>There are no current allergies at the time of this document's creation.</text>
|
8
|
+
<entry typeCode="DRIV">
|
9
|
+
<act classCode="ACT" moodCode="EVN">
|
10
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.30"/>
|
11
|
+
<id root="<%= UUID.generate %>"/>
|
12
|
+
<code nullFlavor="NA"/>
|
13
|
+
<statusCode code="active"/>
|
14
|
+
<effectiveTime>
|
15
|
+
<low nullFlavor="NA"/>
|
16
|
+
</effectiveTime>
|
17
|
+
<entryRelationship typeCode="SUBJ" inversionInd="false">
|
18
|
+
<observation classCode="OBS" moodCode="EVN" negationInd="true">
|
19
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.7"/>
|
20
|
+
<id root="<%= UUID.generate %>"/>
|
21
|
+
<code code="ASSERTION" codeSystem="2.16.840.1.113883.5.4"/>
|
22
|
+
<effectiveTime>
|
23
|
+
<low nullFlavor="UNK"/>
|
24
|
+
</effectiveTime>
|
25
|
+
<statusCode code="completed"/>
|
26
|
+
<value xsi:type="CD" code="419199007"
|
27
|
+
codeSystem="2.16.840.1.113883.6.96" displayName="Allergy to Substance"/>
|
28
|
+
</observation>
|
29
|
+
</entryRelationship>
|
30
|
+
</act>
|
31
|
+
</entry>
|
32
|
+
</section>
|
33
|
+
</component>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<component>
|
2
|
+
<!--Plan of Care-->
|
3
|
+
<section>
|
4
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.10"/>
|
5
|
+
<!--Plan of Care section template-->
|
6
|
+
<code code="18776-5" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Treatment plan"/>
|
7
|
+
<title>Plan of Care</title>
|
8
|
+
<%== render :partial => 'narrative_block', :locals => {:entries => entries, :section => 'plan_of_care'} %>
|
9
|
+
</section>
|
10
|
+
</component>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<% preferred_code = entry.preferred_code(preferred_code_sets)
|
2
|
+
if preferred_code
|
3
|
+
code_system_oid = HealthDataStandards::Util::CodeSystemHelper.oid_for_code_system(preferred_code['code_set'])
|
4
|
+
-%>
|
5
|
+
<code code="<%= preferred_code['code'] %>" codeSystem="<%= code_system_oid %>" displayName="<%= entry.description %>">
|
6
|
+
<% else -%>
|
7
|
+
<code nullFlavor="UNK">
|
8
|
+
<% end -%>
|
9
|
+
<originalText><reference value="#<%= section %>-desc-<%= i %>"/></originalText>
|
10
|
+
<% entry.translation_codes(preferred_code_sets).each do |translation| -%>
|
11
|
+
<translation code="<%= translation['code'] %>" codeSystem="<%= HealthDataStandards::Util::CodeSystemHelper.oid_for_code_system(translation['code_set']) %>" />
|
12
|
+
<% end -%>
|
13
|
+
</code>
|
@@ -0,0 +1,59 @@
|
|
1
|
+
<component>
|
2
|
+
<!--Problems-->
|
3
|
+
<section>
|
4
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.5.1"/>
|
5
|
+
<!--Problems section template-->
|
6
|
+
<code code="11450-4" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Problem list"/>
|
7
|
+
<title>Problems</title>
|
8
|
+
<%== render :partial => 'narrative_block', :locals => {:entries => entries, :section => 'conditions', :status => true } %>
|
9
|
+
<% entries.each_with_index do |entry, i| -%>
|
10
|
+
<entry typeCode="DRIV">
|
11
|
+
<act classCode="ACT" moodCode="EVN">
|
12
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.3"/>
|
13
|
+
<!-- Problem act template -->
|
14
|
+
<id root="<%= UUID.generate %>"/>
|
15
|
+
<code nullFlavor="NA"/>
|
16
|
+
<% if entry.status.eql? 'resolved' -%>
|
17
|
+
<statusCode code="completed"/>
|
18
|
+
<% else -%>
|
19
|
+
<statusCode code="active"/>
|
20
|
+
<% end -%>
|
21
|
+
<effectiveTime>
|
22
|
+
<low <%= value_or_null_flavor(entry.as_point_in_time) %>/>
|
23
|
+
</effectiveTime>
|
24
|
+
<entryRelationship typeCode="SUBJ" inversionInd="false">
|
25
|
+
<observation classCode="OBS" moodCode="EVN">
|
26
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.4"/>
|
27
|
+
|
28
|
+
<!--Problem observation template - NOT episode template-->
|
29
|
+
<id root="<%= UUID.generate %>"/>
|
30
|
+
<code code="64572001" displayName="Condition" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED-CT"/>
|
31
|
+
<text>
|
32
|
+
<reference value="#conditions-desc-<%= i %>"/>
|
33
|
+
</text>
|
34
|
+
<statusCode code="completed"/>
|
35
|
+
<effectiveTime>
|
36
|
+
<low <%= value_or_null_flavor(entry.as_point_in_time) %>/>
|
37
|
+
</effectiveTime>
|
38
|
+
<% if entry.ordinality -%>
|
39
|
+
<priorityCode code="8319008" codeSystem="2.16.840.1.113883.6.96" displayName="Principal diagnosis" />
|
40
|
+
<% end -%>
|
41
|
+
<%== code_display(entry, {'tag_name' => 'value', 'extra_content' => 'xsi:type="CD"', 'preferred_code_sets' => ['SNOMED-CT']}) %>
|
42
|
+
<% if entry.status -%>
|
43
|
+
<entryRelationship typeCode="REFR">
|
44
|
+
<observation classCode="OBS" moodCode="EVN">
|
45
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.6"/>
|
46
|
+
<!-- Problem status observation template -->
|
47
|
+
<code code="33999-4" codeSystem="2.16.840.1.113883.6.1" displayName="Status"/>
|
48
|
+
<statusCode code="completed"/>
|
49
|
+
<value xsi:type="CE" code="<%= status_code_for(entry) %>" codeSystem="2.16.840.1.113883.6.96"/>
|
50
|
+
</observation>
|
51
|
+
</entryRelationship>
|
52
|
+
<% end -%>
|
53
|
+
</observation>
|
54
|
+
</entryRelationship>
|
55
|
+
</act>
|
56
|
+
</entry>
|
57
|
+
<% end -%>
|
58
|
+
</section>
|
59
|
+
</component>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<component>
|
2
|
+
<!-- Conditions: patient has no conditions -->
|
3
|
+
<section>
|
4
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.5"/>
|
5
|
+
<code code="11450-4" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Problem List"/>
|
6
|
+
<title>Problems</title>
|
7
|
+
<text>There are no current problem concern acts at the time of this document's creation.</text>
|
8
|
+
<entry typeCode="DRIV">
|
9
|
+
<act classCode="ACT" moodCode="EVN">
|
10
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.3"/>
|
11
|
+
<id root="<%= UUID.generate %>"/>
|
12
|
+
<code nullFlavor="NA"/>
|
13
|
+
<statusCode code="active"/>
|
14
|
+
<effectiveTime>
|
15
|
+
<low nullFlavor="NA"/>
|
16
|
+
</effectiveTime>
|
17
|
+
<entryRelationship typeCode="SUBJ" inversionInd="false">
|
18
|
+
<observation classCode="OBS" moodCode="EVN" negationInd="true">
|
19
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.4"/>
|
20
|
+
<id root="<%= UUID.generate %>"/>
|
21
|
+
<code code="ASSERTION" codeSystem="2.16.840.1.113883.5.4"/>
|
22
|
+
<effectiveTime>
|
23
|
+
<low nullFlavor="UNK"/>
|
24
|
+
</effectiveTime>
|
25
|
+
<statusCode code="completed"/>
|
26
|
+
</observation>
|
27
|
+
</entryRelationship>
|
28
|
+
</act>
|
29
|
+
</entry>
|
30
|
+
</section>
|
31
|
+
</component>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<component>
|
2
|
+
<!--Encounters-->
|
3
|
+
<section>
|
4
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.22" /> <!-- CCDA Template id -->
|
5
|
+
<!--Encounters section template-->
|
6
|
+
<code code="46240-8" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="History of encounters"/>
|
7
|
+
<title>Encounters</title>
|
8
|
+
<%== render :partial => 'narrative_block', :locals => {:entries => entries, :section => 'encounters'} %>
|
9
|
+
<% entries.each_with_index do |entry, i| -%>
|
10
|
+
<entry typeCode="DRIV">
|
11
|
+
<encounter classCode="ENC" moodCode="EVN">
|
12
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.49"/>
|
13
|
+
<!-- Encounter activity template -->
|
14
|
+
<id root="<%= UUID.generate %>"/>
|
15
|
+
<%== render :partial => 'code_with_reference', :locals => {:entry => entry, :i => i, :section => 'encounters',
|
16
|
+
:preferred_code_sets => ['CPT']} %>
|
17
|
+
<text>
|
18
|
+
<reference value="#encounters-desc-<%= i %>"/>
|
19
|
+
</text>
|
20
|
+
<effectiveTime <%= value_or_null_flavor(entry.as_point_in_time) %>/>
|
21
|
+
</encounter>
|
22
|
+
</entry>
|
23
|
+
<% end -%>
|
24
|
+
</section>
|
25
|
+
</component>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<component>
|
2
|
+
<!--Immunizations-->
|
3
|
+
<section>
|
4
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.2" />
|
5
|
+
<!--Immunizations section template-->
|
6
|
+
<code code="11369-6" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="History of immunizations"/>
|
7
|
+
<title>Immunizations</title>
|
8
|
+
<%== render :partial => 'narrative_block', :locals => {:entries => entries, :section => 'immunizations'} %>
|
9
|
+
<% entries.each_with_index do |entry, i| -%>
|
10
|
+
<entry typeCode="DRIV">
|
11
|
+
<substanceAdministration classCode="SBADM" moodCode="EVN" negationInd="false">
|
12
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.52"/>
|
13
|
+
<!-- Medication activity template -->
|
14
|
+
<id root="<%= UUID.generate %>"/>
|
15
|
+
<code code='IMMUNIZ' codeSystem='2.16.840.1.113883.5.4' codeSystemName='ActCode'/>
|
16
|
+
<text>
|
17
|
+
<reference value="#immunizations-desc-<%= i %>"/>
|
18
|
+
</text>
|
19
|
+
<statusCode code="completed"/>
|
20
|
+
<effectiveTime <%= value_or_null_flavor(entry.as_point_in_time) %>/>
|
21
|
+
<doseQuantity nullFlavor="UNK"/>
|
22
|
+
<consumable>
|
23
|
+
<manufacturedProduct classCode="MANU">
|
24
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.54"/>
|
25
|
+
<!-- Product template -->
|
26
|
+
<manufacturedMaterial>
|
27
|
+
<%== render :partial => 'code_with_reference', :locals => {:entry => entry, :i => i, :section => 'immunizations',
|
28
|
+
:preferred_code_sets => ['CVX']} %>
|
29
|
+
<name><%= entry.description %></name>
|
30
|
+
</manufacturedMaterial>
|
31
|
+
</manufacturedProduct>
|
32
|
+
</consumable>
|
33
|
+
</substanceAdministration>
|
34
|
+
</entry>
|
35
|
+
<% end -%>
|
36
|
+
</section>
|
37
|
+
</component>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<component>
|
2
|
+
<!--Medical Equipment - Not C32-->
|
3
|
+
<section>
|
4
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.23" />
|
5
|
+
<!-- Medical equipment section template -->
|
6
|
+
<code code="46264-8" codeSystem="2.16.840.1.113883.6.1"/>
|
7
|
+
<title>Medical Equipment</title>
|
8
|
+
<%== render :partial => 'narrative_block', :locals => {:entries => entries, :section => 'medical_equipment'} %>
|
9
|
+
<% entries.each_with_index do |entry, i| -%>
|
10
|
+
<entry typeCode="DRIV">
|
11
|
+
<supply classCode="SPLY" moodCode="EVN">
|
12
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.50"/>
|
13
|
+
<!-- Supply activity template -->
|
14
|
+
<id root="<%= UUID.generate %>"/>
|
15
|
+
<statusCode code="completed"/>
|
16
|
+
<effectiveTime <%= value_or_null_flavor(entry.as_point_in_time) %>/>
|
17
|
+
<participant typeCode="DEV">
|
18
|
+
<participantRole classCode="MANU">
|
19
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.37"/>
|
20
|
+
<!-- Product instance template -->
|
21
|
+
<addr/>
|
22
|
+
<telecom/>
|
23
|
+
<playingDevice>
|
24
|
+
<%== code_display(entry, {:preferred_code_sets => ['SNOMED-CT']}) %>
|
25
|
+
</playingDevice>
|
26
|
+
<% if entry.manufacturer %>
|
27
|
+
<scopingEntity>
|
28
|
+
<id root="<%= UUID.generate %>"/>
|
29
|
+
<desc><%= entry.manufacturer %></desc>
|
30
|
+
</scopingEntity>
|
31
|
+
<% end %>
|
32
|
+
</participantRole>
|
33
|
+
</participant>
|
34
|
+
</supply>
|
35
|
+
</entry>
|
36
|
+
<% end -%>
|
37
|
+
</section>
|
38
|
+
</component>
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<component>
|
2
|
+
<!--Medications-->
|
3
|
+
<section>
|
4
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.1" />
|
5
|
+
<code code="10160-0" displayName="History of medication use" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC"/>
|
6
|
+
<title>Medications</title>
|
7
|
+
<%== render :partial => 'narrative_block', :locals => {:entries => entries, :section => 'medications'} %>
|
8
|
+
<% entries.each_with_index do |entry, i| -%>
|
9
|
+
<entry>
|
10
|
+
<!--CCD Medication activity - Required-->
|
11
|
+
<substanceAdministration classCode="SBADM" moodCode="EVN">
|
12
|
+
<templateId root='2.16.840.1.113883.10.20.22.4.16'/>
|
13
|
+
<id root="<%= UUID.generate %>"/>
|
14
|
+
<statusCode code="completed"/>
|
15
|
+
<effectiveTime xsi:type="IVL_TS">
|
16
|
+
<low <%= value_or_null_flavor(entry.as_point_in_time) %>/>
|
17
|
+
<high nullFlavor="UNK"/>
|
18
|
+
</effectiveTime>
|
19
|
+
<consumable>
|
20
|
+
<!--CCD Product - Required-->
|
21
|
+
<manufacturedProduct classCode="MANU">
|
22
|
+
<templateId root='2.16.840.1.113883.10.20.22.4.23'/>
|
23
|
+
<manufacturedMaterial>
|
24
|
+
<%== render :partial => 'code_with_reference', :locals => {:entry => entry, :i => i, :section => 'medications',
|
25
|
+
:preferred_code_sets => ['RxNorm']} %>
|
26
|
+
<name><%= entry.description %></name>
|
27
|
+
</manufacturedMaterial>
|
28
|
+
</manufacturedProduct>
|
29
|
+
</consumable>
|
30
|
+
</substanceAdministration>
|
31
|
+
</entry>
|
32
|
+
<% end -%>
|
33
|
+
</section>
|
34
|
+
</component>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<component>
|
2
|
+
<!-- Medications: patient has no medications -->
|
3
|
+
<section>
|
4
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.1" />
|
5
|
+
<code code="10160-0" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="History of medication use"/>
|
6
|
+
<title>Medications</title>
|
7
|
+
<text>There are no current medications at the time of this document's creation.</text>
|
8
|
+
<entry>
|
9
|
+
<substanceAdministration moodCode="EVN" classCode="SBADM" negationInd=”true”>
|
10
|
+
<text>No known medications.</text>
|
11
|
+
<consumable>
|
12
|
+
<manufacturedProduct>
|
13
|
+
<manufacturedLabeledDrug>
|
14
|
+
<code code="410942007" displayName="drug or medication"
|
15
|
+
codeSystem="2.16.840.1.113883.6.96"
|
16
|
+
codeSystemName="SNOMED CT"/>
|
17
|
+
</manufacturedLabeledDrug>
|
18
|
+
</manufacturedProduct>
|
19
|
+
</consumable>
|
20
|
+
</substanceAdministration>
|
21
|
+
</entry>
|
22
|
+
</section>
|
23
|
+
</component>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<text>
|
2
|
+
<table border="1" width="100%">
|
3
|
+
<thead>
|
4
|
+
<tr>
|
5
|
+
<th>Description</th>
|
6
|
+
<th>Codes</th>
|
7
|
+
<th>Time</th>
|
8
|
+
<% if status.present? %>
|
9
|
+
<th>Status</th>
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
<% if value.present? %>
|
13
|
+
<th>Value</th>
|
14
|
+
<% end %>
|
15
|
+
</tr>
|
16
|
+
</thead>
|
17
|
+
<tbody>
|
18
|
+
<% entries.each_with_index do |entry, i| -%>
|
19
|
+
<tr>
|
20
|
+
<td ID="<%= section %>-desc-<%= i %>"><%= entry.description %></td>
|
21
|
+
<td ID="<%= section %>-code-<%= i %>"><%= entry.codes_to_s %><br/><i><%= entry.specifics %></i></td>
|
22
|
+
<td><%= entry.times_to_s %></td>
|
23
|
+
<% if status.present? %>
|
24
|
+
<td><%= entry.status %></td>
|
25
|
+
<% end %>
|
26
|
+
|
27
|
+
<% if value.present?%>
|
28
|
+
<td>
|
29
|
+
<% entry.values.each do |value| %>
|
30
|
+
<% if value.respond_to? :scalar %>
|
31
|
+
<%= value.try(:scalar) %><br/>
|
32
|
+
<% elsif value.respond_to? :codes %>
|
33
|
+
<% value.codes.each do |system, vals| %>
|
34
|
+
<%= system %>: <%= vals.join(',') %><br/>
|
35
|
+
<% end %>
|
36
|
+
<% else %>
|
37
|
+
UNKNOWN VALUE
|
38
|
+
<% end %>
|
39
|
+
<% end %>
|
40
|
+
</td>
|
41
|
+
<% end %>
|
42
|
+
</tr>
|
43
|
+
<%- end -%>
|
44
|
+
</tbody>
|
45
|
+
</table>
|
46
|
+
</text>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<component>
|
2
|
+
<!--Surgeries-->
|
3
|
+
<section>
|
4
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.7"/>
|
5
|
+
<!--Surgeries section template-->
|
6
|
+
<code code="47519-4" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="List of surgeries"/>
|
7
|
+
<title>Surgeries</title>
|
8
|
+
<%== render :partial => 'narrative_block', :locals => {:entries => entries, :section => 'procedures'} %>
|
9
|
+
<% entries.each_with_index do |entry, i| -%>
|
10
|
+
<entry typeCode="DRIV">
|
11
|
+
<procedure classCode="PROC" moodCode="EVN">
|
12
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.14"/>
|
13
|
+
<!-- Procedure activity template -->
|
14
|
+
<id root="<%= UUID.generate %>"/>
|
15
|
+
<%== render :partial => 'code_with_reference', :locals => {:entry => entry, :i => i, :section => 'procedures',
|
16
|
+
:preferred_code_sets => ['CPT', 'ICD-9-CM', 'ICD-10-CM', 'HCPCS', 'SNOMED-CT']} %>
|
17
|
+
<text>
|
18
|
+
<reference value="#procedures-desc-<%= i %>"/>
|
19
|
+
</text>
|
20
|
+
<statusCode code="completed"/>
|
21
|
+
<effectiveTime <%= value_or_null_flavor(entry.as_point_in_time) %>/>
|
22
|
+
</procedure>
|
23
|
+
</entry>
|
24
|
+
<% end -%>
|
25
|
+
</section>
|
26
|
+
</component>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<component>
|
2
|
+
<!-- Procedures: patient has no procedures -->
|
3
|
+
<section>
|
4
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.7"/>
|
5
|
+
<code code="47519-4" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Procedures"/>
|
6
|
+
<title>Procedures</title>
|
7
|
+
<text>There are no current procedures at the time of this document's creation.</text>
|
8
|
+
<entry typeCode="DRIV">
|
9
|
+
<procedure classCode="PROC" moodCode="EVN" negationInd="true">
|
10
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.14"/>
|
11
|
+
<id root="<%= UUID.generate %>"/>
|
12
|
+
<code code="ASSERTION" codeSystem="2.16.840.1.113883.5.4"/>
|
13
|
+
<effectiveTime>
|
14
|
+
<low nullFlavor="UNK"/>
|
15
|
+
</effectiveTime>
|
16
|
+
<statusCode code="completed"/>
|
17
|
+
</procedure>
|
18
|
+
</entry>
|
19
|
+
</section>
|
20
|
+
</component>
|
@@ -0,0 +1,61 @@
|
|
1
|
+
<component>
|
2
|
+
<!--Diagnostic Results-->
|
3
|
+
<section>
|
4
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.3.1"/>
|
5
|
+
<!--Diagnostic Results section template-->
|
6
|
+
<code code="30954-2" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Results"/>
|
7
|
+
<title>Diagnostic Results</title>
|
8
|
+
<%== render :partial => 'narrative_block', :locals => {:entries => entries, :section => 'results', :value=>true} %>
|
9
|
+
<entry typeCode="DRIV">
|
10
|
+
<organizer classCode="BATTERY" moodCode="EVN">
|
11
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.1"/>
|
12
|
+
<!--Result organizer template -->
|
13
|
+
<id root="<%= UUID.generate %>"/>
|
14
|
+
<code nullFlavor="NA"/>
|
15
|
+
<statusCode code="completed"/>
|
16
|
+
<effectiveTime value="<%= Time.now.utc.to_formatted_s(:number) %>"/>
|
17
|
+
<component>
|
18
|
+
<observation classCode="OBS" moodCode="EVN">
|
19
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.2"/>
|
20
|
+
<id root="<%= UUID.generate %>"/>
|
21
|
+
<code nullFlavor="UNK">
|
22
|
+
<originalText><reference value="Unknown"/></originalText>
|
23
|
+
</code>
|
24
|
+
<text>
|
25
|
+
<reference value="Unknown"/>
|
26
|
+
</text>
|
27
|
+
<statusCode code="completed"/>
|
28
|
+
<effectiveTime nullFlavor="UNK"/>
|
29
|
+
</observation>
|
30
|
+
</component>
|
31
|
+
<% entries.each_with_index do |entry, i| -%>
|
32
|
+
<component>
|
33
|
+
<observation classCode="OBS" moodCode="EVN">
|
34
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.2"/>
|
35
|
+
<!-- Result observation template -->
|
36
|
+
<id root="<%= UUID.generate %>"/>
|
37
|
+
<%== code_display(entry, 'preferred_code_sets' => ['LOINC', 'SNOMED-CT']) %>
|
38
|
+
<text>
|
39
|
+
<reference value="#results-desc-<%= i %>"/>
|
40
|
+
</text>
|
41
|
+
<statusCode code="completed"/>
|
42
|
+
<effectiveTime <%= value_or_null_flavor(entry.as_point_in_time) %>/>
|
43
|
+
<% ev = entry.values.first
|
44
|
+
if ev.present? && ev.respond_to?(:scalar) -%>
|
45
|
+
<% if is_num?(ev.scalar) -%>
|
46
|
+
<value xsi:type="PQ" value="<%= ev.scalar %>" <% if ev.units -%>unit="<%= ev.units %>"<% end -%>/>
|
47
|
+
<% elsif is_bool?(ev.scalar)%>
|
48
|
+
<value xsi:type="BL" value="<%= ev.scalar %>" />
|
49
|
+
<% else -%>
|
50
|
+
<value xsi:type="ST" ><%= ev.scalar %></value>
|
51
|
+
<% end -%>
|
52
|
+
<% else -%>
|
53
|
+
<value xsi:type="PQ" nullFlavor="UNK"/>
|
54
|
+
<% end -%>
|
55
|
+
</observation>
|
56
|
+
</component>
|
57
|
+
<% end -%>
|
58
|
+
</organizer>
|
59
|
+
</entry>
|
60
|
+
</section>
|
61
|
+
</component>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<component>
|
2
|
+
<!-- Diagnostic Results: patient has no results -->
|
3
|
+
<section>
|
4
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.3.1"/>
|
5
|
+
<code code="30954-2" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Results"/>
|
6
|
+
<title>Diagnostic Results</title>
|
7
|
+
<text>There are no current results at the time of this document's creation.</text>
|
8
|
+
<entry typeCode="DRIV">
|
9
|
+
<organizer classCode="BATTERY" moodCode="EVN">
|
10
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.1"/>
|
11
|
+
<id root="<%= UUID.generate %>"/>
|
12
|
+
<code nullFlavor="NA"/>
|
13
|
+
<statusCode code="completed"/>
|
14
|
+
<effectiveTime>
|
15
|
+
<low nullFlavor="UNK"/>
|
16
|
+
</effectiveTime>
|
17
|
+
<component>
|
18
|
+
<observation classCode="OBS" moodCode="EVN" negationInd="true">
|
19
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.2"/>
|
20
|
+
<id root="<%= UUID.generate %>"/>
|
21
|
+
<code code="ASSERTION" codeSystem="2.16.840.1.113883.5.4"/>
|
22
|
+
<statusCode code="completed"/>
|
23
|
+
<effectiveTime>
|
24
|
+
<low nullFlavor="UNK"/>
|
25
|
+
</effectiveTime>
|
26
|
+
</observation>
|
27
|
+
</component>
|
28
|
+
</organizer>
|
29
|
+
</entry>
|
30
|
+
</section>
|
31
|
+
</component>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<component>
|
2
|
+
<!--Social History - CCDA-->
|
3
|
+
<section>
|
4
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.17"/>
|
5
|
+
<!-- Social history section template -->
|
6
|
+
<code code="29762-2" codeSystem="2.16.840.1.113883.6.1"/>
|
7
|
+
<title>Social History</title>
|
8
|
+
<%== render :partial => 'narrative_block', :locals => {:entries => entries, :section => 'social_history'} %>
|
9
|
+
<% entries.each_with_index do |entry, i| -%>
|
10
|
+
<entry typeCode="DRIV">
|
11
|
+
<observation classCode="OBS" moodCode="EVN">
|
12
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.38"/>
|
13
|
+
<!-- Social history observation template -->
|
14
|
+
<id root="<%= UUID.generate %>"/>
|
15
|
+
<%== code_display(entry, {:preferred_code_sets => ['SNOMED-CT']}) %>
|
16
|
+
<statusCode code="completed"/>
|
17
|
+
<effectiveTime <%= value_or_null_flavor(entry.as_point_in_time) %>/>
|
18
|
+
</observation>l
|
19
|
+
</entry>
|
20
|
+
<% end -%>
|
21
|
+
</section>
|
22
|
+
</component>
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<component>
|
2
|
+
<!--Vital Signs-->
|
3
|
+
<section>
|
4
|
+
<templateId root="2.16.840.1.113883.10.20.22.2.4"/>
|
5
|
+
<!--Vital Signs section template-->
|
6
|
+
<code code="8716-3" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Vital signs"/>
|
7
|
+
<title>Vital Signs</title>
|
8
|
+
<%== render :partial => 'narrative_block', :locals => {:entries => entries, :section => 'vitals', :value=>true} %>
|
9
|
+
<entry typeCode="DRIV">
|
10
|
+
<organizer classCode="CLUSTER" moodCode="EVN">
|
11
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.26"/>
|
12
|
+
<!-- Vital signs organizer template -->
|
13
|
+
<id root="<%= UUID.generate %>"/>
|
14
|
+
<code code="46680005" codeSystem="2.16.840.1.113883.6.96" displayName="Vital signs" codeSystemName="SNOMED CT"/>
|
15
|
+
<statusCode code="completed"/>
|
16
|
+
<effectiveTime value="19991114"/>
|
17
|
+
<% entries.each_with_index do |entry, i| -%>
|
18
|
+
<component>
|
19
|
+
<observation classCode="OBS" moodCode="EVN">
|
20
|
+
<templateId root="2.16.840.1.113883.10.20.22.4.27"/>
|
21
|
+
<!-- Result observation template -->
|
22
|
+
<id root="<%= UUID.generate %>"/>
|
23
|
+
<%== code_display(entry, {'preferred_code_sets' => ['LOINC','SNOMED']}) %>
|
24
|
+
<text>
|
25
|
+
<reference value="vitals-desc-<%= i %>"/>
|
26
|
+
</text>
|
27
|
+
<statusCode code="completed"/>
|
28
|
+
<effectiveTime <%= value_or_null_flavor(entry.as_point_in_time) %>/>
|
29
|
+
<% ev = entry.values.first
|
30
|
+
if ev.present? && ev.respond_to?(:scalar) -%>
|
31
|
+
<% if is_num?(ev.scalar) -%>
|
32
|
+
<value xsi:type="PQ" value="<%= ev.scalar %>" <% if ev.units -%>unit="<%= ev.units %>"<% end -%>/>
|
33
|
+
<% elsif is_bool?(ev.scalar)%>
|
34
|
+
<value xsi:type="BL" value="<%= ev.scalar %>" />
|
35
|
+
<% else -%>
|
36
|
+
<value xsi:type="ST" ><%= ev.scalar %></value>
|
37
|
+
<% end -%>
|
38
|
+
<% else -%>
|
39
|
+
<value xsi:type="PQ" nullFlavor="UNK"/>
|
40
|
+
<% end -%>
|
41
|
+
</observation>
|
42
|
+
</component>
|
43
|
+
<% end -%>
|
44
|
+
</organizer>
|
45
|
+
</entry>
|
46
|
+
</section>
|
47
|
+
</component>
|
@@ -0,0 +1,120 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:sdtc="urn:hl7-org:sdtc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 http://xreg2.nist.gov:8080/hitspValidation/schema/cdar2c32/infrastructure/cda/C32_CDA.xsd">
|
3
|
+
<realmCode code="US"/>
|
4
|
+
<typeId root="2.16.840.1.113883.1.3" extension="POCD_HD000040"/>
|
5
|
+
<templateId root="2.16.840.1.113883.10.20.22.1.1" />
|
6
|
+
<templateId root='2.16.840.1.113883.10.20.22.1.2'/>
|
7
|
+
<id root="2.16.840.1.113883.3.72" extension="<%= patient.id %>" assigningAuthorityName="NIST Healthcare Project"/>
|
8
|
+
<code code="34133-9" displayName="Summarization of episode note" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC"/>
|
9
|
+
<title>Cypress C32 Patient Test Record: <%= patient.first %> <%= patient.last %></title>
|
10
|
+
<effectiveTime value="<%= Time.now.utc.to_formatted_s(:number) %>"/>
|
11
|
+
<confidentialityCode code="N"/>
|
12
|
+
<languageCode code="en-US"/>
|
13
|
+
<recordTarget>
|
14
|
+
<patientRole>
|
15
|
+
<id root="Cypress" extension="<%= patient.id %>"/>
|
16
|
+
<addr use="HP">
|
17
|
+
<streetAddressLine>202 Burlington Rd.</streetAddressLine>
|
18
|
+
<city>Bedford</city>
|
19
|
+
<state>MA</state>
|
20
|
+
<postalCode>01730</postalCode>
|
21
|
+
</addr>
|
22
|
+
<telecom value="tel:+1-781-271-3000"/>
|
23
|
+
<patient>
|
24
|
+
<name>
|
25
|
+
<given><%= patient.first %></given>
|
26
|
+
<family><%= patient.last %></family>
|
27
|
+
</name>
|
28
|
+
<administrativeGenderCode code="<%= patient.gender %>" codeSystem="2.16.840.1.113883.5.1" codeSystemName="HL7 AdministrativeGender"/>
|
29
|
+
<birthTime value="<%= Time.at(patient.birthdate).utc.to_formatted_s(:number) %>"/>
|
30
|
+
<% if (patient.race) %>
|
31
|
+
<raceCode code="<%= patient.race['code'] %>" <% if patient.race['name']%>displayName="<%= patient.race['name'] %>"<% end %> codeSystemName="CDC Race and Ethnicity" codeSystem="2.16.840.1.113883.6.238"/>
|
32
|
+
<% end %>
|
33
|
+
<% if (patient.race) %>
|
34
|
+
<ethnicGroupCode code="<%= patient.ethnicity['code'] %>" <% if patient.ethnicity['name']%>displayName="<%= patient.ethnicity['name'] %>"<% end %> codeSystemName="CDC Race and Ethnicity" codeSystem="2.16.840.1.113883.6.238"/>
|
35
|
+
<% end %>
|
36
|
+
<%
|
37
|
+
languages = patient.languages
|
38
|
+
languages = ["en-US"] if languages.nil? or languages.empty?
|
39
|
+
languages.each do |language|%>
|
40
|
+
<languageCommunication>
|
41
|
+
<languageCode code="<%= language %>"/>
|
42
|
+
</languageCommunication>
|
43
|
+
<% end %>
|
44
|
+
</patient>
|
45
|
+
</patientRole>
|
46
|
+
</recordTarget>
|
47
|
+
<author>
|
48
|
+
<time value="<%= Time.now.utc.to_formatted_s(:number) %>"/>
|
49
|
+
<assignedAuthor>
|
50
|
+
<id/>
|
51
|
+
<addr/>
|
52
|
+
<telecom value="tel:+1-781-271-3000"/>
|
53
|
+
<assignedPerson>
|
54
|
+
<name>Auto Generated</name>
|
55
|
+
</assignedPerson>
|
56
|
+
</assignedAuthor>
|
57
|
+
</author>
|
58
|
+
<custodian>
|
59
|
+
<assignedCustodian>
|
60
|
+
<representedCustodianOrganization>
|
61
|
+
<id/>
|
62
|
+
<name>Cypress</name>
|
63
|
+
<telecom value="tel:+1-781-271-3000"/>
|
64
|
+
<addr>
|
65
|
+
<streetAddressLine>202 Burlington Rd.</streetAddressLine>
|
66
|
+
<city>Bedford</city>
|
67
|
+
<state>MA</state>
|
68
|
+
<postalCode>01730</postalCode>
|
69
|
+
</addr>
|
70
|
+
</representedCustodianOrganization>
|
71
|
+
</assignedCustodian>
|
72
|
+
</custodian>
|
73
|
+
<component>
|
74
|
+
<structuredBody>
|
75
|
+
<% if patient.allergies.present? -%>
|
76
|
+
<%== render :partial => 'allergies', :locals => {:entries => patient.allergies} %>
|
77
|
+
<% else %>
|
78
|
+
<%== render :partial => 'allergies_no_current', :locals => {:entries => patient.allergies} %>
|
79
|
+
<% end -%>
|
80
|
+
<% if patient.medications.present? -%>
|
81
|
+
<%== render :partial => 'medications', :locals => {:entries => patient.medications} %>
|
82
|
+
<% else %>
|
83
|
+
<%== render :partial => 'medications_no_current', :locals => {:entries => patient.medications} %>
|
84
|
+
<% end -%>
|
85
|
+
<% if patient.results.present? -%>
|
86
|
+
<%== render :partial => 'results', :locals => {:entries => patient.results} %>
|
87
|
+
<% else -%>
|
88
|
+
<%== render :partial => 'results_no_current', :locals => {:entries => patient.medications} %>
|
89
|
+
<% end %>
|
90
|
+
<% if patient.conditions.present? -%>
|
91
|
+
<%== render :partial => 'conditions', :locals => {:entries => patient.conditions} %>
|
92
|
+
<% else %>
|
93
|
+
<%== render :partial => 'conditions_no_current', :locals => {:entries => patient.conditions} %>
|
94
|
+
<% end -%>
|
95
|
+
<% if patient.procedures.present? -%>
|
96
|
+
<%== render :partial => 'procedures', :locals => {:entries => patient.procedures} %>
|
97
|
+
<% else %>
|
98
|
+
<%== render :partial => 'procedures_no_current', :locals => {:entries => patient.conditions} %>
|
99
|
+
<% end -%>
|
100
|
+
<% if patient.encounters.present? -%>
|
101
|
+
<%== render :partial => 'encounters', :locals => {:entries => patient.encounters} %>
|
102
|
+
<% end -%>
|
103
|
+
<% if patient.vital_signs.present? -%>
|
104
|
+
<%== render :partial => 'vital_signs', :locals => {:entries => patient.vital_signs} %>
|
105
|
+
<% end -%>
|
106
|
+
<% if patient.immunizations.present? -%>
|
107
|
+
<%== render :partial => 'immunizations', :locals => {:entries => patient.immunizations} %>
|
108
|
+
<% end -%>
|
109
|
+
<% if patient.care_goals.present? -%>
|
110
|
+
<%== render :partial => 'care_goals', :locals => {:entries => patient.care_goals} %>
|
111
|
+
<% end -%>
|
112
|
+
<% if patient.social_history.present? -%>
|
113
|
+
<%== render :partial => 'social_history', :locals => {:entries => patient.social_history} %>
|
114
|
+
<% end -%>
|
115
|
+
<% if patient.medical_equipment.present? -%>
|
116
|
+
<%== render :partial => 'medical_equipment', :locals => {:entries => patient.medical_equipment} %>
|
117
|
+
<% end -%>
|
118
|
+
</structuredBody>
|
119
|
+
</component>
|
120
|
+
</ClinicalDocument>
|
@@ -0,0 +1,54 @@
|
|
1
|
+
<div id="table_by_encounter" style="display:none">
|
2
|
+
|
3
|
+
<%
|
4
|
+
patient.encounters.sort! { |left,right| left.as_point_in_time <=> right.as_point_in_time }
|
5
|
+
|
6
|
+
all_entries = []
|
7
|
+
entry_section = {}
|
8
|
+
Record::Sections.each do |section|
|
9
|
+
if section != :encounters
|
10
|
+
patient.send(section).each do |entry|
|
11
|
+
all_entries << entry
|
12
|
+
entry_section[entry.hash] = section
|
13
|
+
end if patient.respond_to? section
|
14
|
+
end
|
15
|
+
end
|
16
|
+
all_entries.sort! { |left,right| left.as_point_in_time <=> right.as_point_in_time }
|
17
|
+
|
18
|
+
entries_by_encounter = {}
|
19
|
+
if (patient.encounters.size > 0)
|
20
|
+
encounters_iterator = patient.encounters.each
|
21
|
+
current_encounter = encounters_iterator.next
|
22
|
+
all_entries.each do |entry|
|
23
|
+
next_encounter = encounters_iterator.peek rescue nil
|
24
|
+
while (next_encounter && entry.as_point_in_time >= next_encounter.as_point_in_time)
|
25
|
+
current_encounter = encounters_iterator.next
|
26
|
+
next_encounter = encounters_iterator.peek rescue nil
|
27
|
+
end
|
28
|
+
entries_by_encounter[current_encounter.hash] ||= []
|
29
|
+
entries_by_encounter[current_encounter.hash] << entry
|
30
|
+
end
|
31
|
+
end
|
32
|
+
%>
|
33
|
+
|
34
|
+
<% patient.encounters.each_with_index do |encounter, index| %>
|
35
|
+
<% if index > 0 %><br/><% end %>
|
36
|
+
<div style="background: #EEEEEE; width: 92%"><h3>Encounter <%= index+1 %></h3></div>
|
37
|
+
<div style="padding-left: 15px;">
|
38
|
+
<%
|
39
|
+
entries_by_section = {}
|
40
|
+
entries_by_encounter[encounter.hash].each do |entry|
|
41
|
+
decoded_section = decode_hqmf_section(entry_section[entry.hash], entry.oid)
|
42
|
+
entries_by_section[decoded_section] ||= []
|
43
|
+
entries_by_section[decoded_section] << entry
|
44
|
+
end if entries_by_encounter[encounter.hash]
|
45
|
+
%>
|
46
|
+
<%== render :partial => 'section', :locals => {entries: [encounter], section: :encounters, concept_map: concept_map} %>
|
47
|
+
<% entries_by_section.each do |section, entries| %>
|
48
|
+
<%== render :partial => 'section', :locals => {entries: entries, section: section, concept_map: concept_map} %>
|
49
|
+
<% end %>
|
50
|
+
</div>
|
51
|
+
|
52
|
+
<% end %>
|
53
|
+
|
54
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div id="patient_information_by_section" style="display:block">
|
2
|
+
<%
|
3
|
+
entries_by_section = {}
|
4
|
+
Record::Sections.each do |section|
|
5
|
+
patient.send(section).each do |entry|
|
6
|
+
decoded_section = decode_hqmf_section(section, entry.oid)
|
7
|
+
entries_by_section[decoded_section] ||= []
|
8
|
+
entries_by_section[decoded_section] << entry
|
9
|
+
end if patient.respond_to? section
|
10
|
+
end
|
11
|
+
%>
|
12
|
+
<% entries_by_section.each do |section, entries| %>
|
13
|
+
<%== render :partial => 'section', :locals => {entries: entries, section: section, concept_map: concept_map} %>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
</div>
|
@@ -0,0 +1,67 @@
|
|
1
|
+
<tr class="narr_tr">
|
2
|
+
|
3
|
+
<td><%if entry.negationInd %><b>Not Done: </b><% end %><%= entry.description %></td>
|
4
|
+
<td>
|
5
|
+
<% entry.codes.each do |set, codes| %>
|
6
|
+
<b>
|
7
|
+
<% if concept_map %>
|
8
|
+
<span onmouseover="showConcepts(event,'<%=entry.id%>_<%=set%>')" onmouseout="hideConcepts(event,'<%=entry.id%>_<%=set%>')" style="cursor: pointer;"><%=set %>: <%= codes.join(',') %></span>
|
9
|
+
<% else %>
|
10
|
+
<%=set %>: <%= codes.join(',') %>
|
11
|
+
<% end %>
|
12
|
+
</b>
|
13
|
+
<br/>
|
14
|
+
<% if concept_map %>
|
15
|
+
<%
|
16
|
+
matches = []
|
17
|
+
codes.each do |code|
|
18
|
+
matches.concat(concept_map[set][code].values)
|
19
|
+
end
|
20
|
+
%>
|
21
|
+
<ul id="<%=entry.id%>_<%=set%>" style="display: none; position: absolute; background: #EEE; padding: 10px; padding-left: 30px; width: 600px; z-index: 3000;">
|
22
|
+
<% matches.each do |concept_match| %>
|
23
|
+
<li><%= concept_match[:concept].titleize %> (<%= concept_match[:oid]%>)</li>
|
24
|
+
<% end %>
|
25
|
+
</ul>
|
26
|
+
<% end %>
|
27
|
+
<% end %>
|
28
|
+
</td>
|
29
|
+
<td><%= entry.times_to_s %></td>
|
30
|
+
<td><%= decode_hqmf_status(entry.status, entry.oid) %></td>
|
31
|
+
<td>
|
32
|
+
<% entry.values.each do |value| %>
|
33
|
+
<% if value.respond_to? :scalar %>
|
34
|
+
<% units = value.try(:units) if(value.respond_to?(:units)) %>
|
35
|
+
<%= value.try(:scalar) %> <%= units %><br/>
|
36
|
+
<% elsif value.respond_to? :codes %>
|
37
|
+
<% value.codes.each do |system, vals| %>
|
38
|
+
<%= system %>: <%= vals.join(',') %>
|
39
|
+
<% end %>
|
40
|
+
<%= (value.description ? "(#{value.description})" : "(UNKNOWN CODED VALUE)")%>
|
41
|
+
<br/>
|
42
|
+
<% else %>
|
43
|
+
UNKNOWN VALUE
|
44
|
+
<% end %>
|
45
|
+
<% end %>
|
46
|
+
</td>
|
47
|
+
<td>
|
48
|
+
<%
|
49
|
+
(entry.attributes.keys.reject {|key| ['codes', 'time', 'description', 'mood_code', 'values', '_id', '_type', 'start_time', 'end_time', 'status_code', 'negationInd', 'negationReason', 'oid'].include? key}).each do |field|
|
50
|
+
field_value = ThingWithCodes.convert_codes_to_s(entry.attributes[field]) rescue entry.attributes[field].to_s
|
51
|
+
%>
|
52
|
+
<%= field %>: (<b><%= field_value %></b>)
|
53
|
+
<%
|
54
|
+
end
|
55
|
+
if entry.negationInd
|
56
|
+
negation_reason = ''
|
57
|
+
if entry.negationReason
|
58
|
+
negation_reason = ThingWithCodes.convert_codes_to_s(entry.negationReason) rescue entry.negationReason.to_s
|
59
|
+
end
|
60
|
+
%>
|
61
|
+
negation: <%= negation_reason %>
|
62
|
+
<%
|
63
|
+
end
|
64
|
+
%>
|
65
|
+
</td>
|
66
|
+
|
67
|
+
</tr>
|
@@ -0,0 +1,58 @@
|
|
1
|
+
<table class="header_table">
|
2
|
+
<tbody>
|
3
|
+
<tr>
|
4
|
+
<td width="20%" bgcolor="#3399ff"><span class="td_label">Patient</span></td>
|
5
|
+
<td colspan="3"><%= patient.first%> <%= patient.last%></td>
|
6
|
+
</tr>
|
7
|
+
<tr>
|
8
|
+
<td width="20%" bgcolor="#3399ff"><span class="td_label">Date of birth</span></td>
|
9
|
+
<td width="30%"><%= Time.at(patient.birthdate).utc.to_formatted_s(:long_ordinal)%></td>
|
10
|
+
<td width="15%" bgcolor="#3399ff"><span class="td_label">Sex</span></td>
|
11
|
+
<td><%= (patient.gender == 'M') ? "Male" : (patient.gender == 'F') ? 'Female' : 'Unknown'%></td>
|
12
|
+
</tr>
|
13
|
+
<tr>
|
14
|
+
<td bgcolor="#3399ff"><span class="td_label">Contact info</span></td>
|
15
|
+
<td> Pirmary Home:<br />202 Burlington Rd.<br />Bedford, MA 01730<br />Tel: +1-781-271-3000<br /></td>
|
16
|
+
<td bgcolor="#3399ff"><span class="td_label">Patient IDs</span></td>
|
17
|
+
<td><%= patient.id %> Cypress<br /></td>
|
18
|
+
</tr>
|
19
|
+
</tbody>
|
20
|
+
</table>
|
21
|
+
<table class="header_table">
|
22
|
+
<tbody>
|
23
|
+
<tr>
|
24
|
+
<td width="20%" bgcolor="#3399ff"><span class="td_label">Document Id</span></td>
|
25
|
+
<td width="80%"><%= patient.id %> 2.16.840.1.113883.3.72</td>
|
26
|
+
</tr>
|
27
|
+
<tr>
|
28
|
+
<td width="20%" bgcolor="#3399ff"><span class="td_label">Document Created:</span></td>
|
29
|
+
<td width="80%"><%= Time.now.utc.to_formatted_s(:long_ordinal)%></td>
|
30
|
+
</tr>
|
31
|
+
</tbody>
|
32
|
+
</table>
|
33
|
+
<table class="header_table">
|
34
|
+
<tbody>
|
35
|
+
<tr>
|
36
|
+
<td width="20%" bgcolor="#3399ff"><span class="td_label">Author</span></td>
|
37
|
+
<td width="80%">Auto Generated</td>
|
38
|
+
</tr>
|
39
|
+
<tr>
|
40
|
+
<td bgcolor="#3399ff"><span class="td_label">Contact info</span></td>
|
41
|
+
<td>
|
42
|
+
<br />Tel: +1-781-271-3000<br />
|
43
|
+
</td>
|
44
|
+
</tr>
|
45
|
+
</tbody>
|
46
|
+
</table>
|
47
|
+
<table class="header_table">
|
48
|
+
<tbody>
|
49
|
+
<tr>
|
50
|
+
<td width="20%" bgcolor="#3399ff"><span class="td_label">Document maintained by</span></td>
|
51
|
+
<td width="80%">Cypress</td>
|
52
|
+
</tr>
|
53
|
+
<tr>
|
54
|
+
<td bgcolor="#3399ff"><span class="td_label">Contact info</span></td>
|
55
|
+
<td width="80%">202 Burlington Rd.<br />Bedford, MA 01730<br />Tel: +1-781-271-3000<br /></td>
|
56
|
+
</tr>
|
57
|
+
</tbody>
|
58
|
+
</table>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<h3><a name="<%= "#{title}_link" %>" href="#toc"><%= section.to_s.titleize %></a></h3>
|
2
|
+
<div>
|
3
|
+
<table class="narr_table" border="1" width="100%">
|
4
|
+
<thead>
|
5
|
+
<tr class="narr_tr">
|
6
|
+
<th class="narr_th" width="30%">Description</th>
|
7
|
+
<th class="narr_th" width="15%">Codes</th>
|
8
|
+
<th class="narr_th" width="15%">Time</th>
|
9
|
+
<th class="narr_th" width="10%">Status</th>
|
10
|
+
<th class="narr_th" width="15%">Results</th>
|
11
|
+
<th class="narr_th" width="15%">Fields</th>
|
12
|
+
</tr>
|
13
|
+
</thead>
|
14
|
+
<tbody>
|
15
|
+
<% (entries.sort { |left,right| left.as_point_in_time <=> right.as_point_in_time }).each do |entry| %>
|
16
|
+
<%== render :partial => 'entry', :locals => {:entry => entry, concept_map: concept_map} %>
|
17
|
+
<% end %>
|
18
|
+
</tbody>
|
19
|
+
</table>
|
20
|
+
</div>
|
@@ -0,0 +1,124 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
2
|
+
<html xmlns:n1="urn:hl7-org:v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
5
|
+
<title>Cypress Certification Patient Test Record: <%= patient.first%> <%= patient.last%></title>
|
6
|
+
<style type="text/css">
|
7
|
+
body {
|
8
|
+
color: #003366;
|
9
|
+
background-color: #FFFFFF;
|
10
|
+
font-family: Verdana, Tahoma, sans-serif;
|
11
|
+
font-size: 11px;
|
12
|
+
}
|
13
|
+
a {
|
14
|
+
color: #003366;
|
15
|
+
background-color: #FFFFFF;
|
16
|
+
}
|
17
|
+
h1 {
|
18
|
+
font-size: 12pt;
|
19
|
+
font-weight: bold;
|
20
|
+
}
|
21
|
+
h2 {
|
22
|
+
font-size: 11pt;
|
23
|
+
font-weight: bold;
|
24
|
+
}
|
25
|
+
h3 {
|
26
|
+
font-size: 10pt;
|
27
|
+
font-weight: bold;
|
28
|
+
}
|
29
|
+
h4 {
|
30
|
+
font-size: 8pt;
|
31
|
+
font-weight: bold;
|
32
|
+
}
|
33
|
+
div {
|
34
|
+
width: 95%;
|
35
|
+
}
|
36
|
+
table {
|
37
|
+
line-height: 10pt;
|
38
|
+
width: 90%;
|
39
|
+
}
|
40
|
+
tr {
|
41
|
+
background-color: #ccccff;
|
42
|
+
}
|
43
|
+
td {
|
44
|
+
padding: 0.1cm 0.2cm;
|
45
|
+
vertical-align: top;
|
46
|
+
}
|
47
|
+
.h1center {
|
48
|
+
font-size: 12pt;
|
49
|
+
font-weight: bold;
|
50
|
+
text-align: center;
|
51
|
+
width: 80%;
|
52
|
+
}
|
53
|
+
.header_table{
|
54
|
+
border: 1pt inset #00008b;
|
55
|
+
}
|
56
|
+
.narr_table {
|
57
|
+
width: 100%;
|
58
|
+
}
|
59
|
+
.narr_tr {
|
60
|
+
background-color: #ffffcc;
|
61
|
+
}
|
62
|
+
.narr_th {
|
63
|
+
background-color: #ffd700;
|
64
|
+
}
|
65
|
+
.td_label{
|
66
|
+
font-weight: bold;
|
67
|
+
color: white;
|
68
|
+
}
|
69
|
+
</style>
|
70
|
+
</head>
|
71
|
+
<body>
|
72
|
+
<h1 class="h1center">Cypress Certification Patient Test Record: <%= patient.first%> <%= patient.last%></h1>
|
73
|
+
<%== render :partial => 'header', :locals => {:patient => patient} %>
|
74
|
+
<!--h2><a name="toc">Table of Contents</a></h2>
|
75
|
+
<ul>
|
76
|
+
<li><a href="#idp190080">Allergies and Adverse Reactions</a></li>
|
77
|
+
<li><a href="#idp553808">Medications - Prescription and Non-Prescription</a></li>
|
78
|
+
<li><a href="#idp266352">Encounters</a></li>
|
79
|
+
<li><a href="#idp594640">Problems</a></li>
|
80
|
+
</ul-->
|
81
|
+
<script language="javascript">
|
82
|
+
var cur_view = "section";
|
83
|
+
function toggle(id) {
|
84
|
+
var e = document.getElementById(id);
|
85
|
+
if (cur_view=="section"){
|
86
|
+
document.getElementById("patient_information_by_section").style.display = 'none';
|
87
|
+
document.getElementById("table_by_encounter").style.display = 'block';
|
88
|
+
document.getElementById('toggle_button').innerHTML="View By Section";
|
89
|
+
cur_view = "encounter";
|
90
|
+
}else{
|
91
|
+
document.getElementById("patient_information_by_section").style.display = 'block';
|
92
|
+
document.getElementById("table_by_encounter").style.display = 'none';
|
93
|
+
document.getElementById('toggle_button').innerHTML="View By Encounter";
|
94
|
+
cur_view = "section";
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
function showConcepts(ev, id) {
|
99
|
+
var left = ev.clientX + document.documentElement.scrollLeft;
|
100
|
+
var top = ev.clientY + document.documentElement.scrollTop;
|
101
|
+
|
102
|
+
var concepts = document.getElementById(id);
|
103
|
+
concepts.style.display = 'block';
|
104
|
+
concepts.style.left = left + 'px';
|
105
|
+
concepts.style.top = top + 'px';
|
106
|
+
}
|
107
|
+
function hideConcepts(ev, id) {
|
108
|
+
var concepts = document.getElementById(id);
|
109
|
+
concepts.style.display = 'none';
|
110
|
+
}
|
111
|
+
</script>
|
112
|
+
<div>
|
113
|
+
<h3><a href="#" onclick="toggle('table_by_encounter');" id="toggle_button">View By Encounter</a></h3>
|
114
|
+
</div>
|
115
|
+
|
116
|
+
<%== render :partial => 'entries_by_section', :locals => {patient: patient, concept_map: concept_map} %>
|
117
|
+
<%== render :partial => 'entries_by_encounter', :locals => {patient: patient, concept_map: concept_map} %>
|
118
|
+
|
119
|
+
<br /><br />
|
120
|
+
<br /><br />
|
121
|
+
<br /><br />
|
122
|
+
<br /><br />
|
123
|
+
</body>
|
124
|
+
</html>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: health-data-standards
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -260,6 +260,31 @@ files:
|
|
260
260
|
- templates/_telecom.gc32.erb
|
261
261
|
- templates/_vital_sign.gc32.erb
|
262
262
|
- templates/_vital_signs.c32.erb
|
263
|
+
- templates/ccda/_allergies.ccda.erb
|
264
|
+
- templates/ccda/_allergies_no_current.ccda.erb
|
265
|
+
- templates/ccda/_care_goals.ccda.erb
|
266
|
+
- templates/ccda/_code_with_reference.ccda.erb
|
267
|
+
- templates/ccda/_conditions.ccda.erb
|
268
|
+
- templates/ccda/_conditions_no_current.ccda.erb
|
269
|
+
- templates/ccda/_encounters.ccda.erb
|
270
|
+
- templates/ccda/_immunizations.ccda.erb
|
271
|
+
- templates/ccda/_medical_equipment.ccda.erb
|
272
|
+
- templates/ccda/_medications.ccda.erb
|
273
|
+
- templates/ccda/_medications_no_current.ccda.erb
|
274
|
+
- templates/ccda/_narrative_block.ccda.erb
|
275
|
+
- templates/ccda/_procedures.ccda.erb
|
276
|
+
- templates/ccda/_procedures_no_current.ccda.erb
|
277
|
+
- templates/ccda/_results.ccda.erb
|
278
|
+
- templates/ccda/_results_no_current.ccda.erb
|
279
|
+
- templates/ccda/_social_history.ccda.erb
|
280
|
+
- templates/ccda/_vital_signs.ccda.erb
|
281
|
+
- templates/ccda/show.ccda.erb
|
282
|
+
- templates/html/_entries_by_encounter.html.erb
|
283
|
+
- templates/html/_entries_by_section.html.erb
|
284
|
+
- templates/html/_entry.html.erb
|
285
|
+
- templates/html/_header.html.erb
|
286
|
+
- templates/html/_section.html.erb
|
287
|
+
- templates/html/show.html.erb
|
263
288
|
- templates/metadata.hdata.erb
|
264
289
|
- templates/record.gc32.erb
|
265
290
|
- templates/show.c32.erb
|