health-data-standards 3.6.1 → 3.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (434) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +7 -2
  3. data/Rakefile +2 -1
  4. data/lib/health-data-standards.rb +22 -1
  5. data/lib/health-data-standards/export/cat_1.rb +25 -6
  6. data/lib/health-data-standards/export/cat_1_r2.rb +8 -2
  7. data/lib/health-data-standards/export/cat_3.rb +8 -7
  8. data/lib/health-data-standards/export/exceptions.rb +13 -0
  9. data/lib/health-data-standards/export/helper/cat1_view_helper.rb +17 -11
  10. data/lib/health-data-standards/export/helper/html_view_helper.rb +13 -7
  11. data/lib/health-data-standards/export/helper/scooped_view_helper.rb +68 -25
  12. data/lib/health-data-standards/export/html.rb +9 -4
  13. data/lib/health-data-standards/export/qrda/entry_template_resolver.rb +29 -11
  14. data/lib/health-data-standards/export/qrda/hqmf-qrda-oids.json +89 -5
  15. data/lib/health-data-standards/export/rendering_context.rb +2 -2
  16. data/lib/health-data-standards/export/template_helper.rb +7 -2
  17. data/lib/health-data-standards/export/view_helper.rb +107 -39
  18. data/lib/health-data-standards/import/bulk_record_importer.rb +8 -5
  19. data/lib/health-data-standards/import/bundle/importer.rb +21 -14
  20. data/lib/health-data-standards/import/c32/care_goal_importer.rb +1 -1
  21. data/lib/health-data-standards/import/c32/immunization_importer.rb +1 -1
  22. data/lib/health-data-standards/import/cat1/clinical_trial_participant_importer.rb +20 -0
  23. data/lib/health-data-standards/import/cat1/device_order_importer.rb +20 -0
  24. data/lib/health-data-standards/import/cat1/diagnosis_active_importer.rb +4 -9
  25. data/lib/health-data-standards/import/cat1/diagnosis_importer.rb +15 -0
  26. data/lib/health-data-standards/import/cat1/diagnosis_inactive_importer.rb +1 -1
  27. data/lib/health-data-standards/import/cat1/diagnostic_study_order_importer.rb +6 -0
  28. data/lib/health-data-standards/import/cat1/encounter_order_act_importer.rb +19 -0
  29. data/lib/health-data-standards/import/cat1/encounter_performed_act_importer.rb +19 -0
  30. data/lib/health-data-standards/import/cat1/encounter_performed_importer.rb +16 -0
  31. data/lib/health-data-standards/import/cat1/immunization_administered_importer.rb +14 -0
  32. data/lib/health-data-standards/import/cat1/medication_dispensed_act_importer.rb +18 -0
  33. data/lib/health-data-standards/import/cat1/patient_importer.rb +44 -17
  34. data/lib/health-data-standards/import/cat1/procedure_order_importer.rb +4 -4
  35. data/lib/health-data-standards/import/cat1/procedure_performed_importer.rb +1 -0
  36. data/lib/health-data-standards/import/cat1/transfer_from_act_importer.rb +18 -0
  37. data/lib/health-data-standards/import/cat1/transfer_from_importer.rb +24 -0
  38. data/lib/health-data-standards/import/cat1/transfer_to_act_importer.rb +18 -0
  39. data/lib/health-data-standards/import/cat1/transfer_to_importer.rb +23 -0
  40. data/lib/health-data-standards/import/cda/allergy_importer.rb +1 -1
  41. data/lib/health-data-standards/import/cda/communication_importer.rb +55 -0
  42. data/lib/health-data-standards/import/cda/condition_importer.rb +17 -1
  43. data/lib/health-data-standards/import/cda/encounter_importer.rb +23 -21
  44. data/lib/health-data-standards/import/cda/medical_equipment_importer.rb +1 -0
  45. data/lib/health-data-standards/import/cda/medication_importer.rb +14 -4
  46. data/lib/health-data-standards/import/cda/procedure_importer.rb +4 -4
  47. data/lib/health-data-standards/import/cda/result_importer.rb +1 -1
  48. data/lib/health-data-standards/import/cda/section_importer.rb +59 -18
  49. data/lib/health-data-standards/models/assessment.rb +3 -0
  50. data/lib/health-data-standards/models/care_experience.rb +2 -0
  51. data/lib/health-data-standards/models/care_goal.rb +4 -0
  52. data/lib/health-data-standards/models/communication.rb +3 -0
  53. data/lib/health-data-standards/models/condition.rb +12 -9
  54. data/lib/health-data-standards/models/cqm/bundle.rb +2 -1
  55. data/lib/health-data-standards/models/cqm/measure.rb +2 -1
  56. data/lib/health-data-standards/models/cqm/patient_cache.rb +7 -3
  57. data/lib/health-data-standards/models/cqm/query_cache.rb +2 -0
  58. data/lib/health-data-standards/models/encounter.rb +14 -1
  59. data/lib/health-data-standards/models/encounter_principal_diagnosis.rb +36 -0
  60. data/lib/health-data-standards/models/entry.rb +5 -1
  61. data/lib/health-data-standards/models/family_history.rb +4 -0
  62. data/lib/health-data-standards/models/immunization.rb +1 -0
  63. data/lib/health-data-standards/models/lab_result.rb +10 -1
  64. data/lib/health-data-standards/models/medical_equipment.rb +2 -1
  65. data/lib/health-data-standards/models/medication.rb +19 -2
  66. data/lib/health-data-standards/models/patient_preference.rb +5 -0
  67. data/lib/health-data-standards/models/procedure.rb +16 -3
  68. data/lib/health-data-standards/models/provider.rb +17 -1
  69. data/lib/health-data-standards/models/provider_preference.rb +5 -0
  70. data/lib/health-data-standards/models/record.rb +8 -9
  71. data/lib/health-data-standards/models/reference.rb +1 -1
  72. data/lib/health-data-standards/models/svs/value_set.rb +28 -10
  73. data/lib/health-data-standards/models/transfer.rb +6 -1
  74. data/lib/health-data-standards/tasks/bundle.rake +5 -3
  75. data/lib/health-data-standards/util/hqmf_template_helper.rb +20 -14
  76. data/lib/health-data-standards/util/hqmfr2_template_oid_map.json +382 -0
  77. data/lib/health-data-standards/util/nlm_helper.rb +14 -0
  78. data/lib/health-data-standards/util/vs_api.rb +72 -54
  79. data/lib/health-data-standards/validate/measure_validator.rb +8 -3
  80. data/lib/health-data-standards/validate/performance_rate_validator.rb +1 -1
  81. data/lib/health-data-standards/validate/qrda_qdm_template_validator.rb +253 -0
  82. data/lib/health-data-standards/validate/reported_result_extractor.rb +5 -1
  83. data/lib/health-data-standards/validate/schematron_validator.rb +6 -0
  84. data/lib/health-data-standards/validate/validators.rb +49 -1
  85. data/lib/hqmf-generator/document.xml.erb +6 -5
  86. data/lib/hqmf-generator/field.xml.erb +1 -0
  87. data/lib/hqmf-generator/hqmf-generator.rb +85 -41
  88. data/lib/hqmf-generator/subset.xml.erb +15 -0
  89. data/lib/hqmf-generator/temporal_relationship.xml.erb +8 -3
  90. data/lib/hqmf-generator/temporal_relationship_attribute.xml.erb +10 -0
  91. data/lib/hqmf-generator/value.xml.erb +2 -2
  92. data/lib/hqmf-model/data_criteria.json +88 -17
  93. data/lib/hqmf-model/data_criteria.rb +144 -72
  94. data/lib/hqmf-model/population_criteria.rb +20 -18
  95. data/lib/hqmf-model/precondition.rb +6 -3
  96. data/lib/hqmf-model/types.rb +1 -1
  97. data/lib/hqmf-parser.rb +9 -0
  98. data/lib/hqmf-parser/1.0/utilities.rb +1 -1
  99. data/lib/hqmf-parser/2.0/data_criteria.rb +293 -319
  100. data/lib/hqmf-parser/2.0/data_criteria_helpers/dc_base_extract.rb +80 -0
  101. data/lib/hqmf-parser/2.0/data_criteria_helpers/dc_definition_from_template_or_type_extract.rb +201 -0
  102. data/lib/hqmf-parser/2.0/data_criteria_helpers/dc_post_processing.rb +85 -0
  103. data/lib/hqmf-parser/2.0/data_criteria_helpers/dc_specific_occurrences_and_source_data_criteria_extract.rb +117 -0
  104. data/lib/hqmf-parser/2.0/document.rb +246 -222
  105. data/lib/hqmf-parser/2.0/document_helpers/doc_population_helper.rb +175 -0
  106. data/lib/hqmf-parser/2.0/document_helpers/doc_utilities.rb +131 -0
  107. data/lib/hqmf-parser/2.0/field_value_helper.rb +251 -0
  108. data/lib/hqmf-parser/2.0/population_criteria.rb +101 -32
  109. data/lib/hqmf-parser/2.0/precondition.rb +61 -35
  110. data/lib/hqmf-parser/2.0/source_data_criteria_helper.rb +112 -0
  111. data/lib/hqmf-parser/2.0/types.rb +253 -73
  112. data/lib/hqmf-parser/2.0/utilities.rb +27 -12
  113. data/lib/hqmf-parser/2.0/value_set_helper.rb +101 -0
  114. data/lib/hqmf-parser/converter/pass1/data_criteria_converter.rb +6 -1
  115. data/lib/hqmf-parser/converter/pass1/population_criteria_converter.rb +34 -30
  116. data/lib/hqmf-parser/parser.rb +5 -5
  117. data/resources/schematron/qrda/cat_1/{CDAR2_QRDA_I_R1_D3_2015MAY_Schematron.sch → HL7_CDAR2_QRDA_Category_I_2_12_16.sch} +4692 -4675
  118. data/resources/schematron/qrda/cat_1_r3_1/HL7 QRDA Category I STU 3.1.sch +3573 -0
  119. data/resources/schematron/qrda/cat_1_r3_1/HL7 QRDA Category III STU 1.1.sch +464 -0
  120. data/resources/schematron/qrda/cat_1_r3_1/QRDA Category I STU Release 3.1.sch +5394 -0
  121. data/resources/schematron/qrda/cat_1_r3_1/voc.xml +1229 -0
  122. data/resources/schematron/qrda/cat_1_r4/HL7 QRDA Category I STU 4.sch +3526 -0
  123. data/resources/schematron/qrda/cat_1_r4/voc.xml +1186 -0
  124. data/resources/schematron/qrda/cat_3_r1_1/HL7 QRDA Category III STU 1.1.sch +528 -0
  125. data/resources/schematron/qrda/cat_3_r1_1/voc.xml +8 -0
  126. data/resources/schematron/qrda/cat_3_r2/HL7 QRDA Category III STU 2.sch +677 -0
  127. data/resources/schematron/qrda/cat_3_r2/voc.xml +1186 -0
  128. data/resources/schematron/qrda/cat_3_r2_1/HL7 QRDA Category III STU 2.1.sch +678 -0
  129. data/resources/schematron/qrda/cat_3_r2_1/voc.xml +1186 -0
  130. data/templates/c32/_medical_equipment.c32.erb +1 -1
  131. data/templates/c32/_vital_signs.c32.erb +1 -1
  132. data/templates/cat1/{_2.16.840.1.113883.10.20.22.4.85.cat1.erb → r2/_2.16.840.1.113883.10.20.22.4.85.cat1.erb} +1 -1
  133. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.1.cat1.erb → r2/_2.16.840.1.113883.10.20.24.3.1.cat1.erb} +3 -3
  134. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.101.cat1.erb → r2/_2.16.840.1.113883.10.20.24.3.101.cat1.erb} +1 -1
  135. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.103.cat1.erb → r2/_2.16.840.1.113883.10.20.24.3.103.cat1.erb} +9 -5
  136. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.105.cat1.erb → r2/_2.16.840.1.113883.10.20.24.3.105.cat1.erb} +18 -10
  137. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.11.cat1.erb +88 -0
  138. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.12.cat1.erb +50 -0
  139. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.13.cat1.erb +54 -0
  140. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.135.cat1.erb +70 -0
  141. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.136.cat1.erb +52 -0
  142. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.14.cat1.erb → r2/_2.16.840.1.113883.10.20.24.3.14.cat1.erb} +24 -6
  143. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.140.cat1.erb +39 -0
  144. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.17.cat1.erb +23 -0
  145. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.18.cat1.erb +25 -0
  146. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.2.cat1.erb +29 -0
  147. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.20.cat1.erb → r2/_2.16.840.1.113883.10.20.24.3.20.cat1.erb} +4 -4
  148. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.22.cat1.erb +22 -0
  149. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.23.cat1.erb +114 -0
  150. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.26.cat1.erb +20 -0
  151. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.28.cat1.erb → r2/_2.16.840.1.113883.10.20.24.3.28.cat1.erb} +2 -2
  152. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.3.cat1.erb +25 -0
  153. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.31.cat1.erb +23 -0
  154. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.32.cat1.erb +20 -0
  155. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.34.cat1.erb → r2/_2.16.840.1.113883.10.20.24.3.34.cat1.erb} +6 -6
  156. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.37.cat1.erb +22 -0
  157. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.38.cat1.erb +20 -0
  158. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.4.cat1.erb +29 -0
  159. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.40.cat1.erb → r2/_2.16.840.1.113883.10.20.24.3.40.cat1.erb} +3 -3
  160. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.41.cat1.erb +46 -0
  161. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.42.cat1.erb +38 -0
  162. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.43.cat1.erb +24 -0
  163. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.44.cat1.erb +25 -0
  164. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.45.cat1.erb +26 -0
  165. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.46.cat1.erb +30 -0
  166. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.47.cat1.erb +47 -0
  167. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.51.cat1.erb +14 -0
  168. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.54.cat1.erb +32 -0
  169. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.55.cat1.erb → r2/_2.16.840.1.113883.10.20.24.3.55.cat1.erb} +0 -0
  170. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.57.cat1.erb +23 -0
  171. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.59.cat1.erb +22 -0
  172. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.62.cat1.erb +36 -0
  173. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.63.cat1.erb +21 -0
  174. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.64.cat1.erb +52 -0
  175. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.66.cat1.erb → r2/_2.16.840.1.113883.10.20.24.3.66.cat1.erb} +6 -6
  176. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.69.cat1.erb +23 -0
  177. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.7.cat1.erb +33 -0
  178. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.76.cat1.erb → r2/_2.16.840.1.113883.10.20.24.3.76.cat1.erb} +5 -3
  179. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.81.cat1.erb +23 -0
  180. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.82.cat1.erb +23 -0
  181. data/templates/cat1/r2/_2.16.840.1.113883.10.20.24.3.9.cat1.erb +64 -0
  182. data/templates/cat1/r2/_2.16.840.1.113883.10.20.28.3.6.cat1.erb +17 -0
  183. data/templates/cat1/{_address.cat1.erb → r2/_address.cat1.erb} +0 -0
  184. data/templates/cat1/{_author.cat1.erb → r2/_author.cat1.erb} +0 -0
  185. data/templates/cat1/r2/_fulfills.cat1.erb +14 -0
  186. data/templates/cat1/{_id.cat1.erb → r2/_id.cat1.erb} +0 -0
  187. data/templates/cat1/{_measures.cat1.erb → r2/_measures.cat1.erb} +1 -1
  188. data/templates/cat1/{_medication_details.cat1.erb → r2/_medication_details.cat1.erb} +3 -2
  189. data/templates/cat1/r2/_medication_dispense.cat1.erb +22 -0
  190. data/templates/cat1/{_ordinality.cat1.erb → r2/_ordinality.cat1.erb} +0 -0
  191. data/templates/cat1/{_organization.cat1.erb → r2/_organization.cat1.erb} +0 -0
  192. data/templates/cat1/{_patient_data.cat1.erb → r2/_patient_data.cat1.erb} +4 -1
  193. data/templates/cat1/r2/_patient_data_r3_1.cat1.erb +17 -0
  194. data/templates/cat1/r2/_providers.cat1.erb +76 -0
  195. data/templates/cat1/r2/_reason.cat1.erb +45 -0
  196. data/templates/cat1/{_record_target.cat1.erb → r2/_record_target.cat1.erb} +3 -0
  197. data/templates/cat1/r2/_reporting_parameters.cat1.erb +31 -0
  198. data/templates/cat1/{_result_value.cat1.erb → r2/_result_value.cat1.erb} +1 -1
  199. data/templates/cat1/{_telecom.cat1.erb → r2/_telecom.cat1.erb} +0 -0
  200. data/templates/cat1/{show.cat1.erb → r2/show.cat1.erb} +52 -5
  201. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.1.cat1.erb +14 -0
  202. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.103.cat1.erb +17 -0
  203. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.105.cat1.erb +68 -0
  204. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.11.cat1.erb +58 -0
  205. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.12.cat1.erb → r3/_2.16.840.1.113883.10.20.24.3.12.cat1.erb} +4 -5
  206. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.13.cat1.erb +39 -0
  207. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.14.cat1.erb +39 -0
  208. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.17.cat1.erb +23 -0
  209. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.18.cat1.erb +25 -0
  210. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.2.cat1.erb +29 -0
  211. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.22.cat1.erb → r3/_2.16.840.1.113883.10.20.24.3.22.cat1.erb} +6 -5
  212. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.23.cat1.erb → r3/_2.16.840.1.113883.10.20.24.3.23.cat1.erb} +26 -30
  213. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.26.cat1.erb +20 -0
  214. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.3.cat1.erb +25 -0
  215. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.31.cat1.erb +23 -0
  216. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.32.cat1.erb → r3/_2.16.840.1.113883.10.20.24.3.32.cat1.erb} +4 -4
  217. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.37.cat1.erb +22 -0
  218. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.38.cat1.erb → r3/_2.16.840.1.113883.10.20.24.3.38.cat1.erb} +3 -3
  219. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.4.cat1.erb +29 -0
  220. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.41.cat1.erb → r3/_2.16.840.1.113883.10.20.24.3.41.cat1.erb} +8 -10
  221. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.42.cat1.erb +38 -0
  222. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.43.cat1.erb +24 -0
  223. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.44.cat1.erb +25 -0
  224. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.45.cat1.erb → r3/_2.16.840.1.113883.10.20.24.3.45.cat1.erb} +5 -5
  225. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.46.cat1.erb +30 -0
  226. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.47.cat1.erb +47 -0
  227. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.51.cat1.erb +14 -0
  228. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.54.cat1.erb → r3/_2.16.840.1.113883.10.20.24.3.54.cat1.erb} +4 -4
  229. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.55.cat1.erb +18 -0
  230. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.57.cat1.erb +23 -0
  231. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.59.cat1.erb +22 -0
  232. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.62.cat1.erb +36 -0
  233. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.63.cat1.erb → r3/_2.16.840.1.113883.10.20.24.3.63.cat1.erb} +6 -8
  234. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.64.cat1.erb +51 -0
  235. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.69.cat1.erb +23 -0
  236. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.7.cat1.erb +33 -0
  237. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.76.cat1.erb +19 -0
  238. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.81.cat1.erb +24 -0
  239. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.82.cat1.erb +24 -0
  240. data/templates/cat1/r3/_2.16.840.1.113883.10.20.24.3.9.cat1.erb +57 -0
  241. data/templates/cat1/r3/_address.cat1.erb +9 -0
  242. data/templates/{cat3/_author.cat3.erb → cat1/r3/_author.cat1.erb} +0 -0
  243. data/templates/cat1/{_fulfills.cat1.erb → r3/_fulfills.cat1.erb} +0 -0
  244. data/templates/{cat3/_id.cat3.erb → cat1/r3/_id.cat1.erb} +0 -0
  245. data/templates/cat1/r3/_measures.cat1.erb +93 -0
  246. data/templates/cat1/r3/_medication_details.cat1.erb +16 -0
  247. data/templates/cat1/{_medication_dispense.cat1.erb → r3/_medication_dispense.cat1.erb} +3 -3
  248. data/templates/cat1/r3/_ordinality.cat1.erb +10 -0
  249. data/templates/cat1/r3/_organization.cat1.erb +9 -0
  250. data/templates/cat1/r3/_patient_data.cat1.erb +17 -0
  251. data/templates/cat1/r3/_providers.cat1.erb +76 -0
  252. data/templates/cat1/r3/_reason.cat1.erb +34 -0
  253. data/templates/cat1/r3/_record_target.cat1.erb +56 -0
  254. data/templates/cat1/r3/_reporting_parameters.cat1.erb +31 -0
  255. data/templates/cat1/r3/_result_value.cat1.erb +28 -0
  256. data/templates/{cat3/_telecom.cat3.erb → cat1/r3/_telecom.cat1.erb} +0 -0
  257. data/templates/cat1/r3/show.cat1.erb +183 -0
  258. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.1.cat1.erb +14 -0
  259. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.103.cat1.erb +17 -0
  260. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.105.cat1.erb +68 -0
  261. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.12.cat1.erb +53 -0
  262. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.135.cat1.erb +71 -0
  263. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.136.cat1.erb +52 -0
  264. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.140.cat1.erb +39 -0
  265. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.17.cat1.erb +23 -0
  266. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.18.cat1.erb → r3_1/_2.16.840.1.113883.10.20.24.3.18.cat1.erb} +3 -3
  267. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.2.cat1.erb → r3_1/_2.16.840.1.113883.10.20.24.3.2.cat1.erb} +2 -2
  268. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.22.cat1.erb +30 -0
  269. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.23.cat1.erb +116 -0
  270. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.26.cat1.erb → r3_1/_2.16.840.1.113883.10.20.24.3.26.cat1.erb} +4 -2
  271. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.3.cat1.erb → r3_1/_2.16.840.1.113883.10.20.24.3.3.cat1.erb} +2 -2
  272. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.31.cat1.erb +24 -0
  273. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.32.cat1.erb +21 -0
  274. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.37.cat1.erb +22 -0
  275. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.38.cat1.erb +21 -0
  276. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.4.cat1.erb → r3_1/_2.16.840.1.113883.10.20.24.3.4.cat1.erb} +2 -2
  277. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.41.cat1.erb +45 -0
  278. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.42.cat1.erb → r3_1/_2.16.840.1.113883.10.20.24.3.42.cat1.erb} +4 -4
  279. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.43.cat1.erb → r3_1/_2.16.840.1.113883.10.20.24.3.43.cat1.erb} +3 -3
  280. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.44.cat1.erb → r3_1/_2.16.840.1.113883.10.20.24.3.44.cat1.erb} +3 -3
  281. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.45.cat1.erb +35 -0
  282. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.46.cat1.erb → r3_1/_2.16.840.1.113883.10.20.24.3.46.cat1.erb} +4 -4
  283. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.47.cat1.erb +47 -0
  284. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.51.cat1.erb +14 -0
  285. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.54.cat1.erb +32 -0
  286. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.55.cat1.erb +18 -0
  287. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.57.cat1.erb → r3_1/_2.16.840.1.113883.10.20.24.3.57.cat1.erb} +3 -3
  288. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.59.cat1.erb +22 -0
  289. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.62.cat1.erb → r3_1/_2.16.840.1.113883.10.20.24.3.62.cat1.erb} +5 -5
  290. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.63.cat1.erb +21 -0
  291. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.64.cat1.erb → r3_1/_2.16.840.1.113883.10.20.24.3.64.cat1.erb} +7 -7
  292. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.69.cat1.erb → r3_1/_2.16.840.1.113883.10.20.24.3.69.cat1.erb} +2 -2
  293. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.7.cat1.erb → r3_1/_2.16.840.1.113883.10.20.24.3.7.cat1.erb} +12 -9
  294. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.81.cat1.erb +33 -0
  295. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.82.cat1.erb +33 -0
  296. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.24.3.9.cat1.erb +41 -0
  297. data/templates/cat1/r3_1/_2.16.840.1.113883.10.20.28.3.6.cat1.erb +17 -0
  298. data/templates/cat1/r3_1/_address.cat1.erb +9 -0
  299. data/templates/cat1/r3_1/_author.cat1.erb +28 -0
  300. data/templates/cat1/r3_1/_fulfills.cat1.erb +14 -0
  301. data/templates/cat1/r3_1/_id.cat1.erb +1 -0
  302. data/templates/cat1/r3_1/_measures.cat1.erb +93 -0
  303. data/templates/cat1/r3_1/_medication_details.cat1.erb +16 -0
  304. data/templates/cat1/r3_1/_medication_dispense.cat1.erb +22 -0
  305. data/templates/cat1/r3_1/_ordinality.cat1.erb +10 -0
  306. data/templates/cat1/r3_1/_organization.cat1.erb +9 -0
  307. data/templates/cat1/r3_1/_patient_data.cat1.erb +17 -0
  308. data/templates/cat1/r3_1/_providers.cat1.erb +76 -0
  309. data/templates/cat1/r3_1/_reason.cat1.erb +34 -0
  310. data/templates/cat1/r3_1/_record_target.cat1.erb +56 -0
  311. data/templates/cat1/r3_1/_reporting_parameters.cat1.erb +31 -0
  312. data/templates/cat1/r3_1/_result_value.cat1.erb +28 -0
  313. data/templates/cat1/r3_1/_telecom.cat1.erb +1 -0
  314. data/templates/cat1/r3_1/show.cat1.erb +183 -0
  315. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.1.cat1.erb +14 -0
  316. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.103.cat1.erb +17 -0
  317. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.105.cat1.erb +68 -0
  318. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.12.cat1.erb +53 -0
  319. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.135.cat1.erb +75 -0
  320. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.136.cat1.erb +52 -0
  321. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.140.cat1.erb +39 -0
  322. data/templates/cat1/{_2.16.840.1.113883.10.20.24.3.59.cat1.erb → r4/_2.16.840.1.113883.10.20.24.3.144.cat1.erb} +6 -6
  323. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.145.cat1.erb +24 -0
  324. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.17.cat1.erb +23 -0
  325. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.18.cat1.erb +25 -0
  326. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.2.cat1.erb +29 -0
  327. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.22.cat1.erb +30 -0
  328. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.23.cat1.erb +116 -0
  329. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.3.cat1.erb +25 -0
  330. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.31.cat1.erb +24 -0
  331. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.32.cat1.erb +21 -0
  332. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.37.cat1.erb +22 -0
  333. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.38.cat1.erb +21 -0
  334. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.4.cat1.erb +29 -0
  335. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.41.cat1.erb +45 -0
  336. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.42.cat1.erb +38 -0
  337. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.43.cat1.erb +24 -0
  338. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.44.cat1.erb +25 -0
  339. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.45.cat1.erb +35 -0
  340. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.46.cat1.erb +30 -0
  341. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.47.cat1.erb +47 -0
  342. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.51.cat1.erb +14 -0
  343. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.54.cat1.erb +32 -0
  344. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.55.cat1.erb +18 -0
  345. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.57.cat1.erb +23 -0
  346. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.59.cat1.erb +22 -0
  347. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.62.cat1.erb +36 -0
  348. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.63.cat1.erb +21 -0
  349. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.64.cat1.erb +52 -0
  350. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.7.cat1.erb +33 -0
  351. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.81.cat1.erb +33 -0
  352. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.82.cat1.erb +33 -0
  353. data/templates/cat1/r4/_2.16.840.1.113883.10.20.24.3.9.cat1.erb +41 -0
  354. data/templates/cat1/r4/_2.16.840.1.113883.10.20.28.3.6.cat1.erb +17 -0
  355. data/templates/cat1/r4/_address.cat1.erb +7 -0
  356. data/templates/cat1/r4/_author.cat1.erb +28 -0
  357. data/templates/cat1/r4/_fulfills.cat1.erb +14 -0
  358. data/templates/cat1/r4/_id.cat1.erb +1 -0
  359. data/templates/cat1/r4/_measures.cat1.erb +93 -0
  360. data/templates/cat1/r4/_medication_details.cat1.erb +16 -0
  361. data/templates/cat1/r4/_medication_dispense.cat1.erb +22 -0
  362. data/templates/cat1/r4/_ordinality.cat1.erb +10 -0
  363. data/templates/cat1/r4/_organization.cat1.erb +9 -0
  364. data/templates/cat1/r4/_patient_data.cat1.erb +17 -0
  365. data/templates/cat1/r4/_providers.cat1.erb +76 -0
  366. data/templates/cat1/r4/_reason.cat1.erb +34 -0
  367. data/templates/cat1/r4/_record_target.cat1.erb +54 -0
  368. data/templates/cat1/r4/_reporting_parameters.cat1.erb +31 -0
  369. data/templates/cat1/r4/_result_value.cat1.erb +28 -0
  370. data/templates/cat1/r4/_telecom.cat1.erb +1 -0
  371. data/templates/cat1/r4/show.cat1.erb +192 -0
  372. data/templates/cat3/{_address.cat3.erb → r1/_address.cat3.erb} +0 -0
  373. data/templates/cat3/r1/_author.cat3.erb +28 -0
  374. data/templates/cat3/{_continuous_variable_value.cat3.erb → r1/_continuous_variable_value.cat3.erb} +0 -0
  375. data/templates/cat3/r1/_id.cat3.erb +1 -0
  376. data/templates/cat3/{_measure_data.cat3.erb → r1/_measure_data.cat3.erb} +7 -6
  377. data/templates/cat3/{_organization.cat3.erb → r1/_organization.cat3.erb} +0 -0
  378. data/templates/cat3/{_performance_rate.cat3.erb → r1/_performance_rate.cat3.erb} +1 -3
  379. data/templates/cat3/{_providers.cat3.erb → r1/_providers.cat3.erb} +0 -0
  380. data/templates/cat3/{_reporting_parameters.cat3.erb → r1/_reporting_parameters.cat3.erb} +0 -0
  381. data/templates/cat3/{_supplemental_data.cat3.erb → r1/_supplemental_data.cat3.erb} +2 -0
  382. data/templates/cat3/r1/_telecom.cat3.erb +1 -0
  383. data/templates/cat3/{show.cat3.erb → r1/show.cat3.erb} +5 -5
  384. data/templates/cat3/r1_1/_address.cat3.erb +9 -0
  385. data/templates/cat3/r1_1/_author.cat3.erb +28 -0
  386. data/templates/cat3/r1_1/_continuous_variable_value.cat3.erb +20 -0
  387. data/templates/cat3/r1_1/_id.cat3.erb +1 -0
  388. data/templates/cat3/r1_1/_measure_data.cat3.erb +136 -0
  389. data/templates/cat3/r1_1/_organization.cat3.erb +6 -0
  390. data/templates/cat3/r1_1/_performance_rate.cat3.erb +18 -0
  391. data/templates/{cat1/_providers.cat1.erb → cat3/r1_1/_providers.cat3.erb} +18 -18
  392. data/templates/{cat1/_reporting_parameters.cat1.erb → cat3/r1_1/_reporting_parameters.cat3.erb} +5 -1
  393. data/templates/cat3/r1_1/_supplemental_data.cat3.erb +38 -0
  394. data/templates/cat3/r1_1/_telecom.cat3.erb +1 -0
  395. data/templates/cat3/r1_1/show.cat3.erb +150 -0
  396. data/templates/cat3/r2/_address.cat3.erb +9 -0
  397. data/templates/cat3/r2/_author.cat3.erb +28 -0
  398. data/templates/cat3/r2/_continuous_variable_value.cat3.erb +20 -0
  399. data/templates/cat3/r2/_id.cat3.erb +1 -0
  400. data/templates/cat3/r2/_measure_data.cat3.erb +136 -0
  401. data/templates/cat3/r2/_organization.cat3.erb +6 -0
  402. data/templates/cat3/r2/_performance_rate.cat3.erb +19 -0
  403. data/templates/cat3/r2/_providers.cat3.erb +57 -0
  404. data/templates/cat3/r2/_reporting_parameters.cat3.erb +29 -0
  405. data/templates/cat3/r2/_supplemental_data.cat3.erb +38 -0
  406. data/templates/cat3/r2/_telecom.cat3.erb +1 -0
  407. data/templates/cat3/r2/show.cat3.erb +150 -0
  408. data/templates/cat3/r2_1/_address.cat3.erb +9 -0
  409. data/templates/cat3/r2_1/_author.cat3.erb +28 -0
  410. data/templates/cat3/r2_1/_continuous_variable_value.cat3.erb +20 -0
  411. data/templates/cat3/r2_1/_id.cat3.erb +1 -0
  412. data/templates/cat3/r2_1/_measure_data.cat3.erb +136 -0
  413. data/templates/cat3/r2_1/_organization.cat3.erb +6 -0
  414. data/templates/cat3/r2_1/_performance_rate.cat3.erb +19 -0
  415. data/templates/cat3/r2_1/_providers.cat3.erb +57 -0
  416. data/templates/cat3/r2_1/_reporting_parameters.cat3.erb +20 -0
  417. data/templates/cat3/r2_1/_reporting_parameters_act.cat3.erb +10 -0
  418. data/templates/cat3/r2_1/_supplemental_data.cat3.erb +38 -0
  419. data/templates/cat3/r2_1/_telecom.cat3.erb +1 -0
  420. data/templates/cat3/r2_1/show.cat3.erb +153 -0
  421. data/templates/ccda/_medical_equipment.ccda.erb +1 -1
  422. data/templates/ccda/_social_history.ccda.erb +2 -2
  423. data/templates/ccda/_vital_signs.ccda.erb +1 -1
  424. data/templates/html/_entries_by_section.html.erb +1 -1
  425. metadata +425 -153
  426. data/lib/health-data-standards/import/cat1/procedure_importer.rb +0 -42
  427. data/templates/cat1/_2.16.840.1.113883.10.20.24.3.11.cat1.erb +0 -55
  428. data/templates/cat1/_2.16.840.1.113883.10.20.24.3.13.cat1.erb +0 -38
  429. data/templates/cat1/_2.16.840.1.113883.10.20.24.3.17.cat1.erb +0 -22
  430. data/templates/cat1/_2.16.840.1.113883.10.20.24.3.31.cat1.erb +0 -22
  431. data/templates/cat1/_2.16.840.1.113883.10.20.24.3.37.cat1.erb +0 -20
  432. data/templates/cat1/_2.16.840.1.113883.10.20.24.3.47.cat1.erb +0 -27
  433. data/templates/cat1/_2.16.840.1.113883.10.20.24.3.51.cat1.erb +0 -13
  434. data/templates/cat1/_reason.cat1.erb +0 -23
