cqm-models 1.0.3 → 1.1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. checksums.yaml +5 -5
  2. data/.eslintrc.json +10 -2
  3. data/.github/PULL_REQUEST_TEMPLATE.md +0 -4
  4. data/.rubocop.yml +3 -0
  5. data/.travis.yml +31 -1
  6. data/README.md +59 -2
  7. data/app/assets/javascripts/AdverseEvent.js +16 -7
  8. data/app/assets/javascripts/AllDataElements.js +6 -6
  9. data/app/assets/javascripts/AllergyIntolerance.js +16 -7
  10. data/app/assets/javascripts/AssessmentOrder.js +15 -6
  11. data/app/assets/javascripts/AssessmentPerformed.js +16 -7
  12. data/app/assets/javascripts/AssessmentRecommended.js +16 -7
  13. data/app/assets/javascripts/CareGoal.js +16 -7
  14. data/app/assets/javascripts/CommunicationPerformed.js +15 -6
  15. data/app/assets/javascripts/DeviceApplied.js +16 -7
  16. data/app/assets/javascripts/DeviceOrder.js +16 -7
  17. data/app/assets/javascripts/DeviceRecommended.js +16 -7
  18. data/app/assets/javascripts/Diagnosis.js +16 -7
  19. data/app/assets/javascripts/DiagnosticStudyOrder.js +16 -7
  20. data/app/assets/javascripts/DiagnosticStudyPerformed.js +16 -7
  21. data/app/assets/javascripts/DiagnosticStudyRecommended.js +16 -7
  22. data/app/assets/javascripts/EncounterOrder.js +16 -7
  23. data/app/assets/javascripts/EncounterPerformed.js +16 -7
  24. data/app/assets/javascripts/EncounterRecommended.js +16 -7
  25. data/app/assets/javascripts/FamilyHistory.js +16 -7
  26. data/app/assets/javascripts/Id.js +7 -3
  27. data/app/assets/javascripts/ImmunizationAdministered.js +16 -7
  28. data/app/assets/javascripts/ImmunizationOrder.js +16 -7
  29. data/app/assets/javascripts/IndividualResult.js +7 -2
  30. data/app/assets/javascripts/InterventionOrder.js +16 -7
  31. data/app/assets/javascripts/InterventionPerformed.js +16 -7
  32. data/app/assets/javascripts/InterventionRecommended.js +16 -7
  33. data/app/assets/javascripts/LaboratoryTestOrder.js +16 -7
  34. data/app/assets/javascripts/LaboratoryTestPerformed.js +16 -7
  35. data/app/assets/javascripts/LaboratoryTestRecommended.js +16 -7
  36. data/app/assets/javascripts/MedicationActive.js +16 -7
  37. data/app/assets/javascripts/MedicationAdministered.js +16 -7
  38. data/app/assets/javascripts/MedicationDischarge.js +16 -7
  39. data/app/assets/javascripts/MedicationDispensed.js +16 -7
  40. data/app/assets/javascripts/MedicationOrder.js +16 -7
  41. data/app/assets/javascripts/Participation.js +15 -6
  42. data/app/assets/javascripts/PatientCareExperience.js +16 -7
  43. data/app/assets/javascripts/PatientCharacteristic.js +16 -7
  44. data/app/assets/javascripts/PatientCharacteristicBirthdate.js +16 -7
  45. data/app/assets/javascripts/PatientCharacteristicClinicalTrialParticipant.js +16 -7
  46. data/app/assets/javascripts/PatientCharacteristicEthnicity.js +16 -7
  47. data/app/assets/javascripts/PatientCharacteristicExpired.js +16 -7
  48. data/app/assets/javascripts/PatientCharacteristicPayer.js +16 -7
  49. data/app/assets/javascripts/PatientCharacteristicRace.js +16 -7
  50. data/app/assets/javascripts/PatientCharacteristicSex.js +16 -7
  51. data/app/assets/javascripts/PhysicalExamOrder.js +16 -7
  52. data/app/assets/javascripts/PhysicalExamPerformed.js +16 -7
  53. data/app/assets/javascripts/PhysicalExamRecommended.js +16 -7
  54. data/app/assets/javascripts/ProcedureOrder.js +16 -7
  55. data/app/assets/javascripts/ProcedurePerformed.js +16 -7
  56. data/app/assets/javascripts/ProcedureRecommended.js +16 -7
  57. data/app/assets/javascripts/ProviderCareExperience.js +16 -7
  58. data/app/assets/javascripts/ProviderCharacteristic.js +16 -7
  59. data/app/assets/javascripts/QDMPatient.js +262 -0
  60. data/app/assets/javascripts/Result.js +7 -2
  61. data/app/assets/javascripts/ResultComponent.js +14 -6
  62. data/app/assets/javascripts/SubstanceAdministered.js +16 -7
  63. data/app/assets/javascripts/SubstanceOrder.js +16 -7
  64. data/app/assets/javascripts/SubstanceRecommended.js +16 -7
  65. data/app/assets/javascripts/Symptom.js +16 -7
  66. data/app/assets/javascripts/attributes/Component.js +30 -0
  67. data/app/assets/javascripts/attributes/FacilityLocation.js +30 -0
  68. data/app/assets/javascripts/basetypes/Any.js +1 -1
  69. data/app/assets/javascripts/basetypes/Code.js +1 -1
  70. data/app/assets/javascripts/basetypes/DataElement.js +2 -1
  71. data/app/assets/javascripts/basetypes/DateTime.js +5 -1
  72. data/app/assets/javascripts/basetypes/Interval.js +1 -1
  73. data/app/assets/javascripts/basetypes/Quantity.js +1 -1
  74. data/app/assets/javascripts/basetypes/Ratio.js +1 -1
  75. data/app/assets/javascripts/browser.js +3 -0
  76. data/app/assets/javascripts/cqm/AllCQMModels.js +24 -0
  77. data/app/assets/javascripts/cqm/CQLLibrary.js +32 -0
  78. data/app/assets/javascripts/cqm/CQLStatementDependency.js +28 -0
  79. data/app/assets/javascripts/cqm/Concept.js +17 -0
  80. data/app/assets/javascripts/cqm/Measure.js +108 -0
  81. data/app/assets/javascripts/{MeasurePackage.js → cqm/MeasurePackage.js} +9 -3
  82. data/app/assets/javascripts/cqm/Patient.js +38 -0
  83. data/app/assets/javascripts/cqm/PopulationSet.js +88 -0
  84. data/app/assets/javascripts/cqm/Provider.js +44 -0
  85. data/app/assets/javascripts/cqm/ValueSet.js +26 -0
  86. data/app/assets/javascripts/index.js +18 -8
  87. data/app/models/{qdm/tacoma → cqm}/concept.rb +4 -4
  88. data/app/models/cqm/cql_library.rb +22 -0
  89. data/app/models/cqm/cql_statement_dependency.rb +24 -0
  90. data/app/models/cqm/measure.rb +105 -0
  91. data/app/models/{qdm/tacoma → cqm}/measure_package.rb +2 -2
  92. data/app/models/cqm/patient.rb +20 -0
  93. data/app/models/cqm/population_set.rb +86 -0
  94. data/app/models/cqm/provider.rb +110 -0
  95. data/app/models/cqm/valueset.rb +15 -0
  96. data/app/models/hqmfOid_to_datatype_map.json +55 -0
  97. data/app/models/model_finder.rb +12 -0
  98. data/app/models/models.rb +18 -6
  99. data/app/models/qdm/adverse_event.rb +3 -2
  100. data/app/models/qdm/allergy_intolerance.rb +2 -1
  101. data/app/models/qdm/assessment_order.rb +1 -0
  102. data/app/models/qdm/assessment_performed.rb +2 -1
  103. data/app/models/qdm/assessment_recommended.rb +2 -1
  104. data/app/models/qdm/attributes/attribute.rb +63 -0
  105. data/app/models/qdm/{component.rb → attributes/component.rb} +1 -1
  106. data/app/models/qdm/{facility_location.rb → attributes/facility_location.rb} +1 -1
  107. data/app/models/qdm/basetypes/data_element.rb +21 -6
  108. data/app/models/qdm/basetypes/interval.rb +2 -1
  109. data/app/models/qdm/care_goal.rb +2 -1
  110. data/app/models/qdm/communication_performed.rb +1 -0
  111. data/app/models/qdm/device_applied.rb +2 -1
  112. data/app/models/qdm/device_order.rb +2 -1
  113. data/app/models/qdm/device_recommended.rb +2 -1
  114. data/app/models/qdm/diagnosis.rb +2 -1
  115. data/app/models/qdm/diagnostic_study_order.rb +2 -1
  116. data/app/models/qdm/diagnostic_study_performed.rb +3 -2
  117. data/app/models/qdm/diagnostic_study_recommended.rb +2 -1
  118. data/app/models/qdm/encounter_order.rb +3 -2
  119. data/app/models/qdm/encounter_performed.rb +2 -1
  120. data/app/models/qdm/encounter_recommended.rb +3 -2
  121. data/app/models/qdm/family_history.rb +2 -1
  122. data/app/models/qdm/immunization_administered.rb +2 -1
  123. data/app/models/qdm/immunization_order.rb +2 -1
  124. data/app/models/qdm/intervention_order.rb +2 -1
  125. data/app/models/qdm/intervention_performed.rb +2 -1
  126. data/app/models/qdm/intervention_recommended.rb +2 -1
  127. data/app/models/qdm/laboratory_test_order.rb +2 -1
  128. data/app/models/qdm/laboratory_test_performed.rb +2 -1
  129. data/app/models/qdm/laboratory_test_recommended.rb +2 -1
  130. data/app/models/qdm/medication_active.rb +2 -1
  131. data/app/models/qdm/medication_administered.rb +2 -1
  132. data/app/models/qdm/medication_discharge.rb +2 -1
  133. data/app/models/qdm/medication_dispensed.rb +4 -3
  134. data/app/models/qdm/medication_order.rb +3 -2
  135. data/app/models/qdm/participation.rb +1 -0
  136. data/app/models/qdm/patient.rb +7 -4
  137. data/app/models/qdm/patient_care_experience.rb +2 -1
  138. data/app/models/qdm/patient_characteristic.rb +2 -1
  139. data/app/models/qdm/patient_characteristic_birthdate.rb +2 -1
  140. data/app/models/qdm/patient_characteristic_clinical_trial_participant.rb +2 -1
  141. data/app/models/qdm/patient_characteristic_ethnicity.rb +2 -1
  142. data/app/models/qdm/patient_characteristic_expired.rb +2 -1
  143. data/app/models/qdm/patient_characteristic_payer.rb +2 -1
  144. data/app/models/qdm/patient_characteristic_race.rb +2 -1
  145. data/app/models/qdm/patient_characteristic_sex.rb +2 -1
  146. data/app/models/qdm/physical_exam_order.rb +2 -1
  147. data/app/models/qdm/physical_exam_performed.rb +2 -1
  148. data/app/models/qdm/physical_exam_recommended.rb +2 -1
  149. data/app/models/qdm/procedure_order.rb +2 -1
  150. data/app/models/qdm/procedure_performed.rb +2 -1
  151. data/app/models/qdm/procedure_recommended.rb +2 -1
  152. data/app/models/qdm/provider_care_experience.rb +2 -1
  153. data/app/models/qdm/provider_characteristic.rb +2 -1
  154. data/app/models/qdm/substance_administered.rb +2 -1
  155. data/app/models/qdm/substance_order.rb +2 -1
  156. data/app/models/qdm/substance_recommended.rb +2 -1
  157. data/app/models/qdm/symptom.rb +2 -1
  158. data/bin/build_cql_execution.sh +8 -0
  159. data/bin/validate_browser.sh +17 -0
  160. data/bin/validate_generator.sh +12 -0
  161. data/cqm-models.gemspec +5 -2
  162. data/data/oids_qdm_5.4.json +321 -0
  163. data/data/{oids.json → oids_unversioned.json} +0 -0
  164. data/dist/browser.js +102937 -0
  165. data/dist/index.js +36637 -36540
  166. data/lib/generate_models.rb +89 -93
  167. data/lib/generate_patients.rb +125 -0
  168. data/lib/generate_types.rb +64 -0
  169. data/lib/generators/custom_mongo/model.rb.tt +20 -0
  170. data/lib/generators/custom_mongo/model_generator.rb +34 -0
  171. data/notice.md +9 -0
  172. data/package.json +12 -6
  173. data/templates/id_template.js.erb +8 -3
  174. data/templates/index_template.js.erb +18 -8
  175. data/templates/models_template.rb.erb +20 -4
  176. data/templates/mongoose_template.js.erb +23 -15
  177. data/templates/patient_extension.rb.erb +7 -4
  178. data/templates/patient_template.js.erb +88 -87
  179. data/yarn.lock +552 -347
  180. metadata +86 -19
  181. data/app/assets/javascripts/Component.js +0 -26
  182. data/app/assets/javascripts/Concept.js +0 -14
  183. data/app/assets/javascripts/FacilityLocation.js +0 -26
  184. data/app/assets/javascripts/Measure.js +0 -78
  185. data/app/assets/javascripts/Patient.js +0 -262
  186. data/app/assets/javascripts/ValueSet.js +0 -30
  187. data/app/models/qdm/tacoma/measure.rb +0 -174
  188. data/app/models/qdm/tacoma/valueset.rb +0 -68
