health-data-standards 3.2.12 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -1,11 +1,11 @@
1
- This is a project to generate and consume HITSP C32, ASTM CCR, QRDA Category I and PQRI.
1
+ This is a project to generate and consume HITSP C32, ASTM CCR, QRDA Category I, QRDA Category III and PQRI.
2
2
 
3
- In addition this project also contains libaries for parsing hqmf documents and for dealing with NLM valuesets.
3
+ In addition this project also contains libaries for parsing HQMF documents and for dealing with NLM valuesets.
4
4
 
5
5
  Environment
6
6
  ===========
7
7
 
8
- This project currently uses Ruby 1.9.3 and is built using [Bundler](http://gembundler.com/). To get all of the dependencies for the project, first install bundler:
8
+ This project currently uses Ruby 1.9.3, Ruby 2.0.0 and JRuby 1.7.5 and is built using [Bundler](http://gembundler.com/). To get all of the dependencies for the project, first install bundler:
9
9
 
10
10
  gem install bundler
11
11
 
@@ -13,18 +13,32 @@ Then run bundler to grab all of the necessary gems:
13
13
 
14
14
  bundle install
15
15
 
16
- The Quality Measure engine relies on a MongoDB [MongoDB](http://www.mongodb.org/) running a minimum of version 1.8.* or higher. To get and install Mongo refer to:
16
+ The Quality Measure engine relies on a MongoDB [MongoDB](http://www.mongodb.org/) running a minimum of version 2.4.* or higher. To get and install Mongo refer to:
17
17
 
18
18
  http://www.mongodb.org/display/DOCS/Quickstart
19
19
 
20
20
  Project Practices
21
21
  =================
22
22
 
23
- Please try to follow our [Coding Style Guides](http://github.com/eedrummer/styleguide). Additionally, we will be using git in a pattern similar to [Vincent Driessen's workflow](http://nvie.com/posts/a-successful-git-branching-model/). While feature branches are encouraged, they are not required to work on the project.
23
+ Please try to follow the [GitHub Coding Style Guides](https://github.com/styleguide). Additionally, we are switching to the git workflow described in [Juan Batiz-Benet's Gist](https://gist.github.com/jbenet/ee6c9ac48068889b0912). If you are new to the project and would like to make changes, please fork and do your work in a feature branch. Submit a pull request and we'll check to see if it is suitable to be merged in.
24
24
 
25
25
  Change Log
26
26
  ==========
27
27
 
28
+ 3.3.0 - November 7, 2013
29
+
30
+ * Removing hardcoded headers in QRDA documents and replacing them with templates populated by Ruby objects
31
+ * XML structural fixes in QRDA Category III generation
32
+ * QRDA Category I generation was previously dependent on a patient being associated with a bundle id, it will now use the latest bundle if one is not provided
33
+ * Specified a version in our dependency on rubyzip. API changes in rubyzip were breaking our code
34
+ * Fixed discrepancies between our Measure model and the JSON representation provided in measure bundles
35
+
36
+ 3.2.11 - September 4, 2013
37
+
38
+ * Adding rake tasks for working with measure bundles
39
+ * Fixes for XPath expression execution when using JRuby
40
+ * OID fixes for ordinality in QRDA Category
41
+
28
42
  3.2.8 - August 23, 2013
29
43
 
30
44
  * Bug fixes for QRDA Category III generation
@@ -83,7 +83,11 @@ require_relative 'health-data-standards/models/qrda/legal_authenticator'
83
83
  require_relative 'health-data-standards/models/qrda/author'
84
84
  require_relative 'health-data-standards/models/qrda/header'
85
85
 
86
-
86
+ require_relative 'health-data-standards/models/cqm/aggregate_objects'
87
+ require_relative 'health-data-standards/models/cqm/query_cache'
88
+ require_relative 'health-data-standards/models/cqm/bundle'
89
+ require_relative 'health-data-standards/models/cqm/measure'
90
+ require_relative 'health-data-standards/models/cqm/patient_cache'
87
91
 
88
92
  require_relative 'health-data-standards/export/qrda/entry_template_resolver'
89
93
  require_relative 'health-data-standards/export/helper/scooped_view_helper'
@@ -168,11 +172,6 @@ require_relative 'health-data-standards/import/cat1/ecog_status_importer'
168
172
  require_relative 'health-data-standards/import/cat1/symptom_active_importer'
169
173
  require_relative 'health-data-standards/import/cat1/insurance_provider_importer'
170
174
 
171
- require_relative 'health-data-standards/models/cqm/aggregate_objects'
172
- require_relative 'health-data-standards/models/cqm/query_cache'
173
- require_relative 'health-data-standards/models/cqm/bundle'
174
- require_relative 'health-data-standards/models/cqm/measure'
175
- require_relative 'health-data-standards/models/cqm/patient_cache'
176
175
  require_relative 'health-data-standards/import/bundle/importer'
177
176
 
178
177
 
@@ -9,10 +9,10 @@ module HealthDataStandards
9
9
  @cat1_renderer.template_helper = HealthDataStandards::Export::TemplateHelper.new('cat1', 'cat1')
10
10
  end
11
11
 
12
- def export(measures, header, effective_date, start_date, end_date, test_id=nil)
12
+ def export(measures, header, effective_date, start_date, end_date, filter=nil,test_id=nil)
13
13
  results = {}
14
14
  measures.each do |measure|
15
- results[measure['hqmf_id']] = HealthDataStandards::CQM::QueryCache.aggregate_measure(measure['hqmf_id'], effective_date, test_id)
15
+ results[measure['hqmf_id']] = HealthDataStandards::CQM::QueryCache.aggregate_measure(measure['hqmf_id'], effective_date, filter, test_id)
16
16
  end
17
17
  @rendering_context.render(:template => 'show',
18
18
  :locals => {:measures => measures, :start_date => start_date,
@@ -5,9 +5,16 @@ module HealthDataStandards
5
5
  include HealthDataStandards::Util
6
6
  include HealthDataStandards::SVS
7
7
  VS_MAP = {}
8
+
8
9
  def value_set_map(bundle_id=nil)
9
-
10
- VS_MAP[bundle_id] ||= Hash[ValueSet.where({bundle_id: bundle_id}).map{ |p| [p.oid, p.code_set_map] }]
10
+ bundle_id_to_use = nil
11
+ if bundle_id
12
+ bundle_id_to_use = bundle_id
13
+ else
14
+ latest_bundle_id = HealthDataStandards::CQM::Bundle.latest_bundle_id
15
+ bundle_id_to_use = Moped::BSON::ObjectId.from_string(latest_bundle_id) if latest_bundle_id
16
+ end
17
+ VS_MAP[bundle_id_to_use] ||= Hash[ValueSet.where({bundle_id: bundle_id_to_use}).map{ |p| [p.oid, p.code_set_map] }]
11
18
  end
12
19
 
13
20
  # Given a set of measures, find the data criteria/value set pairs that are unique across all of them
@@ -130,7 +137,7 @@ module HealthDataStandards
130
137
 
131
138
  def handle_patient_expired(patient)
132
139
  if patient.expired
133
- [OpenStruct.new(start_date: patient.deathdate)]
140
+ [OpenStruct.new(start_date: patient.deathdate, id: UUID.generate)]
134
141
  else
135
142
  []
136
143
  end
@@ -139,20 +146,6 @@ module HealthDataStandards
139
146
  def handle_payer_information(patient)
140
147
  patient.insurance_providers
141
148
  end
142
-
143
- def code_in_valueset( code, valuesets=[],bundle_id=nil)
144
- unless(bundle_id.nil?)
145
- bundle = Bundle.find(bundle_id)
146
- vs_matches = []
147
- valuesets.each do |vs|
148
- vset = bundle.valuesets.where({"oid"=>vs}).first
149
- if vset && vset.concepts.where({"code" => code["code"], "codeSystem" => code["code_system"]}).first
150
- vs_matches << vs
151
- end
152
- end
153
- return vs_matches
154
- end
155
- end
156
149
  end
157
150
  end
158
151
  end
@@ -3,6 +3,7 @@ module HealthDataStandards
3
3
 
4
4
  class Bundle
5
5
  include Mongoid::Document
6
+ include Mongoid::Timestamps
6
7
  store_in collection: 'bundles'
7
8
  field :title, type: String
8
9
  field :version, type: String
@@ -15,19 +16,20 @@ module HealthDataStandards
15
16
 
16
17
  validates_presence_of :version
17
18
 
18
- def self.active
19
- self.where({active: true})
19
+ scope :active, where(active: true)
20
+
21
+ def self.latest_bundle_id
22
+ desc(:exported).first.try(:_id)
20
23
  end
21
24
 
22
25
  def measures
23
- HealthDataStandards::CQM::Measure.where({bundle_id: self.id}).order_by([["id", :asc],["sub_id",:asc]])
26
+ HealthDataStandards::CQM::Measure.where({bundle_id: self.id}).order_by([["id", :asc],["sub_id",:asc]])
24
27
  end
25
28
 
26
29
  def records
27
- Record.where(bundle_id: self._id, test_id: nil).order_by([["last", :asc]])
30
+ Record.where(bundle_id: self._id, test_id: nil).order_by([["last", :asc]])
28
31
  end
29
32
 
30
-
31
33
  def value_sets
32
34
  HealthDataStandards::SVS::ValueSet.in(bundle_id: self.id)
33
35
  end
@@ -38,8 +40,6 @@ module HealthDataStandards
38
40
  self.value_sets.destroy
39
41
  super
40
42
  end
41
-
42
-
43
- end
43
+ end
44
44
  end
45
45
  end
@@ -2,6 +2,10 @@ module HealthDataStandards
2
2
  module CQM
3
3
  class Measure
4
4
  include Mongoid::Document
5
+ include Mongoid::Timestamps
6
+
7
+ MSRPOPL = 'MSRPOPL'
8
+
5
9
  store_in collection: 'measures'
6
10
  field :id, type: String
7
11
  field :sub_id, type: String
@@ -18,7 +22,7 @@ module HealthDataStandards
18
22
  field :oids, type: Array
19
23
 
20
24
  field :population_criteria, type: Hash
21
- field :data_criteria, type: Hash, default: {}
25
+ field :data_criteria, type: Array, default: []
22
26
  field :source_data_criteria, type: Hash, default: {}
23
27
  field :measure_period, type: Hash
24
28
  field :measure_attributes, type: Hash
@@ -29,13 +33,12 @@ module HealthDataStandards
29
33
  scope :top_level , any_of({"sub_id" => nil}, {"sub_id" => "a"})
30
34
  scope :order_by_id_sub_id, order_by([["id", :asc],["sub_id", :asc]])
31
35
 
32
- index({oids: 1})
33
- index({hqmf_id: 1})
34
- index({category: 1})
35
- index({sub_id: 1})
36
- index({_id: 1, sub_id: 1})
37
-
38
- index "bundle_id" => 1
36
+ index oids: 1
37
+ index hqmf_id: 1
38
+ index category: 1
39
+ index sub_id: 1
40
+ index _id: 1, sub_id: 1
41
+ index bundle_id: 1
39
42
 
40
43
  validates_presence_of :id
41
44
  validates_presence_of :name
@@ -70,109 +73,62 @@ module HealthDataStandards
70
73
  @hqmf ||= HQMF::Document.from_json(self.hqmf_document)
71
74
  end
72
75
 
73
- def smoking_gun_data(patient_cache_filter={})
74
- ::Measure.calculate_smoking_gun_data(self["bundle_id"], self.hqmf_id, patient_cache_filter)
76
+ def key
77
+ "#{self['id']}#{sub_id}"
78
+ end
79
+
80
+ def is_cv?
81
+ ! population_ids[MSRPOPL].nil?
75
82
  end
76
- # Calculate the smoking gun data for the given hqmf_id with the given patient_cache_filter
77
- # The filter will allow us to segment the cache by things like test_id required for Cypress.
78
-
79
- def self.calculate_smoking_gun_data(bundle_id, hqmf_id, patient_cache_filter={})
80
- population_keys = ('a'..'zz').to_a
81
- values = {}
82
- measure = Measure.top_level.where({hqmf_id: hqmf_id, bundle_id: bundle_id}).first
83
- sub_ids = []
84
- hqmf_measure = measure.as_hqmf_model
85
- population_codes = []
86
- if hqmf_measure.populations.length == 1
87
- sub_ids = nil
88
- population = hqmf_measure.populations[0]
89
- HQMF::PopulationCriteria::ALL_POPULATION_CODES.each do |code|
90
- population_codes << population[code] if population[code]
91
- end
92
- else
93
- #Do not bother with populaions that contain stratifications
94
- hqmf_measure.populations.each_with_index do |population,index|
95
- if population["stratification"].nil?
96
- sub_ids << population_keys[index]
97
- HQMF::PopulationCriteria::ALL_POPULATION_CODES.each do |code|
98
- population_codes << population[code] if population[code]
99
- end
100
- end
101
- end
102
- end
103
83
 
104
- population_codes.uniq!
105
-
106
- rationals = PatientCache.smoking_gun_rational(measure.hqmf_id,sub_ids,patient_cache_filter)
107
- rationals.each_pair do |mrn,rash|
108
- values[mrn] = []
109
- population_codes.each do |pop_code|
110
- # if (population[pop_code])
111
- population_criteria = hqmf_measure.population_criteria(pop_code)
112
- if population_criteria.preconditions
113
- array = []
114
-
115
- parent = population_criteria.preconditions[0]
116
- values[mrn].concat self.loop_preconditions(hqmf_measure, parent, rash)
117
- end # end population_criteria.preconditions
118
- #end # end (population[pop_code])
119
- end # population_codes
120
- values[mrn].uniq!
121
- end
122
- values
84
+ def self.installed
85
+ Measure.order_by([["id", :asc],["sub_id", :asc]]).to_a
123
86
  end
87
+
124
88
 
125
- private
126
-
127
-
128
- def self.loop_data_criteria(hqmf, data_criteria, rationale)
129
- result = []
130
- if (rationale[data_criteria.id])
131
-
132
- if data_criteria.type != :derived
133
- template = HQMF::DataCriteria.template_id_for_definition(data_criteria.definition, data_criteria.status, data_criteria.negation)
134
- value_set_oid = data_criteria.code_list_id
135
- begin
136
- qrda_template = HealthDataStandards::Export::QRDA::EntryTemplateResolver.qrda_oid_for_hqmf_oid(template,value_set_oid)
137
- rescue
138
- value_set_oid = 'In QRDA Header (Non Null Value)'
139
- qrda_template = 'N/A'
140
- end # end begin recue
141
- description = "#{HQMF::DataCriteria.title_for_template_id(template).titleize}: #{data_criteria.title}"
142
- result << {description: description, oid: value_set_oid, template: qrda_template, rationale: rationale[data_criteria.id]}
143
- if data_criteria.temporal_references
144
- data_criteria.temporal_references.each do |temporal_reference|
145
- if temporal_reference.reference.id != 'MeasurePeriod'
146
- result.concat loop_data_criteria(hqmf, hqmf.data_criteria(temporal_reference.reference.id), rationale)
147
- end #if temporal_reference.reference.id
148
- end # end data_criteria.temporal_references.each do |temporal_reference|
149
- end# end if data_criteria.temporal_references
150
- else #data_criteria.type != :derived
151
- (data_criteria.children_criteria || []).each do |child_id|
152
- result.concat loop_data_criteria(hqmf, hqmf.data_criteria(child_id), rationale)
153
- end
154
- end
155
- end
156
- result
89
+ # Finds all measures and groups the sub measures
90
+ # @return Array - This returns an Array of Hashes. Each Hash will represent a top level measure with an ID, name, and category.
91
+ # It will also have an array called subs containing hashes with an ID and name for each sub-measure.
92
+ def self.all_by_measure
93
+ reduce = 'function(obj,prev) {
94
+ if (obj.sub_id != null)
95
+ prev.subs.push({id : obj.id + obj.sub_id, name : obj.subtitle});
96
+ }'
97
+
98
+ self.moped_session.command( :group=> {:ns=>"measures", :key => {:id=>1, :name=>1, :category=>1}, :initial => {:subs => []}, "$reduce" => reduce})["retval"]
157
99
  end
158
100
 
159
- def self.loop_preconditions(hqmf, parent, rationale)
160
- result = []
161
- parent.preconditions.each do |precondition|
162
- parent_key = "precondition_#{parent.id}"
163
- key = "precondition_#{precondition.id}"
164
- if precondition.preconditions.empty?
165
- data_criteria = hqmf.data_criteria(precondition.reference.id)
166
- result.concat loop_data_criteria(hqmf, data_criteria, rationale)
167
- else
168
- if (rationale[parent_key] && rationale[key])
169
- result.concat loop_preconditions(hqmf, precondition, rationale)
170
- end
101
+ def display_name
102
+ "#{self['cms_id']}/#{self['nqf_id']} - #{name}"
103
+ end
104
+
105
+
106
+ def set_id
107
+ self.hqmf_set_id
108
+ end
109
+
110
+ def measure_id
111
+ self['id']
112
+ end
113
+
114
+ def continuous?
115
+ population_ids[MSRPOPL]
116
+ end
117
+
118
+ def title
119
+ self.name
120
+ end
121
+
122
+ def all_data_criteria
123
+ return @crit if @crit
124
+ @crit = []
125
+ self.data_criteria.each do |dc|
126
+ dc.each_pair do |k,v|
127
+ @crit << HQMF::DataCriteria.from_json(k,v)
171
128
  end
172
129
  end
173
- result
130
+ @crit
174
131
  end
175
-
176
132
  end
177
133
  end
178
134
  end
@@ -2,6 +2,7 @@
2
2
  module CQM
3
3
  class PatientCache
4
4
  include Mongoid::Document
5
+ include Mongoid::Timestamps
5
6
  store_in collection: 'patient_cache'
6
7
  index "value.last" => 1
7
8
  index "bundle_id" => 1
@@ -2,8 +2,11 @@ module HealthDataStandards
2
2
  module CQM
3
3
  class QueryCache
4
4
  include Mongoid::Document
5
+ include Mongoid::Timestamps
5
6
  store_in collection: 'query_cache'
6
7
 
8
+ field :calculation_date, type: Time
9
+ field :status, type: Hash
7
10
  field :measure_id, type: String
8
11
  field :sub_id, type: String
9
12
  field :population_ids, type: Hash
@@ -18,8 +21,8 @@ module HealthDataStandards
18
21
  field :OBSERV, type: Float
19
22
  field :supplemental_data, type: Hash
20
23
 
21
- def self.aggregate_measure(measure_id, effective_date, test_id=nil)
22
- cache_entries = self.where(effective_date: effective_date, measure_id: measure_id, test_id: test_id)
24
+ def self.aggregate_measure(measure_id, effective_date, filter=nil, test_id=nil)
25
+ cache_entries = self.where(effective_date: effective_date, measure_id: measure_id, test_id: test_id, filter: filter)
23
26
  aggregate_count = AggregateCount.new
24
27
  aggregate_count.measure_id = measure_id
25
28
  cache_entries.each do |cache_entry|
@@ -1,5 +1,6 @@
1
1
  class Record
2
2
  include Mongoid::Document
3
+ include Mongoid::Timestamps
3
4
  extend Memoist
4
5
 
5
6
  field :title, type: String
@@ -1,6 +1,3 @@
1
- <% vals = entry.values.empty? ? [nil] : entry.values
2
- vals.each do |value|
3
- %>
4
1
  <entry>
5
2
  <observation classCode="OBS" moodCode="EVN" <%== negation_indicator(entry) %>>
6
3
  <!-- Consolidated Result Observation templateId (Implied Template) -->
@@ -17,8 +14,7 @@
17
14
  <low <%= value_or_null_flavor(entry.start_time) %>/>
18
15
  <high <%= value_or_null_flavor(entry.end_time) %>/>
19
16
  </effectiveTime>
20
- <%== render(:partial => 'result_value', :locals => {:values => [value], :result_oids=>result_oids}) %>
17
+ <%== render(:partial => 'result_value', :locals => {:values => [entry.values.first], :result_oids=>result_oids}) %>
21
18
  <%== render(:partial => 'reason', :locals => {:entry => entry, :reason_oids=>field_oids["REASON"]}) %>
22
19
  </observation>
23
- </entry>
24
- <% end %>
20
+ </entry>
@@ -1,6 +1,3 @@
1
- <% vals = entry.values.empty? ? [nil] : entry.values
2
- vals.each do |value|
3
- %>
4
1
  <entry>
5
2
  <observation classCode="OBS" moodCode="EVN">
6
3
  <!-- Functional Status Result Observation (consolidation) template -->
@@ -18,7 +15,6 @@
18
15
  </effectiveTime>
19
16
 
20
17
  <!-- Result -->
21
- <%== render(:partial => 'result_value', :locals => {:values => [value], :result_oids=>result_oids}) %>
18
+ <%== render(:partial => 'result_value', :locals => {:values => [entry.values.first], :result_oids=>result_oids}) %>
22
19
  </observation>
23
- </entry>
24
- <% end %>
20
+ </entry>
@@ -1,6 +1,3 @@
1
- <% vals = entry.values.empty? ? [nil] : entry.values
2
- vals.each do |value|
3
- %>
4
1
  <entry>
5
2
  <!--Laboratory test, result -->
6
3
  <observation classCode="OBS" moodCode="EVN">
@@ -16,7 +13,6 @@
16
13
  <low <%= value_or_null_flavor(entry.start_time) %>/>
17
14
  <high <%= value_or_null_flavor(entry.end_time) %>/>
18
15
  </effectiveTime>
19
- <%== render(:partial => 'result_value', :locals => {:values => [value], :result_oids=>result_oids}) %>
16
+ <%== render(:partial => 'result_value', :locals => {:values => [entry.values.first], :result_oids=>result_oids}) %>
20
17
  </observation>
21
- </entry>
22
- <% end %>
18
+ </entry>
@@ -1,6 +1,3 @@
1
- <% vals = entry.values.empty? ? [nil] : entry.values
2
- vals.each do |value|
3
- %>
4
1
  <entry>
5
2
  <!-- Physical Exam Finding -->
6
3
  <observation classCode="OBS" moodCode="EVN">
@@ -16,7 +13,6 @@
16
13
  <low <%= value_or_null_flavor(entry.start_time) %>/>
17
14
  <high <%= value_or_null_flavor(entry.end_time) %>/>
18
15
  </effectiveTime>
19
- <%== render(:partial => 'result_value', :locals => {:values => [value], :result_oids=>result_oids}) %>
16
+ <%== render(:partial => 'result_value', :locals => {:values => [entry.values.first], :result_oids=>result_oids}) %>
20
17
  </observation>
21
- </entry>
22
- <% end %>
18
+ </entry>
@@ -1,6 +1,3 @@
1
- <% vals = entry.values.empty? ? [nil] : entry.values
2
- vals.each do |value|
3
- %>
4
1
  <entry>
5
2
  <observation classCode="OBS" moodCode="EVN" <%== negation_indicator(entry) %>>
6
3
  <!-- Procedure Activity Procedure (Consolidation) template -->
@@ -15,7 +12,6 @@
15
12
  <low <%= value_or_null_flavor(entry.start_time) %>/>
16
13
  <high <%= value_or_null_flavor(entry.end_time) %>/>
17
14
  </effectiveTime>
18
- <%== render(:partial => 'result_value', :locals => {:values => [value], :result_oids=>result_oids}) %>
15
+ <%== render(:partial => 'result_value', :locals => {:values => [entry.values.first], :result_oids=>result_oids}) %>
19
16
  </observation>
20
17
  </entry>
21
- <% end %>
@@ -1,6 +1,6 @@
1
- <% vals = entry.values.empty? ? [nil] : entry.values
2
- vals.each do |value|
3
- %>
1
+
2
+ <% vals = entry.values || [nil]
3
+ vals.each do |value| %>
4
4
  <entry>
5
5
  <procedure classCode="PROC" moodCode="EVN">
6
6
  <!-- Consolidated Procedure Activity Procedure TemplateId
@@ -1,6 +1,5 @@
1
- <% vals = entry.values.empty? ? [nil] : entry.values
2
- vals.each do |value|
3
- %>
1
+ <% vals = entry.values || [nil]
2
+ vals.each do |value| %>
4
3
  <entry>
5
4
  <observation classCode="OBS" moodCode="EVN" <%== negation_indicator(entry) %>>
6
5
  <!-- Consolidation Assessment Scale Observation templateId -->
@@ -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.to_s.strip %>" <% if ev.units && (ev.units != "") -%>unit="<%= ev.units %>"<% end -%>/>
17
+ <value xsi:type="PQ" value="<%= ev.scalar %>" <% 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 -%>
@@ -17,12 +17,12 @@
17
17
  </assignedPerson>
18
18
  <% elsif author.device %>
19
19
  <assignedAuthoringDevice>
20
- <softwareName><%= author.device.name %></softwareName>
21
20
  <manufacturerModelName><%= author.device.model %></manufacturerModelName>
21
+ <softwareName><%= author.device.name %></softwareName>
22
22
  </assignedAuthoringDevice>
23
23
  <% end %>
24
24
 
25
25
  <%== render :partial=>"organization", :locals=>{organization: author.organization} %>
26
26
 
27
27
  </assignedAuthor>
28
- </author>
28
+ </author>
@@ -1,4 +1,4 @@
1
- <entryRelationship type="COMP">
1
+ <entryRelationship typeCode="COMP">
2
2
  <observation classCode="OBS" moodCode="EVN">
3
3
  <templateId root="2.16.840.1.113883.10.20.27.3.2"/>
4
4
  <code nullFlavor="OTH">
@@ -1,7 +1,7 @@
1
- <representedOrganization>
1
+ <% tag_name ||= "representedOrganization" %>
2
+ <<%=tag_name %>>
2
3
  <!-- Represents unique registry organization TIN -->
3
-
4
4
  <%== render :partial=>"id", :collection=>organization.ids, :id=> "identifier" %>
5
5
  <!-- Contains name - specific registry not required-->
6
6
  <name><%= organization.name %></name>
7
- </representedOrganization>
7
+ </<%=tag_name %>>
@@ -42,7 +42,7 @@
42
42
  <custodian>
43
43
  <assignedCustodian>
44
44
  <%== render :partial=>"id", :collection=>header.custodian.organization.ids, :id=>"identifier" %>
45
- <%== render :partial=>"organization", :locals=>{organization: header.custodian.organization} %>
45
+ <%== render :partial=>"organization", :locals=>{organization: header.custodian.organization, tag_name: "representedCustodianOrganization"} %>
46
46
  </assignedCustodian>
47
47
  </custodian>
48
48
  <!-- The legal authenticator of the CDA document is a single person who is at the
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: health-data-standards
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.12
4
+ version: 3.3.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Andy Gregorowicz
@@ -12,11 +13,12 @@ authors:
12
13
  autorequire:
13
14
  bindir: bin
14
15
  cert_chain: []
15
- date: 2013-12-09 00:00:00.000000000 Z
16
+ date: 2013-11-07 00:00:00.000000000 Z
16
17
  dependencies:
17
18
  - !ruby/object:Gem::Dependency
18
19
  name: rest-client
19
20
  requirement: !ruby/object:Gem::Requirement
21
+ none: false
20
22
  requirements:
21
23
  - - ~>
22
24
  - !ruby/object:Gem::Version
@@ -24,6 +26,7 @@ dependencies:
24
26
  type: :runtime
25
27
  prerelease: false
26
28
  version_requirements: !ruby/object:Gem::Requirement
29
+ none: false
27
30
  requirements:
28
31
  - - ~>
29
32
  - !ruby/object:Gem::Version
@@ -31,6 +34,7 @@ dependencies:
31
34
  - !ruby/object:Gem::Dependency
32
35
  name: erubis
33
36
  requirement: !ruby/object:Gem::Requirement
37
+ none: false
34
38
  requirements:
35
39
  - - ~>
36
40
  - !ruby/object:Gem::Version
@@ -38,6 +42,7 @@ dependencies:
38
42
  type: :runtime
39
43
  prerelease: false
40
44
  version_requirements: !ruby/object:Gem::Requirement
45
+ none: false
41
46
  requirements:
42
47
  - - ~>
43
48
  - !ruby/object:Gem::Version
@@ -45,6 +50,7 @@ dependencies:
45
50
  - !ruby/object:Gem::Dependency
46
51
  name: mongoid
47
52
  requirement: !ruby/object:Gem::Requirement
53
+ none: false
48
54
  requirements:
49
55
  - - ~>
50
56
  - !ruby/object:Gem::Version
@@ -52,6 +58,7 @@ dependencies:
52
58
  type: :runtime
53
59
  prerelease: false
54
60
  version_requirements: !ruby/object:Gem::Requirement
61
+ none: false
55
62
  requirements:
56
63
  - - ~>
57
64
  - !ruby/object:Gem::Version
@@ -59,6 +66,7 @@ dependencies:
59
66
  - !ruby/object:Gem::Dependency
60
67
  name: activesupport
61
68
  requirement: !ruby/object:Gem::Requirement
69
+ none: false
62
70
  requirements:
63
71
  - - ~>
64
72
  - !ruby/object:Gem::Version
@@ -66,6 +74,7 @@ dependencies:
66
74
  type: :runtime
67
75
  prerelease: false
68
76
  version_requirements: !ruby/object:Gem::Requirement
77
+ none: false
69
78
  requirements:
70
79
  - - ~>
71
80
  - !ruby/object:Gem::Version
@@ -73,6 +82,7 @@ dependencies:
73
82
  - !ruby/object:Gem::Dependency
74
83
  name: uuid
75
84
  requirement: !ruby/object:Gem::Requirement
85
+ none: false
76
86
  requirements:
77
87
  - - ~>
78
88
  - !ruby/object:Gem::Version
@@ -80,6 +90,7 @@ dependencies:
80
90
  type: :runtime
81
91
  prerelease: false
82
92
  version_requirements: !ruby/object:Gem::Requirement
93
+ none: false
83
94
  requirements:
84
95
  - - ~>
85
96
  - !ruby/object:Gem::Version
@@ -87,6 +98,7 @@ dependencies:
87
98
  - !ruby/object:Gem::Dependency
88
99
  name: builder
89
100
  requirement: !ruby/object:Gem::Requirement
101
+ none: false
90
102
  requirements:
91
103
  - - ~>
92
104
  - !ruby/object:Gem::Version
@@ -94,6 +106,7 @@ dependencies:
94
106
  type: :runtime
95
107
  prerelease: false
96
108
  version_requirements: !ruby/object:Gem::Requirement
109
+ none: false
97
110
  requirements:
98
111
  - - ~>
99
112
  - !ruby/object:Gem::Version
@@ -101,6 +114,7 @@ dependencies:
101
114
  - !ruby/object:Gem::Dependency
102
115
  name: nokogiri
103
116
  requirement: !ruby/object:Gem::Requirement
117
+ none: false
104
118
  requirements:
105
119
  - - ~>
106
120
  - !ruby/object:Gem::Version
@@ -108,6 +122,7 @@ dependencies:
108
122
  type: :runtime
109
123
  prerelease: false
110
124
  version_requirements: !ruby/object:Gem::Requirement
125
+ none: false
111
126
  requirements:
112
127
  - - ~>
113
128
  - !ruby/object:Gem::Version
@@ -115,20 +130,23 @@ dependencies:
115
130
  - !ruby/object:Gem::Dependency
116
131
  name: rubyzip
117
132
  requirement: !ruby/object:Gem::Requirement
133
+ none: false
118
134
  requirements:
119
- - - ! '>='
135
+ - - '='
120
136
  - !ruby/object:Gem::Version
121
- version: '0'
137
+ version: 0.9.9
122
138
  type: :runtime
123
139
  prerelease: false
124
140
  version_requirements: !ruby/object:Gem::Requirement
141
+ none: false
125
142
  requirements:
126
- - - ! '>='
143
+ - - '='
127
144
  - !ruby/object:Gem::Version
128
- version: '0'
145
+ version: 0.9.9
129
146
  - !ruby/object:Gem::Dependency
130
147
  name: log4r
131
148
  requirement: !ruby/object:Gem::Requirement
149
+ none: false
132
150
  requirements:
133
151
  - - ~>
134
152
  - !ruby/object:Gem::Version
@@ -136,6 +154,7 @@ dependencies:
136
154
  type: :runtime
137
155
  prerelease: false
138
156
  version_requirements: !ruby/object:Gem::Requirement
157
+ none: false
139
158
  requirements:
140
159
  - - ~>
141
160
  - !ruby/object:Gem::Version
@@ -143,6 +162,7 @@ dependencies:
143
162
  - !ruby/object:Gem::Dependency
144
163
  name: memoist
145
164
  requirement: !ruby/object:Gem::Requirement
165
+ none: false
146
166
  requirements:
147
167
  - - ~>
148
168
  - !ruby/object:Gem::Version
@@ -150,6 +170,7 @@ dependencies:
150
170
  type: :runtime
151
171
  prerelease: false
152
172
  version_requirements: !ruby/object:Gem::Requirement
173
+ none: false
153
174
  requirements:
154
175
  - - ~>
155
176
  - !ruby/object:Gem::Version
@@ -517,29 +538,29 @@ files:
517
538
  - Gemfile
518
539
  - README.md
519
540
  - Rakefile
520
- - VERSION
521
541
  homepage: https://github.com/projectcypress/health-data-standards
522
542
  licenses:
523
543
  - APL 2.0
524
- metadata: {}
525
544
  post_install_message:
526
545
  rdoc_options: []
527
546
  require_paths:
528
547
  - lib
529
548
  required_ruby_version: !ruby/object:Gem::Requirement
549
+ none: false
530
550
  requirements:
531
551
  - - ! '>='
532
552
  - !ruby/object:Gem::Version
533
553
  version: '0'
534
554
  required_rubygems_version: !ruby/object:Gem::Requirement
555
+ none: false
535
556
  requirements:
536
557
  - - ! '>='
537
558
  - !ruby/object:Gem::Version
538
559
  version: '0'
539
560
  requirements: []
540
561
  rubyforge_project:
541
- rubygems_version: 2.1.3
562
+ rubygems_version: 1.8.25
542
563
  signing_key:
543
- specification_version: 4
564
+ specification_version: 3
544
565
  summary: A library for generating and consuming various healthcare related formats.
545
566
  test_files: []
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ZTU3MzQ3NTYyZDJmYjk2NDc4ZWFhNWExNzkyZWJkYjZmYWE1MzIwNg==
5
- data.tar.gz: !binary |-
6
- NzhlZWM4ZTA4MWVmYjRjMDE1ZjBiNDg2YTAyNmE2Mzg3MDZhZDFjYg==
7
- SHA512:
8
- metadata.gz: !binary |-
9
- ZjJlODQ5M2Q1YjM1YjZmNGJhOWIwOTczMzMyNGVhYTUzZTIzMWQwNzE2ZWI4
10
- ZGVlODI3OTIzMmU2MmFjMmUxMjMwM2U2ZjVhODhhMzMyYWYyYzQ3NGIyZDlk
11
- MjVkYjA3NWI5MDlkMzdlYmIxZWQxYWJhMzUzZTdjZWM0MmM3MDg=
12
- data.tar.gz: !binary |-
13
- NDE1MGVkOTM1YTVjYmFjZGViZDE0NWQxZTM5ZDNhODIyZWY2MWQ3MDhiYzJl
14
- M2RjM2RiODBhMGY1MWQ4NjJlM2Q1MDgxYzYxOWIzNzYyN2UxZjIyODk5NWQ0
15
- NGZiNGMwYWQ2ZGZiYzU5ZWQ1YWM0YmNkYTkxMTQ4MmU0Nzg3YTA=
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.7.0