@@ -0,0 +1,14 @@
1
+ require 'rest_client'
2
+ require 'nokogiri'
3
+ module HealthDataStandards
4
+ module Util
5
+ class NLMHelper
6
+ def self.validateNLMUser(nlmUrl, proxy, nlmLicenseCode, nlmUser, nlmPassword)
7
+ RestClient.proxy = proxy
8
+ nlmResult = RestClient.post nlmUrl, {user: nlmUser, password: nlmPassword, licenseCode: nlmLicenseCode}
9
+ doc = Nokogiri::XML(nlmResult)
10
+ return doc.search('Result').text == 'true'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -2,78 +2,96 @@ require 'rest_client'
2
2
  require 'uri'
3
3
  module HealthDataStandards
4
4
  module Util
5
- class VSNotFoundError < StandardError
6
- end
5
+ class VSNotFoundError < StandardError
6
+ end
7
+
8
+ class VSApi
9
+ attr_accessor :api_url, :ticket_url, :username, :password
7
10
 
8
- class VSApi
9
- attr_accessor :api_url, :ticket_url, :username, :password
11
+ def initialize(ticket_url, api_url, username, password, ticket_granting_ticket = nil)
12
+ @api_url = api_url
13
+ @ticket_url = ticket_url
14
+ @username = username
15
+ @password = password
16
+ @proxy_ticket = ticket_granting_ticket
17
+ end
10
18
 