@@ -0,0 +1,15 @@
1
+ module CQM
2
+ # ValueSet represents a collection of Concepts, used by the Measures to specify a set of codes for a particular topic
3
+ class ValueSet
4
+ include Mongoid::Document
5
+ field :oid, type: String
6
+ field :display_name, type: String
7
+ field :version, type: String
8
+
9
+ index oid: 1
10
+
11
+ embeds_many :concepts
12
+
13
+ scope :by_oid, ->(oid) { where(oid: oid) }
14
+ end
15
+ end
@@ -0,0 +1,55 @@
1
+ {
2
+ "2.16.840.1.113883.10.20.28.4.61": "PhysicalExamOrder",
3
+ "2.16.840.1.113883.10.20.28.4.130": "Participation",
4
+ "2.16.840.1.113883.10.20.28.4.55": "PatientCharacteristicSex",
5
+ "2.16.840.1.113883.10.20.28.4.7": "CareGoal",
6
+ "2.16.840.1.113883.10.20.28.4.53": "PatientCharacteristic",
7
+ "2.16.840.1.113883.10.20.28.4.56": "PatientCharacteristicEthnicity",
8
+ "2.16.840.1.113883.10.20.28.4.59": "PatientCharacteristicRace",
9
+ "2.16.840.1.113883.10.20.28.4.42": "LaboratoryTestPerformed",
10
+ "2.16.840.1.113883.10.20.28.4.116": "Symptom",
11
+ "2.16.840.1.113883.10.20.28.4.45": "MedicationAdministered",
12
+ "2.16.840.1.113883.10.20.28.4.68": "ProcedureRecommended",
13
+ "2.16.840.1.113883.10.20.28.4.5": "EncounterPerformed",
14
+ "2.16.840.1.113883.10.20.28.4.110": "Diagnosis",
15
+ "2.16.840.1.113883.10.20.28.4.132": "CommunicationPerformed",
16
+ "2.16.840.1.113883.10.20.28.4.117": "AssessmentPerformed",
17
+ "2.16.840.1.113883.10.20.28.4.6": "PatientCharacteristicClinicalTrialParticipant",
18
+ "2.16.840.1.113883.10.20.28.4.15": "DeviceOrder",
19
+ "2.16.840.1.113883.10.20.28.4.23": "DiagnosticStudyPerformed",
20
+ "2.16.840.1.113883.10.20.28.4.35": "InterventionOrder",
21
+ "2.16.840.1.113883.10.20.28.4.111": "FamilyHistory",
22
+ "2.16.840.1.113883.10.20.28.4.44": "MedicationActive",
23
+ "2.16.840.1.113883.10.20.28.4.41": "LaboratoryTestOrder",
24
+ "2.16.840.1.113883.10.20.28.4.22": "DiagnosticStudyOrder",
25
+ "2.16.840.1.113883.10.20.28.4.77": "SubstanceOrder",
26
+ "2.16.840.1.113883.10.20.28.4.58": "PatientCharacteristicPayer",
27
+ "2.16.840.1.113883.10.20.28.4.57": "PatientCharacteristicExpired",
28
+ "2.16.840.1.113883.10.20.28.4.131": "AssessmentOrder",
29
+ "2.16.840.1.113883.10.20.28.4.118": "AssessmentRecommended",
30
+ "2.16.840.1.113883.10.20.28.4.112": "ImmunizationAdministered",
31
+ "2.16.840.1.113883.10.20.28.4.73": "SubstanceAdministered",
32
+ "2.16.840.1.113883.10.20.28.4.27": "EncounterOrder",
33
+ "2.16.840.1.113883.10.20.28.4.28": "EncounterRecommended",
34
+ "2.16.840.1.113883.10.20.28.4.67": "ProcedurePerformed",
35
+ "2.16.840.1.113883.10.20.28.4.119": "AllergyIntolerance",
36
+ "2.16.840.1.113883.10.20.28.4.71": "ProviderCharacteristic",
37
+ "22.16.840.1.113883.10.20.28.4.63": "PhysicalExamRecommended",
38
+ "2.16.840.1.113883.10.20.28.4.54": "PatientCharacteristicBirthdate",
39
+ "2.16.840.1.113883.10.20.28.4.120": "AdverseEvent",
40
+ "2.16.840.1.113883.10.20.28.4.16": "DeviceRecommended",
41
+ "2.16.840.1.113883.10.20.28.4.13": "DeviceApplied",
42
+ "2.16.840.1.113883.10.20.28.4.48": "MedicationDischarge",
43
+ "2.16.840.1.113883.10.20.28.4.36": "InterventionPerformed",
44
+ "2.16.840.1.113883.10.20.28.4.43": "LaboratoryTestRecommended",
45
+ "2.16.840.1.113883.10.20.28.4.49": "MedicationDispensed",
46
+ "2.16.840.1.113883.10.20.28.4.24": "DiagnosticStudyRecommended",
47
+ "2.16.840.1.113883.10.20.28.4.113": "ImmunizationOrder",
48
+ "2.16.840.1.113883.10.20.28.4.52": "PatientCareExperience",
49
+ "2.16.840.1.113883.10.20.28.4.70": "ProviderCareExperience",
50
+ "2.16.840.1.113883.10.20.28.4.66": "ProcedureOrder",
51
+ "2.16.840.1.113883.10.20.28.4.51": "MedicationOrder",
52
+ "2.16.840.1.113883.10.20.28.4.78": "SubstanceRecommended",
53
+ "2.16.840.1.113883.10.20.28.4.37": "InterventionRecommended",
54
+ "2.16.840.1.113883.10.20.28.4.62": "PhysicalExamPerformed"
55
+ }
@@ -0,0 +1,12 @@
1
+ module QDM
2
+ # Find the right datatype model.
3
+ class ModelFinder
4
+ @hqmfOidToDatatypeMap = JSON.parse(File.read(File.join(File.dirname(__FILE__), 'hqmfOid_to_datatype_map.json')))
5
+
6
+ def self.by_hqmf_oid(hqmfOid)
7
+ datatype = @hqmfOidToDatatypeMap[hqmfOid]
8
+ return nil if datatype.nil?
9
+ return QDM.const_get(datatype)
10
+ end
11
+ end
12
+ end
@@ -3,6 +3,9 @@ module QDM
3
3
  end
