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
@@ -9,14 +9,19 @@ module HealthDataStandards
9
9
  @code_map = nil
10
10
  end
11
11
 
12
- def export(patient, measures=[])
13
- @code_map ||= self.build_code_map
12
+ # For environments where value sets are scoped, say by measure, they can be passed in
13
+ def export(patient, measures=[], scoped_value_sets = nil)
14
+ if scoped_value_sets
15
+ @code_map = self.build_code_map(scoped_value_sets) # Don't cache if value sets are passed in
16
+ else
17
+ @code_map ||= self.build_code_map
18
+ end
14
19
  @rendering_context.render(:template => 'show', :locals => {:patient => patient, :code_map => @code_map, :measures => measures})
15
20
  end
16
21
 
17
- def build_code_map
22
+ def build_code_map(scoped_value_sets = nil)
18
23
  super_code_map = {}
19
- val_set_array = HealthDataStandards::SVS::ValueSet.all.to_a
24
+ val_set_array = (scoped_value_sets || HealthDataStandards::SVS::ValueSet.all).to_a
20
25
  val_set_array.each do |valset|
21
26
  valset.concepts.each do |concept|
22
27
  super_code_map[concept.code_system_name] ||= {}
@@ -5,7 +5,7 @@ module HealthDataStandards
5
5
  def hqmf_qrda_oid_map
6
6
  if @hqmf_qrda_oid_map.blank?
7
7
  template_id_file = File.expand_path('../hqmf-qrda-oids.json', __FILE__)
8
- @hqmf_qrda_oid_map = JSON.parse(File.read(template_id_file))
8
+ @hqmf_qrda_oid_map = JSON.parse(File.read(template_id_file))
9
9
  end
10
10
  @hqmf_qrda_oid_map
11
11
  end
@@ -14,36 +14,54 @@ module HealthDataStandards
14
14
  hqmf_qrda_oid_map.any? {|map_tuple| map_tuple['qrda_oid'] == oid}
15
15
  end
16
16
 
17
- def qrda_oid_for_hqmf_oid(hqmf_oid, vs_oid = nil)
17
+ def qrda_oid_for_hqmf_oid(hqmf_oid, vs_oid = nil, qrda_version = nil)
18
18
 
19
19
  if (vs_oid && hqmf_oid == '2.16.840.1.113883.3.560.1.1001')
20
- qrda_oid_for_hqmf_patient_characteristic(vs_oid)
20
+ qrda_oid_for_hqmf_patient_characteristic(vs_oid, qrda_version)
21
21
  else
22
22
  oid_tuple = hqmf_qrda_oid_map.find {|map_tuple| map_tuple['hqmf_oid'] == hqmf_oid }
23
23
  if oid_tuple.nil?
24
- puts "no qrda oid for #{hqmf_oid}"
24
+ if hqmf_oid.nil?
25
+ raise "This may be due to a discrepency between QDM 4.2 and QRDA R3. "\
26
+ "Expected cases for this error include: "\
27
+ "Diagnosis, Family History, Symptom, Immunization data types, "\
28
+ "and Encounter Performed attributes for Diagnosis and Principal Diagnosis."
29
+ else
30
+ raise "No QRDA template available for OID #{hqmf_oid}: #{__FILE__} line #{__LINE__}"
31
+ end
25
32
  end
26
- oid_tuple['qrda_oid']
33
+ "#{oid_tuple['qrda_oid']}"
27
34
  end
28
35
 
29
36
  end
30
37
 
31
38
  # given a value set oid for a patient characteristic, return the qrda oid for the correct characteristic
32
- def qrda_oid_for_hqmf_patient_characteristic(vs_oid)
39
+ def qrda_oid_for_hqmf_patient_characteristic(vs_oid, qrda_version = nil)
33
40
  # This is a special case. This HQMF OID maps to more than one QRDA OID.
34
41
  # So we need to try to figure out what template we should use based on the
35
42
  # content of the entry
36
- if vs_oid == '2.16.840.1.113883.3.526.3.1279'
43
+ case vs_oid
44
+ when '2.16.840.1.113883.3.526.3.1279'
37
45
  # Patient Characteristic Observation Assertion template for
38
46
  # Patient Characteristic: ECOG Performance Status-Poor
39
47
  '2.16.840.1.113883.10.20.24.3.103'