11
- def initialize(ticket_url, api_url, username, password)
12
- @api_url = api_url
13
- @ticket_url = ticket_url
14
- @username = username
15
- @password = password
16
- end
19
+ def get_valueset(oid, effective_date = nil, include_draft = false, &block)
20
+ params = { id: oid, ticket: get_ticket }
21
+ params[:effectiveDate] = effective_date if effective_date
22
+ params[:includeDraft] = 'yes' if include_draft
23
+ vs = RestClient.get(api_url, params: params)
24
+ yield oid, vs if block_given?
25
+ vs
26
+ end
17
27
 
18
- def get_valueset(oid, effective_date=nil, include_draft=false, &block)
19
- params = {id: oid, ticket: get_ticket}
20
- params[:effectiveDate] = effective_date if effective_date
21
- params[:includeDraft] = 'yes' if include_draft
22
- vs = RestClient.get api_url, {:params=>params}
23
- yield oid,vs if block_given?
24
- vs
25
- end
28
+ def process_valuesets(oids, effective_date = nil, &block)
29
+ oids.each do |oid|
30
+ vs = get_valueset(oid,effective_date)
31
+ yield oid,vs
32
+ end
33
+ end
26
34
 
27
- def process_valuesets(oids, effective_date=nil, &block)
28
- oids.each do |oid|
29
- vs = get_valueset(oid,effective_date)
30
- yield oid,vs
31
- end
32
- end
35
+ def proxy_ticket
36
+ @proxy_ticket ||= get_proxy_ticket
37
+ end
33
38
 