4
4
  require 'mongoid'
5
5
 
6
+ # ModelFinder
7
+ require_relative 'model_finder'
8
+
6
9
  # Generated models that are dependencies for base types
7
10
  require_relative 'qdm/id'
8
11
 
@@ -12,14 +15,25 @@ require_relative 'qdm/basetypes/data_element'
12
15
  require_relative 'qdm/basetypes/interval'
13
16
  require_relative 'qdm/basetypes/quantity'
14
17
  require_relative 'qdm/basetypes/ratio'
18
+ require_relative 'qdm/attributes/attribute'
19
+ require_relative 'qdm/attributes/facility_location'
20
+ require_relative 'qdm/attributes/component'
15
21
 
16
22
  # Tacoma-specific models
17
- require_relative 'qdm/tacoma/measure'
18
- require_relative 'qdm/tacoma/measure_package'
19
- require_relative 'qdm/tacoma/valueset'
20
- require_relative 'qdm/tacoma/concept'
23
+ require_relative 'cqm/measure'
24
+ require_relative 'cqm/measure_package'
25
+ require_relative 'cqm/valueset'
26
+ require_relative 'cqm/concept'
27
+ require_relative 'cqm/cql_statement_dependency'
28
+ require_relative 'cqm/cql_library'
29
+ require_relative 'cqm/population_set'
30
+ require_relative 'cqm/patient'
31
+ require_relative 'cqm/provider'
21
32
  require_relative 'qdm/tacoma/individual_result'