40
- elsif ["2.16.840.1.113883.3.117.1.7.1.402" , "2.16.840.1.113883.3.117.1.7.1.403" , "2.16.840.1.113883.3.117.1.7.1.287" ,"2.16.840.1.113883.3.117.1.7.1.307"].index(vs_oid)
48
+ when '2.16.840.1.113883.3.117.1.7.1.402', '2.16.840.1.113883.3.117.1.7.1.403',
49
+ '2.16.840.1.113883.3.117.1.7.1.287', '2.16.840.1.113883.3.117.1.7.1.307'
41
50
  # Patient Charasteristic Gestational Age
42
51
  '2.16.840.1.113883.10.20.24.3.101'
43
- elsif vs_oid == "2.16.840.1.113883.3.526.3.1189" || vs_oid == "2.16.840.1.113883.3.526.3.1170" || vs_oid == '2.16.840.1.113883.3.600.2390'
52
+ when '2.16.840.1.113883.3.526.3.1189', '2.16.840.1.113883.3.526.3.1170', '2.16.840.1.113883.3.600.2390'
44
53
  # Patient Characteristic Tobacco User/Non-User
45
- '2.16.840.1.113883.10.20.22.4.85'
54
+ case qrda_version
55
+ when 'r3_1', 'r3'
56
+ '2.16.840.1.113883.10.20.24.3.103'
57
+ else
58
+ '2.16.840.1.113883.10.20.22.4.85'
59
+ end
60
+ else
61
+ # return generic pc observation template for anything not specificly mapped to its own template
62
+ '2.16.840.1.113883.10.20.24.3.103'
46
63
  end
64
+
47
65
  end
48
66
 
49
67
  alias :partial_for :qrda_oid_for_hqmf_oid
@@ -52,4 +70,4 @@ module HealthDataStandards
52
70
  end
53
71
  end
54
72
  end
