cqm-models 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.eslintignore +1 -0
- data/.eslintrc.json +26 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +32 -0
- data/.gitignore +21 -0
- data/.rspec +2 -0
- data/.rubocop.yml +42 -0
- data/.travis.yml +21 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +201 -0
- data/README.md +26 -0
- data/Rakefile +12 -0
- data/app/assets/javascripts/AdverseEvent.js +27 -0
- data/app/assets/javascripts/AllDataElements.js +120 -0
- data/app/assets/javascripts/AllergyIntolerance.js +27 -0
- data/app/assets/javascripts/AssessmentPerformed.js +30 -0
- data/app/assets/javascripts/AssessmentRecommended.js +27 -0
- data/app/assets/javascripts/CareGoal.js +25 -0
- data/app/assets/javascripts/CommunicationFromPatientToProvider.js +26 -0
- data/app/assets/javascripts/CommunicationFromProviderToPatient.js +26 -0
- data/app/assets/javascripts/CommunicationFromProviderToProvider.js +26 -0
- data/app/assets/javascripts/Component.js +22 -0
- data/app/assets/javascripts/Concept.js +14 -0
- data/app/assets/javascripts/DeviceApplied.js +29 -0
- data/app/assets/javascripts/DeviceOrder.js +26 -0
- data/app/assets/javascripts/DeviceRecommended.js +26 -0
- data/app/assets/javascripts/Diagnosis.js +27 -0
- data/app/assets/javascripts/DiagnosticStudyOrder.js +27 -0
- data/app/assets/javascripts/DiagnosticStudyPerformed.js +33 -0
- data/app/assets/javascripts/DiagnosticStudyRecommended.js +27 -0
- data/app/assets/javascripts/EncounterOrder.js +27 -0
- data/app/assets/javascripts/EncounterPerformed.js +32 -0
- data/app/assets/javascripts/EncounterRecommended.js +27 -0
- data/app/assets/javascripts/FacilityLocation.js +22 -0
- data/app/assets/javascripts/FamilyHistory.js +25 -0
- data/app/assets/javascripts/Id.js +22 -0
- data/app/assets/javascripts/ImmunizationAdministered.js +30 -0
- data/app/assets/javascripts/ImmunizationOrder.js +30 -0
- data/app/assets/javascripts/InterventionOrder.js +26 -0
- data/app/assets/javascripts/InterventionPerformed.js +29 -0
- data/app/assets/javascripts/InterventionRecommended.js +26 -0
- data/app/assets/javascripts/LaboratoryTestOrder.js +27 -0
- data/app/assets/javascripts/LaboratoryTestPerformed.js +33 -0
- data/app/assets/javascripts/LaboratoryTestRecommended.js +27 -0
- data/app/assets/javascripts/Measure.js +76 -0
- data/app/assets/javascripts/MeasurePackage.js +20 -0
- data/app/assets/javascripts/MedicationActive.js +28 -0
- data/app/assets/javascripts/MedicationAdministered.js +31 -0
- data/app/assets/javascripts/MedicationDischarge.js +30 -0
- data/app/assets/javascripts/MedicationDispensed.js +31 -0
- data/app/assets/javascripts/MedicationOrder.js +34 -0
- data/app/assets/javascripts/Participation.js +21 -0
- data/app/assets/javascripts/Patient.js +248 -0
- data/app/assets/javascripts/PatientCareExperience.js +23 -0
- data/app/assets/javascripts/PatientCharacteristic.js +23 -0
- data/app/assets/javascripts/PatientCharacteristicBirthdate.js +24 -0
- data/app/assets/javascripts/PatientCharacteristicClinicalTrialParticipant.js +26 -0
- data/app/assets/javascripts/PatientCharacteristicEthnicity.js +23 -0
- data/app/assets/javascripts/PatientCharacteristicExpired.js +25 -0
- data/app/assets/javascripts/PatientCharacteristicPayer.js +24 -0
- data/app/assets/javascripts/PatientCharacteristicRace.js +23 -0
- data/app/assets/javascripts/PatientCharacteristicSex.js +23 -0
- data/app/assets/javascripts/PhysicalExamOrder.js +28 -0
- data/app/assets/javascripts/PhysicalExamPerformed.js +31 -0
- data/app/assets/javascripts/PhysicalExamRecommended.js +28 -0
- data/app/assets/javascripts/ProcedureOrder.js +30 -0
- data/app/assets/javascripts/ProcedurePerformed.js +35 -0
- data/app/assets/javascripts/ProcedureRecommended.js +30 -0
- data/app/assets/javascripts/ProviderCareExperience.js +23 -0
- data/app/assets/javascripts/ProviderCharacteristic.js +23 -0
- data/app/assets/javascripts/Ratio.js +22 -0
- data/app/assets/javascripts/Result.js +28 -0
- data/app/assets/javascripts/ResultComponent.js +21 -0
- data/app/assets/javascripts/SubstanceAdministered.js +30 -0
- data/app/assets/javascripts/SubstanceOrder.js +32 -0
- data/app/assets/javascripts/SubstanceRecommended.js +32 -0
- data/app/assets/javascripts/Symptom.js +25 -0
- data/app/assets/javascripts/ValueSet.js +30 -0
- data/app/assets/javascripts/basetypes/Code.js +25 -0
- data/app/assets/javascripts/basetypes/DataElement.js +36 -0
- data/app/assets/javascripts/basetypes/DateTime.js +18 -0
- data/app/assets/javascripts/basetypes/Interval.js +35 -0
- data/app/assets/javascripts/basetypes/Quantity.js +20 -0
- data/app/assets/javascripts/index.js +12 -0
- data/app/models/models.rb +78 -0
- data/app/models/qdm/adverse_event.rb +15 -0
- data/app/models/qdm/allergy_intolerance.rb +15 -0
- data/app/models/qdm/assessment_performed.rb +18 -0
- data/app/models/qdm/assessment_recommended.rb +15 -0
- data/app/models/qdm/basetypes/code.rb +56 -0
- data/app/models/qdm/basetypes/data_element.rb +42 -0
- data/app/models/qdm/basetypes/interval.rb +54 -0
- data/app/models/qdm/basetypes/quantity.rb +52 -0
- data/app/models/qdm/care_goal.rb +13 -0
- data/app/models/qdm/communication_from_patient_to_provider.rb +14 -0
- data/app/models/qdm/communication_from_provider_to_patient.rb +14 -0
- data/app/models/qdm/communication_from_provider_to_provider.rb +14 -0
- data/app/models/qdm/component.rb +10 -0
- data/app/models/qdm/device_applied.rb +17 -0
- data/app/models/qdm/device_order.rb +14 -0
- data/app/models/qdm/device_recommended.rb +14 -0
- data/app/models/qdm/diagnosis.rb +15 -0
- data/app/models/qdm/diagnostic_study_order.rb +15 -0
- data/app/models/qdm/diagnostic_study_performed.rb +21 -0
- data/app/models/qdm/diagnostic_study_recommended.rb +15 -0
- data/app/models/qdm/encounter_order.rb +15 -0
- data/app/models/qdm/encounter_performed.rb +20 -0
- data/app/models/qdm/encounter_recommended.rb +15 -0
- data/app/models/qdm/facility_location.rb +10 -0
- data/app/models/qdm/family_history.rb +13 -0
- data/app/models/qdm/id.rb +10 -0
- data/app/models/qdm/immunization_administered.rb +18 -0
- data/app/models/qdm/immunization_order.rb +18 -0
- data/app/models/qdm/intervention_order.rb +14 -0
- data/app/models/qdm/intervention_performed.rb +17 -0
- data/app/models/qdm/intervention_recommended.rb +14 -0
- data/app/models/qdm/laboratory_test_order.rb +15 -0
- data/app/models/qdm/laboratory_test_performed.rb +21 -0
- data/app/models/qdm/laboratory_test_recommended.rb +15 -0
- data/app/models/qdm/medication_active.rb +16 -0
- data/app/models/qdm/medication_administered.rb +19 -0
- data/app/models/qdm/medication_discharge.rb +18 -0
- data/app/models/qdm/medication_dispensed.rb +19 -0
- data/app/models/qdm/medication_order.rb +22 -0
- data/app/models/qdm/participation.rb +9 -0
- data/app/models/qdm/patient.rb +201 -0
- data/app/models/qdm/patient_care_experience.rb +11 -0
- data/app/models/qdm/patient_characteristic.rb +11 -0
- data/app/models/qdm/patient_characteristic_birthdate.rb +12 -0
- data/app/models/qdm/patient_characteristic_clinical_trial_participant.rb +14 -0
- data/app/models/qdm/patient_characteristic_ethnicity.rb +11 -0
- data/app/models/qdm/patient_characteristic_expired.rb +13 -0
- data/app/models/qdm/patient_characteristic_payer.rb +12 -0
- data/app/models/qdm/patient_characteristic_race.rb +11 -0
- data/app/models/qdm/patient_characteristic_sex.rb +11 -0
- data/app/models/qdm/physical_exam_order.rb +16 -0
- data/app/models/qdm/physical_exam_performed.rb +19 -0
- data/app/models/qdm/physical_exam_recommended.rb +16 -0
- data/app/models/qdm/procedure_order.rb +18 -0
- data/app/models/qdm/procedure_performed.rb +23 -0
- data/app/models/qdm/procedure_recommended.rb +18 -0
- data/app/models/qdm/provider_care_experience.rb +11 -0
- data/app/models/qdm/provider_characteristic.rb +11 -0
- data/app/models/qdm/ratio.rb +10 -0
- data/app/models/qdm/result_component.rb +9 -0
- data/app/models/qdm/substance_administered.rb +18 -0
- data/app/models/qdm/substance_order.rb +20 -0
- data/app/models/qdm/substance_recommended.rb +20 -0
- data/app/models/qdm/symptom.rb +13 -0
- data/app/models/qdm/tacoma/concept.rb +14 -0
- data/app/models/qdm/tacoma/measure.rb +172 -0
- data/app/models/qdm/tacoma/measure_package.rb +10 -0
- data/app/models/qdm/tacoma/valueset.rb +68 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/bin/validate_dist.sh +17 -0
- data/config/mongoid.yml +6 -0
- data/cqm-models.gemspec +29 -0
- data/data/oids.json +584 -0
- data/dist/index.js +157647 -0
- data/lib/cqm/models.rb +1 -0
- data/lib/generate_models.rb +330 -0
- data/modelinfo/qdm-modelinfo-4.2.xml +515 -0
- data/modelinfo/qdm-modelinfo-4.3.xml +521 -0
- data/modelinfo/qdm-modelinfo-5.0.1.xml +436 -0
- data/modelinfo/qdm-modelinfo-5.0.2.xml +445 -0
- data/modelinfo/qdm-modelinfo-5.0.xml +429 -0
- data/modelinfo/qdm-modelinfo-5.3.xml +524 -0
- data/package.json +34 -0
- data/templates/all_data_elements_template.js.erb +4 -0
- data/templates/index_template.js.erb +12 -0
- data/templates/models_template.rb.erb +21 -0
- data/templates/mongoose_template.js.erb +20 -0
- data/templates/patient_extension.rb.erb +194 -0
- data/templates/patient_template.js.erb +247 -0
- data/tmp/.keep +0 -0
- data/yarn.lock +1901 -0
- metadata +320 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
const mongoose = require('mongoose');
|
2
|
+
|
3
|
+
function Code(key, options) {
|
4
|
+
mongoose.SchemaType.call(this, key, options, 'Code');
|
5
|
+
}
|
6
|
+
Code.prototype = Object.create(mongoose.SchemaType.prototype);
|
7
|
+
|
8
|
+
Code.prototype.cast = (code) => {
|
9
|
+
if (typeof code.code === 'undefined') {
|
10
|
+
throw new Error(`Code: ${code} does not have a code`);
|
11
|
+
} else if (typeof code.codeSystem === 'undefined') {
|
12
|
+
throw new Error(`Code: ${code} does not have a codeSystem`);
|
13
|
+
}
|
14
|
+
|
15
|
+
const val = { code: code.code, codeSystem: code.codeSystem };
|
16
|
+
|
17
|
+
val.descriptor = (typeof code.descriptor !== 'undefined') ? code.descriptor : null;
|
18
|
+
val.codeSystemOid = (typeof code.codeSystemOid !== 'undefined') ? code.codeSystemOid : null;
|
19
|
+
val.version = (typeof code.version !== 'undefined') ? code.version : null;
|
20
|
+
|
21
|
+
return val;
|
22
|
+
};
|
23
|
+
|
24
|
+
mongoose.Schema.Types.Code = Code;
|
25
|
+
module.exports = Code;
|
@@ -0,0 +1,36 @@
|
|
1
|
+
const mongoose = require('mongoose');
|
2
|
+
const Code = require('./Code.js');
|
3
|
+
|
4
|
+
const [Schema] = [mongoose.Schema];
|
5
|
+
|
6
|
+
function DataElementSchema(add, options) {
|
7
|
+
const extended = new Schema({
|
8
|
+
dataElementCodes: { type: [Code] },
|
9
|
+
description: { type: String },
|
10
|
+
}, options);
|
11
|
+
|
12
|
+
if (add) {
|
13
|
+
extended.add(add);
|
14
|
+
}
|
15
|
+
|
16
|
+
// Returns all of the codes on this data element
|
17
|
+
// in a format usable by the cql-execution framework
|
18
|
+
extended.methods.getCode = function getCode() {
|
19
|
+
return this.dataElementCodes.map((code) => {
|
20
|
+
const result = {};
|
21
|
+
result.code = code.code;
|
22
|
+
result.system = code.code_system;
|
23
|
+
return result;
|
24
|
+
});
|
25
|
+
};
|
26
|
+
|
27
|
+
// Returns all of the codes on this data element
|
28
|
+
// in their normal form.
|
29
|
+
extended.methods.codes = function getCodes() {
|
30
|
+
return this.dataElementCodes;
|
31
|
+
};
|
32
|
+
|
33
|
+
return extended;
|
34
|
+
}
|
35
|
+
|
36
|
+
module.exports.DataElementSchema = DataElementSchema;
|
@@ -0,0 +1,18 @@
|
|
1
|
+
const mongoose = require('mongoose');
|
2
|
+
const cql = require('cql-execution');
|
3
|
+
|
4
|
+
function DateTime(key, options) {
|
5
|
+
mongoose.SchemaType.call(this, key, options, 'DateTime');
|
6
|
+
}
|
7
|
+
DateTime.prototype = Object.create(mongoose.SchemaType.prototype);
|
8
|
+
|
9
|
+
DateTime.prototype.cast = (dateTime) => {
|
10
|
+
if (!Date.parse(dateTime)) {
|
11
|
+
throw new Error(`DateTime: ${dateTime} is not a valid DateTime`);
|
12
|
+
}
|
13
|
+
|
14
|
+
return cql.DateTime.fromDate(new Date(dateTime), 0);
|
15
|
+
};
|
16
|
+
|
17
|
+
mongoose.Schema.Types.DateTime = DateTime;
|
18
|
+
module.exports = DateTime;
|
@@ -0,0 +1,35 @@
|
|
1
|
+
const mongoose = require('mongoose');
|
2
|
+
const cql = require('cql-execution');
|
3
|
+
|
4
|
+
function Interval(key, options) {
|
5
|
+
mongoose.SchemaType.call(this, key, options, 'Interval');
|
6
|
+
}
|
7
|
+
Interval.prototype = Object.create(mongoose.SchemaType.prototype);
|
8
|
+
|
9
|
+
Interval.prototype.cast = (interval) => {
|
10
|
+
if (typeof interval.low === 'undefined' || interval.low === null) {
|
11
|
+
throw new Error(`Interval: ${interval} does not have a low value`);
|
12
|
+
}
|
13
|
+
const casted = new cql.Interval(interval.low, interval.high, interval.lowClosed, interval.highClosed);
|
14
|
+
|
15
|
+
// Cast Low and High values to Quantities if it is a quantity
|
16
|
+
if (casted.low && casted.low.unit && casted.low.value) {
|
17
|
+
casted.low = new cql.Quantity(casted.low);
|
18
|
+
if (casted.high && casted.high.unit && casted.high.value) {
|
19
|
+
casted.high = new cql.Quantity(casted.high);
|
20
|
+
}
|
21
|
+
return casted;
|
22
|
+
}
|
23
|
+
|
24
|
+
// Cast to DateTime if it is a string representing a DateTime
|
25
|
+
if (casted.low && Date.parse(casted.low)) {
|
26
|
+
casted.low = cql.DateTime.fromDate(new Date(casted.low), 0);
|
27
|
+
}
|
28
|
+
if (casted.high && Date.parse(casted.high)) {
|
29
|
+
casted.high = cql.DateTime.fromDate(new Date(casted.high), 0);
|
30
|
+
}
|
31
|
+
return casted;
|
32
|
+
};
|
33
|
+
|
34
|
+
mongoose.Schema.Types.Interval = Interval;
|
35
|
+
module.exports = Interval;
|
@@ -0,0 +1,20 @@
|
|
1
|
+
const mongoose = require('mongoose');
|
2
|
+
const cql = require('cql-execution');
|
3
|
+
|
4
|
+
function Quantity(key, options) {
|
5
|
+
mongoose.SchemaType.call(this, key, options, 'Quantity');
|
6
|
+
}
|
7
|
+
Quantity.prototype = Object.create(mongoose.SchemaType.prototype);
|
8
|
+
|
9
|
+
Quantity.prototype.cast = (quantity) => {
|
10
|
+
if (typeof quantity.value === 'undefined') {
|
11
|
+
throw new Error(`Quantity: ${quantity} does not have a value`);
|
12
|
+
} else if (typeof quantity.unit === 'undefined') {
|
13
|
+
throw new Error(`Quantity: ${quantity} does not have a unit`);
|
14
|
+
}
|
15
|
+
|
16
|
+
return new cql.Quantity(quantity);
|
17
|
+
};
|
18
|
+
|
19
|
+
mongoose.Schema.Types.Quantity = Quantity;
|
20
|
+
module.exports = Quantity;
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module.exports = require('./AllDataElements.js');
|
2
|
+
module.exports.CQL = require('cql-execution');
|
3
|
+
module.exports.Result = require('./Result.js').Result;
|
4
|
+
module.exports.ResultSchema = require('./Result.js').ResultSchema;
|
5
|
+
module.exports.Measure = require('./Measure.js').Measure;
|
6
|
+
module.exports.MeasureSchema = require('./Measure.js').MeasureSchema;
|
7
|
+
module.exports.MeasurePackage = require('./MeasurePackage.js').MeasurePackage;
|
8
|
+
module.exports.MeasurePackageSchema = require('./MeasurePackage.js').MeasurePackageSchema;
|
9
|
+
module.exports.ValueSet = require('./ValueSet.js').ValueSet;
|
10
|
+
module.exports.ValueSetSchema = require('./ValueSet.js').ValueSetSchema;
|
11
|
+
module.exports.Concept = require('./Concept.js').Concept;
|
12
|
+
module.exports.ConceptSchema = require('./Concept.js').ConceptSchema;
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# Base QDM module (generated from lib/generate_models.rb) for QDM 5.3
|
2
|
+
module QDM
|
3
|
+
end
|
4
|
+
require 'mongoid'
|
5
|
+
|
6
|
+
# base types
|
7
|
+
require_relative 'qdm/basetypes/code'
|
8
|
+
require_relative 'qdm/basetypes/interval'
|
9
|
+
require_relative 'qdm/basetypes/quantity'
|
10
|
+
require_relative 'qdm/basetypes/data_element'
|
11
|
+
|
12
|
+
# Tacoma-specific models
|
13
|
+
require_relative 'qdm/tacoma/measure'
|
14
|
+
require_relative 'qdm/tacoma/measure_package'
|
15
|
+
require_relative 'qdm/tacoma/valueset'
|
16
|
+
require_relative 'qdm/tacoma/concept'
|
17
|
+
|
18
|
+
# Generated models
|
19
|
+
require_relative 'qdm/patient'
|
20
|
+
require_relative 'qdm/id'
|
21
|
+
require_relative 'qdm/ratio'
|
22
|
+
require_relative 'qdm/physical_exam_order'
|
23
|
+
require_relative 'qdm/participation'
|
24
|
+
require_relative 'qdm/patient_characteristic_sex'
|
25
|
+
require_relative 'qdm/care_goal'
|
26
|
+
require_relative 'qdm/patient_characteristic'
|
27
|
+
require_relative 'qdm/patient_characteristic_ethnicity'
|
28
|
+
require_relative 'qdm/patient_characteristic_race'
|
29
|
+
require_relative 'qdm/laboratory_test_performed'
|
30
|
+
require_relative 'qdm/symptom'
|
31
|
+
require_relative 'qdm/medication_administered'
|
32
|
+
require_relative 'qdm/procedure_recommended'
|
33
|
+
require_relative 'qdm/encounter_performed'
|
34
|
+
require_relative 'qdm/diagnosis'
|
35
|
+
require_relative 'qdm/communication_from_provider_to_patient'
|
36
|
+
require_relative 'qdm/assessment_performed'
|
37
|
+
require_relative 'qdm/patient_characteristic_clinical_trial_participant'
|
38
|
+
require_relative 'qdm/device_order'
|
39
|
+
require_relative 'qdm/diagnostic_study_performed'
|
40
|
+
require_relative 'qdm/intervention_order'
|
41
|
+
require_relative 'qdm/family_history'
|
42
|
+
require_relative 'qdm/component'
|
43
|
+
require_relative 'qdm/result_component'
|
44
|
+
require_relative 'qdm/facility_location'
|
45
|
+
require_relative 'qdm/communication_from_provider_to_provider'
|
46
|
+
require_relative 'qdm/medication_active'
|
47
|
+
require_relative 'qdm/laboratory_test_order'
|
48
|
+
require_relative 'qdm/diagnostic_study_order'
|
49
|
+
require_relative 'qdm/substance_order'
|
50
|
+
require_relative 'qdm/patient_characteristic_payer'
|
51
|
+
require_relative 'qdm/patient_characteristic_expired'
|
52
|
+
require_relative 'qdm/assessment_recommended'
|
53
|
+
require_relative 'qdm/immunization_administered'
|
54
|
+
require_relative 'qdm/substance_administered'
|
55
|
+
require_relative 'qdm/encounter_order'
|
56
|
+
require_relative 'qdm/encounter_recommended'
|
57
|
+
require_relative 'qdm/procedure_performed'
|
58
|
+
require_relative 'qdm/allergy_intolerance'
|
59
|
+
require_relative 'qdm/provider_characteristic'
|
60
|
+
require_relative 'qdm/physical_exam_recommended'
|
61
|
+
require_relative 'qdm/patient_characteristic_birthdate'
|
62
|
+
require_relative 'qdm/adverse_event'
|
63
|
+
require_relative 'qdm/communication_from_patient_to_provider'
|
64
|
+
require_relative 'qdm/device_recommended'
|
65
|
+
require_relative 'qdm/device_applied'
|
66
|
+
require_relative 'qdm/medication_discharge'
|
67
|
+
require_relative 'qdm/intervention_performed'
|
68
|
+
require_relative 'qdm/laboratory_test_recommended'
|
69
|
+
require_relative 'qdm/medication_dispensed'
|
70
|
+
require_relative 'qdm/diagnostic_study_recommended'
|
71
|
+
require_relative 'qdm/immunization_order'
|
72
|
+
require_relative 'qdm/patient_care_experience'
|
73
|
+
require_relative 'qdm/provider_care_experience'
|
74
|
+
require_relative 'qdm/procedure_order'
|
75
|
+
require_relative 'qdm/medication_order'
|
76
|
+
require_relative 'qdm/substance_recommended'
|
77
|
+
require_relative 'qdm/intervention_recommended'
|
78
|
+
require_relative 'qdm/physical_exam_performed'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module QDM
|
2
|
+
# app/models/qdm/adverse_event.rb
|
3
|
+
class AdverseEvent < DataElement
|
4
|
+
include Mongoid::Document
|
5
|
+
embedded_in :patient
|
6
|
+
field :authorDatetime, type: DateTime
|
7
|
+
field :relevantPeriod, type: QDM::Interval
|
8
|
+
field :severity, type: QDM::Code
|
9
|
+
field :facilityLocation, type: QDM::Code
|
10
|
+
field :type, type: QDM::Code
|
11
|
+
field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.120'
|
12
|
+
field :category, type: String, default: 'adverse_event'
|
13
|
+
field :qdmVersion, type: String, default: '5.3'
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module QDM
|
2
|
+
# app/models/qdm/allergy_intolerance.rb
|
3
|
+
class AllergyIntolerance < DataElement
|
4
|
+
include Mongoid::Document
|
5
|
+
embedded_in :patient
|
6
|
+
field :authorDatetime, type: DateTime
|
7
|
+
field :prevalencePeriod, type: QDM::Interval
|
8
|
+
field :type, type: QDM::Code
|
9
|
+
field :severity, type: QDM::Code
|
10
|
+
field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.119'
|
11
|
+
field :category, type: String, default: 'allergy'
|
12
|
+
field :qdmStatus, type: String, default: 'intolerance'
|
13
|
+
field :qdmVersion, type: String, default: '5.3'
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module QDM
|
2
|
+
# app/models/qdm/assessment_performed.rb
|
3
|
+
class AssessmentPerformed < DataElement
|
4
|
+
include Mongoid::Document
|
5
|
+
embedded_in :patient
|
6
|
+
field :authorDatetime, type: DateTime
|
7
|
+
field :negationRationale, type: QDM::Code
|
8
|
+
field :reason, type: QDM::Code
|
9
|
+
field :method, type: QDM::Code
|
10
|
+
field :result
|
11
|
+
field :components, type: Array
|
12
|
+
field :relatedTo, type: Array
|
13
|
+
field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.117'
|
14
|
+
field :category, type: String, default: 'assessment'
|
15
|
+
field :qdmStatus, type: String, default: 'performed'
|
16
|
+
field :qdmVersion, type: String, default: '5.3'
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module QDM
|
2
|
+
# app/models/qdm/assessment_recommended.rb
|
3
|
+
class AssessmentRecommended < DataElement
|
4
|
+
include Mongoid::Document
|
5
|
+
embedded_in :patient
|
6
|
+
field :authorDatetime, type: DateTime
|
7
|
+
field :negationRationale, type: QDM::Code
|
8
|
+
field :reason, type: QDM::Code
|
9
|
+
field :method, type: QDM::Code
|
10
|
+
field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.118'
|
11
|
+
field :category, type: String, default: 'assessment'
|
12
|
+
field :qdmStatus, type: String, default: 'recommended'
|
13
|
+
field :qdmVersion, type: String, default: '5.3'
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module QDM
|
2
|
+
# Represents a Code
|
3
|
+
class Code
|
4
|
+
attr_reader :code, :codeSystem, :descriptor, :codeSystemOid, :version
|
5
|
+
|
6
|
+
# Code and code system are required (at minimum).
|
7
|
+
def initialize(code, codeSystem, descriptor = nil, codeSystemOid = nil, version = nil)
|
8
|
+
@code = code
|
9
|
+
@codeSystem = codeSystem
|
10
|
+
@descriptor = descriptor
|
11
|
+
@codeSystemOid = codeSystemOid
|
12
|
+
@version = version
|
13
|
+
end
|
14
|
+
|
15
|
+
# Converts an object of this instance into a database friendly value.
|
16
|
+
def mongoize
|
17
|
+
{ code: @code, codeSystem: @codeSystem, descriptor: @descriptor, codeSystemOid: @codeSystemOid, version: @version }
|
18
|
+
end
|
19
|
+
|
20
|
+
class << self
|
21
|
+
# Get the object as it was stored in the database, and instantiate
|
22
|
+
# this custom class from it.
|
23
|
+
#
|
24
|
+
# The array elements in demongoize are the same 5 elements used in mongoize, i.e.
|
25
|
+
# [ code, codeSystem, descriptor, codeSystemOid, version ].
|
26
|
+
def demongoize(object)
|
27
|
+
return nil unless object
|
28
|
+
object = object.symbolize_keys
|
29
|
+
QDM::Code.new(object[:code], object[:codeSystem], object[:descriptor], object[:codeSystemOid], object[:version])
|
30
|
+
end
|
31
|
+
|
32
|
+
# Takes any possible object and converts it to how it would be
|
33
|
+
# stored in the database.
|
34
|
+
def mongoize(object)
|
35
|
+
case object
|
36
|
+
when nil then nil
|
37
|
+
when QDM::Code then object.mongoize
|
38
|
+
when Hash
|
39
|
+
object = object.symbolize_keys
|
40
|
+
codeSystem = object[:system] ? object[:system] : object[:codeSystem]
|
41
|
+
QDM::Code.new(object[:code], codeSystem, object[:descriptor], object[:codeSystemOid], object[:version]).mongoize
|
42
|
+
else object
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Converts the object that was supplied to a criteria and converts it
|
47
|
+
# into a database friendly form.
|
48
|
+
def evolve(object)
|
49
|
+
case object
|
50
|
+
when QDM::Code then object.mongoize
|
51
|
+
else object
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module QDM
|
2
|
+
# Represents QDM datatype (parent class of all generated QDM datatype models)
|
3
|
+
class DataElement
|
4
|
+
include Mongoid::Document
|
5
|
+
embedded_in :patient
|
6
|
+
|
7
|
+
# Codes that describe this datatype.
|
8
|
+
field :dataElementCodes, type: Array, default: []
|
9
|
+
|
10
|
+
# Optional description.
|
11
|
+
field :description, type: String
|
12
|
+
|
13
|
+
# Returns the attribute requested on the datatype.
|
14
|
+
def get(attribute)
|
15
|
+
send(attribute) if has_attribute?(attribute)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns all of the codes on this datatype in a way that is typical
|
19
|
+
# to the CQL execution engine.
|
20
|
+
def code_system_pairs
|
21
|
+
codes.collect do |code|
|
22
|
+
{ code: code.code, system: code.codeSystem }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Helper method that returns the codes on this data element as QDM::Code
|
27
|
+
# objects.
|
28
|
+
def codes
|
29
|
+
dataElementCodes.collect { |code| QDM::Code.demongoize(code) }
|
30
|
+
end
|
31
|
+
|
32
|
+
# Return the Mongo id for this datatype.
|
33
|
+
def id
|
34
|
+
_id
|
35
|
+
end
|
36
|
+
|
37
|
+
# Include '_type' in any JSON output. This is necessary for deserialization.
|
38
|
+
def to_json(options = nil)
|
39
|
+
serializable_hash(methods: :_type).to_json(options)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module QDM
|
2
|
+
# Represents an Interval
|
3
|
+
class Interval
|
4
|
+
attr_reader :low, :high
|
5
|
+
|
6
|
+
# Low and high are required (at minimum).
|
7
|
+
def initialize(low, high, lowClosed = true, highClosed = true)
|
8
|
+
@low = low
|
9
|
+
@high = high
|
10
|
+
@lowClosed = lowClosed
|
11
|
+
@highClosed = highClosed
|
12
|
+
end
|
13
|
+
|
14
|
+
# Converts an object of this instance into a database friendly value.
|
15
|
+
def mongoize
|
16
|
+
{ low: @low, high: @high, lowClosed: @lowClosed, highClosed: @highClosed }
|
17
|
+
end
|
18
|
+
|
19
|
+
class << self
|
20
|
+
# Get the object as it was stored in the database, and instantiate
|
21
|
+
# this custom class from it.
|
22
|
+
#
|
23
|
+
# The array elements in demongoize are the same 5 elements used in mongoize, i.e.
|
24
|
+
# [ low, high ].
|
25
|
+
def demongoize(object)
|
26
|
+
return nil unless object
|
27
|
+
object = object.symbolize_keys
|
28
|
+
QDM::Interval.new(object[:low], object[:high], object[:lowClosed], object[:highClosed]) if object.is_a?(Hash)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Takes any possible object and converts it to how it would be
|
32
|
+
# stored in the database.
|
33
|
+
def mongoize(object)
|
34
|
+
case object
|
35
|
+
when nil then nil
|
36
|
+
when QDM::Interval then object.mongoize
|
37
|
+
when Hash
|
38
|
+
object = object.symbolize_keys
|
39
|
+
QDM::Interval.new(object[:low], object[:high], object[:lowClosed], object[:highClosed]).mongoize
|
40
|
+
else object
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Converts the object that was supplied to a criteria and converts it
|
45
|
+
# into a database friendly form.
|
46
|
+
def evolve(object)
|
47
|
+
case object
|
48
|
+
when QDM::Interval then object.mongoize
|
49
|
+
else object
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module QDM
|
2
|
+
# Represents a Quantity
|
3
|
+
class Quantity
|
4
|
+
attr_reader :value, :unit
|
5
|
+
|
6
|
+
# Value and unit are required.
|
7
|
+
def initialize(value, unit)
|
8
|
+
@value = value
|
9
|
+
@unit = unit
|
10
|
+
end
|
11
|
+
|
12
|
+
# Converts an object of this instance into a database friendly value.
|
13
|
+
def mongoize
|
14
|
+
{ value: @value, unit: @unit }
|
15
|
+
end
|
16
|
+
|
17
|
+
class << self
|
18
|
+
# Get the object as it was stored in the database, and instantiate
|
19
|
+
# this custom class from it.
|
20
|
+
#
|
21
|
+
# The array elements in demongoize are the same 5 elements used in mongoize, i.e.
|
22
|
+
# [ value, unit ].
|
23
|
+
def demongoize(object)
|
24
|
+
return nil unless object
|
25
|
+
object = object.symbolize_keys
|
26
|
+
QDM::Quantity.new(object[:value], object[:unit]) if object.is_a?(Hash)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Takes any possible object and converts it to how it would be
|
30
|
+
# stored in the database.
|
31
|
+
def mongoize(object)
|
32
|
+
case object
|
33
|
+
when nil then nil
|
34
|
+
when QDM::Quantity then object.mongoize
|
35
|
+
when Hash
|
36
|
+
object = object.symbolize_keys
|
37
|
+
QDM::Quantity.new(object[:value], object[:unit]).mongoize
|
38
|
+
else object
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Converts the object that was supplied to a criteria and converts it
|
43
|
+
# into a database friendly form.
|
44
|
+
def evolve(object)
|
45
|
+
case object
|
46
|
+
when QDM::Quantity then object.mongoize
|
47
|
+
else object
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module QDM
|
2
|
+
# app/models/qdm/care_goal.rb
|
3
|
+
class CareGoal < DataElement
|
4
|
+
include Mongoid::Document
|
5
|
+
embedded_in :patient
|
6
|
+
field :relevantPeriod, type: QDM::Interval
|
7
|
+
field :relatedTo, type: Array
|
8
|
+
field :targetOutcome
|
9
|
+
field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.7'
|
10
|
+
field :category, type: String, default: 'care_goal'
|
11
|
+
field :qdmVersion, type: String, default: '5.3'
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module QDM
|
2
|
+
# app/models/qdm/communication_from_patient_to_provider.rb
|
3
|
+
class CommunicationFromPatientToProvider < DataElement
|
4
|
+
include Mongoid::Document
|
5
|
+
embedded_in :patient
|
6
|
+
field :authorDatetime, type: DateTime
|
7
|
+
field :relatedTo, type: Array
|
8
|
+
field :negationRationale, type: QDM::Code
|
9
|
+
field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.8'
|
10
|
+
field :category, type: String, default: 'communication'
|
11
|
+
field :qdmStatus, type: String, default: 'from_patient_to_provider'
|
12
|
+
field :qdmVersion, type: String, default: '5.3'
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module QDM
|
2
|
+
# app/models/qdm/communication_from_provider_to_patient.rb
|
3
|
+
class CommunicationFromProviderToPatient < DataElement
|
4
|
+
include Mongoid::Document
|
5
|
+
embedded_in :patient
|
6
|
+
field :authorDatetime, type: DateTime
|
7
|
+
field :relatedTo, type: Array
|
8
|
+
field :negationRationale, type: QDM::Code
|
9
|
+
field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.9'
|
10
|
+
field :category, type: String, default: 'communication'
|
11
|
+
field :qdmStatus, type: String, default: 'from_provider_to_patient'
|
12
|
+
field :qdmVersion, type: String, default: '5.3'
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module QDM
|
2
|
+
# app/models/qdm/communication_from_provider_to_provider.rb
|
3
|
+
class CommunicationFromProviderToProvider < DataElement
|
4
|
+
include Mongoid::Document
|
5
|
+
embedded_in :patient
|
6
|
+
field :authorDatetime, type: DateTime
|
7
|
+
field :relatedTo, type: Array
|
8
|
+
field :negationRationale, type: QDM::Code
|
9
|
+
field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.10'
|
10
|
+
field :category, type: String, default: 'communication'
|
11
|
+
field :qdmStatus, type: String, default: 'from_provider_to_provider'
|
12
|
+
field :qdmVersion, type: String, default: '5.3'
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module QDM
|
2
|
+
# app/models/qdm/device_applied.rb
|
3
|
+
class DeviceApplied < DataElement
|
4
|
+
include Mongoid::Document
|
5
|
+
embedded_in :patient
|
6
|
+
field :authorDatetime, type: DateTime
|
7
|
+
field :relevantPeriod, type: QDM::Interval
|
8
|
+
field :negationRationale, type: QDM::Code
|
9
|
+
field :reason, type: QDM::Code
|
10
|
+
field :anatomicalLocationSite, type: QDM::Code
|
11
|
+
field :anatomicalApproachSite, type: QDM::Code
|
12
|
+
field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.13'
|
13
|
+
field :category, type: String, default: 'device'
|
14
|
+
field :qdmStatus, type: String, default: 'applied'
|
15
|
+
field :qdmVersion, type: String, default: '5.3'
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module QDM
|
2
|
+
# app/models/qdm/device_order.rb
|
3
|
+
class DeviceOrder < DataElement
|
4
|
+
include Mongoid::Document
|
5
|
+
embedded_in :patient
|
6
|
+
field :authorDatetime, type: DateTime
|
7
|
+
field :negationRationale, type: QDM::Code
|
8
|
+
field :reason, type: QDM::Code
|
9
|
+
field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.15'
|
10
|
+
field :category, type: String, default: 'device'
|
11
|
+
field :qdmStatus, type: String, default: 'order'
|
12
|
+
field :qdmVersion, type: String, default: '5.3'
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module QDM
|
2
|
+
# app/models/qdm/device_recommended.rb
|
3
|
+
class DeviceRecommended < DataElement
|
4
|
+
include Mongoid::Document
|
5
|
+
embedded_in :patient
|
6
|
+
field :authorDatetime, type: DateTime
|
7
|
+
field :negationRationale, type: QDM::Code
|
8
|
+
field :reason, type: QDM::Code
|
9
|
+
field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.16'
|
10
|
+
field :category, type: String, default: 'device'
|
11
|
+
field :qdmStatus, type: String, default: 'recommended'
|
12
|
+
field :qdmVersion, type: String, default: '5.3'
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module QDM
|
2
|
+
# app/models/qdm/diagnosis.rb
|
3
|
+
class Diagnosis < DataElement
|
4
|
+
include Mongoid::Document
|
5
|
+
embedded_in :patient
|
6
|
+
field :authorDatetime, type: DateTime
|
7
|
+
field :prevalencePeriod, type: QDM::Interval
|
8
|
+
field :anatomicalLocationSite, type: QDM::Code
|
9
|
+
field :severity, type: QDM::Code
|
10
|
+
field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.110'
|
11
|
+
field :qrdaOid, type: String, default: '2.16.840.1.113883.10.20.24.3.135'
|
12
|
+
field :category, type: String, default: 'condition'
|
13
|
+
field :qdmVersion, type: String, default: '5.3'
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module QDM
|
2
|
+
# app/models/qdm/diagnostic_study_order.rb
|
3
|
+
class DiagnosticStudyOrder < DataElement
|
4
|
+
include Mongoid::Document
|
5
|
+
embedded_in :patient
|
6
|
+
field :authorDatetime, type: DateTime
|
7
|
+
field :reason, type: QDM::Code
|
8
|
+
field :method, type: QDM::Code
|
9
|
+
field :negationRationale, type: QDM::Code
|
10
|
+
field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.3.22'
|
11
|
+
field :category, type: String, default: 'diagnostic_study'
|
12
|
+
field :qdmStatus, type: String, default: 'order'
|
13
|
+
field :qdmVersion, type: String, default: '5.3'
|
14
|
+
end
|
15
|
+
end
|