22
33
 
34
+ # Make Patient Generation Available
35
+ require_relative '../../lib/generate_patients'
36
+
23
37
  # Generated models
24
38
  require_relative 'qdm/patient'
25
39
  require_relative 'qdm/physical_exam_order'
@@ -42,9 +56,7 @@ require_relative 'qdm/device_order'
42
56
  require_relative 'qdm/diagnostic_study_performed'
43
57
  require_relative 'qdm/intervention_order'
44
58
  require_relative 'qdm/family_history'
45
- require_relative 'qdm/component'
46
59
  require_relative 'qdm/result_component'
47
- require_relative 'qdm/facility_location'
48
60
  require_relative 'qdm/medication_active'
49
61
  require_relative 'qdm/laboratory_test_order'
50
62
  require_relative 'qdm/diagnostic_study_order'
@@ -6,9 +6,10 @@ module QDM
6
6
  field :authorDatetime, type: DateTime
7
7
  field :relevantPeriod, type: QDM::Interval
8
8
  field :severity, type: QDM::Code
9
- field :facilityLocation, type: QDM::Code
9
+ field :facilityLocation, type: QDM::FacilityLocation
10
10
  field :type, type: QDM::Code
11
- field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.120'
11
+ field :qdmTitle, type: String, default: 'Adverse Event'
12
+ field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.120'
12
13
  field :qdmCategory, type: String, default: 'adverse_event'