34
- def proxy_ticket
35
- @proxy_ticket ||= get_proxy_ticket
36
- end
39
+ def get_proxy_ticket
40
+ # the content type is set and the body is a string becuase the NLM service does not support urlencoded content and
41
+ # throws an error on that contnet type
42
+ RestClient.post(@ticket_url, username: @username, password: @password)
43
+ end
37
44
 
38
- def get_proxy_ticket
39
- # the content type is set and the body is a string becuase the NLM service does not support urlencoded content and
40
- # throws an error on that contnet type
41
- RestClient.post ticket_url, {username: username, password: password}
42
- end
45
+ def get_ticket
46
+ RestClient.post("#{ticket_url}/#{proxy_ticket}", service: "http://umlsks.nlm.nih.gov")
47
+ end
43
48
 
44
- def get_ticket
45
- RestClient.post "#{ticket_url}/#{proxy_ticket}", {service: "http://umlsks.nlm.nih.gov"}
46
- end
47
- end
49
+ def self.get_tgt_using_credentials(username, password, ticket_url)
50
+ RestClient.post(ticket_url, username: username, password: password)
51
+ end
52
+ end
48
53
 
49
54
  class VSApiV2 < VSApi
50
- def initialize(ticket_url, api_url, username, password)
51
- super(ticket_url, api_url, username, password)
55
+
56
+ # This default profile is used when the include_draft option is true without a profile specified.
57
+ # The VSAC V2 API needs a profile to be specified when using includeDraft. Future work on this
58
+ # class could include a function to fetch the list of profiles from the https://vsac.nlm.nih.gov/vsac/profiles
59
+ # call.
60
+ DEFAULT_PROFILE = "Most Recent CS Versions"
61
+
62
+ def initialize(ticket_url, api_url, username, password, ticket_granting_ticket = nil)
63
+ super(ticket_url, api_url, username, password, ticket_granting_ticket)
52
64
  end