55
- end
73
+ end
@@ -1,5 +1,5 @@
1
1
  [
2
- {
2
+ {
3
3
  "hqmf_name": "Care Goal",
4
4
  "hqmf_oid": "2.16.840.1.113883.3.560.1.9",
5
5
  "qrda_name": "Care Goal",
@@ -101,6 +101,12 @@
101
101
  "qrda_name": "Diagnostic Study Order",
102
102
  "qrda_oid": "2.16.840.1.113883.10.20.24.3.17"
103
103
  },
104
+ {
105
+ "hqmf_name": "Diagnostic Study, Order not done",
106
+ "hqmf_oid": "2.16.840.1.113883.3.560.1.140",
107
+ "qrda_name": "Diagnostic Study Order",
108
+ "qrda_oid": "2.16.840.1.113883.10.20.24.3.17"
109
+ },
104
110
  {
105
111
  "hqmf_name": "Diagnostic Study, Performed",
106
112
  "hqmf_oid": "2.16.840.1.113883.3.560.1.3",
@@ -109,7 +115,7 @@
109
115
  },
110
116
  {
111
117
  "hqmf_name": "Diagnostic Study, Recommended",
112
- "hqmf_oid": "2.16.840.1.113883.3.560.1.40",
118
+ "hqmf_oid": "2.16.840.1.113883.10.20.28.3.24",
113
119
  "qrda_name": "Diagnostic Study Recommended",
114
120
  "qrda_oid": "2.16.840.1.113883.10.20.24.3.19"
115
121
  },
@@ -179,6 +185,24 @@
179
185
  "qrda_name": "Functional Status Result",
180
186
  "qrda_oid": "2.16.840.1.113883.10.20.24.3.28"
181
187
  },
188
+ {
189
+ "hqmf_name": "Immunization Administered",
190
+ "hqmf_oid": "2.16.840.1.113883.10.20.28.3.112",
191
+ "qrda_name": "Immunization Administered",
192
+ "qrda_oid": "2.16.840.1.113883.10.20.24.3.140"
193
+ },
194
+ {
195
+ "hqmf_name": "Immunization, Allergy",
196
+ "hqmf_oid": "2.16.840.1.113883.10.20.28.3.114",
197
+ "qrda_name": "Medication Allergy",
198
+ "qrda_oid": "2.16.840.1.113883.10.20.24.3.44"
199
+ },
200
+ {
201
+ "hqmf_name": "Immunization, Intolerance",
202
+ "hqmf_oid": "2.16.840.1.113883.10.20.28.3.115",
203
+ "qrda_name": "Medication Intolerance",
204
+ "qrda_oid": "2.16.840.1.113883.10.20.24.3.46"
205
+ },
182
206
  {
183
207
  "hqmf_name": "Incision Datetime (attribute)",
184
208
  "hqmf_oid": "2.16.840.1.113883.3.560.1.1007",
@@ -203,6 +227,12 @@
203
227
  "qrda_name": "Intervention Order",
204
228
  "qrda_oid": "2.16.840.1.113883.10.20.24.3.31"
205
229
  },
230
+ {
231
+ "hqmf_name": "Intervention, Order not done",
232
+ "hqmf_oid": "2.16.840.1.113883.3.560.1.145",
233
+ "qrda_name": "Intervention Order",
234
+ "qrda_oid": "2.16.840.1.113883.10.20.24.3.31"
235
+ },
206
236
  {
207
237
  "hqmf_name": "Intervention, Performed",
208
238
  "hqmf_oid": "2.16.840.1.113883.3.560.1.46",
@@ -239,6 +269,12 @@
239
269
  "qrda_name": "Laboratory Test Order",
240
270
  "qrda_oid": "2.16.840.1.113883.10.20.24.3.37"
241
271
  },
272
+ {
273
+ "hqmf_name": "Laboratory Test, Order not done",
274
+ "hqmf_oid": "2.16.840.1.113883.3.560.1.150",
275
+ "qrda_name": "Laboratory Test Order",
276
+ "qrda_oid": "2.16.840.1.113883.10.20.24.3.37"
277
+ },
242
278
  {
243
279
  "hqmf_name": "Laboratory Test, Performed",
244
280
  "hqmf_oid": "2.16.840.1.113883.3.560.1.5",
@@ -330,19 +366,25 @@
330
366
  "qrda_oid": "2.16.840.1.113883.10.20.24.3.55"
331
367
  },
332
368
  {
333
- "hqmf_name": "Patient Charactersitic, ECOG Performance Status Poor",
369
+ "hqmf_name": "Patient Characteristic, ECOG Performance Status Poor",
334
370
  "hqmf_oid": "2.16.840.1.113883.3.560.1.1001",
335
371
  "qrda_name": "Patient Characteristic Observation Assertion",
336
372
  "qrda_oid": "2.16.840.1.113883.10.20.24.3.103"
337
373
  },
338
374
  {
339
- "hqmf_name": "Patient Charactersitic, Estimated Date of Conception",
375
+ "hqmf_name": "Patient Characteristic, Clinical Trial Participant",
376
+ "hqmf_oid": "2.16.840.1.113883.10.20.28.3.6",
377
+ "qrda_name": "Patient Characteristic Clinical Trial Participant",
378
+ "qrda_oid": "2.16.840.1.113883.10.20.24.3.51"
379
+ },
380
+ {
381
+ "hqmf_name": "Patient Characteristic, Estimated Date of Conception",
340
382
  "hqmf_oid": "2.16.840.1.113883.3.560.1.1001",
341
383
  "qrda_name": "Patient Characteristic Estimated Date of Conception",
342
384
  "qrda_oid": "2.16.840.1.113883.10.20.24.3.102"
343
385
  },
344
386
  {
345
- "hqmf_name": "Patient Charactersitic, Tobacco user and Non-User",
387
+ "hqmf_name": "Patient Characteristic, Tobacco user and Non-User",
346
388
  "hqmf_oid": "2.16.840.1.113883.3.560.1.1001",
347
389
  "qrda_name": "Tobacco Use",
348
390
  "qrda_oid": "2.16.840.1.113883.10.20.22.4.85"
@@ -557,6 +599,12 @@
557
599
  "qrda_name": "Diagnostic Study Performed",
558
600
  "qrda_oid": "2.16.840.1.113883.10.20.24.3.18"
559
601
  },
602
+ {
603
+ "hqmf_name": "Discharge Medication, not Performed",
604
+ "hqmf_oid": "2.16.840.1.113883.3.560.1.200",
605
+ "qrda_name": "Discharge Medication - Active Medication",
606
+ "qrda_oid": "2.16.840.1.113883.10.20.24.3.105"
607
+ },
560
608
  {
561
609
  "hqmf_name": "Procedure, not Performed",
562
610
  "hqmf_oid": "2.16.840.1.113883.3.560.1.106",
@@ -593,6 +641,12 @@
593
641
  "qrda_name": "Device Applied",
594
642
  "qrda_oid": "2.16.840.1.113883.10.20.24.3.7"
595
643
  },
644
+ {
645
+ "hqmf_name": "Device, Order not done",
646
+ "hqmf_oid": "2.16.840.1.113883.3.560.1.137",
647
+ "qrda_name": "Device Order",
648
+ "qrda_oid": "2.16.840.1.113883.10.20.24.3.9"
649
+ },
596
650
  {
597
651
  "hqmf_name": "Procedure, Order not done",
598
652
  "hqmf_oid": "2.16.840.1.113883.3.560.1.162",
@@ -634,5 +688,35 @@
634
688
  "hqmf_oid": "2.16.840.1.113883.3.560.1.157",
635
689
  "qrda_name": "Physical Exam Performed",
636
690
  "qrda_oid": "2.16.840.1.113883.10.20.24.3.59"
691
+ },
692
+ {
693
+ "hqmf_name": "Diagnosis",
694
+ "hqmf_oid": "2.16.840.1.113883.10.20.28.3.110",
695
+ "qrda_name": "Diagnosis",
696
+ "qrda_oid": "2.16.840.1.113883.10.20.24.3.135"
697
+ },
698
+ {
699
+ "hqmf_name": "Family History",
700
+ "hqmf_oid": "2.16.840.1.113883.10.20.28.3.111",
701
+ "qrda_name": "Family History",
702
+ "qrda_oid": "2.16.840.1.113883.10.20.24.3.12"
703
+ },
704
+ {
705
+ "hqmf_name": "Symptom",
706
+ "hqmf_oid": "2.16.840.1.113883.10.20.28.3.116",
707
+ "qrda_name": "Symptom",
708
+ "qrda_oid": "2.16.840.1.113883.10.20.24.3.136"
709
+ },
710
+ {
711
+ "hqmf_name": "Assessment, Performed",
712
+ "hqmf_oid": "2.16.840.1.113883.10.20.28.3.117",
713
+ "qrda_name": "Assessment Performed",
714
+ "qrda_oid": "2.16.840.1.113883.10.20.24.3.144"
715
+ },
716
+ {
717
+ "hqmf_name": "Assessment, Recommended",
718
+ "hqmf_oid": "2.16.840.1.113883.10.20.28.3.118",
719
+ "qrda_name": "Assessment Recommended",
720
+ "qrda_oid": "2.16.840.1.113883.10.20.24.3.145"
637
721
  }
638
722
  ]