13
14
  field :qdmVersion, type: String, default: '5.4'
14
15
  end
@@ -7,7 +7,8 @@ module QDM
7
7
  field :prevalencePeriod, type: QDM::Interval
8
8
  field :type, type: QDM::Code
9
9
  field :severity, type: QDM::Code
10
- field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.119'
10
+ field :qdmTitle, type: String, default: 'Allergy/Intolerance'
11
+ field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.119'
11
12
  field :qdmCategory, type: String, default: 'allergy'
12
13
  field :qdmStatus, type: String, default: 'intolerance'
13
14
  field :qdmVersion, type: String, default: '5.4'
@@ -6,6 +6,7 @@ module QDM
6
6
  field :authorDatetime, type: DateTime
7
7
  field :negationRationale, type: QDM::Code
8
8
  field :reason, type: QDM::Code
9
+ field :qdmTitle, type: String, default: 'Assessment, Order'
9
10
  field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.131'
10
11
  field :qdmCategory, type: String, default: 'assessment'
11
12
  field :qdmStatus, type: String, default: 'order'
@@ -10,7 +10,8 @@ module QDM
10
10
  field :result
11
11
  field :components, type: Array
12
12
  embeds_many :relatedTo, class_name: 'QDM::Id'
13
- field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.117'
13
+ field :qdmTitle, type: String, default: 'Assessment, Performed'
14
+ field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.117'
14
15
  field :qdmCategory, type: String, default: 'assessment'