53
65
 
54
66
  def get_valueset(oid, options = {}, &block)
55
67
  version = options.fetch(:version, nil)
56
68
  include_draft = options.fetch(:include_draft, false)
57
- params = {id: oid, ticket: get_ticket}
58
- params[:version] = version if version
59
- params[:includeDraft] = 'yes' if include_draft
60
- begin
61
- vs = RestClient.get api_url, {:params=>params}
62
- rescue RestClient::ResourceNotFound
63
- raise VSNotFoundError, "No ValueSet found for oid '#{oid}'"
64
- end
65
- yield oid,vs if block_given?
66
- vs
67
- end
69
+ profile = options.fetch(:profile, DEFAULT_PROFILE)
70
+ effective_date = options.fetch(:effective_date, nil)
71
+ program_name = options.fetch(:program, nil)
72
+ params = { id: oid, ticket: get_ticket }
73
+ params[:version] = version if version
74
+ params[:includeDraft] = 'yes' if include_draft
75
+ params[:profile] = profile if include_draft
76
+ params[:effectiveDate] = effective_date if effective_date
77
+ params[:programType] = program_name if program_name
78
+ begin
79
+ vs = RestClient.get(api_url, :params=>params)
80
+ rescue RestClient::ResourceNotFound
81
+ raise VSNotFoundError, "No ValueSet found for oid '#{oid}'"
82
+ end
83
+ yield oid, vs if block_given?
84
+ vs
85
+ end
68
86
 