@@ -52,9 +52,9 @@ module HealthDataStandards
52
52
  rendering_context.extend(extension)
53
53
  end
54
54
  end
55
- erb.result(rendering_context.my_binding)
55
+ erb.result(rendering_context.my_binding)
56
56
  end.join
57
57
  end
58
58
  end
59
59
  end
60
- end
60
+ end
@@ -10,10 +10,11 @@ module HealthDataStandards
10
10
  # provide a different directory if you want to use this class
11
11
  # outside of the HDS gem
12
12
  class TemplateHelper
13
- def initialize(template_format, template_subdir = nil, template_directory = nil)
13
+ def initialize(template_format, template_subdir = nil, template_directory = nil, qrda_version = nil)
14
14
  @template_format = template_format
15
15
  @template_directory = template_directory
16
16
  @template_subdir = template_subdir
17
+ @qrda_version = qrda_version
17
18
  @template_cache = {}
18
19
  end
19
20
 
@@ -42,8 +43,12 @@ module HealthDataStandards
42
43
  protected
43
44
 
44
45
  def cache_template(template_name)
46
+ subdir = @qrda_version
47
+
45
48
  entry = @template_cache[template_name] || {mtime:-1, erb:nil}
46
- filename = File.join(template_root, "#{template_name}.#{@template_format}.erb")
49
+ template_dir = template_root
50
+ template_dir = File.join(template_root, subdir) if subdir
51
+ filename = File.join(template_dir, "#{template_name}.#{@template_format}.erb")
47
52
  mtime = File.mtime(filename).to_i
48
53
  if mtime > entry[:mtime]
49
54
  src = File.read(filename)
@@ -5,9 +5,40 @@ module HealthDataStandards
5
5
  options['tag_name'] ||= 'code'
6
6
  options['attribute'] ||= :codes
7
7
  options['exclude_null_flavor'] ||= false