15
16
  field :qdmStatus, type: String, default: 'performed'
16
17
  field :qdmVersion, type: String, default: '5.4'
@@ -6,7 +6,8 @@ module QDM
6
6
  field :authorDatetime, type: DateTime
7
7
  field :negationRationale, type: QDM::Code
8
8
  field :reason, type: QDM::Code
9
- field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.118'
9
+ field :qdmTitle, type: String, default: 'Assessment, Recommended'
10
+ field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.118'
10
11
  field :qdmCategory, type: String, default: 'assessment'
11
12
  field :qdmStatus, type: String, default: 'recommended'
12
13
  field :qdmVersion, type: String, default: '5.4'
@@ -0,0 +1,63 @@
1
+ module QDM
2
+ # Represents QDM attribute
3
+ class Attribute
4
+ include Mongoid::Document
5
+
6
+ def initialize(options = {})
7
+ super(options)
8
+ end
9
+
10
+ # Returns the attribute requested on the datatype.
11
+ def get(attribute)
12
+ send(attribute) if has_attribute?(attribute)
13
+ end
14
+
15
+ def mongoize
16
+ json_representation = {}
17
+ attribute_names.each do |field|
18
+ json_representation[field] = send(field).mongoize
19
+ end
20
+ json_representation
21
+ end
22
+
23
+ # Include '_type' in any JSON output. This is necessary for deserialization.
24
+ def to_json(options = nil)
25
+ serializable_hash(methods: :_type).to_json(options)
26
+ end
27
+
28
+ class << self
29
+ # Get the object as it was stored in the database, and instantiate
30
+ # this custom class from it.
31
+ def demongoize(object)
32
+ return nil unless object
33
+ object = object.symbolize_keys
34
+ if object.is_a?(Hash)
35
+ # This will turn the object into the concrete type eg: facilityLocation
36
+ data_element = QDM.const_get(object[:_type]).new
37
+ data_element.attribute_names.each do |field|
38
+ data_element.send(field + '=', object[field.to_sym])
39
+ end
40
+ data_element
41
+ else object
42
+ end
43
+ end
44
+
45
+ # Takes any possible object and converts it to how it would be
46
+ # stored in the database.
47
+ def mongoize(object)
48
+ case object
49
+ when nil then nil
50
+ when QDM::Attribute then object.mongoize
51
+ when Hash
52
+ object = object.symbolize_keys
53
+ data_element = QDM.const_get(object[:_type]).new
54
+ data_element.attribute_names.each do |field|
55
+ data_element.send(field + '=', object[field.to_sym])
56
+ end
57
+ data_element.mongoize
58
+ else object
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -1,6 +1,6 @@
1
1
  module QDM
2
2
  # app/models/qdm/component.rb
3
- class Component < DataElement
3
+ class Component < Attribute
4
4
  include Mongoid::Document
5
5
  field :code, type: QDM::Code
6
6
  field :result