69
87
  def process_valuesets(oids, options = {}, &block)
70
88
  version = options.fetch(:version, nil)
71
89
  include_draft = options.fetch(:include_draft, false)
72
- oids.each do |oid|
73
- vs = get_valueset(oid, version: version, include_draft: include_draft)
74
- yield oid,vs
75
- end
76
- end
90
+ oids.each do |oid|
91
+ vs = get_valueset(oid, version: version, include_draft: include_draft)
92
+ yield oid, vs
93
+ end
94
+ end
77
95
  end
78
96
  end
79
97
  end
@@ -36,8 +36,12 @@ module HealthDataStandards
36
36
  doc_population_ids = @doc.xpath(measure_population_selector).map(&:value).map(&:upcase).sort
37
37
  duplicates = doc_population_ids.group_by{ |e| e }.select { |k, v| v.size > 1 }.map(&:first)
38
38
  duplicates.each do |duplicate|
39
- measureId = @doc.xpath(find_measure_node_for_population(duplicate)).at_xpath("cda:reference/cda:externalDocument/cda:id[./@root='2.16.840.1.113883.4.738']/@extension")
40
- @errors << build_error("Population #{duplicate} for Measure #{measureId.value} reported more than once", "/", data[:file_name])
39
+ begin
40
+ measureId = @doc.xpath(find_measure_node_for_population(duplicate)).at_xpath("cda:reference/cda:externalDocument/cda:id[./@root='2.16.840.1.113883.4.738']/@extension")
41
+ @errors << build_error("Population #{duplicate} for Measure #{measureId.value} reported more than once", "/", data[:file_name])
42
+ rescue
43
+ @errors << build_error("Population #{duplicate} for reported more than once", "/", data[:file_name])
44
+ end
41
45
  noDuplicateMeasures = false
42
46
  end
43
47
  return noDuplicateMeasures
@@ -119,7 +123,8 @@ module HealthDataStandards
119
123
  "/cda:ClinicalDocument/cda:component/cda:structuredBody/cda:component/cda:section/cda:entry" +
120
124
  "/cda:organizer[ ./cda:templateId[@root='2.16.840.1.113883.10.20.27.3.1']" +
121
125
  "and ./cda:component/cda:observation[./cda:templateId[@root='2.16.840.1.113883.10.20.27.3.5']]/cda:reference" +
122
- "/cda:externalObservation/cda:id[@root='#{id.upcase}']]"
126
+ "/cda:externalObservation/cda:id[@root[contains(translate(.,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLOMNOPQRSTUVWXYZ')" +
127
+ ",'#{id.upcase}')]]]"
123
128
  end
124
129
  end
125
130
  end
@@ -77,7 +77,7 @@ module HealthDataStandards
77
77
  if (reported_result['PR']['value'].split('.',2).last.size > 6)
78
78
  return build_error("Reported Performance Rate SHALL not have a precision greater than .000001 ", "/", data[:file_name])
79
79
  elsif (reported_result['PR']['value'].to_f - expected.round(6)).abs > 0.0000001
80
- return build_error("Reported Performance Rate of #{reported_result['PR']['value']} for Numerator #{_ids['NUMER']} does not match expected value of #{expected.to_s[0,8]}.", "/", data[:file_name])
80
+ return build_error("Reported Performance Rate of #{reported_result['PR']['value']} for Numerator #{_ids['NUMER']} does not match expected value of #{expected.round(6)}.", "/", data[:file_name])
81
81
  end
82
82
  end
83
83
  end
