health-data-standards 3.2.11 → 3.2.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +9 -9
  2. data/lib/health-data-standards/export/cat_3.rb +3 -2
  3. data/lib/health-data-standards/export/rendering_context.rb +24 -12
  4. data/lib/health-data-standards/import/cat1/diagnosis_active_importer.rb +14 -0
  5. data/lib/health-data-standards/import/cat1/procedure_performed_importer.rb +9 -0
  6. data/lib/health-data-standards/import/cda/medical_equipment_importer.rb +9 -0
  7. data/lib/health-data-standards/models/qrda/author.rb +16 -0
  8. data/lib/health-data-standards/models/qrda/custodian.rb +11 -0
  9. data/lib/health-data-standards/models/qrda/device.rb +12 -0
  10. data/lib/health-data-standards/models/qrda/header.rb +14 -0
  11. data/lib/health-data-standards/models/qrda/id.rb +16 -0
  12. data/lib/health-data-standards/models/qrda/legal_authenticator.rb +16 -0
  13. data/lib/health-data-standards/models/qrda/organization.rb +9 -0
  14. data/lib/health-data-standards/models/qrda/person.rb +11 -0
  15. data/lib/health-data-standards.rb +11 -0
  16. data/templates/cat1/_2.16.840.1.113883.10.20.24.3.11.cat1.erb +15 -1
  17. data/templates/cat1/_2.16.840.1.113883.10.20.24.3.20.cat1.erb +6 -2
  18. data/templates/cat1/_2.16.840.1.113883.10.20.24.3.28.cat1.erb +6 -2
  19. data/templates/cat1/_2.16.840.1.113883.10.20.24.3.40.cat1.erb +6 -2
  20. data/templates/cat1/_2.16.840.1.113883.10.20.24.3.57.cat1.erb +6 -2
  21. data/templates/cat1/_2.16.840.1.113883.10.20.24.3.59.cat1.erb +5 -1
  22. data/templates/cat1/_2.16.840.1.113883.10.20.24.3.66.cat1.erb +3 -3
  23. data/templates/cat1/_2.16.840.1.113883.10.20.24.3.69.cat1.erb +6 -16
  24. data/templates/cat1/_result_value.cat1.erb +1 -1
  25. data/templates/cat3/_address.cat3.erb +9 -0
  26. data/templates/cat3/_author.cat3.erb +28 -0
  27. data/templates/cat3/_id.cat3.erb +1 -0
  28. data/templates/cat3/_organization.cat3.erb +7 -0
  29. data/templates/cat3/_telecom.cat3.erb +1 -0
  30. data/templates/cat3/show.cat3.erb +18 -31
  31. metadata +16 -3
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZmQ1ZDk1ZWEwZDBiYjEwZGEzZDNiMjdiNDQzNjdjNTdlOTdmYjM0Mg==
4
+ ZTU3MzQ3NTYyZDJmYjk2NDc4ZWFhNWExNzkyZWJkYjZmYWE1MzIwNg==
5
5
  data.tar.gz: !binary |-
6
- ZTY5ZDk0Y2IwNDM4MDg1ZjFiNDEyOWE4MGVkNTdlNTgyYWJmNjNmYw==
7
- !binary "U0hBNTEy":
6
+ NzhlZWM4ZTA4MWVmYjRjMDE1ZjBiNDg2YTAyNmE2Mzg3MDZhZDFjYg==
7
+ SHA512:
8
8
  metadata.gz: !binary |-
9
- YmNhMTUzM2ZhYzliZDFhODU2NTc5ZTBlM2ZlMDgxYTliNWEyYWM4ZmU1MTFk
10
- NDkyNzEwNzVkYmI5ZmNiZWJlMDNlZjNlOWU2ODU4Y2FjMmM3YTIwM2JkN2Y3
11
- NTk0ZjBiNzkzMTIxYzY2M2IzYjExNTRmMmY2MmU1NjM0Y2RkNmI=
9
+ ZjJlODQ5M2Q1YjM1YjZmNGJhOWIwOTczMzMyNGVhYTUzZTIzMWQwNzE2ZWI4
10
+ ZGVlODI3OTIzMmU2MmFjMmUxMjMwM2U2ZjVhODhhMzMyYWYyYzQ3NGIyZDlk
11
+ MjVkYjA3NWI5MDlkMzdlYmIxZWQxYWJhMzUzZTdjZWM0MmM3MDg=
12
12
  data.tar.gz: !binary |-