8
+ # allowing wild card matching of any code system for generic templates
9
+ # valueset filtering should filter out a decent code
10
+ # TODO: Can we add nil? logic to the function? Make it so that we don't have to include the preferred_code_sets['*'] if we want all?
11
+ pcs = if options['preferred_code_sets'] && options['preferred_code_sets'].index("*")
12
+ # all of the code_systems that we know about
13
+ HealthDataStandards::Util::CodeSystemHelper::CODE_SYSTEMS.values | HealthDataStandards::Util::CodeSystemHelper::CODE_SYSTEM_ALIASES.keys
14
+ else
15
+ options['preferred_code_sets']
16
+ end
17
+ create_code_string(entry, entry.preferred_code(pcs, options['attribute'], options['value_set_map']), options)
18
+ end
19
+
20
+ def create_code_string(entry, preferred_code, options={})
21
+
22
+ code_string = create_code_display_string(entry, preferred_code, options)
23
+
24
+ unless entry['negationInd'] == true
25
+ code_string += "<originalText>#{ERB::Util.html_escape entry.description}</originalText>" if entry.respond_to?(:description)
26
+
27
+ code_string += create_laterality_code_string(entry, options) if options["laterality"]
28
+
29
+ code_string += create_translations_code_string(entry, options) if options["attribute"] == :codes && entry.respond_to?(:translation_codes)
30
+
31
+ code_string += "</#{options['tag_name']}>"
32
+ end
33
+
34
+ code_string
35
+ end
36
+
37
+ def create_code_display_string(entry, preferred_code, options={})
8
38
  code_string = nil
9
- preferred_code = entry.preferred_code(options['preferred_code_sets'], options['attribute'], options['value_set_map'])
10
- if preferred_code
39
+ if entry['negationInd'] == true
40
+ code_string = "<#{options['tag_name']} nullFlavor=\"NA\" #{options['extra_content']}/>"
41
+ elsif preferred_code
11
42
  code_system_oid = HealthDataStandards::Util::CodeSystemHelper.oid_for_code_system(preferred_code['code_set'])
12
43
  code_string = "<#{options['tag_name']} code=\"#{preferred_code['code']}\" codeSystem=\"#{code_system_oid}\" #{options['extra_content']}>"
13
44
  else
@@ -15,20 +46,23 @@ module HealthDataStandards
15
46
  code_string += "nullFlavor=\"UNK\" " unless options["exclude_null_flavor"]
16
47
  code_string += "#{options['extra_content']}>"
17
48
  end
18
-
19
-
20
-
21
- if options["attribute"] == :codes && entry.respond_to?(:translation_codes)
22
- code_string += "<originalText>#{ERB::Util.html_escape entry.description}</originalText>" if entry.respond_to?(:description)
23
- entry.translation_codes(options['preferred_code_sets'], options['value_set_map']).each do |translation|
24
- code_string += "<translation code=\"#{translation['code']}\" codeSystem=\"#{HealthDataStandards::Util::CodeSystemHelper.oid_for_code_system(translation['code_set'])}\"/>\n"
25
- end
49
+ code_string
50
+ end
51
+
52
+ def create_laterality_code_string(entry, options={})
53
+ code_string = "\n<!-- QDM Attribute: Laterality -->\n<qualifier>\n<name code='182353008' codeSystem='2.16.840.1.113883.6.96' displayName='Side' />\n"
54
+ code_string += "<value xsi:type='CD' code='#{options['laterality']['code']}' displayName='#{options['laterality']['title']}' sdtc:valueSet='#{oid_for_code(entry.laterality,field_oids['LATERALITY'])}'
55
+ codeSystem='#{HealthDataStandards::Util::CodeSystemHelper.oid_for_code_system(options['laterality']['code_system'])}'/>\n</qualifier>\n"
56
+ end
57
+
58
+ def create_translations_code_string(entry, options={})
59
+ code_string = ''
60
+ entry.translation_codes(options['preferred_code_sets'], options['value_set_map']).each do |translation|
61
+ code_string += "<translation code=\"#{translation['code']}\" codeSystem=\"#{HealthDataStandards::Util::CodeSystemHelper.oid_for_code_system(translation['code_set'])}\"/>\n"
26
62
  end
27
-
28
- code_string += "</#{options['tag_name']}>"
29
63
  code_string
30
64
  end
31
-
65
+
32
66
  def status_code_for(entry)
33
67
  case entry.status.to_s.downcase
34
68
  when 'active'
@@ -43,7 +77,7 @@ module HealthDataStandards
43
77
  def fulfillment_quantity(codes, fulfillmentHistory, dose)