@@ -1,6 +1,6 @@
1
1
  module QDM
2
2
  # app/models/qdm/facility_location.rb
3
- class FacilityLocation < DataElement
3
+ class FacilityLocation < Attribute
4
4
  include Mongoid::Document
5
5
  field :code, type: QDM::Code
6
6
  field :locationPeriod, type: QDM::Interval
@@ -3,6 +3,7 @@ module QDM
3
3
  class DataElement
4
4
  include Mongoid::Document
5
5
  embedded_in :patient
6
+ embedded_in :measure
6
7
 
7
8
  # Codes that describe this datatype.
8
9
  field :dataElementCodes, type: Array, default: []
@@ -10,6 +11,9 @@ module QDM
10
11
  # Optional description.
11
12
  field :description, type: String
12
13
 
14
+ # Valueset oid of the specific type.
15
+ field :codeListId, type: String
16
+
13
17
  embeds_one :id, class_name: 'QDM::Id'
14
18
 
15
19
  def initialize(options = {})
@@ -66,14 +70,25 @@ module QDM
66
70
  end
67
71
 
68
72
  # Special case for facility locations
69
- next unless field == 'facilityLocations'
70
- send(field).each do |facility_location|
71
- facility_location['locationPeriod'][:low] = (facility_location['locationPeriod'][:low].to_time + seconds).to_datetime
72
- facility_location['locationPeriod'][:high] = (facility_location['locationPeriod'][:high].to_time + seconds).to_datetime
73
+ if field == 'facilityLocations'
74
+ send(field).each do |facility_location|
75
+ shift_facility_location_dates(facility_location, seconds)
76
+ end
77
+ elsif field == 'facilityLocation'
78
+ facility_location = send(field)
79
+ unless facility_location.nil?
80
+ shift_facility_location_dates(facility_location, seconds)
81
+ send(field + '=', facility_location)
82
+ end
73
83
  end
74
84
  end
75
85
  end
76
86
 
87
+ def shift_facility_location_dates(facility_location, seconds)
88
+ facility_location['locationPeriod'][:low] = (facility_location['locationPeriod'][:low].to_time + seconds).to_datetime
89
+ facility_location['locationPeriod'][:high] = (facility_location['locationPeriod'][:high].to_time + seconds).to_datetime
90
+ end
91
+
77
92
  class << self
78
93
  # Get the object as it was stored in the database, and instantiate
79
94
  # this custom class from it.
@@ -82,7 +97,7 @@ module QDM
82
97
  return nil unless object
83
98
  object = object.symbolize_keys
84
99
  if object.is_a?(Hash)
85
- data_element = QDM::DataElement.new
100
+ data_element = QDM.const_get(object[:_type])
86
101
  data_element.attribute_names.each do |field|
87
102
  data_element.send(field + '=', object[field.to_sym])
88
103
  end
@@ -99,7 +114,7 @@ module QDM
99
114
  when QDM::DataElement then object.mongoize
100
115
  when Hash
101
116
  object = object.symbolize_keys
102
- data_element = QDM::DataElement.new
117
+ data_element = QDM.const_get(object[:_type])
103
118
  data_element.attribute_names.each do |field|
104
119
  data_element.send(field + '=', object[field.to_sym])
105
120
  end
@@ -6,7 +6,7 @@ module QDM
6
6
  # Low and high are required (at minimum).
7
7
  def initialize(low, high, lowClosed = true, highClosed = true)
8
8
  @low = low
9
- @high = high
9
+ @high = high.is_a?(DateTime) && (high.year > 9999) ? high.change(year: 9999) : high
10
10
  @lowClosed = lowClosed
11
11
  @highClosed = highClosed
12
12
  end
@@ -27,6 +27,7 @@ module QDM
27
27
  end
28
28
  if (@high.is_a? DateTime) || (@high.is_a? Time)
29
29
  @high = (@high.utc.to_time + seconds.seconds).to_datetime.new_offset(0)
30
+ @high = @high.year > 9999 ? @high.change(year: 9999) : @high
30
31
  end
31
32
  self
32
33
  end
@@ -6,7 +6,8 @@ module QDM
6
6
  field :relevantPeriod, type: QDM::Interval
7
7
  embeds_many :relatedTo, class_name: 'QDM::Id'
8
8
  field :targetOutcome
9
- field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.7'
9
+ field :qdmTitle, type: String, default: 'Care Goal'
10
+ field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.7'
10
11
  field :qdmCategory, type: String, default: 'care_goal'
11
12
  field :qdmVersion, type: String, default: '5.4'
12
13
  end