13
- YTgxOGY4MDBlMGY1NmM3MDQ3ZTFmNTc5ZDExOTliNWI1YTVhNzgzZGJjNDEw
14
- MWU4NmY1OTJlMjBmMGI5MzBlOGUxYWQwOGMwMTc4NWI5N2MyMzRhM2Y0MzQy
15
- OTVkOWM2MjU3MWUxOTkwZWMwYWI3Yzg4ZDdmYzdjOWFlMmM1MWE=
13
+ NDE1MGVkOTM1YTVjYmFjZGViZDE0NWQxZTM5ZDNhODIyZWY2MWQ3MDhiYzJl
14
+ M2RjM2RiODBhMGY1MWQ4NjJlM2Q1MDgxYzYxOWIzNzYyN2UxZjIyODk5NWQ0
15
+ NGZiNGMwYWQ2ZGZiYzU5ZWQ1YWM0YmNkYTkxMTQ4MmU0Nzg3YTA=
@@ -9,7 +9,7 @@ module HealthDataStandards
9
9
  @cat1_renderer.template_helper = HealthDataStandards::Export::TemplateHelper.new('cat1', 'cat1')
10
10
  end
11
11
 
12
- def export(measures, effective_date, start_date, end_date, test_id=nil)
12
+ def export(measures, header, effective_date, start_date, end_date, test_id=nil)
13
13
  results = {}
14
14
  measures.each do |measure|
15
15
  results[measure['hqmf_id']] = HealthDataStandards::CQM::QueryCache.aggregate_measure(measure['hqmf_id'], effective_date, test_id)
@@ -17,7 +17,8 @@ module HealthDataStandards
17
17
  @rendering_context.render(:template => 'show',
18
18
  :locals => {:measures => measures, :start_date => start_date,
19
19
  :end_date => end_date, :cat1_renderer => @cat1_renderer,
20
- :results => results})
20
+ :results => results,
21
+ :header=>header})
21
22
  end
22
23
  end
23
24
  end
@@ -22,26 +22,38 @@ module HealthDataStandards
22
22
  binding
23
23
  end
24
24
 
25
+
26
+
25
27
  def render(params)
26
28
  erb = nil
29
+ ident = nil
27
30
  if params[:template]
28
31
  erb = @template_helper.template(params[:template])
29
32
  elsif params[:partial]
30
33
  erb = @template_helper.partial(params[:partial])
31
- end
32
-
33
- locals = params[:locals]
34
- locals ||= {}
35
- rendering_context = RenderingContext.new(locals)
36
- rendering_context.template_helper = @template_helper
37
- if @extensions.present?
38
- rendering_context.extensions = @extensions
39
- @extensions.each do |extension|
40
- rendering_context.extend(extension)
34
+ if params[:collection]
35
+ ident = params[:id] || params[:partial]
41
36
  end
42
37
  end
43
- eruby = Erubis::EscapedEruby.new(erb) # TODO: cache these
44
- eruby.result(rendering_context.my_binding)
38
+
39
+ collection = params[:collection] || [true]
40
+ collection.map do |item|
41
+ locals = params[:locals]
42
+ locals ||= {}
43
+ if ident
44
+ locals[ident] = item
45
+ end
46
+ rendering_context = RenderingContext.new(locals)
47
+ rendering_context.template_helper = @template_helper
48
+ if @extensions.present?
49
+ rendering_context.extensions = @extensions
50
+ @extensions.each do |extension|
51
+ rendering_context.extend(extension)
52
+ end
53
+ end
54
+ eruby = Erubis::EscapedEruby.new(erb) # TODO: cache these
55
+ eruby.result(rendering_context.my_binding)
56
+ end.join
45
57
  end
46
58
  end
47
59
  end
@@ -7,6 +7,20 @@ module HealthDataStandards
7
7
  super(CDA::EntryFinder.new("//cda:observation[cda:templateId/@root='2.16.840.1.113883.10.20.24.3.11']"))
8
8
  @status_xpath = nil # We'll hardcode this to active in create entry because this is from the
9
9
  # diagnosis active template