44
78
  if (codes["RxNorm"].present?)
45
79
  doses = (fulfillmentHistory.quantity_dispensed['value'].to_f / dose['value'].to_f ).to_i
46
- return "value='#{doses}'"
80
+ return "value='#{doses}' unit='1'"
47
81
  else
48
82
  return "value='#{fulfillmentHistory.quantity_dispensed['value']}' unit='#{fulfillmentHistory.quantity_dispensed['unit']}'"
49
83
  end
@@ -58,10 +92,36 @@ module HealthDataStandards
58
92
  end
59
93
 
60
94
  def dose_quantity(codes, dose)
61
- if (codes["RxNorm"].present?)
62
- return "value='1'"
95
+ if (codes["RxNorm"].present? || codes["CVX"].present?)
96
+ if dose['unit'].present?
97
+ return "value='1' unit='#{ucum_for_dose_quantity(dose['unit'])}'"
98
+ else
99
+ return "value='1'"
100
+ end
101
+ else
102
+ return "value='#{dose['scalar']}' unit='#{dose['units']}'"
103
+ end
104
+ end
105
+
106
+ def ucum_for_dose_quantity(unit)
107
+ case unit
108
+ when 'capsule(s)'
109
+ '{Capsule}'
110
+ when 'tablet(s)'
111
+ '{tbl}'
63
112
  else
64
- return "value=#{dose['value']} unit=#{dose['unit']}"
113
+ unit
114
+ end
115
+ end
116
+
117
+ def ucum_for_dose_quantity(unit)
118
+ case unit
119
+ when 'capsule(s)'
120
+ '{Capsule}'
121
+ when 'tablet(s)'
122
+ '{tbl}'
123
+ else
124
+ unit
65
125
  end
66
126
  end
67
127
 
@@ -92,30 +152,12 @@ module HealthDataStandards
92
152
 
93
153
  if (codes.is_a? Hash)
94
154
  clean_hash = {}
95
-
155
+
96
156
  if codes['codeSystem']
97
- if codes['title']
98
- clean_hash[codes['codeSystem']] = codes['code'] + " (#{codes['title']})"
99
- else
100
- clean_hash[codes['codeSystem']] = codes['code']
101
- end
157
+ clean_hash[codes['codeSystem']] = clean_hash_code_system(codes)
102
158
  elsif codes['_id']
103
159
  codes.keys.reject {|key| ['_id'].include? key}.each do |hashkey|
104
- value = codes[hashkey]
105
- if value.nil?
106
- clean_hash[hashkey.titleize] = 'none'
107
- elsif value.is_a? Hash
108
- hash_result = convert_field_to_hash(hashkey, value)
109
- if hash_result.is_a? Hash
110
- clean_hash[hashkey.titleize] = hash_result.map {|key, value| "#{key}: #{value}"}.join(' ')
111
- else
112
- clean_hash[hashkey.titleize] = hash_result
113
- end
114
- elsif value.is_a? Array
115
- clean_hash[hashkey.titleize] = value.join(', ')
116
- else
117
- clean_hash[hashkey.titleize] = convert_field_to_hash(hashkey, value)
118
- end
160
+ clean_hash[hashkey.titleize] = clean_hash_id(codes, hashkey)
119
161
  end
120
162
  elsif codes['scalar']
121
163
  return "#{codes['scalar']} #{codes['units']}"
@@ -139,7 +181,33 @@ module HealthDataStandards
139
181
  end
140
182
  end
141
183
 
184
+ def clean_hash_code_system(codes)
185
+ if codes['title']
186
+ return codes['code'] + " (#{codes['title']})"
187
+ else
188
+ return codes['code']
189
+ end
190
+ end
191
+
192
+ def clean_hash_id(codes, hashkey)
193
+ value = codes[hashkey]
194
+ if value.nil?
195
+ return 'none'
196
+ elsif value.is_a? Hash
197
+ hash_result = convert_field_to_hash(hashkey, value)
198
+ if hash_result.is_a? Hash
199
+ return hash_result.map {|key, value| "#{key}: #{value}"}.join(' ')
200
+ else
201
+ return hash_result
202
+ end
203
+ elsif value.is_a? Array
204
+ return value.join(', ')
205
+ else
206
+ return convert_field_to_hash(hashkey, value)
207
+ end
208
+ end
209
+
142
210
 
143
211
  end
144
212
  end
145
- end
213
+ end