@@ -0,0 +1,253 @@
1
+ module HealthDataStandards
2
+ module Validate
3
+ class QrdaQdmTemplateValidator
4
+ include BaseValidator
5
+
6
+ # Hash of templateIds/extensions specified in the Patient Data Section QDM for QRDA R3
7
+ QRDA_CAT_1_R3_QDM_OIDS = {
8
+ '2.16.840.1.113883.10.20.24.3.1' => '2014-12-01',
9
+ '2.16.840.1.113883.10.20.24.3.2' => '2014-12-01',
10
+ '2.16.840.1.113883.10.20.24.3.3' => '2014-12-01',
11
+ '2.16.840.1.113883.10.20.24.3.4' => '2014-12-01',
12
+ '2.16.840.1.113883.10.20.24.3.5' => '2014-12-01',
13
+ '2.16.840.1.113883.10.20.24.3.6' => '2014-12-01',
14
+ '2.16.840.1.113883.10.20.24.3.7' => '2014-12-01',
15
+ '2.16.840.1.113883.10.20.24.3.8' => '2014-12-01',
16
+ '2.16.840.1.113883.10.20.24.3.9' => '2014-12-01',
17
+ '2.16.840.1.113883.10.20.24.3.10' => '2014-12-01',
18
+ '2.16.840.1.113883.10.20.24.3.121' => '2014-12-01',
19
+ '2.16.840.1.113883.10.20.24.3.12' => '2014-12-01',
20
+ '2.16.840.1.113883.10.20.24.3.123' => '2014-12-01',
21
+ '2.16.840.1.113883.10.20.24.3.125' => '2014-12-01',
22
+ '2.16.840.1.113883.10.20.24.3.15' => '2014-12-01',
23
+ '2.16.840.1.113883.10.20.24.3.16' => '2014-12-01',
24
+ '2.16.840.1.113883.10.20.24.3.17' => '2014-12-01',
25
+ '2.16.840.1.113883.10.20.24.3.18' => '2014-12-01',
26
+ '2.16.840.1.113883.10.20.24.3.19' => '2014-12-01',
27
+ '2.16.840.1.113883.10.20.24.3.105' => '2014-12-01',
28
+ '2.16.840.1.113883.10.20.24.3.21' => '2014-12-01',
29
+ '2.16.840.1.113883.10.20.24.3.22' => '2014-12-01',
30
+ '2.16.840.1.113883.10.20.24.3.23' => '2014-12-01',
31
+ '2.16.840.1.113883.10.20.24.3.24' => '2014-12-01',
32
+ '2.16.840.1.113883.10.20.24.3.25' => '2014-12-01',
33
+ '2.16.840.1.113883.10.20.24.3.26' => '2014-12-01',
34
+ '2.16.840.1.113883.10.20.24.3.27' => '2014-12-01',
35
+ '2.16.840.1.113883.10.20.24.3.29' => '2014-12-01',
36
+ '2.16.840.1.113883.10.20.24.3.30' => '2014-12-01',
37
+ '2.16.840.1.113883.10.20.24.3.31' => '2014-12-01',
38
+ '2.16.840.1.113883.10.20.24.3.32' => '2014-12-01',
39
+ '2.16.840.1.113883.10.20.24.3.33' => '2014-12-01',
40
+ '2.16.840.1.113883.10.20.24.3.35' => '2014-12-01',
41
+ '2.16.840.1.113883.10.20.24.3.36' => '2014-12-01',
42
+ '2.16.840.1.113883.10.20.24.3.37' => '2014-12-01',
43
+ '2.16.840.1.113883.10.20.24.3.38' => '2014-12-01',
44
+ '2.16.840.1.113883.10.20.24.3.39' => '2014-12-01',
45
+ '2.16.840.1.113883.10.20.24.3.41' => '2014-12-01',
46
+ '2.16.840.1.113883.10.20.24.3.42' => '2014-12-01',
47
+ '2.16.840.1.113883.10.20.24.3.43' => '2014-12-01',
48
+ '2.16.840.1.113883.10.20.24.3.44' => '2014-12-01',
49
+ '2.16.840.1.113883.10.20.24.3.45' => '2014-12-01',
50
+ '2.16.840.1.113883.10.20.24.3.46' => '2014-12-01',
51
+ '2.16.840.1.113883.10.20.24.3.47' => '2014-12-01',
52
+ '2.16.840.1.113883.10.20.24.3.48' => '2014-12-01',
53
+ '2.16.840.1.113883.10.20.24.3.51' => '2014-12-01',
54
+ '2.16.840.1.113883.10.20.24.3.54' => '2014-12-01',
55
+ '2.16.840.1.113883.10.20.24.3.103' => '2014-12-01',
56
+ '2.16.840.1.113883.10.20.24.3.55' => nil,
57
+ '2.16.840.1.113883.10.20.24.3.58' => '2014-12-01',
58
+ '2.16.840.1.113883.10.20.24.3.59' => '2014-12-01',
59
+ '2.16.840.1.113883.10.20.24.3.60' => '2014-12-01',
60
+ '2.16.840.1.113883.10.20.24.3.61' => '2014-12-01',
61
+ '2.16.840.1.113883.10.20.24.3.62' => '2014-12-01',
62
+ '2.16.840.1.113883.10.20.24.3.63' => '2014-12-01',
63
+ '2.16.840.1.113883.10.20.24.3.64' => '2014-12-01',
64
+ '2.16.840.1.113883.10.20.24.3.65' => '2014-12-01',
65
+ '2.16.840.1.113883.10.20.24.3.67' => '2014-12-01',
66
+ '2.16.840.1.113883.10.20.24.3.114' => '2014-12-01',
67
+ '2.16.840.1.113883.10.20.24.3.69' => '2014-12-01',
68
+ '2.16.840.1.113883.10.20.24.3.75' => '2014-12-01',
69
+ '2.16.840.1.113883.10.20.24.3.120' => '2014-12-01',
70
+ '2.16.840.1.113883.10.20.24.3.127' => '2014-12-01',
71
+ '2.16.840.1.113883.10.20.24.3.122' => '2014-12-01',
72
+ '2.16.840.1.113883.10.20.24.3.124' => '2014-12-01',
73
+ '2.16.840.1.113883.10.20.24.3.81' => '2014-12-01',
74
+ '2.16.840.1.113883.10.20.24.3.82' => '2014-12-01'
75
+ }
76
+ # Hash of templateIds/extensions specified in the Patient Data Section QDM for QRDA R3_1
77
+ QRDA_CAT_1_R3_1_QDM_OIDS = {
78
+ '2.16.840.1.113883.10.20.24.3.1' => '2016-02-01',
79
+ '2.16.840.1.113883.10.20.24.3.2' => '2016-02-01',
80
+ '2.16.840.1.113883.10.20.24.3.3' => '2016-02-01',
81
+ '2.16.840.1.113883.10.20.24.3.4' => '2016-02-01',
82
+ '2.16.840.1.113883.10.20.24.3.5' => '2016-02-01',
83
+ '2.16.840.1.113883.10.20.24.3.6' => '2016-02-01',
84
+ '2.16.840.1.113883.10.20.24.3.7' => '2016-02-01',
85
+ '2.16.840.1.113883.10.20.24.3.8' => '2016-02-01',
86
+ '2.16.840.1.113883.10.20.24.3.130' => nil,
87
+ '2.16.840.1.113883.10.20.24.3.131' => nil,
88
+ '2.16.840.1.113883.10.20.24.3.137' => nil,
89
+ '2.16.840.1.113883.10.20.24.3.15' => '2016-02-01',
90
+ '2.16.840.1.113883.10.20.24.3.16' => '2016-02-01',
91
+ '2.16.840.1.113883.10.20.24.3.17' => '2016-02-01',
92
+ '2.16.840.1.113883.10.20.24.3.18' => '2016-02-01',
93
+ '2.16.840.1.113883.10.20.24.3.19' => '2016-02-01',
94
+ '2.16.840.1.113883.10.20.24.3.105' => '2016-02-01',
95
+ '2.16.840.1.113883.10.20.24.3.21' => '2016-02-01',
96
+ '2.16.840.1.113883.10.20.24.3.132' => nil,
97
+ '2.16.840.1.113883.10.20.24.3.133' => nil,
98
+ '2.16.840.1.113883.10.20.24.3.134' => nil,
99
+ '2.16.840.1.113883.10.20.24.3.12' => '2016-02-01',
100
+ '2.16.840.1.113883.10.20.24.3.25' => '2016-02-01',
101
+ '2.16.840.1.113883.10.20.24.3.26' => '2016-02-01',
102
+ '2.16.840.1.113883.10.20.24.3.27' => '2016-02-01',
103
+ '2.16.840.1.113883.10.20.24.3.140' => nil,
104
+ '2.16.840.1.113883.10.20.24.3.143' => nil,
105
+ '2.16.840.1.113883.10.20.24.3.29' => '2016-02-01',
106
+ '2.16.840.1.113883.10.20.24.3.30' => '2016-02-01',
107
+ '2.16.840.1.113883.10.20.24.3.31' => '2016-02-01',
108
+ '2.16.840.1.113883.10.20.24.3.32' => '2016-02-01',
109
+ '2.16.840.1.113883.10.20.24.3.33' => '2016-02-01',
110
+ '2.16.840.1.113883.10.20.24.3.35' => '2016-02-01',
111
+ '2.16.840.1.113883.10.20.24.3.36' => '2016-02-01',
112
+ '2.16.840.1.113883.10.20.24.3.37' => '2016-02-01',
113
+ '2.16.840.1.113883.10.20.24.3.38' => '2016-02-01',
114
+ '2.16.840.1.113883.10.20.24.3.39' => '2016-02-01',
115
+ '2.16.840.1.113883.10.20.24.3.41' => '2016-02-01',
116
+ '2.16.840.1.113883.10.20.24.3.42' => '2016-02-01',
117
+ '2.16.840.1.113883.10.20.24.3.43' => '2016-02-01',
118
+ '2.16.840.1.113883.10.20.24.3.44' => '2016-02-01',
119
+ '2.16.840.1.113883.10.20.24.3.139' => nil,
120
+ '2.16.840.1.113883.10.20.24.3.46' => '2016-02-01',
121
+ '2.16.840.1.113883.10.20.24.3.47' => '2016-02-01',
122
+ '2.16.840.1.113883.10.20.24.3.48' => '2016-02-01',
123
+ '2.16.840.1.113883.10.20.24.3.51' => '2016-02-01',
124
+ '2.16.840.1.113883.10.20.24.3.54' => '2016-02-01',
125
+ '2.16.840.1.113883.10.20.24.3.103' => '2016-02-01',
126
+ '2.16.840.1.113883.10.20.24.3.58' => '2016-02-01',
127
+ '2.16.840.1.113883.10.20.24.3.59' => '2016-02-01',
128
+ '2.16.840.1.113883.10.20.24.3.55' => nil,
129
+ '2.16.840.1.113883.10.20.24.3.60' => '2016-02-01',
130
+ '2.16.840.1.113883.10.20.24.3.61' => '2016-02-01',
131
+ '2.16.840.1.113883.10.20.24.3.62' => '2016-02-01',
132
+ '2.16.840.1.113883.10.20.24.3.63' => '2016-02-01',
133
+ '2.16.840.1.113883.10.20.24.3.64' => '2016-02-01',
134
+ '2.16.840.1.113883.10.20.24.3.65' => '2016-02-01',
135
+ '2.16.840.1.113883.10.20.24.3.67' => '2016-02-01',
136
+ '2.16.840.1.113883.10.20.24.3.69' => '2016-02-01',
137
+ '2.16.840.1.113883.10.20.24.3.75' => '2016-02-01',
138
+ '2.16.840.1.113883.10.20.24.3.138' => nil,
139
+ '2.16.840.1.113883.10.20.24.3.141' => nil,
140
+ '2.16.840.1.113883.10.20.24.3.142' => nil
141
+ }
142
+ # Hash of templateIds/extensions specified in the Patient Data Section QDM for QRDA R4
143
+ QRDA_CAT_1_R4_QDM_OIDS = {
144
+ '2.16.840.1.113883.10.20.24.3.1' => '2016-02-01',
145
+ '2.16.840.1.113883.10.20.24.3.2' => '2016-02-01',
146
+ '2.16.840.1.113883.10.20.24.3.3' => '2016-02-01',
147
+ '2.16.840.1.113883.10.20.24.3.4' => '2016-02-01',
148
+ '2.16.840.1.113883.10.20.24.3.5' => '2016-02-01',
149
+ '2.16.840.1.113883.10.20.24.3.6' => '2016-02-01',
150
+ '2.16.840.1.113883.10.20.24.3.7' => '2016-02-01',
151
+ '2.16.840.1.113883.10.20.24.3.8' => '2016-02-01',
152
+ '2.16.840.1.113883.10.20.24.3.130' => nil,
153
+ '2.16.840.1.113883.10.20.24.3.131' => nil,
154
+ '2.16.840.1.113883.10.20.24.3.137' => '2016-08-01',
155
+ '2.16.840.1.113883.10.20.24.3.15' => '2016-02-01',
156
+ '2.16.840.1.113883.10.20.24.3.16' => '2016-02-01',
157
+ '2.16.840.1.113883.10.20.24.3.17' => '2016-02-01',
158
+ '2.16.840.1.113883.10.20.24.3.18' => '2016-02-01',
159
+ '2.16.840.1.113883.10.20.24.3.19' => '2016-02-01',
160
+ '2.16.840.1.113883.10.20.24.3.105' => '2016-02-01',
161
+ '2.16.840.1.113883.10.20.24.3.21' => '2016-02-01',
162
+ '2.16.840.1.113883.10.20.24.3.132' => nil,
163
+ '2.16.840.1.113883.10.20.24.3.133' => nil,
164
+ '2.16.840.1.113883.10.20.24.3.134' => nil,
165
+ '2.16.840.1.113883.10.20.24.3.12' => '2016-02-01',
166
+ '2.16.840.1.113883.10.20.24.3.140' => nil,
167
+ '2.16.840.1.113883.10.20.24.3.143' => nil,
168
+ '2.16.840.1.113883.10.20.24.3.29' => '2016-02-01',
169
+ '2.16.840.1.113883.10.20.24.3.30' => '2016-02-01',
170
+ '2.16.840.1.113883.10.20.24.3.31' => '2016-02-01',
171
+ '2.16.840.1.113883.10.20.24.3.32' => '2016-02-01',
172
+ '2.16.840.1.113883.10.20.24.3.33' => '2016-02-01',
173
+ '2.16.840.1.113883.10.20.24.3.35' => '2016-02-01',
174
+ '2.16.840.1.113883.10.20.24.3.36' => '2016-02-01',
175
+ '2.16.840.1.113883.10.20.24.3.37' => '2016-02-01',
176
+ '2.16.840.1.113883.10.20.24.3.38' => '2016-02-01',
177
+ '2.16.840.1.113883.10.20.24.3.39' => '2016-02-01',
178
+ '2.16.840.1.113883.10.20.24.3.41' => '2016-02-01',
179
+ '2.16.840.1.113883.10.20.24.3.42' => '2016-02-01',
180
+ '2.16.840.1.113883.10.20.24.3.43' => '2016-02-01',
181
+ '2.16.840.1.113883.10.20.24.3.44' => '2016-02-01',
182
+ '2.16.840.1.113883.10.20.24.3.139' => nil,
183
+ '2.16.840.1.113883.10.20.24.3.46' => '2016-02-01',
184
+ '2.16.840.1.113883.10.20.24.3.47' => '2016-02-01',
185
+ '2.16.840.1.113883.10.20.24.3.48' => '2016-02-01',
186
+ '2.16.840.1.113883.10.20.24.3.51' => '2016-02-01',
187
+ '2.16.840.1.113883.10.20.24.3.54' => '2016-02-01',
188
+ '2.16.840.1.113883.10.20.24.3.103' => '2016-02-01',
189
+ '2.16.840.1.113883.10.20.24.3.58' => '2016-02-01',
190
+ '2.16.840.1.113883.10.20.24.3.59' => '2016-02-01',
191
+ '2.16.840.1.113883.10.20.24.3.55' => nil,
192
+ '2.16.840.1.113883.10.20.24.3.60' => '2016-02-01',
193
+ '2.16.840.1.113883.10.20.24.3.61' => '2016-02-01',
194
+ '2.16.840.1.113883.10.20.24.3.62' => '2016-02-01',
195
+ '2.16.840.1.113883.10.20.24.3.63' => '2016-02-01',
196
+ '2.16.840.1.113883.10.20.24.3.64' => '2016-02-01',
197
+ '2.16.840.1.113883.10.20.24.3.65' => '2016-02-01',
198
+ '2.16.840.1.113883.10.20.24.3.67' => '2016-02-01',
199
+ '2.16.840.1.113883.10.20.24.3.75' => '2016-02-01',
200
+ '2.16.840.1.113883.10.20.24.3.138' => '2016-08-01',
201
+ '2.16.840.1.113883.10.20.24.3.141' => nil,
202
+ '2.16.840.1.113883.10.20.24.3.142' => nil,
203
+ '2.16.840.1.113883.10.20.24.3.144' => '2016-08-01',
204
+ '2.16.840.1.113883.10.20.24.3.145' => '2016-08-01'
205
+ }
206
+
207
+ def initialize(qrda_version)
208
+ @name = 'QRDA QDM Template Validator'
209
+ @templateshash = case qrda_version
210
+ when 'r3' then QRDA_CAT_1_R3_QDM_OIDS
211
+ when 'r3_1' then QRDA_CAT_1_R3_1_QDM_OIDS
212
+ when 'r4' then QRDA_CAT_1_R4_QDM_OIDS
213
+ end
214
+ end
215
+
216
+ # Validates that a QRDA Cat I file's Patient Data Section QDM (V3) contains entries that conform
217
+ # to the QDM approach to QRDA. In contrast to a QRDA Framework Patient Data Section that requires
218
+ # but does not specify the structured entries, the Patient Data Section QDM contained entry templates
219
+ # have specific requirements to align the quality measure data element type with its corresponding NQF
220
+ # QDM HQMF pattern, its referenced value set and potential QDM attributes.
221
+ # The result will be an Array of execution errors indicating use of templates that are not valid for the
222
+ # specified QRDA version
223
+ def validate(file, data={})
224
+ @errors = []
225
+ # if validator does not support the qrda version specified, no checks are made
226
+ unless @templateshash.nil?
227
+ @doc = get_document(file)
228
+ @doc.root.add_namespace_definition('cda', 'urn:hl7-org:v3')
229
+ extract_entries.each do |entry|
230
+ # each entry is evaluated separetly.
231
+ entry_value_for_qrda_version(entry, data)
232
+ end
233
+ end
234
+ @errors
235
+ end
236
+
237
+ def entry_value_for_qrda_version(entry, data={})
238
+ # an entry may have multiple templateIds
239
+ tids = entry.xpath('./*/cda:templateId')
240
+ # an entry only needs one valid templateId to be acceptable
241
+ unless tids.map { |tid| @templateshash.has_key?(tid['root']) && @templateshash[tid['root']] == tid['extension'] }.include? true
242
+ msg = "#{tids.map { |tid| "#{tid['root']}:#{tid['extension']}" }} are not valid Patient Data Section QDM entries for this QRDA Version"
243
+ @errors << build_error(msg, entry.path, data[:file_name])
244
+ end
245
+ end
246
+
247
+ # returns a list of the patient data entries
248
+ def extract_entries
249
+ @doc.xpath('//cda:component/cda:section[cda:templateId/@root="2.16.840.1.113883.10.20.24.2.1"]/cda:entry')
250
+ end
251
+ end
252
+ end
253
+ end