10
+ @severity_xpath = "./cda:entryRelationship/cda:observation[cda:templateId/@root='2.16.840.1.113883.10.20.22.4.8']/cda:value"
11
+ end
12
+
13
+ def create_entry(entry_element, nrh = NarrativeReferenceHandler.new)
14
+ condition = super(entry_element,nrh)
15
+ extract_severity(entry_element,condition)
16
+ condition
17
+ end
18
+
19
+ def extract_severity(entry_element,condition)
20
+ severity = entry_element.at_xpath(@severity_xpath)
21
+ if(severity)
22
+ condition.severity = {CodeSystemHelper.code_system_for(severity['codeSystem']) => [severity['code']]}
23
+ end
10
24
  end
11
25
  end
12
26
  end
@@ -6,11 +6,13 @@ module HealthDataStandards
6
6
  super(entry_finder)
7
7
  @entry_class = Procedure
8
8
  @ordinality_xpath = "./cda:priorityCode"
9
+ @incision_xpath ="./cda:entryRelationship/cda:procedure[./cda:templateId[@root='2.16.840.1.113883.10.20.24.3.89']]/cda:effectiveTime"
9
10
  end
10
11
 
11
12
  def create_entry(entry_element, nrh = CDA::NarrativeReferenceHandler.new)
12
13
  procedure = super
13
14
  extract_ordinality(entry_element, procedure)
15
+ extract_incision_date_time(entry_element,procedure)
14
16
  procedure
15
17
  end
16
18
 
@@ -22,6 +24,13 @@ module HealthDataStandards
22
24
  procedure.ordinality = {CodeSystemHelper.code_system_for(ordinality_element['codeSystem']) => [ordinality_element['code']]}
23
25
  end
24
26
  end
27
+
28
+ def extract_incision_date_time(parent_element, procedure)
29
+ incision_time = parent_element.at_xpath(@incision_xpath)
30
+ if incision_time
31
+ procedure.incision_time = HL7Helper.timestamp_to_integer(incision_time['value'])
32
+ end
33
+ end
25
34
  end
26
35
  end
27
36
  end
@@ -5,12 +5,14 @@ module HealthDataStandards
5
5
  def initialize(entry_finder=EntryFinder.new("//cda:section[cda:templateId/@root='2.16.840.1.113883.3.88.11.83.128']/cda:entry/cda:supply"))
6
6
  super(entry_finder)
7
7
  @code_xpath = "./cda:participant/cda:participantRole/cda:playingDevice/cda:code"
8
+ @anatomical_xpath = "./cda:targetSiteCode"
8
9
  @entry_class = MedicalEquipment
9
10
  end
10
11
 
11
12
  def create_entry(entry_element, nrh = NarrativeReferenceHandler.new)
12
13
  medical_equipment = super
13
14
  extract_manufacturer(entry_element, medical_equipment)
15
+ extract_anatomical_structure(entry_element, medical_equipment)
14
16
  medical_equipment
15
17
  end
16
18
 
@@ -18,6 +20,13 @@ module HealthDataStandards
18
20
  manufacturer = entry_element.at_xpath("./cda:participant/cda:participantRole/cda:scopingEntity/cda:desc").try(:inner_text)
19
21
  entry.manufacturer = manufacturer.strip if manufacturer
20
22
  end
23
+
24
+ def extract_anatomical_structure(entry_element, entry)
25
+ site = entry_element.at_xpath(@anatomical_xpath)
26
+ if site
27
+ entry.anatomical_structure = {CodeSystemHelper.code_system_for(site['codeSystem']) => [site['code']]}
28
+ end
29
+ end
21
30
  end
22
31
  end
23
32
  end
