cqm-models 0.7.2
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.
- 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
|