@@ -11,6 +11,7 @@ module QDM
11
11
  embeds_many :relatedTo, class_name: 'QDM::Id'
12
12
  field :relevantPeriod, type: QDM::Interval
13
13
  field :negationRationale, type: QDM::Code
14
+ field :qdmTitle, type: String, default: 'Communication, Performed'
14
15
  field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.132'
15
16
  field :qdmCategory, type: String, default: 'communication'
16
17
  field :qdmStatus, type: String, default: 'performed'
@@ -8,7 +8,8 @@ module QDM
8
8
  field :negationRationale, type: QDM::Code
9
9
  field :reason, type: QDM::Code
10
10
  field :anatomicalLocationSite, type: QDM::Code
11
- field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.13'
11
+ field :qdmTitle, type: String, default: 'Device, Applied'
12
+ field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.13'
12
13
  field :qdmCategory, type: String, default: 'device'
13
14
  field :qdmStatus, type: String, default: 'applied'
14
15
  field :qdmVersion, type: String, default: '5.4'
@@ -6,7 +6,8 @@ module QDM
6
6
  field :authorDatetime, type: DateTime
7
7
  field :negationRationale, type: QDM::Code
8
8
  field :reason, type: QDM::Code
9
- field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.15'
9
+ field :qdmTitle, type: String, default: 'Device, Order'
10
+ field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.15'
10
11
  field :qdmCategory, type: String, default: 'device'
11
12
  field :qdmStatus, type: String, default: 'order'
12
13
  field :qdmVersion, type: String, default: '5.4'
@@ -6,7 +6,8 @@ module QDM
6
6
  field :authorDatetime, type: DateTime
7
7
  field :negationRationale, type: QDM::Code
8
8
  field :reason, type: QDM::Code
9
- field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.16'
9
+ field :qdmTitle, type: String, default: 'Device, Recommended'
10
+ field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.16'
10
11
  field :qdmCategory, type: String, default: 'device'
11
12
  field :qdmStatus, type: String, default: 'recommended'
12
13
  field :qdmVersion, type: String, default: '5.4'
@@ -7,7 +7,8 @@ module QDM
7
7
  field :prevalencePeriod, type: QDM::Interval
8
8
  field :anatomicalLocationSite, type: QDM::Code
9
9
  field :severity, type: QDM::Code
10
- field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.110'
10
+ field :qdmTitle, type: String, default: 'Diagnosis'
11
+ field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.110'
11
12
  field :qrdaOid, type: String, default: '2.16.840.1.113883.10.20.24.3.135'
12
13
  field :qdmCategory, type: String, default: 'condition'
13
14
  field :qdmVersion, type: String, default: '5.4'
@@ -6,7 +6,8 @@ module QDM
6
6
  field :authorDatetime, type: DateTime
7
7
  field :reason, type: QDM::Code
8
8
  field :negationRationale, type: QDM::Code
9
- field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.22'
9
+ field :qdmTitle, type: String, default: 'Diagnostic Study, Order'
10
+ field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.22'
10
11
  field :qdmCategory, type: String, default: 'diagnostic_study'
11
12
  field :qdmStatus, type: String, default: 'order'
12
13
  field :qdmVersion, type: String, default: '5.4'
@@ -10,10 +10,11 @@ module QDM
10
10
  field :resultDatetime, type: DateTime
11
11
  field :status, type: QDM::Code
12
12
  field :method, type: QDM::Code
13
- field :facilityLocation, type: QDM::Code
13
+ field :facilityLocation, type: QDM::FacilityLocation
14
14
  field :negationRationale, type: QDM::Code
15
15
  field :components, type: Array
16
- field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.23'
16
+ field :qdmTitle, type: String, default: 'Diagnostic Study, Performed'
17
+ field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.23'
17
18
  field :qdmCategory, type: String, default: 'diagnostic_study'
18
19
  field :qdmStatus, type: String, default: 'performed'
19
20
  field :qdmVersion, type: String, default: '5.4'
@@ -5,7 +5,8 @@ module QDM
5
5
  embedded_in :patient
6
6
  field :authorDatetime, type: DateTime
7
7
  field :negationRationale, type: QDM::Code
8
- field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.24'
8
+ field :qdmTitle, type: String, default: 'Diagnostic Study, Recommended'
9
+ field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.24'
9
10
  field :qrdaOid, type: String, default: '2.16.840.1.113883.10.20.24.3.19'
10
11
  field :qdmCategory, type: String, default: 'diagnostic_study'
11
12
  field :qdmStatus, type: String, default: 'recommended'