@@ -0,0 +1,16 @@
1
+ module Qrda
2
+
3
+ class Author
4
+
5
+ include Mongoid::Document
6
+ field :time, type: DateTime, default: Time.now
7
+ embeds_many :ids
8
+ embeds_many :addresses
9
+ embeds_many :telecoms
10
+ embeds_one :person, class_name: "Qrda::Person"
11
+ embeds_one :device
12
+ embeds_one :organization, class_name: "Qrda::Organization"
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,11 @@
1
+ module Qrda
2
+
3
+ class Custodian
4
+ include Mongoid::Document
5
+ embeds_many :ids
6
+ embeds_one :person, class_name: "Qrda::Person"
7
+ embeds_one :organization, class_name: "Qrda::Organization"
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,12 @@
1
+ module Qrda
2
+
3
+ class Device
4
+
5
+ include Mongoid::Document
6
+
7
+ field :name, type: String
8
+ field :model, type: String
9
+
10
+ end
11
+
12
+ end
@@ -0,0 +1,14 @@
1
+ module Qrda
2
+
3
+ class Header
4
+ include Mongoid::Document
5
+ embeds_one :identifier, class_name: "Qrda::Id"
6
+ embeds_many :authors
7
+ embeds_one :custodian
8
+ embeds_one :legal_authenticator
9
+ embeds_many :performers
10
+
11
+ field :time , type: DateTime, default: Time.now
12
+ end
13
+
14
+ end
@@ -0,0 +1,16 @@
1
+ module Qrda
2
+
3
+ class Id
4
+ include Mongoid::Document
5
+ field :extension, type: String
6
+ field :root, type: String
7
+
8
+ def self.generate(root=nil, extension=nil)
9
+ root ||= ""
10
+ extension ||= ""
11
+ return self.new(root: root, extension: extension)
12
+ end
13
+
14
+
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Qrda
2
+
3
+ class LegalAuthenticator
4
+ include Mongoid::Document
5
+
6
+ field :time, type: DateTime, default: Time.now
7
+
8
+ embeds_many :ids
9
+ embeds_many :addresses
10
+ embeds_one :person, class_name: "Qrda::Person"
11
+ embeds_one :organization, class_name: "Qrda::Organization"
12
+
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,9 @@
1
+ module Qrda
2
+
3
+ class Organization
4
+ include Mongoid::Document
5
+ field :name, type: String
6
+ embeds_many :ids
7
+ end
8
+
9
+ end
@@ -0,0 +1,11 @@
1
+ module Qrda
2
+
3
+ class Person
4
+ include Mongoid::Document
5
+ field :given, type: String
6
+ field :family, type: String
7
+
8
+
9
+ end
10
+
11
+ end
@@ -74,6 +74,17 @@ require_relative 'health-data-standards/models/metadata/change_info'
74
74
  require_relative 'health-data-standards/models/metadata/link_info'
75
75
  require_relative 'health-data-standards/models/metadata/pedigree'
76
76
 
77
+ require_relative 'health-data-standards/models/qrda/id'
78
+ require_relative 'health-data-standards/models/qrda/device'
79
+ require_relative 'health-data-standards/models/qrda/person'
80
+ require_relative 'health-data-standards/models/qrda/organization'
81
+ require_relative 'health-data-standards/models/qrda/custodian'
82
+ require_relative 'health-data-standards/models/qrda/legal_authenticator'
83
+ require_relative 'health-data-standards/models/qrda/author'
84
+ require_relative 'health-data-standards/models/qrda/header'
85
+
86
+
87
+
77
88
  require_relative 'health-data-standards/export/qrda/entry_template_resolver'
78
89
  require_relative 'health-data-standards/export/helper/scooped_view_helper'
79
90
  require_relative 'health-data-standards/export/helper/html_view_helper'
@@ -14,7 +14,7 @@
14
14
  <!-- Attribute: discharge datetime -->
15
15
  <high <%= value_or_null_flavor(entry.end_time) %>/>
16
16
  </effectiveTime>
17
- <%== render(:partial => 'ordinality', :locals => {:entry => entry, :reason_oids=>field_oids["ORDINAL"]}) %>
17
+ <%== render(:partial => 'ordinality', :locals => {:entry => entry, :ordinality_oids=>field_oids["ORDINAL"]}) %>
18
18
 
19
19
  <%== code_display(entry, {'tag_name' => 'value', 'value_set_map' => value_set_map,'preferred_code_sets' => ['LOINC', 'SNOMED-CT', 'ICD-9-CM', 'ICD-10-CM'],
20
20
  'extra_content' => "xsi:type=\"CD\" sdtc:valueSet=\"#{value_set_oid}\""}) %>
@@ -37,5 +37,19 @@
37
37
  codeSystemName="SNOMED CT"/>
38
38
  </observation>
39
39
  </entryRelationship>
40
+ <% if entry.severity
41
+
42
+ %>
43
+ <entryRelationship typeCode="REFR">
44
+ <observation classCode="OBS" moodCode="EVN">
45
+ <templateId root="2.16.840.1.113883.10.20.22.4.8"/>
46
+ <code code="SEV"
47
+ codeSystem="2.16.840.1.113883.5.4"/>
48
+ <statusCode code="completed"/>
49
+ <%== render(:partial => 'result_value', :locals => {:values => [entry.severity], :result_oids=>field_oids["SEVERITY"]} ) %>
50
+ </observation>
51
+
52
+ </entryRelationship>
53
+ <% end %>
40
54
  </observation>
41
55
  </entry>
@@ -1,3 +1,6 @@
1
+ <% vals = entry.values.empty? ? [nil] : entry.values
2
+ vals.each do |value|
3
+ %>
1
4
  <entry>
2
5
  <observation classCode="OBS" moodCode="EVN" <%== negation_indicator(entry) %>>
3
6
  <!-- Consolidated Result Observation templateId (Implied Template) -->
@@ -14,7 +17,8 @@
14
17
  <low <%= value_or_null_flavor(entry.start_time) %>/>
15
18
  <high <%= value_or_null_flavor(entry.end_time) %>/>
16
19
  </effectiveTime>
17
- <%== render(:partial => 'result_value', :locals => {:values => [entry.values.first], :result_oids=>result_oids}) %>
20
+ <%== render(:partial => 'result_value', :locals => {:values => [value], :result_oids=>result_oids}) %>
18
21
  <%== render(:partial => 'reason', :locals => {:entry => entry, :reason_oids=>field_oids["REASON"]}) %>
19
22
  </observation>
20
- </entry>
23
+ </entry>
24
+ <% end %>
@@ -1,3 +1,6 @@
1
+ <% vals = entry.values.empty? ? [nil] : entry.values
2
+ vals.each do |value|
3
+ %>
1
4
  <entry>
2
5
  <observation classCode="OBS" moodCode="EVN">
3
6
  <!-- Functional Status Result Observation (consolidation) template -->
@@ -15,6 +18,7 @@
15
18
  </effectiveTime>
16
19
 
17
20
  <!-- Result -->
18
- <%== render(:partial => 'result_value', :locals => {:values => [entry.values.first], :result_oids=>result_oids}) %>
21
+ <%== render(:partial => 'result_value', :locals => {:values => [value], :result_oids=>result_oids}) %>
19
22
  </observation>
20
- </entry>
23
+ </entry>
24
+ <% end %>
@@ -1,3 +1,6 @@
1
+ <% vals = entry.values.empty? ? [nil] : entry.values
2
+ vals.each do |value|
3
+ %>
1
4
  <entry>
2
5
  <!--Laboratory test, result -->
3
6
  <observation classCode="OBS" moodCode="EVN">
@@ -13,6 +16,7 @@
13
16
  <low <%= value_or_null_flavor(entry.start_time) %>/>
14
17
  <high <%= value_or_null_flavor(entry.end_time) %>/>
15
18
  </effectiveTime>
16
- <%== render(:partial => 'result_value', :locals => {:values => [entry.values.first], :result_oids=>result_oids}) %>
19
+ <%== render(:partial => 'result_value', :locals => {:values => [value], :result_oids=>result_oids}) %>
17
20
  </observation>
18
- </entry>
21
+ </entry>
22
+ <% end %>
@@ -1,3 +1,6 @@
1
+ <% vals = entry.values.empty? ? [nil] : entry.values
2
+ vals.each do |value|
3
+ %>
1
4
  <entry>
2
5
  <!-- Physical Exam Finding -->
3
6
  <observation classCode="OBS" moodCode="EVN">
@@ -13,6 +16,7 @@
13
16
  <low <%= value_or_null_flavor(entry.start_time) %>/>
14
17
  <high <%= value_or_null_flavor(entry.end_time) %>/>
15
18
  </effectiveTime>
16
- <%== render(:partial => 'result_value', :locals => {:values => [entry.values.first], :result_oids=>result_oids}) %>
19
+ <%== render(:partial => 'result_value', :locals => {:values => [value], :result_oids=>result_oids}) %>
17
20
  </observation>
18
- </entry>
21
+ </entry>
22
+ <% end %>
@@ -1,3 +1,6 @@
1
+ <% vals = entry.values.empty? ? [nil] : entry.values
2
+ vals.each do |value|
3
+ %>
1
4
  <entry>
2
5
  <observation classCode="OBS" moodCode="EVN" <%== negation_indicator(entry) %>>
3
6
  <!-- Procedure Activity Procedure (Consolidation) template -->
@@ -12,6 +15,7 @@
12
15
  <low <%= value_or_null_flavor(entry.start_time) %>/>
13
16
  <high <%= value_or_null_flavor(entry.end_time) %>/>
14
17
  </effectiveTime>
15
- <%== render(:partial => 'result_value', :locals => {:values => [entry.values.first], :result_oids=>result_oids}) %>
18
+ <%== render(:partial => 'result_value', :locals => {:values => [value], :result_oids=>result_oids}) %>
16
19
  </observation>
17
20
  </entry>
21
+ <% end %>
@@ -1,6 +1,6 @@
1
-
2
- <% vals = entry.values || [nil]
3
- vals.each do |value| %>
1
+ <% vals = entry.values.empty? ? [nil] : entry.values
2
+ vals.each do |value|
3
+ %>
4
4
  <entry>
5
5
  <procedure classCode="PROC" moodCode="EVN">
6
6
  <!-- Consolidated Procedure Activity Procedure TemplateId
@@ -1,3 +1,6 @@
1
+ <% vals = entry.values.empty? ? [nil] : entry.values
2
+ vals.each do |value|
3
+ %>
1
4
  <entry>
2
5
  <observation classCode="OBS" moodCode="EVN" <%== negation_indicator(entry) %>>
3
6
  <!-- Consolidation Assessment Scale Observation templateId -->
@@ -12,21 +15,8 @@
12
15
  <low <%= value_or_null_flavor(entry.start_time) %>/>
13
16
  <high <%= value_or_null_flavor(entry.end_time) %>/>
14
17
  </effectiveTime>
15
-
16
- <% ev = entry.values.first
17
- if ev.present?
18
- if ev.respond_to?(:scalar)
19
- if is_num?(ev.scalar) -%>
20
- <value xsi:type="INT" value="<%= ev.scalar %>"/>
21
- <% else -%>
22
- <value xsi:type="ST"><%= ev.scalar%></value>
23
- <% end %>
24
- <% else %>
25
- <%== code_display(entry, 'tag_name'=>'value', 'value_set_map' => value_set_map,'preferred_code_sets' => ['LOINC', 'SNOMED-CT'],'extra_content' =>'xsi:type="CD"') %>
26
- <% end %>
27
- <% else -%>
28
- <value xsi:type="CD" nullFlavor="UNK"/>
29
- <% end -%>
18
+ <%== render(:partial => 'result_value', :locals => {:values => [value], :result_oids=>result_oids} ) %>
30
19
  <%== render(:partial => 'reason', :locals => {:entry => entry, :reason_oids=>field_oids["REASON"]}) %>
31
20
  </observation>
32
- </entry>
21
+ </entry>
22
+ <% end %>
@@ -14,7 +14,7 @@
14
14
  <%== code_display(ev, 'preferred_code_sets' => ['LOINC', 'SNOMED-CT', 'ICD-9-CM', 'ICD-10-CM'], 'tag_name' => 'value', 'extra_content' => extra_content) %>
15
15
  <% elsif ev.respond_to?(:scalar) -%>
16
16
  <% if is_num?(ev.scalar) -%>
17
- <value xsi:type="PQ" value="<%= ev.scalar %>" <% if ev.units && (ev.units != "") -%>unit="<%= ev.units %>"<% end -%>/>
17
+ <value xsi:type="PQ" value="<%= ev.scalar.to_s.strip %>" <% if ev.units && (ev.units != "") -%>unit="<%= ev.units %>"<% end -%>/>
18
18
  <% elsif is_bool?(ev.scalar)%>
19
19
  <value xsi:type="BL" value="<%= ev.scalar %>" />
20
20
  <% else -%>
@@ -0,0 +1,9 @@
1
+ <addr use="<%= address.use %>">
2
+ <% address.street.each do |street| %>
3
+ <streetAddressLine><%= street %></streetAddressLine>
4
+ <% end %>
5
+ <city><%= address.city %></city>
6
+ <state><%= address.state %></state>
7
+ <postalCode><%= address.zip %></postalCode>
8
+ <country><%= address.country %></country>
9
+ </addr>
@@ -0,0 +1,28 @@
1
+ <!-- SHALL have 1..* author. MAY be device or person.
2
+ The author of the CDA document in this example is a device at a data submission vendor/registry. -->
3
+ <author>
4
+ <time value="<%= author.time.to_formatted_s(:number) %>"/>
5
+ <assignedAuthor>
6
+ <!-- Registry author ID -->
7
+ <%== render :partial=>"id", :collection=>author.ids, :id=>"identifier" %>
8
+ <%== render :partial=>"address" , :collection=>author.addresses %>
9
+ <%== render :partial=>"telecom" , :collection=>author.telecoms %>
10
+
11
+ <% if author.person %>
12
+ <assignedPerson>
13
+ <name>
14
+ <given><%= author.person.given %></given>
15
+ <family><%= author.person.family %></family>
16
+ </name>
17
+ </assignedPerson>
18
+ <% elsif author.device %>
19
+ <assignedAuthoringDevice>
20
+ <softwareName><%= author.device.name %></softwareName>
21
+ <manufacturerModelName><%= author.device.model %></manufacturerModelName>
22
+ </assignedAuthoringDevice>
23
+ <% end %>
24
+
25
+ <%== render :partial=>"organization", :locals=>{organization: author.organization} %>
26
+
27
+ </assignedAuthor>
28
+ </author>
@@ -0,0 +1 @@
1
+ <id <%== identifier.root.nil? ? "" : "root='#{identifier.root}'" -%> extension="<%= identifier.extension %>"/>
@@ -0,0 +1,7 @@
1
+ <representedOrganization>
2
+ <!-- Represents unique registry organization TIN -->
3
+
4
+ <%== render :partial=>"id", :collection=>organization.ids, :id=> "identifier" %>
5
+ <!-- Contains name - specific registry not required-->
6
+ <name><%= organization.name %></name>
7
+ </representedOrganization>
@@ -0,0 +1 @@
1
+ <telecom use="<%=telecom.use%>" value="tel:+<%=telecom.value%>" />
@@ -12,7 +12,8 @@
12
12
  <typeId root="2.16.840.1.113883.1.3" extension="POCD_HD000040"/>
13
13
  <!-- QRDA Category III Release 1 template ID (this template ID differs from QRDA III comment only template ID). -->
14
14
  <templateId root="2.16.840.1.113883.10.20.27.1.1"/>
15
- <id root="<%= UUID.generate %>"/>
15
+ <%== render :partial=>"id", :locals=>{identifier: header.identifier} %>
16
+
16
17
  <!-- SHALL QRDA III document type code -->
17
18
  <code code="55184-6" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC"
18
19
  displayName="Quality Reporting Document Architecture Calculated Summary Report"/>
@@ -30,35 +31,18 @@
30
31
  <id nullFlavor="NA"/>
31
32
  </patientRole>
32
33
  </recordTarget>
34
+
35
+ <%== render :partial=>"author", :collection=>header.authors %>
33
36
  <!-- SHALL have 1..* author. MAY be device or person.
34
37
  The author of the CDA document in this example is a device at a data submission vendor/registry. -->
35
- <author>
36
- <time value="<%= Time.now.utc.to_formatted_s(:number) %>"/>
37
- <assignedAuthor>
38
- <!-- Registry author ID -->
39
- <id extension="Cypress" root="MITRE"/>
40
- <assignedAuthoringDevice>
41
- <softwareName></softwareName>
42
- </assignedAuthoringDevice>
43
- <representedOrganization>
44
- <!-- Represents unique registry organization TIN -->
45
- <id root="root" extension="ext"/>
46
- <!-- Contains name - specific registry not required-->
47
- <name></name>
48
- </representedOrganization>
49
- </assignedAuthor>
50
- </author>
38
+
51
39
  <!-- The custodian of the CDA document is the same as the legal authenticator in this
52
40
  example and represents the reporting organization. -->
53
41
  <!-- SHALL -->
54
42
  <custodian>
55
43
  <assignedCustodian>
56
- <representedCustodianOrganization>
57
- <!-- SHALL have an id - This is an example root -->
58
- <id root="root"/>
59
- <!-- SHOULD Name not required -->
60
- <name>Cypress</name>
61
- </representedCustodianOrganization>
44
+ <%== render :partial=>"id", :collection=>header.custodian.organization.ids, :id=>"identifier" %>
45
+ <%== render :partial=>"organization", :locals=>{organization: header.custodian.organization} %>
62
46
  </assignedCustodian>
63
47
  </custodian>
64
48
  <!-- The legal authenticator of the CDA document is a single person who is at the
@@ -66,18 +50,21 @@
66
50
  <!-- SHALL -->
67
51
  <legalAuthenticator>
68
52
  <!-- SHALL -->
69
- <time value="<%= Time.now.utc.to_formatted_s(:number) %>"/>
53
+ <time value="<%= header.legal_authenticator.time.utc.to_formatted_s(:number) %>"/>
70
54
  <!-- SHALL -->
71
55
  <signatureCode code="S"/>
72
56
  <assignedEntity>
73
57
  <!-- SHALL ID -->
74
- <id root="root"/>
75
- <!-- SHALL -->
76
- <representedOrganization>
77
- <!-- SHALL Id -->
78
- <!-- example root -->
79
- <id root="root"/>
80
- </representedOrganization>
58
+ <%== render :partial=>"id", :collection=>header.legal_authenticator.ids, :id=>"identifier" %>
59
+ <%== render :partial=>"address" , :collection=>header.legal_authenticator.addresses %>
60
+ <assignedPerson>
61
+ <name>
62
+ <given><%= header.legal_authenticator.person.given %></given>
63
+ <family><%= header.legal_authenticator.person.family %></family>
64
+ </name>
65
+ </assignedPerson>
66
+
67
+ <%== render :partial=>"organization", :locals=>{organization: header.legal_authenticator.organization} %>
81
68
  </assignedEntity>
82
69
  </legalAuthenticator>
83
70
 
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: 3.2.11
4
+ version: 3.2.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Gregorowicz
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2013-09-04 00:00:00.000000000 Z
15
+ date: 2013-12-09 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rest-client
@@ -290,6 +290,14 @@ files:
290
290
  - lib/health-data-standards/models/procedure.rb
291
291
  - lib/health-data-standards/models/provider.rb
292
292
  - lib/health-data-standards/models/provider_performance.rb
293
+ - lib/health-data-standards/models/qrda/author.rb
294
+ - lib/health-data-standards/models/qrda/custodian.rb
295
+ - lib/health-data-standards/models/qrda/device.rb
296
+ - lib/health-data-standards/models/qrda/header.rb
297
+ - lib/health-data-standards/models/qrda/id.rb
298
+ - lib/health-data-standards/models/qrda/legal_authenticator.rb
299
+ - lib/health-data-standards/models/qrda/organization.rb
300
+ - lib/health-data-standards/models/qrda/person.rb
293
301
  - lib/health-data-standards/models/record.rb
294
302
  - lib/health-data-standards/models/result_value.rb
295
303
  - lib/health-data-standards/models/support.rb
@@ -416,11 +424,16 @@ files:
416
424
  - templates/cat1/_reporting_parameters.cat1.erb
417
425
  - templates/cat1/_result_value.cat1.erb
418
426
  - templates/cat1/show.cat1.erb
427
+ - templates/cat3/_address.cat3.erb
428
+ - templates/cat3/_author.cat3.erb
419
429
  - templates/cat3/_continuous_variable_value.cat3.erb
430
+ - templates/cat3/_id.cat3.erb
420
431
  - templates/cat3/_measure_data.cat3.erb
432
+ - templates/cat3/_organization.cat3.erb
421
433
  - templates/cat3/_performance_rate.cat3.erb
422
434
  - templates/cat3/_reporting_parameters.cat3.erb
423
435
  - templates/cat3/_supplemental_data.cat3.erb
436
+ - templates/cat3/_telecom.cat3.erb
424
437
  - templates/cat3/show.cat3.erb
425
438
  - templates/ccda/_allergies.ccda.erb
426
439
  - templates/ccda/_allergies_no_current.ccda.erb
@@ -525,7 +538,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
525
538
  version: '0'
526
539
  requirements: []
527
540
  rubyforge_project:
528
- rubygems_version: 2.0.7
541
+ rubygems_version: 2.1.3
529
542
  signing_key:
530
543
  specification_version: 4
531
544
  summary: A library for generating and consuming various healthcare related formats.