├── tmp └── .keep ├── .eslintignore ├── .rspec ├── lib ├── cqm │ └── models.rb ├── generator_helpers.rb └── generators │ └── custom_mongo │ ├── model.rb.tt │ └── model_generator.rb ├── app ├── assets │ └── javascripts │ │ ├── browser.js │ │ ├── cqm │ │ ├── Concept.js │ │ ├── ValueSet.js │ │ ├── MeasurePackage.js │ │ ├── ClauseResult.js │ │ ├── CQLStatementDependency.js │ │ ├── CQLLibrary.js │ │ ├── Provider.js │ │ ├── Patient.js │ │ └── StatementResult.js │ │ ├── basetypes │ │ ├── DateTime.js │ │ ├── Ratio.js │ │ ├── Quantity.js │ │ ├── Code.js │ │ ├── QDMDate.js │ │ ├── Interval.js │ │ └── AnyEntity.js │ │ ├── attributes │ │ ├── Identifier.js │ │ ├── Location.js │ │ ├── ResultComponent.js │ │ ├── FacilityLocation.js │ │ ├── DiagnosisComponent.js │ │ ├── PatientEntity.js │ │ ├── CarePartner.js │ │ ├── Organization.js │ │ ├── Practitioner.js │ │ └── Component.js │ │ ├── Result.js │ │ ├── Participation.js │ │ ├── RelatedPerson.js │ │ ├── CareGoal.js │ │ ├── Symptom.js │ │ ├── PatientCharacteristic.js │ │ ├── DeviceOrder.js │ │ ├── PatientCareExperience.js │ │ ├── ProviderCareExperience.js │ │ ├── FamilyHistory.js │ │ ├── AdverseEvent.js │ │ ├── PatientCharacteristicSex.js │ │ ├── AssessmentOrder.js │ │ ├── Diagnosis.js │ │ ├── PatientCharacteristicRace.js │ │ ├── DeviceRecommended.js │ │ ├── InterventionOrder.js │ │ ├── LaboratoryTestOrder.js │ │ ├── PatientCharacteristicPayer.js │ │ ├── AllergyIntolerance.js │ │ ├── EncounterOrder.js │ │ ├── DiagnosticStudyOrder.js │ │ ├── MedicationActive.js │ │ ├── PatientCharacteristicEthnicity.js │ │ ├── PhysicalExamOrder.js │ │ ├── ProcedureOrder.js │ │ ├── AssessmentRecommended.js │ │ ├── InterventionRecommended.js │ │ ├── PatientCharacteristicBirthdate.js │ │ ├── PatientCharacteristicExpired.js │ │ ├── EncounterRecommended.js │ │ ├── ProcedureRecommended.js │ │ ├── LaboratoryTestRecommended.js │ │ ├── ImmunizationOrder.js │ │ ├── PhysicalExamRecommended.js │ │ ├── SubstanceOrder.js │ │ ├── SubstanceRecommended.js │ │ ├── DiagnosticStudyRecommended.js │ │ ├── SubstanceAdministered.js │ │ ├── MedicationDischarge.js │ │ ├── InterventionPerformed.js │ │ ├── MedicationAdministered.js │ │ ├── CommunicationPerformed.js │ │ ├── MedicationOrder.js │ │ ├── AssessmentPerformed.js │ │ ├── ImmunizationAdministered.js │ │ ├── PhysicalExamPerformed.js │ │ ├── MedicationDispensed.js │ │ └── ProcedurePerformed.js └── models │ ├── qdm │ ├── attributes │ │ ├── result_component.rb │ │ ├── component.rb │ │ ├── location.rb │ │ ├── facility_location.rb │ │ ├── patient_entity.rb │ │ ├── diagnosis_component.rb │ │ ├── identifier.rb │ │ ├── care_partner.rb │ │ ├── organization.rb │ │ ├── practitioner.rb │ │ ├── entity.rb │ │ └── attribute.rb │ ├── participation.rb │ ├── patient_characteristic.rb │ ├── related_person.rb │ ├── patient_characteristic_race.rb │ ├── patient_characteristic_sex.rb │ ├── patient_care_experience.rb │ ├── patient_characteristic_ethnicity.rb │ ├── provider_care_experience.rb │ ├── patient_characteristic_payer.rb │ ├── patient_characteristic_birthdate.rb │ ├── care_goal.rb │ ├── symptom.rb │ ├── patient_characteristic_expired.rb │ ├── family_history.rb │ ├── device_order.rb │ ├── assessment_order.rb │ ├── device_recommended.rb │ ├── intervention_order.rb │ ├── laboratory_test_order.rb │ ├── adverse_event.rb │ ├── assessment_recommended.rb │ ├── diagnostic_study_order.rb │ ├── intervention_recommended.rb │ ├── allergy_intolerance.rb │ ├── diagnosis.rb │ ├── laboratory_test_recommended.rb │ ├── physical_exam_order.rb │ ├── encounter_recommended.rb │ ├── medication_active.rb │ ├── diagnostic_study_recommended.rb │ ├── encounter_order.rb │ ├── physical_exam_recommended.rb │ ├── procedure_recommended.rb │ ├── procedure_order.rb │ ├── patient_characteristic_clinical_trial_participant.rb │ ├── immunization_order.rb │ ├── substance_recommended.rb │ ├── substance_administered.rb │ ├── intervention_performed.rb │ ├── substance_order.rb │ ├── immunization_administered.rb │ ├── medication_administered.rb │ ├── communication_performed.rb │ ├── medication_discharge.rb │ ├── assessment_performed.rb │ ├── physical_exam_performed.rb │ ├── encounter_performed.rb │ ├── medication_order.rb │ ├── medication_dispensed.rb │ ├── procedure_performed.rb │ ├── laboratory_test_performed.rb │ ├── basetypes │ │ ├── date.rb │ │ ├── quantity.rb │ │ ├── ratio.rb │ │ └── code.rb │ └── diagnostic_study_performed.rb │ ├── cqm │ ├── measure_package.rb │ ├── valueset.rb │ ├── concept.rb │ ├── clause_result.rb │ ├── patient.rb │ ├── cql_statement_dependency.rb │ ├── cql_library.rb │ └── statement_result.rb │ └── model_finder.rb ├── Gemfile ├── config └── mongoid.yml ├── bin ├── setup ├── build_cql_execution.sh ├── validate_generator.sh ├── console ├── validate_dist.sh └── validate_browser.sh ├── spec ├── support │ └── jasmine.json ├── simplecov_init.rb ├── cqm │ ├── interval_spec.rb │ ├── patient_generator_spec.rb │ ├── encounter_performed_spec.rb │ └── individual_result_spec.rb ├── spec_helper.rb └── javascript │ └── unit │ └── individual_result_spec.js ├── templates ├── entity_extension.rb.erb ├── all_data_elements_template.js.erb ├── identifier_template.js.erb └── identifier_extension.rb.erb ├── Rakefile ├── .gitignore ├── jest.config.js ├── .github ├── workflows │ ├── npm-publish.yml │ └── ci.yml └── PULL_REQUEST_TEMPLATE.md ├── notice.md ├── .rubocop.yml ├── .eslintrc.json ├── cqm-models.gemspec └── package.json /tmp/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /dist/** 2 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --format documentation 2 | --color 3 | -------------------------------------------------------------------------------- /lib/cqm/models.rb: -------------------------------------------------------------------------------- 1 | require_relative '../../app/models/models' 2 | -------------------------------------------------------------------------------- /app/assets/javascripts/browser.js: -------------------------------------------------------------------------------- 1 | window.cqm = window.cqm || {}; 2 | window.cqm.models = require('./index'); 3 | 4 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | git_source(:github) { |repo_name| "https://github.com/#{repo_name}" } 4 | 5 | gemspec 6 | -------------------------------------------------------------------------------- /config/mongoid.yml: -------------------------------------------------------------------------------- 1 | test: 2 | clients: 3 | default: 4 | database: cqm_models_test 5 | hosts: 6 | - localhost:27017 7 | -------------------------------------------------------------------------------- /bin/setup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -euo pipefail 3 | IFS=$'\n\t' 4 | set -vx 5 | 6 | bundle install 7 | 8 | # Do any other automated setup that you need to do here 9 | -------------------------------------------------------------------------------- /spec/support/jasmine.json: -------------------------------------------------------------------------------- 1 | { 2 | "spec_dir": "spec", 3 | 4 | "spec_files": [ 5 | "javascript/**/*[sS]pec.js" 6 | ], 7 | 8 | "helpers": [ 9 | "javascript/helpers/**/*.js" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /templates/entity_extension.rb.erb: -------------------------------------------------------------------------------- 1 | def initialize(options = {}) 2 | super(options) 3 | # default id to the mongo ObjectId for this DataElement if it isnt already defined 4 | self.id = _id.to_s unless id? 5 | end 6 | end -------------------------------------------------------------------------------- /spec/simplecov_init.rb: -------------------------------------------------------------------------------- 1 | require 'simplecov' 2 | 3 | SimpleCov.start do 4 | add_filter 'spec/' 5 | end 6 | 7 | if ENV['CODECOV_TOKEN'] 8 | require 'codecov' 9 | SimpleCov.formatter = SimpleCov::Formatter::Codecov 10 | end 11 | -------------------------------------------------------------------------------- /app/models/qdm/attributes/result_component.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/result_component.rb 3 | class ResultComponent < Component 4 | include Mongoid::Document 5 | field :referenceRange, type: QDM::Interval 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /templates/all_data_elements_template.js.erb: -------------------------------------------------------------------------------- 1 | <%- datatypes.each do |datatype, _| -%> 2 | module.exports.<%= datatype %> = require('./<%= datatype %>.js').<%= datatype %>; 3 | module.exports.<%= datatype %>Schema = require('./<%= datatype %>.js').<%= datatype %>Schema; 4 | <%- end -%> -------------------------------------------------------------------------------- /app/models/qdm/attributes/component.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/component.rb 3 | class Component < Attribute 4 | include Mongoid::Document 5 | field :code, type: QDM::Code 6 | field :result 7 | field :qdmVersion, type: String, default: '5.6' 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'bundler/gem_tasks' 2 | require 'rspec/core/rake_task' 3 | 4 | RSpec::Core::RakeTask.new(:spec) 5 | 6 | begin 7 | require 'bundler/setup' 8 | rescue LoadError 9 | puts 'You must `gem install bundler` and `bundle install` to run rake tasks' 10 | end 11 | 12 | task default: :spec 13 | -------------------------------------------------------------------------------- /bin/build_cql_execution.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # If cql-execution/lib does not exist, build it from src. 4 | # This is needed if pointing to a cql-execution branch, as only the coffeescript 5 | # is included in the ./node_modules directory. 6 | if [ ! -d "./node_modules/cql-execution/lib" ]; then 7 | yarn build-cql 8 | fi 9 | -------------------------------------------------------------------------------- /app/models/qdm/attributes/location.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/location.rb 3 | class Location < Entity 4 | include Mongoid::Document 5 | embedded_in :data_element 6 | field :locationType, type: QDM::Code 7 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.142' 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/models/qdm/attributes/facility_location.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/facility_location.rb 3 | class FacilityLocation < Attribute 4 | include Mongoid::Document 5 | field :code, type: QDM::Code 6 | field :locationPeriod, type: QDM::Interval 7 | field :qdmVersion, type: String, default: '5.6' 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.bundle/ 2 | /.yardoc 3 | /.nyc_output 4 | /Gemfile.lock 5 | /_yardoc/ 6 | /coverage/ 7 | /doc/ 8 | /pkg/ 9 | /spec/reports/ 10 | node_modules/ 11 | tmp/ 12 | 13 | # yarn error tracking 14 | yarn-error.log 15 | 16 | # rspec failure tracking 17 | .rspec_status 18 | .DS_Store 19 | .byebug_history 20 | 21 | # Editor-specific files 22 | .vscode/ 23 | .idea/ 24 | -------------------------------------------------------------------------------- /app/models/qdm/attributes/patient_entity.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/patient_entity.rb 3 | class PatientEntity < Entity 4 | include Mongoid::Document 5 | embedded_in :data_element 6 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.136' 7 | field :qrdaOid, type: String, default: '2.16.840.1.113883.10.20.24.3.161' 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/models/cqm/measure_package.rb: -------------------------------------------------------------------------------- 1 | module CQM 2 | # MeasurePackage stores the uploaded file for a given Measure, so it can be recreated if need be 3 | class MeasurePackage 4 | include Mongoid::Document 5 | include Mongoid::Timestamps 6 | 7 | field :file, type: BSON::Binary 8 | belongs_to :measure, class_name: 'CQM::Measure', inverse_of: :package 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /app/models/qdm/attributes/diagnosis_component.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/diagnosis_component.rb 3 | class DiagnosisComponent < Attribute 4 | include Mongoid::Document 5 | field :code, type: QDM::Code 6 | field :presentOnAdmissionIndicator, type: QDM::Code 7 | field :rank, type: Integer 8 | field :qdmVersion, type: String, default: '5.6' 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /bin/validate_generator.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | yes | ruby lib/generate_models.rb modelinfo/qdm-modelinfo-5.6.xml data/oids_qdm_5.6.json 4 | 5 | if git diff --quiet HEAD --; then 6 | echo "Generator script produces no differences." 7 | exit 0 8 | else 9 | echo "Differences found when running generator script! Make sure there are no 10 | unstaged or untracked files." 11 | exit 1 12 | fi 13 | -------------------------------------------------------------------------------- /bin/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require "bundler/setup" 4 | require "cqm/models" 5 | 6 | # You can add fixtures and/or initialization code here to make experimenting 7 | # with your gem easier. You can also use a different console, if you like. 8 | 9 | # (If you use this, don't forget to add pry to your Gemfile!) 10 | # require "pry" 11 | # Pry.start 12 | 13 | require "irb" 14 | IRB.start(__FILE__) 15 | -------------------------------------------------------------------------------- /app/models/qdm/attributes/identifier.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/identifier.rb 3 | class Identifier < Attribute 4 | include Mongoid::Document 5 | field :namingSystem, type: String 6 | field :value, type: String 7 | field :qdmVersion, type: String, default: '5.6' 8 | 9 | validates_uniqueness_of :value, conditions: -> { where(namingSystem: CQM::Provider::NPI_OID) } 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /app/models/qdm/attributes/care_partner.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/care_partner.rb 3 | class CarePartner < Entity 4 | include Mongoid::Document 5 | embedded_in :data_element 6 | field :relationship, type: QDM::Code 7 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.134' 8 | field :qrdaOid, type: String, default: '2.16.840.1.113883.10.20.24.3.160' 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /app/models/qdm/attributes/organization.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/organization.rb 3 | class Organization < Entity 4 | include Mongoid::Document 5 | embedded_in :data_element 6 | field :organizationType, type: QDM::Code 7 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.135' 8 | field :qrdaOid, type: String, default: '2.16.840.1.113883.10.20.24.3.163' 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /app/models/model_finder.rb: -------------------------------------------------------------------------------- 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 | 10 | return QDM.const_get(datatype) 11 | end 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/models/cqm/valueset.rb: -------------------------------------------------------------------------------- 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 16 | -------------------------------------------------------------------------------- /app/models/qdm/attributes/practitioner.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/practitioner.rb 3 | class Practitioner < Entity 4 | include Mongoid::Document 5 | embedded_in :data_element 6 | field :role, type: QDM::Code 7 | field :specialty, type: QDM::Code 8 | field :qualification, type: QDM::Code 9 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.137' 10 | field :qrdaOid, type: String, default: '2.16.840.1.113883.10.20.24.3.162' 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | /* 2 | * For a detailed explanation regarding each configuration property, visit: 3 | * https://jestjs.io/docs/configuration 4 | */ 5 | 6 | module.exports = { 7 | name: 'jest', 8 | testEnvironment: 'node', 9 | verbose: true, 10 | roots: ['/app/assets/', '/spec/javascript'], 11 | testMatch: ['//spec/javascript/**/*.js'], 12 | modulePathIgnorePatterns: ['/dist/'], 13 | collectCoverageFrom: [ 14 | 'app/assets/**/*.js', 15 | ], 16 | }; 17 | -------------------------------------------------------------------------------- /app/assets/javascripts/cqm/Concept.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const ConceptSchema = new mongoose.Schema({ 4 | code: String, 5 | code_system_oid: String, 6 | code_system_name: String, 7 | code_system_version: String, 8 | display_name: String, 9 | }); 10 | 11 | module.exports.ConceptSchema = ConceptSchema; 12 | class Concept extends mongoose.Document { 13 | constructor(object) { 14 | super(object, ConceptSchema); 15 | } 16 | } 17 | module.exports.Concept = Concept; 18 | -------------------------------------------------------------------------------- /app/models/cqm/concept.rb: -------------------------------------------------------------------------------- 1 | module CQM 2 | # Concept is an individual code within a ValueSet, including all of the associated metadata 3 | # such as code system, version, and display name 4 | class Concept 5 | include Mongoid::Document 6 | field :code, type: String 7 | field :code_system_oid, type: String 8 | field :code_system_name, type: String 9 | field :code_system_version, type: String 10 | field :display_name, type: String 11 | 12 | embedded_in :value_set 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /lib/generator_helpers.rb: -------------------------------------------------------------------------------- 1 | require 'erb' 2 | require 'active_support/all' 3 | 4 | # Helper file for generating classes 5 | module GeneratorHelpers 6 | def self.inject_extension(extension_path, file_path) 7 | # Inject Ruby Patient model extensions 8 | template = File.read(extension_path) 9 | renderer = ERB.new(template, nil, '-') 10 | rb_model = File.read(file_path) 11 | rb_model.gsub!(/end/, renderer.result(binding)) 12 | File.open(file_path, 'w') { |file| file.write(rb_model) } 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /app/models/qdm/participation.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/participation.rb 3 | class Participation < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :participationPeriod, type: QDM::Interval 7 | field :qdmTitle, type: String, default: 'Participation' 8 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.130' 9 | field :qdmCategory, type: String, default: 'participation' 10 | field :qdmVersion, type: String, default: '5.6' 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/models/qdm/attributes/entity.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/entity.rb 3 | class Entity < Attribute 4 | include Mongoid::Document 5 | embedded_in :data_element 6 | field :id, type: String 7 | embeds_one :identifier, class_name: 'QDM::Identifier' 8 | field :qdmVersion, type: String, default: '5.6' 9 | def initialize(options = {}) 10 | super(options) 11 | # default id to the mongo ObjectId for this DataElement if it isnt already defined 12 | self.id = _id.to_s unless id? 13 | end 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /app/models/qdm/patient_characteristic.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/patient_characteristic.rb 3 | class PatientCharacteristic < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :qdmTitle, type: String, default: 'Patient Characteristic' 8 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.53' 9 | field :qdmCategory, type: String, default: 'patient_characteristic' 10 | field :qdmVersion, type: String, default: '5.6' 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /bin/validate_dist.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | mkdir -p tmp/dist/ 4 | 5 | # dist_test browserifies index.js to tmp/dist 6 | yarn run dist_test 7 | 8 | # comm -3 only returns lines that differ between the two files. If none are different, diff will be empty 9 | diff=`diff dist/index.js tmp/dist/index.js` 10 | 11 | # Exit with a non-zero code if the diff isn't empty 12 | if [ "$diff" != "" ]; then 13 | echo "dist/index.js is out of date. Please run 'yarn run dist' locally and commit/push the result" 14 | exit 1 15 | fi 16 | 17 | echo "dist/index.js is up to date" 18 | -------------------------------------------------------------------------------- /app/models/qdm/related_person.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/related_person.rb 3 | class RelatedPerson < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | embeds_one :identifier, class_name: 'QDM::Identifier' 7 | field :linkedPatientId, type: String 8 | field :qdmTitle, type: String, default: 'Related Person' 9 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.141' 10 | field :qdmCategory, type: String, default: 'related_person' 11 | field :qdmVersion, type: String, default: '5.6' 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/models/qdm/patient_characteristic_race.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/patient_characteristic_race.rb 3 | class PatientCharacteristicRace < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :qdmTitle, type: String, default: 'Patient Characteristic Race' 7 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.59' 8 | field :qdmCategory, type: String, default: 'patient_characteristic' 9 | field :qdmStatus, type: String, default: 'race' 10 | field :qdmVersion, type: String, default: '5.6' 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/models/qdm/patient_characteristic_sex.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/patient_characteristic_sex.rb 3 | class PatientCharacteristicSex < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :qdmTitle, type: String, default: 'Patient Characteristic Sex' 7 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.55' 8 | field :qdmCategory, type: String, default: 'patient_characteristic' 9 | field :qdmStatus, type: String, default: 'gender' 10 | field :qdmVersion, type: String, default: '5.6' 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /bin/validate_browser.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | mkdir -p tmp/dist/ 4 | 5 | # browser_test browserifies index.js to tmp/dist 6 | yarn run browser_test 7 | 8 | # comm -3 only returns lines that differ between the two files. If none are different, diff will be empty 9 | diff=`diff dist/browser.js tmp/dist/browser.js` 10 | 11 | # Exit with a non-zero code if the diff isn't empty 12 | if [ "$diff" != "" ]; then 13 | echo "dist/browser.js is out of date. Please run 'yarn run browser' locally and commit/push the result" 14 | exit 1 15 | fi 16 | 17 | echo "dist/browser.js is up to date" 18 | -------------------------------------------------------------------------------- /app/models/qdm/patient_care_experience.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/patient_care_experience.rb 3 | class PatientCareExperience < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | embeds_many :recorder, class_name: 'QDM::Entity' 8 | field :qdmTitle, type: String, default: 'Patient Care Experience' 9 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.52' 10 | field :qdmCategory, type: String, default: 'care_experience' 11 | field :qdmVersion, type: String, default: '5.6' 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/models/qdm/patient_characteristic_ethnicity.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/patient_characteristic_ethnicity.rb 3 | class PatientCharacteristicEthnicity < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :qdmTitle, type: String, default: 'Patient Characteristic Ethnicity' 7 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.56' 8 | field :qdmCategory, type: String, default: 'patient_characteristic' 9 | field :qdmStatus, type: String, default: 'ethnicity' 10 | field :qdmVersion, type: String, default: '5.6' 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/models/qdm/provider_care_experience.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/provider_care_experience.rb 3 | class ProviderCareExperience < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | embeds_many :recorder, class_name: 'QDM::Entity' 8 | field :qdmTitle, type: String, default: 'Provider Care Experience' 9 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.70' 10 | field :qdmCategory, type: String, default: 'care_experience' 11 | field :qdmVersion, type: String, default: '5.6' 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /spec/cqm/interval_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | RSpec.describe QDM::Interval do 4 | it 'shouldn\'t shift dates with a high past 9998' do 5 | dt_low = DateTime.new(2018, 10, 29, 9, 54, 0) 6 | dt_high = DateTime.new(9999, 12, 31, 23, 59, 59) 7 | 8 | # number of seconds to shift (4 years, plus 1 day for the leap year 2022) 9 | shift_seconds = 60 * 60 * 24 * (365 * 4 + 1) 10 | 11 | interval = QDM::Interval.new(dt_low, dt_high) 12 | 13 | interval.shift_dates(shift_seconds) 14 | 15 | expect(interval.high).to eq(dt_high) 16 | expect(interval.low).to eq(dt_low.next_year(4)) 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /app/models/qdm/patient_characteristic_payer.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/patient_characteristic_payer.rb 3 | class PatientCharacteristicPayer < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :relevantPeriod, type: QDM::Interval 7 | field :qdmTitle, type: String, default: 'Patient Characteristic Payer' 8 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.58' 9 | field :qdmCategory, type: String, default: 'patient_characteristic' 10 | field :qdmStatus, type: String, default: 'payer' 11 | field :qdmVersion, type: String, default: '5.6' 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/models/qdm/patient_characteristic_birthdate.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/patient_characteristic_birthdate.rb 3 | class PatientCharacteristicBirthdate < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :birthDatetime, type: DateTime 7 | field :qdmTitle, type: String, default: 'Patient Characteristic Birthdate' 8 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.54' 9 | field :qdmCategory, type: String, default: 'patient_characteristic' 10 | field :qdmStatus, type: String, default: 'birthdate' 11 | field :qdmVersion, type: String, default: '5.6' 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/models/qdm/care_goal.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/care_goal.rb 3 | class CareGoal < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :statusDate, type: Date 7 | field :relevantPeriod, type: QDM::Interval 8 | field :relatedTo, type: Array 9 | field :targetOutcome 10 | embeds_many :performer, class_name: 'QDM::Entity' 11 | field :qdmTitle, type: String, default: 'Care Goal' 12 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.7' 13 | field :qdmCategory, type: String, default: 'care_goal' 14 | field :qdmVersion, type: String, default: '5.6' 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /app/models/qdm/symptom.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/symptom.rb 3 | class Symptom < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :prevalencePeriod, type: QDM::Interval 7 | field :severity, type: QDM::Code 8 | embeds_many :recorder, class_name: 'QDM::Entity' 9 | field :qdmTitle, type: String, default: 'Symptom' 10 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.116' 11 | field :qrdaOid, type: String, default: '2.16.840.1.113883.10.20.24.3.136' 12 | field :qdmCategory, type: String, default: 'symptom' 13 | field :qdmVersion, type: String, default: '5.6' 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /app/models/qdm/patient_characteristic_expired.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/patient_characteristic_expired.rb 3 | class PatientCharacteristicExpired < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :expiredDatetime, type: DateTime 7 | field :cause, type: QDM::Code 8 | field :qdmTitle, type: String, default: 'Patient Characteristic Expired' 9 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.57' 10 | field :qdmCategory, type: String, default: 'patient_characteristic' 11 | field :qdmStatus, type: String, default: 'expired' 12 | field :qdmVersion, type: String, default: '5.6' 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /app/models/qdm/family_history.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/family_history.rb 3 | class FamilyHistory < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :relationship, type: QDM::Code 8 | embeds_many :recorder, class_name: 'QDM::Entity' 9 | field :qdmTitle, type: String, default: 'Family History' 10 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.111' 11 | field :qrdaOid, type: String, default: '2.16.840.1.113883.10.20.24.3.12' 12 | field :qdmCategory, type: String, default: 'family_history' 13 | field :qdmVersion, type: String, default: '5.6' 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /app/models/qdm/device_order.rb: -------------------------------------------------------------------------------- 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 | embeds_many :requester, class_name: 'QDM::Entity' 10 | field :qdmTitle, type: String, default: 'Device, Order' 11 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.15' 12 | field :qdmCategory, type: String, default: 'device' 13 | field :qdmStatus, type: String, default: 'order' 14 | field :qdmVersion, type: String, default: '5.6' 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /app/assets/javascripts/basetypes/DateTime.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 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 (dateTime.isDateTime) { 11 | return dateTime; 12 | } 13 | 14 | if (!Date.parse(dateTime)) { 15 | throw new Error(`DateTime: ${dateTime} is not a valid DateTime`); 16 | } 17 | 18 | return cql.DateTime.fromJSDate(new Date(dateTime), 0); 19 | }; 20 | 21 | mongoose.Schema.Types.DateTime = DateTime; 22 | module.exports = DateTime; 23 | -------------------------------------------------------------------------------- /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | name: npm-publish 2 | on: 3 | push: 4 | branches: 5 | - master 6 | jobs: 7 | npm-publish: 8 | if: contains(github.event.head_commit.message, 'Release') 9 | name: npm-publish 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Checkout repository 14 | uses: actions/checkout@v3 15 | 16 | - name: Use Node.js 20.x 17 | uses: actions/setup-node@v3 18 | with: 19 | node-version: 20.x 20 | 21 | - name: Install node dependencies 22 | run: npm ci 23 | 24 | - name: Publish to npm 25 | uses: JS-DevTools/npm-publish@v3 26 | with: 27 | token: ${{ secrets.NPM_TOKEN }} 28 | -------------------------------------------------------------------------------- /app/assets/javascripts/cqm/ValueSet.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | const Concept = require('./Concept.js'); 3 | 4 | const [String] = [mongoose.Schema.Types.String]; 5 | 6 | const ValueSetSchema = new mongoose.Schema( 7 | { 8 | oid: String, 9 | display_name: String, 10 | version: String, 11 | 12 | concepts: [Concept.ConceptSchema], 13 | }, 14 | // Options 15 | { 16 | timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }, 17 | } 18 | ); 19 | 20 | module.exports.ValueSetSchema = ValueSetSchema; 21 | class ValueSet extends mongoose.Document { 22 | constructor(object) { 23 | super(object, ValueSetSchema); 24 | } 25 | } 26 | module.exports.ValueSet = ValueSet; 27 | -------------------------------------------------------------------------------- /app/models/qdm/assessment_order.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/assessment_order.rb 3 | class AssessmentOrder < 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 | embeds_many :requester, class_name: 'QDM::Entity' 10 | field :qdmTitle, type: String, default: 'Assessment, Order' 11 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.131' 12 | field :qdmCategory, type: String, default: 'assessment' 13 | field :qdmStatus, type: String, default: 'order' 14 | field :qdmVersion, type: String, default: '5.6' 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /app/models/qdm/device_recommended.rb: -------------------------------------------------------------------------------- 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 | embeds_many :requester, class_name: 'QDM::Entity' 10 | field :qdmTitle, type: String, default: 'Device, Recommended' 11 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.16' 12 | field :qdmCategory, type: String, default: 'device' 13 | field :qdmStatus, type: String, default: 'recommended' 14 | field :qdmVersion, type: String, default: '5.6' 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /app/models/qdm/intervention_order.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/intervention_order.rb 3 | class InterventionOrder < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :reason, type: QDM::Code 8 | field :negationRationale, type: QDM::Code 9 | embeds_many :requester, class_name: 'QDM::Entity' 10 | field :qdmTitle, type: String, default: 'Intervention, Order' 11 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.35' 12 | field :qdmCategory, type: String, default: 'intervention' 13 | field :qdmStatus, type: String, default: 'order' 14 | field :qdmVersion, type: String, default: '5.6' 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /app/assets/javascripts/attributes/Identifier.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const [Number, String] = [ 4 | mongoose.Schema.Types.Number, 5 | mongoose.Schema.Types.String, 6 | ]; 7 | 8 | const IdentifierSchema = mongoose.Schema({ 9 | namingSystem: String, 10 | value: String, 11 | qdmVersion: { type: String, default: '5.6' }, 12 | _type: { type: String, default: 'QDM::Identifier' }, 13 | 14 | }, { _id: false, id: false }); 15 | 16 | module.exports.IdentifierSchema = IdentifierSchema; 17 | class Identifier extends mongoose.Document { 18 | constructor(object) { 19 | super(object, IdentifierSchema); 20 | this._type = 'QDM::Identifier'; 21 | } 22 | } 23 | module.exports.Identifier = Identifier; 24 | -------------------------------------------------------------------------------- /app/models/qdm/laboratory_test_order.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/laboratory_test_order.rb 3 | class LaboratoryTestOrder < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :reason, type: QDM::Code 8 | field :negationRationale, type: QDM::Code 9 | embeds_many :requester, class_name: 'QDM::Entity' 10 | field :qdmTitle, type: String, default: 'Laboratory Test, Order' 11 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.41' 12 | field :qdmCategory, type: String, default: 'laboratory_test' 13 | field :qdmStatus, type: String, default: 'order' 14 | field :qdmVersion, type: String, default: '5.6' 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /app/models/qdm/adverse_event.rb: -------------------------------------------------------------------------------- 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 :relevantDatetime, type: DateTime 8 | field :severity, type: QDM::Code 9 | field :facilityLocation, type: QDM::FacilityLocation 10 | field :type, type: QDM::Code 11 | embeds_many :recorder, class_name: 'QDM::Entity' 12 | field :qdmTitle, type: String, default: 'Adverse Event' 13 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.120' 14 | field :qdmCategory, type: String, default: 'adverse_event' 15 | field :qdmVersion, type: String, default: '5.6' 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /app/models/qdm/assessment_recommended.rb: -------------------------------------------------------------------------------- 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 | embeds_many :requester, class_name: 'QDM::Entity' 10 | field :qdmTitle, type: String, default: 'Assessment, Recommended' 11 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.118' 12 | field :qdmCategory, type: String, default: 'assessment' 13 | field :qdmStatus, type: String, default: 'recommended' 14 | field :qdmVersion, type: String, default: '5.6' 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /app/models/qdm/diagnostic_study_order.rb: -------------------------------------------------------------------------------- 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 :negationRationale, type: QDM::Code 9 | embeds_many :requester, class_name: 'QDM::Entity' 10 | field :qdmTitle, type: String, default: 'Diagnostic Study, Order' 11 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.22' 12 | field :qdmCategory, type: String, default: 'diagnostic_study' 13 | field :qdmStatus, type: String, default: 'order' 14 | field :qdmVersion, type: String, default: '5.6' 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /app/assets/javascripts/basetypes/Ratio.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | const cql = require('cql-execution'); 3 | 4 | function Ratio(key, options) { 5 | mongoose.SchemaType.call(this, key, options, 'Ratio'); 6 | } 7 | Ratio.prototype = Object.create(mongoose.SchemaType.prototype); 8 | 9 | Ratio.prototype.cast = (ratio) => { 10 | if (typeof ratio.numerator === 'undefined') { 11 | throw new Error(`Ratio: ${ratio} does not have a numerator`); 12 | } else if (typeof ratio.denominator === 'undefined') { 13 | throw new Error(`Ratio: ${ratio} does not have a denominator`); 14 | } 15 | 16 | return new cql.Ratio(ratio.numerator, ratio.denominator); 17 | }; 18 | 19 | mongoose.Schema.Types.Ratio = Ratio; 20 | module.exports = Ratio; 21 | -------------------------------------------------------------------------------- /app/models/cqm/clause_result.rb: -------------------------------------------------------------------------------- 1 | module CQM 2 | # ClauseResult is used to store clause result information in IndividualResult 3 | class ClauseResult 4 | include Mongoid::Document 5 | include Mongoid::Timestamps 6 | 7 | # Library the clause this result is for is in 8 | field :library_name, type: String 9 | # Statment the clause this result is for is in 10 | field :statement_name, type: String 11 | # LocalId of the clause this result is for 12 | field :localId, type: String 13 | # Final, processed result of raw calculation 14 | field :final, type: String 15 | # Raw result of clause calculation 16 | field :raw 17 | 18 | # Relations to other model classes 19 | embedded_in :individual_result 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /app/models/qdm/intervention_recommended.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/intervention_recommended.rb 3 | class InterventionRecommended < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :reason, type: QDM::Code 8 | field :negationRationale, type: QDM::Code 9 | embeds_many :requester, class_name: 'QDM::Entity' 10 | field :qdmTitle, type: String, default: 'Intervention, Recommended' 11 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.37' 12 | field :qdmCategory, type: String, default: 'intervention' 13 | field :qdmStatus, type: String, default: 'recommended' 14 | field :qdmVersion, type: String, default: '5.6' 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /app/assets/javascripts/basetypes/Quantity.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 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.value, quantity.unit); 17 | }; 18 | 19 | mongoose.Schema.Types.Quantity = Quantity; 20 | module.exports = Quantity; 21 | -------------------------------------------------------------------------------- /app/models/qdm/allergy_intolerance.rb: -------------------------------------------------------------------------------- 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 | embeds_many :recorder, class_name: 'QDM::Entity' 11 | field :qdmTitle, type: String, default: 'Allergy/Intolerance' 12 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.119' 13 | field :qdmCategory, type: String, default: 'allergy' 14 | field :qdmStatus, type: String, default: 'intolerance' 15 | field :qdmVersion, type: String, default: '5.6' 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /app/models/qdm/diagnosis.rb: -------------------------------------------------------------------------------- 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 | embeds_many :recorder, class_name: 'QDM::Entity' 11 | field :qdmTitle, type: String, default: 'Diagnosis' 12 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.110' 13 | field :qrdaOid, type: String, default: '2.16.840.1.113883.10.20.24.3.135' 14 | field :qdmCategory, type: String, default: 'condition' 15 | field :qdmVersion, type: String, default: '5.6' 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /app/models/qdm/laboratory_test_recommended.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/laboratory_test_recommended.rb 3 | class LaboratoryTestRecommended < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :reason, type: QDM::Code 8 | field :negationRationale, type: QDM::Code 9 | embeds_many :requester, class_name: 'QDM::Entity' 10 | field :qdmTitle, type: String, default: 'Laboratory Test, Recommended' 11 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.43' 12 | field :qdmCategory, type: String, default: 'laboratory_test' 13 | field :qdmStatus, type: String, default: 'recommended' 14 | field :qdmVersion, type: String, default: '5.6' 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /app/models/qdm/physical_exam_order.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/physical_exam_order.rb 3 | class PhysicalExamOrder < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :reason, type: QDM::Code 8 | field :anatomicalLocationSite, type: QDM::Code 9 | field :negationRationale, type: QDM::Code 10 | embeds_many :requester, class_name: 'QDM::Entity' 11 | field :qdmTitle, type: String, default: 'Physical Exam, Order' 12 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.61' 13 | field :qdmCategory, type: String, default: 'physical_exam' 14 | field :qdmStatus, type: String, default: 'order' 15 | field :qdmVersion, type: String, default: '5.6' 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /app/assets/javascripts/cqm/MeasurePackage.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | // using mBuffer to not conflict with system Buffer 4 | const [mBuffer, ObjectId] = [ 5 | mongoose.Schema.Types.Buffer, 6 | mongoose.Schema.Types.ObjectId, 7 | ]; 8 | 9 | const MeasurePackageSchema = new mongoose.Schema( 10 | { 11 | file: mBuffer, 12 | measure: { type: ObjectId, ref: 'Measure' }, 13 | }, 14 | // Options 15 | { 16 | timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }, 17 | } 18 | ); 19 | 20 | module.exports.MeasurePackageSchema = MeasurePackageSchema; 21 | class MeasurePackage extends mongoose.Document { 22 | constructor(object) { 23 | super(object, MeasurePackageSchema); 24 | } 25 | } 26 | module.exports.MeasurePackage = MeasurePackage; 27 | -------------------------------------------------------------------------------- /app/models/qdm/encounter_recommended.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/encounter_recommended.rb 3 | class EncounterRecommended < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :reason, type: QDM::Code 8 | field :facilityLocation, type: QDM::FacilityLocation 9 | field :negationRationale, type: QDM::Code 10 | embeds_many :requester, class_name: 'QDM::Entity' 11 | field :qdmTitle, type: String, default: 'Encounter, Recommended' 12 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.28' 13 | field :qdmCategory, type: String, default: 'encounter' 14 | field :qdmStatus, type: String, default: 'recommended' 15 | field :qdmVersion, type: String, default: '5.6' 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /lib/generators/custom_mongo/model.rb.tt: -------------------------------------------------------------------------------- 1 | <% module_namespacing do -%> 2 | class <%= class_name %><%= " < #{options[:parent].classify}" if options[:parent] %> 3 | <% unless options[:parent] -%> 4 | include Mongoid::Document 5 | <% end -%> 6 | <% if options[:timestamps] -%> 7 | include Mongoid::Timestamps 8 | <% end -%> 9 | <% if options[:collection] -%> 10 | store_in collection: "<%= options[:collection] %>" 11 | <% end -%> 12 | <% attributes.reject{|attr| attr.reference?}.each do |attribute| -%> 13 | field :<%= attribute.name %>, type: <%= attribute.type_class %><% if attribute.default -%>, default: '<%= attribute.default %>'<% end -%> 14 | 15 | <% end -%> 16 | <% attributes.select{|attr| attr.reference? }.each do |attribute| -%> 17 | embedded_in :<%= attribute.name%> 18 | <% end -%> 19 | end 20 | <% end -%> 21 | -------------------------------------------------------------------------------- /notice.md: -------------------------------------------------------------------------------- 1 | NOTICE 2 | ====== 3 | This (software/technical data) was produced for the U. S. Government under Contract Number HHSM-500-2012-00008I, and is subject to Federal Acquisition Regulation Clause 52.227-14, Rights in Data-General. 4 | 5 | No other use other than that granted to the U. S. Government, or to those acting on behalf of the U. S. Government under that Clause is authorized without the express written permission of The MITRE Corporation. 6 | 7 | To the extent necessary MITRE hereby grants express written permission to use, reproduce, distribute, modify, and otherwise leverage this software to the extent permitted by the Apache 2.0 license. 8 | 9 | For further information, please contact The MITRE Corporation, Contracts Management Office, 7515 Colshire Drive, McLean, VA 22102-7539, (703) 983-6000. 10 | -------------------------------------------------------------------------------- /app/models/qdm/medication_active.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/medication_active.rb 3 | class MedicationActive < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :relevantDatetime, type: DateTime 7 | field :relevantPeriod, type: QDM::Interval 8 | field :dosage, type: QDM::Quantity 9 | field :frequency, type: QDM::Code 10 | field :route, type: QDM::Code 11 | embeds_many :recorder, class_name: 'QDM::Entity' 12 | field :qdmTitle, type: String, default: 'Medication, Active' 13 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.44' 14 | field :qdmCategory, type: String, default: 'medication' 15 | field :qdmStatus, type: String, default: 'active' 16 | field :qdmVersion, type: String, default: '5.6' 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /app/models/qdm/diagnostic_study_recommended.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/diagnostic_study_recommended.rb 3 | class DiagnosticStudyRecommended < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :negationRationale, type: QDM::Code 8 | embeds_many :requester, class_name: 'QDM::Entity' 9 | field :qdmTitle, type: String, default: 'Diagnostic Study, Recommended' 10 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.24' 11 | field :qrdaOid, type: String, default: '2.16.840.1.113883.10.20.24.3.19' 12 | field :qdmCategory, type: String, default: 'diagnostic_study' 13 | field :qdmStatus, type: String, default: 'recommended' 14 | field :qdmVersion, type: String, default: '5.6' 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /app/models/qdm/encounter_order.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/encounter_order.rb 3 | class EncounterOrder < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :reason, type: QDM::Code 8 | field :facilityLocation, type: QDM::FacilityLocation 9 | field :negationRationale, type: QDM::Code 10 | embeds_many :requester, class_name: 'QDM::Entity' 11 | field :priority, type: QDM::Code 12 | field :qdmTitle, type: String, default: 'Encounter, Order' 13 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.27' 14 | field :qdmCategory, type: String, default: 'encounter' 15 | field :qdmStatus, type: String, default: 'order' 16 | field :qdmVersion, type: String, default: '5.6' 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /app/models/qdm/physical_exam_recommended.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/physical_exam_recommended.rb 3 | class PhysicalExamRecommended < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :reason, type: QDM::Code 8 | field :anatomicalLocationSite, type: QDM::Code 9 | field :negationRationale, type: QDM::Code 10 | embeds_many :requester, class_name: 'QDM::Entity' 11 | field :qdmTitle, type: String, default: 'Physical Exam, Recommended' 12 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.63' 13 | field :qdmCategory, type: String, default: 'physical_exam' 14 | field :qdmStatus, type: String, default: 'recommended' 15 | field :qdmVersion, type: String, default: '5.6' 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /spec/cqm/patient_generator_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | RSpec.describe QDM::PatientGeneration do 4 | it 'single massive patient contains same number of dataElements that are in list of all patients' do 5 | count = 0 6 | # Each patient gets 4 charactaristics by default 7 | patient_characteristics = 4 8 | stacked_patient = QDM::PatientGeneration.generate_exhaustive_data_element_patients(false, 'qdm-modelinfo-5.6.xml')[0] 9 | stacked_patients = QDM::PatientGeneration.generate_exhaustive_data_element_patients(true, 'qdm-modelinfo-5.6.xml') 10 | stacked_patients.each do |patient| 11 | count += (patient.qdmPatient.dataElements.size - patient_characteristics) 12 | end 13 | expect(count).to equal stacked_patient.qdmPatient.dataElements.size - patient_characteristics 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /app/models/qdm/procedure_recommended.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/procedure_recommended.rb 3 | class ProcedureRecommended < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :reason, type: QDM::Code 8 | field :anatomicalLocationSite, type: QDM::Code 9 | field :rank, type: Integer 10 | embeds_many :requester, class_name: 'QDM::Entity' 11 | field :negationRationale, type: QDM::Code 12 | field :qdmTitle, type: String, default: 'Procedure, Recommended' 13 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.68' 14 | field :qdmCategory, type: String, default: 'procedure' 15 | field :qdmStatus, type: String, default: 'recommended' 16 | field :qdmVersion, type: String, default: '5.6' 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | require_relative './simplecov_init' 2 | require 'bundler/setup' 3 | require 'cqm/models' 4 | require 'nokogiri' 5 | require 'byebug' 6 | 7 | Mongoid.load!('config/mongoid.yml', :test) 8 | 9 | # Seems new version of mongoid (and/or Mongo) doesn't default to UTC. 10 | Time.zone = 'UTC' 11 | 12 | RSpec.configure do |config| 13 | # Enable flags like --only-failures and --next-failure 14 | config.example_status_persistence_file_path = '.rspec_status' 15 | 16 | # Disable RSpec exposing methods globally on `Module` and `main` 17 | config.disable_monkey_patching! 18 | 19 | config.expect_with :rspec do |c| 20 | c.syntax = :expect 21 | end 22 | 23 | config.before(:suite) do 24 | dump_database 25 | end 26 | end 27 | 28 | def dump_database 29 | Mongoid.default_client.collections.each(&:drop) 30 | end 31 | -------------------------------------------------------------------------------- /app/models/qdm/procedure_order.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/procedure_order.rb 3 | class ProcedureOrder < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :reason, type: QDM::Code 8 | field :anatomicalLocationSite, type: QDM::Code 9 | field :rank, type: Integer 10 | field :priority, type: QDM::Code 11 | field :negationRationale, type: QDM::Code 12 | embeds_many :requester, class_name: 'QDM::Entity' 13 | field :qdmTitle, type: String, default: 'Procedure, Order' 14 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.66' 15 | field :qdmCategory, type: String, default: 'procedure' 16 | field :qdmStatus, type: String, default: 'order' 17 | field :qdmVersion, type: String, default: '5.6' 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /app/models/qdm/patient_characteristic_clinical_trial_participant.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/patient_characteristic_clinical_trial_participant.rb 3 | class PatientCharacteristicClinicalTrialParticipant < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :reason, type: QDM::Code 7 | field :relevantPeriod, type: QDM::Interval 8 | field :qdmTitle, type: String, default: 'Patient Characteristic Clinical Trial Participant' 9 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.6' 10 | field :qrdaOid, type: String, default: '2.16.840.1.113883.10.20.24.3.51' 11 | field :qdmCategory, type: String, default: 'patient_characteristic' 12 | field :qdmStatus, type: String, default: 'clinical_trial_participant' 13 | field :qdmVersion, type: String, default: '5.6' 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /app/models/cqm/patient.rb: -------------------------------------------------------------------------------- 1 | module CQM 2 | # Patient model that holds non-QDM data for the patient 3 | class Patient 4 | include Mongoid::Document 5 | field :givenNames, type: Array 6 | field :familyName, type: String 7 | field :bundleId, type: String 8 | field :expectedValues, type: Array 9 | field :notes, type: String 10 | field :measure_ids, type: Array 11 | 12 | has_and_belongs_to_many :providers, class_name: 'CQM::Provider' 13 | embeds_one :qdmPatient, class_name: 'QDM::Patient', autobuild: true 14 | has_many :calculation_results, class_name: 'CQM::IndividualResult', inverse_of: :patient 15 | 16 | # Include '_type' in any JSON output. This is necessary for deserialization. 17 | def to_json(options = nil) 18 | serializable_hash(include: :_type, methods: :_type).to_json(options) 19 | end 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /templates/identifier_template.js.erb: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const [Number, String] = [ 4 | mongoose.Schema.Types.Number, 5 | mongoose.Schema.Types.String, 6 | ]; 7 | 8 | const IdentifierSchema = mongoose.Schema({ 9 | <%- for attribute in attrs_with_extras -%> 10 | <% if attribute[:default] %><%= attribute[:name] %>: { type: <%= TYPE_LOOKUP_JS[attribute[:type]] -%>, default: '<%= attribute[:default] %>' },<% else %><%= attribute[:name] %>: <%= TYPE_LOOKUP_JS[attribute[:type]] -%>,<%- end %> 11 | <%- end %> 12 | }, { _id: false, id: false }); 13 | 14 | module.exports.IdentifierSchema = IdentifierSchema; 15 | class Identifier extends mongoose.Document { 16 | constructor(object) { 17 | super(object, IdentifierSchema); 18 | this._type = 'QDM::<%= datatype %>'; 19 | } 20 | } 21 | module.exports.Identifier = Identifier; 22 | -------------------------------------------------------------------------------- /app/assets/javascripts/cqm/ClauseResult.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const [String, Mixed] = [ 4 | mongoose.Schema.Types.String, 5 | mongoose.Schema.Types.Mixed, 6 | ]; 7 | 8 | const ClauseResultSchema = mongoose.Schema({ 9 | // Library the clause this result is for is in 10 | library_name: String, 11 | // Statement the clause this result is for is in 12 | statement_name: String, 13 | // LocalId of the clause this result is for 14 | localId: String, 15 | // Final, processed result of raw calculation 16 | final: String, 17 | // Raw result of clause calculation 18 | raw: Mixed, 19 | }); 20 | 21 | 22 | module.exports.ClauseResultSchema = ClauseResultSchema; 23 | class ClauseResult extends mongoose.Document { 24 | constructor(object) { 25 | super(object, ClauseResultSchema); 26 | } 27 | } 28 | module.exports.ClauseResult = ClauseResult; 29 | -------------------------------------------------------------------------------- /app/models/qdm/immunization_order.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/immunization_order.rb 3 | class ImmunizationOrder < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :activeDatetime, type: DateTime 7 | field :authorDatetime, type: DateTime 8 | field :dosage, type: QDM::Quantity 9 | field :supply, type: QDM::Quantity 10 | field :reason, type: QDM::Code 11 | field :route, type: QDM::Code 12 | field :negationRationale, type: QDM::Code 13 | embeds_many :requester, class_name: 'QDM::Entity' 14 | field :qdmTitle, type: String, default: 'Immunization, Order' 15 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.113' 16 | field :qdmCategory, type: String, default: 'immunization' 17 | field :qdmStatus, type: String, default: 'order' 18 | field :qdmVersion, type: String, default: '5.6' 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /app/models/qdm/substance_recommended.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/substance_recommended.rb 3 | class SubstanceRecommended < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :reason, type: QDM::Code 8 | field :dosage, type: QDM::Quantity 9 | field :frequency, type: QDM::Code 10 | field :refills, type: Integer 11 | field :route, type: QDM::Code 12 | field :negationRationale, type: QDM::Code 13 | embeds_many :requester, class_name: 'QDM::Entity' 14 | field :qdmTitle, type: String, default: 'Substance, Recommended' 15 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.78' 16 | field :qdmCategory, type: String, default: 'substance' 17 | field :qdmStatus, type: String, default: 'recommended' 18 | field :qdmVersion, type: String, default: '5.6' 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /app/assets/javascripts/Result.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const PlaceholderResultSchema = mongoose.Schema({ 4 | cache_id: String, 5 | measure_id: String, 6 | sub_id: String, 7 | test_id: String, 8 | effective_date: Number, 9 | filters: Object, 10 | prefilter: Object, 11 | calculation_time: Date, 12 | status: Object, 13 | population_ids: Object, 14 | STRAT: Number, 15 | IPP: Number, 16 | DENOM: Number, 17 | NUMER: Number, 18 | NUMEX: Number, 19 | DENEX: Number, 20 | DENEXCEP: Number, 21 | MSRPOPL: Number, 22 | OBSERV: Number, 23 | MSRPOPLEX: Number, 24 | supplemental_data: Object, 25 | }); 26 | 27 | module.exports.ResultSchema = PlaceholderResultSchema; 28 | class PlaceholderResult extends mongoose.Document { 29 | constructor(object) { 30 | super(object, PlaceholderResultSchema); 31 | } 32 | } 33 | module.exports.PlaceholderResult = PlaceholderResult; 34 | -------------------------------------------------------------------------------- /app/models/cqm/cql_statement_dependency.rb: -------------------------------------------------------------------------------- 1 | module CQM 2 | # Statement is a given CQL Statement within a CQL Library, which has many dependencies 3 | class StatementDependency 4 | include Mongoid::Document 5 | embedded_in :cql_library 6 | 7 | field :statement_name, type: String 8 | embeds_many :statement_references 9 | end 10 | 11 | # StatementReference notes a CQL Library/Statement which a given Statement (in which it is embedded) relies upon. This 12 | # is also used for populations/stratifications/SDEs to reference their defining statement. 13 | class StatementReference 14 | include Mongoid::Document 15 | embedded_in :statement_dependency 16 | embedded_in :population_set 17 | embedded_in :population_map 18 | embedded_in :stratification 19 | 20 | field :library_name, type: String 21 | field :statement_name, type: String 22 | field :hqmf_id, type: String 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /app/models/qdm/substance_administered.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/substance_administered.rb 3 | class SubstanceAdministered < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :relevantDatetime, type: DateTime 8 | field :relevantPeriod, type: QDM::Interval 9 | field :dosage, type: QDM::Quantity 10 | field :frequency, type: QDM::Code 11 | field :route, type: QDM::Code 12 | field :negationRationale, type: QDM::Code 13 | embeds_many :performer, class_name: 'QDM::Entity' 14 | field :qdmTitle, type: String, default: 'Substance, Administered' 15 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.73' 16 | field :qdmCategory, type: String, default: 'substance' 17 | field :qdmStatus, type: String, default: 'administered' 18 | field :qdmVersion, type: String, default: '5.6' 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /app/models/qdm/intervention_performed.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/intervention_performed.rb 3 | class InterventionPerformed < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :relevantDatetime, type: DateTime 8 | field :relevantPeriod, type: QDM::Interval 9 | field :reason, type: QDM::Code 10 | field :result 11 | field :status, type: QDM::Code 12 | field :negationRationale, type: QDM::Code 13 | embeds_many :performer, class_name: 'QDM::Entity' 14 | field :relatedTo, type: Array 15 | field :qdmTitle, type: String, default: 'Intervention, Performed' 16 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.36' 17 | field :qdmCategory, type: String, default: 'intervention' 18 | field :qdmStatus, type: String, default: 'performed' 19 | field :qdmVersion, type: String, default: '5.6' 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /app/models/cqm/cql_library.rb: -------------------------------------------------------------------------------- 1 | module CQM 2 | # CQLLibrary encapsulates what used to be a Hash in Ruby, by explicitly specifying 3 | # a library ID, and the CQL string for that library 4 | class CQLLibrary 5 | include Mongoid::Document 6 | embedded_in :measure 7 | 8 | field :library_name, type: String 9 | field :library_version, type: String 10 | field :cql, type: String 11 | field :elm, type: Hash 12 | field :elm_annotations, type: Hash 13 | field :is_main_library, type: Boolean, default: false 14 | 15 | # Currently this is only relevant for cql libraries that are included in composite measures, 16 | # true indicates the library files are in the "top level" folder of the measure package, rather 17 | # than coming from a component measure folder. 18 | field :is_top_level, type: Boolean, default: true 19 | 20 | embeds_many :statement_dependencies, class_name: 'CQM::StatementDependency' 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /app/models/qdm/substance_order.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/substance_order.rb 3 | class SubstanceOrder < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :relevantPeriod, type: QDM::Interval 8 | field :reason, type: QDM::Code 9 | field :dosage, type: QDM::Quantity 10 | field :supply, type: QDM::Quantity 11 | field :frequency, type: QDM::Code 12 | field :refills, type: Integer 13 | field :route, type: QDM::Code 14 | field :negationRationale, type: QDM::Code 15 | embeds_many :requester, class_name: 'QDM::Entity' 16 | field :qdmTitle, type: String, default: 'Substance, Order' 17 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.77' 18 | field :qdmCategory, type: String, default: 'substance' 19 | field :qdmStatus, type: String, default: 'order' 20 | field :qdmVersion, type: String, default: '5.6' 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /app/models/qdm/immunization_administered.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/immunization_administered.rb 3 | class ImmunizationAdministered < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :relevantDatetime, type: DateTime 8 | field :reason, type: QDM::Code 9 | field :dosage, type: QDM::Quantity 10 | field :route, type: QDM::Code 11 | field :negationRationale, type: QDM::Code 12 | embeds_many :performer, class_name: 'QDM::Entity' 13 | field :qdmTitle, type: String, default: 'Immunization, Administered' 14 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.112' 15 | field :qrdaOid, type: String, default: '2.16.840.1.113883.10.20.24.3.140' 16 | field :qdmCategory, type: String, default: 'immunization' 17 | field :qdmStatus, type: String, default: 'administered' 18 | field :qdmVersion, type: String, default: '5.6' 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /app/models/qdm/medication_administered.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/medication_administered.rb 3 | class MedicationAdministered < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :relevantDatetime, type: DateTime 8 | field :relevantPeriod, type: QDM::Interval 9 | field :dosage, type: QDM::Quantity 10 | field :frequency, type: QDM::Code 11 | field :route, type: QDM::Code 12 | field :reason, type: QDM::Code 13 | field :negationRationale, type: QDM::Code 14 | embeds_many :performer, class_name: 'QDM::Entity' 15 | field :qdmTitle, type: String, default: 'Medication, Administered' 16 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.45' 17 | field :qdmCategory, type: String, default: 'medication' 18 | field :qdmStatus, type: String, default: 'administered' 19 | field :qdmVersion, type: String, default: '5.6' 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /app/models/qdm/communication_performed.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/communication_performed.rb 3 | class CommunicationPerformed < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :category, type: QDM::Code 8 | field :medium, type: QDM::Code 9 | embeds_many :sender, class_name: 'QDM::Entity' 10 | embeds_many :recipient, class_name: 'QDM::Entity' 11 | field :relatedTo, type: Array 12 | field :sentDatetime, type: DateTime 13 | field :receivedDatetime, type: DateTime 14 | field :negationRationale, type: QDM::Code 15 | field :qdmTitle, type: String, default: 'Communication, Performed' 16 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.132' 17 | field :qdmCategory, type: String, default: 'communication' 18 | field :qdmStatus, type: String, default: 'performed' 19 | field :qdmVersion, type: String, default: '5.6' 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /app/assets/javascripts/cqm/CQLStatementDependency.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const StatementReferenceSchema = new mongoose.Schema({ 4 | library_name: String, 5 | statement_name: String, 6 | hqmf_id: String, 7 | }); 8 | 9 | const StatementDependencySchema = new mongoose.Schema({ 10 | statement_name: String, 11 | statement_references: [StatementReferenceSchema], 12 | }); 13 | 14 | module.exports.StatementReferenceSchema = StatementReferenceSchema; 15 | class StatementReference extends mongoose.Document { 16 | constructor(object) { 17 | super(object, StatementReferenceSchema); 18 | } 19 | } 20 | module.exports.StatementReference = StatementReference; 21 | 22 | module.exports.StatementDependencySchema = StatementDependencySchema; 23 | class StatementDependency extends mongoose.Document { 24 | constructor(object) { 25 | super(object, StatementDependencySchema); 26 | } 27 | } 28 | module.exports.StatementDependency = StatementDependency; 29 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | AllCops: 2 | Exclude: 3 | - 'bin/**/*' 4 | - 'vendor/**/*' 5 | TargetRubyVersion: 2.3 6 | 7 | Metrics/LineLength: 8 | Enabled: false 9 | 10 | Metrics/ClassLength: 11 | Enabled: false 12 | 13 | Metrics/BlockLength: 14 | Enabled: false 15 | 16 | Metrics/MethodLength: 17 | Enabled: false 18 | 19 | Metrics/AbcSize: 20 | Enabled: false 21 | 22 | Metrics/PerceivedComplexity: 23 | Enabled: false 24 | 25 | Metrics/CyclomaticComplexity: 26 | Enabled: false 27 | 28 | Style/FrozenStringLiteralComment: 29 | Enabled: false 30 | 31 | Style/RedundantReturn: 32 | Enabled: false 33 | 34 | Lint/ScriptPermission: 35 | Enabled: false 36 | 37 | Naming/UncommunicativeMethodParamName: 38 | Enabled: false 39 | 40 | Naming/VariableName: 41 | Enabled: false 42 | 43 | Style/DateTime: 44 | Enabled: false 45 | 46 | # Only disabled until the cyclomatic complexity method in measure.rb (ported from bonnie-bundler) is rewritten 47 | Lint/NestedMethodDefinition: 48 | Enabled: false 49 | -------------------------------------------------------------------------------- /app/models/qdm/medication_discharge.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/medication_discharge.rb 3 | class MedicationDischarge < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :refills, type: Integer 8 | field :dosage, type: QDM::Quantity 9 | field :supply, type: QDM::Quantity 10 | field :frequency, type: QDM::Code 11 | field :daysSupplied, type: Integer 12 | field :route, type: QDM::Code 13 | field :negationRationale, type: QDM::Code 14 | embeds_many :prescriber, class_name: 'QDM::Entity' 15 | embeds_many :recorder, class_name: 'QDM::Entity' 16 | field :qdmTitle, type: String, default: 'Medication, Discharge' 17 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.48' 18 | field :qdmCategory, type: String, default: 'medication' 19 | field :qdmStatus, type: String, default: 'discharge' 20 | field :qdmVersion, type: String, default: '5.6' 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /app/models/qdm/assessment_performed.rb: -------------------------------------------------------------------------------- 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 :relevantDatetime, type: DateTime 8 | field :relevantPeriod, type: QDM::Interval 9 | field :negationRationale, type: QDM::Code 10 | field :reason, type: QDM::Code 11 | field :method, type: QDM::Code 12 | field :result 13 | field :interpretation, type: QDM::Code 14 | field :components, type: Array 15 | field :relatedTo, type: Array 16 | embeds_many :performer, class_name: 'QDM::Entity' 17 | field :qdmTitle, type: String, default: 'Assessment, Performed' 18 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.117' 19 | field :qdmCategory, type: String, default: 'assessment' 20 | field :qdmStatus, type: String, default: 'performed' 21 | field :qdmVersion, type: String, default: '5.6' 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /app/models/qdm/physical_exam_performed.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/physical_exam_performed.rb 3 | class PhysicalExamPerformed < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :relevantDatetime, type: DateTime 8 | field :relevantPeriod, type: QDM::Interval 9 | field :reason, type: QDM::Code 10 | field :method, type: QDM::Code 11 | field :result 12 | field :anatomicalLocationSite, type: QDM::Code 13 | field :negationRationale, type: QDM::Code 14 | field :components, type: Array 15 | embeds_many :performer, class_name: 'QDM::Entity' 16 | field :relatedTo, type: Array 17 | field :qdmTitle, type: String, default: 'Physical Exam, Performed' 18 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.62' 19 | field :qdmCategory, type: String, default: 'physical_exam' 20 | field :qdmStatus, type: String, default: 'performed' 21 | field :qdmVersion, type: String, default: '5.6' 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /app/assets/javascripts/cqm/CQLLibrary.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | const { StatementDependencySchema } = require('./CQLStatementDependency'); 3 | 4 | const [Mixed, mDate] = [ 5 | mongoose.Schema.Types.Mixed, 6 | mongoose.Schema.Types.Date, 7 | ]; 8 | 9 | const CQLLibrarySchema = new mongoose.Schema( 10 | { 11 | library_name: String, 12 | library_version: String, 13 | cql: String, 14 | elm: Mixed, 15 | elm_annotations: Mixed, 16 | is_main_library: { type: Boolean, default: false }, 17 | is_top_level: { type: Boolean, default: true }, 18 | statement_dependencies: [StatementDependencySchema], 19 | }, 20 | // Options 21 | { 22 | timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }, // These are the Mongoid conventions for timestamps 23 | } 24 | ); 25 | 26 | module.exports.CQLLibrarySchema = CQLLibrarySchema; 27 | class CQLLibrary extends mongoose.Document { 28 | constructor(object) { 29 | super(object, CQLLibrarySchema); 30 | } 31 | } 32 | module.exports.CQLLibrary = CQLLibrary; 33 | -------------------------------------------------------------------------------- /app/models/qdm/encounter_performed.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/encounter_performed.rb 3 | class EncounterPerformed < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :admissionSource, type: QDM::Code 8 | field :clazz, type: QDM::Code 9 | field :relevantPeriod, type: QDM::Interval 10 | field :dischargeDisposition, type: QDM::Code 11 | field :facilityLocations, type: Array, default: [] 12 | field :diagnoses, type: Array 13 | field :lengthOfStay, type: QDM::Quantity 14 | field :priority, type: QDM::Code 15 | embeds_many :participant, class_name: 'QDM::Entity' 16 | field :relatedTo, type: Array 17 | field :qdmTitle, type: String, default: 'Encounter, Performed' 18 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.5' 19 | field :qdmCategory, type: String, default: 'encounter' 20 | field :qdmStatus, type: String, default: 'performed' 21 | field :qdmVersion, type: String, default: '5.6' 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /app/models/cqm/statement_result.rb: -------------------------------------------------------------------------------- 1 | module CQM 2 | # StatementResult is used to store statement result information in IndividualResult 3 | class StatementResult 4 | include Mongoid::Document 5 | include Mongoid::Timestamps 6 | 7 | # These are the Mongoid equivalent of the Mongoose "enum" attribute for the respective fields. 8 | # They throw an error if you try to assign a value that's not in the array. 9 | validates_inclusion_of :relevance, in: %w[NA TRUE FALSE] 10 | 11 | # Library the clause this result is for is in 12 | field :library_name, type: String 13 | # Statment the clause this result is for is in 14 | field :statement_name, type: String 15 | # LocalId of the clause this result is for 16 | field :pretty, type: String 17 | # Final, processed result of raw calculation 18 | field :final, type: String 19 | # Raw result of clause calculation 20 | field :raw 21 | 22 | field :relevance, type: String 23 | 24 | # Relations to other model classes 25 | embedded_in :individual_result 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /app/assets/javascripts/attributes/Location.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { EntitySchemaFunction } = require('./Entity'); 4 | const Code = require('../basetypes/Code'); 5 | const Interval = require('../basetypes/Interval'); 6 | const Quantity = require('../basetypes/Quantity'); 7 | const DateTime = require('../basetypes/DateTime'); 8 | const QDMDate = require('../basetypes/QDMDate'); 9 | const Any = require('../basetypes/Any'); 10 | 11 | const [Number, String] = [ 12 | mongoose.Schema.Types.Number, 13 | mongoose.Schema.Types.String, 14 | ]; 15 | 16 | const LocationSchema = EntitySchemaFunction({ 17 | locationType: Code, 18 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.142' }, 19 | _type: { type: String, default: 'QDM::Location' }, 20 | 21 | }); 22 | 23 | module.exports.LocationSchema = LocationSchema; 24 | class Location extends mongoose.Document { 25 | constructor(object) { 26 | super(object, LocationSchema); 27 | this._type = 'QDM::Location'; 28 | } 29 | } 30 | 31 | module.exports.Location = Location; 32 | 33 | -------------------------------------------------------------------------------- /app/assets/javascripts/cqm/Provider.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const [Schema, String, Boolean] = [ 4 | mongoose.Schema, 5 | mongoose.Schema.Types.String, 6 | mongoose.Schema.Types.Boolean, 7 | ]; 8 | 9 | const AddressSchema = new mongoose.Schema({ 10 | street: [String], 11 | city: String, 12 | state: String, 13 | zip: String, 14 | country: String, 15 | use: String, 16 | }); 17 | 18 | const TelecomSchema = new mongoose.Schema({ 19 | use: String, 20 | value: String, 21 | preferred: Boolean, 22 | }); 23 | 24 | const ProviderSchema = new Schema({ 25 | _type: { type: String, default: 'Provider' }, 26 | 27 | givenNames: [String], 28 | familyName: String, 29 | specialty: String, 30 | title: String, 31 | addresses: [AddressSchema], 32 | telecoms: [TelecomSchema], 33 | 34 | }, { id: false }); 35 | 36 | module.exports.ProviderSchema = ProviderSchema; 37 | class Provider extends mongoose.Document { 38 | constructor(object) { 39 | super(object, ProviderSchema); 40 | } 41 | } 42 | module.exports.Provider = Provider; 43 | -------------------------------------------------------------------------------- /app/assets/javascripts/attributes/ResultComponent.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { ComponentSchemaFunction } = require('./Component'); 4 | const Code = require('../basetypes/Code'); 5 | const Interval = require('../basetypes/Interval'); 6 | const Quantity = require('../basetypes/Quantity'); 7 | const DateTime = require('../basetypes/DateTime'); 8 | const QDMDate = require('../basetypes/QDMDate'); 9 | const Any = require('../basetypes/Any'); 10 | 11 | const [Number, String] = [ 12 | mongoose.Schema.Types.Number, 13 | mongoose.Schema.Types.String, 14 | ]; 15 | 16 | const ResultComponentSchema = ComponentSchemaFunction({ 17 | referenceRange: Interval, 18 | _type: { type: String, default: 'QDM::ResultComponent' }, 19 | 20 | }); 21 | 22 | module.exports.ResultComponentSchema = ResultComponentSchema; 23 | class ResultComponent extends mongoose.Document { 24 | constructor(object) { 25 | super(object, ResultComponentSchema); 26 | this._type = 'QDM::ResultComponent'; 27 | } 28 | } 29 | 30 | module.exports.ResultComponent = ResultComponent; 31 | 32 | -------------------------------------------------------------------------------- /app/models/qdm/medication_order.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/medication_order.rb 3 | class MedicationOrder < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :relevantPeriod, type: QDM::Interval 8 | field :refills, type: Integer 9 | field :dosage, type: QDM::Quantity 10 | field :supply, type: QDM::Quantity 11 | field :frequency, type: QDM::Code 12 | field :daysSupplied, type: Integer 13 | field :route, type: QDM::Code 14 | field :setting, type: QDM::Code 15 | field :reason, type: QDM::Code 16 | field :negationRationale, type: QDM::Code 17 | embeds_many :prescriber, class_name: 'QDM::Entity' 18 | field :relatedTo, type: Array 19 | field :qdmTitle, type: String, default: 'Medication, Order' 20 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.51' 21 | field :qdmCategory, type: String, default: 'medication' 22 | field :qdmStatus, type: String, default: 'order' 23 | field :qdmVersion, type: String, default: '5.6' 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /app/assets/javascripts/attributes/FacilityLocation.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const Code = require('../basetypes/Code'); 4 | const Interval = require('../basetypes/Interval'); 5 | const Quantity = require('../basetypes/Quantity'); 6 | const DateTime = require('../basetypes/DateTime'); 7 | const QDMDate = require('../basetypes/QDMDate'); 8 | const Any = require('../basetypes/Any'); 9 | 10 | 11 | const [Number, String] = [ 12 | mongoose.Schema.Types.Number, 13 | mongoose.Schema.Types.String, 14 | ]; 15 | 16 | const FacilityLocationSchema = new mongoose.Schema({ 17 | code: Code, 18 | locationPeriod: Interval, 19 | qdmVersion: { type: String, default: '5.6' }, 20 | _type: { type: String, default: 'QDM::FacilityLocation' }, 21 | 22 | }); 23 | 24 | module.exports.FacilityLocationSchema = FacilityLocationSchema; 25 | class FacilityLocation extends mongoose.Document { 26 | constructor(object) { 27 | super(object, FacilityLocationSchema); 28 | this._type = 'QDM::FacilityLocation'; 29 | } 30 | } 31 | 32 | module.exports.FacilityLocation = FacilityLocation; 33 | 34 | -------------------------------------------------------------------------------- /spec/cqm/encounter_performed_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | RSpec.describe QDM::EncounterPerformed do 4 | it 'persist EncounterPerformed details for a patient' do 5 | expect do 6 | @patient = CQM::Patient.new(givenNames: %w['Example Patient'], familyName: 'C-cee', bundleId: 'C') 7 | @patient.qdmPatient.birthDatetime = 15.years.ago 8 | encounter_performed = QDM::EncounterPerformed.new( 9 | 'authorDatetime' => '2012-08-21T08:00:00.000+00:00', 10 | 'class' => { 11 | 'code' => '111297003', 12 | 'system' => 'SNOMED-CT' 13 | }, 14 | 'relevantPeriod' => { 15 | 'low' => '2012-08-21T08:00:00.000+00:00', 16 | 'high' => '2012-12-19T08:15:00.000+00:00', 17 | 'lowClosed' => true, 18 | 'highClosed' => true 19 | }, 20 | 'diagnoses' => [ 21 | { 22 | 'code' => '111297002', 23 | 'system' => 'SNOMED-CT' 24 | } 25 | ] 26 | ) 27 | @patient.qdmPatient.dataElements << encounter_performed 28 | @patient.save! 29 | end.to_not raise_error 30 | end 31 | end 32 | -------------------------------------------------------------------------------- /app/models/qdm/medication_dispensed.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/medication_dispensed.rb 3 | class MedicationDispensed < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :relevantDatetime, type: DateTime 8 | field :relevantPeriod, type: QDM::Interval 9 | field :refills, type: Integer 10 | field :dosage, type: QDM::Quantity 11 | field :supply, type: QDM::Quantity 12 | field :frequency, type: QDM::Code 13 | field :daysSupplied, type: Integer 14 | field :route, type: QDM::Code 15 | embeds_many :prescriber, class_name: 'QDM::Entity' 16 | embeds_many :dispenser, class_name: 'QDM::Entity' 17 | field :negationRationale, type: QDM::Code 18 | field :relatedTo, type: Array 19 | field :qdmTitle, type: String, default: 'Medication, Dispensed' 20 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.49' 21 | field :qdmCategory, type: String, default: 'medication' 22 | field :qdmStatus, type: String, default: 'dispensed' 23 | field :qdmVersion, type: String, default: '5.6' 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /app/assets/javascripts/attributes/DiagnosisComponent.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const Code = require('../basetypes/Code'); 4 | const Interval = require('../basetypes/Interval'); 5 | const Quantity = require('../basetypes/Quantity'); 6 | const DateTime = require('../basetypes/DateTime'); 7 | const QDMDate = require('../basetypes/QDMDate'); 8 | const Any = require('../basetypes/Any'); 9 | 10 | 11 | const [Number, String] = [ 12 | mongoose.Schema.Types.Number, 13 | mongoose.Schema.Types.String, 14 | ]; 15 | 16 | const DiagnosisComponentSchema = new mongoose.Schema({ 17 | code: Code, 18 | presentOnAdmissionIndicator: Code, 19 | rank: Number, 20 | qdmVersion: { type: String, default: '5.6' }, 21 | _type: { type: String, default: 'QDM::DiagnosisComponent' }, 22 | 23 | }); 24 | 25 | module.exports.DiagnosisComponentSchema = DiagnosisComponentSchema; 26 | class DiagnosisComponent extends mongoose.Document { 27 | constructor(object) { 28 | super(object, DiagnosisComponentSchema); 29 | this._type = 'QDM::DiagnosisComponent'; 30 | } 31 | } 32 | 33 | module.exports.DiagnosisComponent = DiagnosisComponent; 34 | 35 | -------------------------------------------------------------------------------- /app/models/qdm/procedure_performed.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/procedure_performed.rb 3 | class ProcedurePerformed < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :relevantDatetime, type: DateTime 8 | field :relevantPeriod, type: QDM::Interval 9 | field :reason, type: QDM::Code 10 | field :method, type: QDM::Code 11 | field :result 12 | field :status, type: QDM::Code 13 | field :anatomicalLocationSite, type: QDM::Code 14 | field :rank, type: Integer 15 | field :incisionDatetime, type: DateTime 16 | field :negationRationale, type: QDM::Code 17 | field :components, type: Array 18 | embeds_many :performer, class_name: 'QDM::Entity' 19 | field :relatedTo, type: Array 20 | field :qdmTitle, type: String, default: 'Procedure, Performed' 21 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.67' 22 | field :qdmCategory, type: String, default: 'procedure' 23 | field :qdmStatus, type: String, default: 'performed' 24 | field :qdmVersion, type: String, default: '5.6' 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /app/assets/javascripts/attributes/PatientEntity.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { EntitySchemaFunction } = require('./Entity'); 4 | const Code = require('../basetypes/Code'); 5 | const Interval = require('../basetypes/Interval'); 6 | const Quantity = require('../basetypes/Quantity'); 7 | const DateTime = require('../basetypes/DateTime'); 8 | const QDMDate = require('../basetypes/QDMDate'); 9 | const Any = require('../basetypes/Any'); 10 | 11 | const [Number, String] = [ 12 | mongoose.Schema.Types.Number, 13 | mongoose.Schema.Types.String, 14 | ]; 15 | 16 | const PatientEntitySchema = EntitySchemaFunction({ 17 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.136' }, 18 | qrdaOid: { type: String, default: '2.16.840.1.113883.10.20.24.3.161' }, 19 | _type: { type: String, default: 'QDM::PatientEntity' }, 20 | 21 | }); 22 | 23 | module.exports.PatientEntitySchema = PatientEntitySchema; 24 | class PatientEntity extends mongoose.Document { 25 | constructor(object) { 26 | super(object, PatientEntitySchema); 27 | this._type = 'QDM::PatientEntity'; 28 | } 29 | } 30 | 31 | module.exports.PatientEntity = PatientEntity; 32 | 33 | -------------------------------------------------------------------------------- /app/assets/javascripts/attributes/CarePartner.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { EntitySchemaFunction } = require('./Entity'); 4 | const Code = require('../basetypes/Code'); 5 | const Interval = require('../basetypes/Interval'); 6 | const Quantity = require('../basetypes/Quantity'); 7 | const DateTime = require('../basetypes/DateTime'); 8 | const QDMDate = require('../basetypes/QDMDate'); 9 | const Any = require('../basetypes/Any'); 10 | 11 | const [Number, String] = [ 12 | mongoose.Schema.Types.Number, 13 | mongoose.Schema.Types.String, 14 | ]; 15 | 16 | const CarePartnerSchema = EntitySchemaFunction({ 17 | relationship: Code, 18 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.134' }, 19 | qrdaOid: { type: String, default: '2.16.840.1.113883.10.20.24.3.160' }, 20 | _type: { type: String, default: 'QDM::CarePartner' }, 21 | 22 | }); 23 | 24 | module.exports.CarePartnerSchema = CarePartnerSchema; 25 | class CarePartner extends mongoose.Document { 26 | constructor(object) { 27 | super(object, CarePartnerSchema); 28 | this._type = 'QDM::CarePartner'; 29 | } 30 | } 31 | 32 | module.exports.CarePartner = CarePartner; 33 | 34 | -------------------------------------------------------------------------------- /app/models/qdm/laboratory_test_performed.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/laboratory_test_performed.rb 3 | class LaboratoryTestPerformed < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :relevantDatetime, type: DateTime 8 | field :relevantPeriod, type: QDM::Interval 9 | field :status, type: QDM::Code 10 | field :method, type: QDM::Code 11 | field :result 12 | field :resultDatetime, type: DateTime 13 | field :reason, type: QDM::Code 14 | field :referenceRange, type: QDM::Interval 15 | field :interpretation, type: QDM::Code 16 | field :negationRationale, type: QDM::Code 17 | field :components, type: Array 18 | embeds_many :performer, class_name: 'QDM::Entity' 19 | field :relatedTo, type: Array 20 | field :qdmTitle, type: String, default: 'Laboratory Test, Performed' 21 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.42' 22 | field :qdmCategory, type: String, default: 'laboratory_test' 23 | field :qdmStatus, type: String, default: 'performed' 24 | field :qdmVersion, type: String, default: '5.6' 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /app/models/qdm/basetypes/date.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # Represents a QDM/CQL Date 3 | class Date 4 | attr_accessor :year, :month, :day 5 | 6 | def initialize(year = nil, month = nil, day = nil) 7 | @year = year 8 | @month = month 9 | @day = day 10 | end 11 | 12 | # Converts an object of this instance into a database friendly value. 13 | def mongoize 14 | "#{format('%04d', year)}-#{format('%02d', month)}-#{format('%02d', day)}" 15 | end 16 | 17 | class << self 18 | # Get the string as it was stored in the database, and instantiate 19 | # this custom class from it. 20 | def demongoize(date_str) 21 | return nil unless date_str 22 | 23 | year = date_str[0..3].to_i 24 | month = date_str[5..6].to_i 25 | day = date_str[8..10].to_i 26 | QDM::Date.new(year, month, day) 27 | end 28 | 29 | # Converts the object that was supplied to a criteria and converts it 30 | # into a database friendly form. 31 | def evolve(object) 32 | case object 33 | when QDM::Date then object.mongoize 34 | else object 35 | end 36 | end 37 | end 38 | end 39 | end 40 | -------------------------------------------------------------------------------- /app/assets/javascripts/attributes/Organization.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { EntitySchemaFunction } = require('./Entity'); 4 | const Code = require('../basetypes/Code'); 5 | const Interval = require('../basetypes/Interval'); 6 | const Quantity = require('../basetypes/Quantity'); 7 | const DateTime = require('../basetypes/DateTime'); 8 | const QDMDate = require('../basetypes/QDMDate'); 9 | const Any = require('../basetypes/Any'); 10 | 11 | const [Number, String] = [ 12 | mongoose.Schema.Types.Number, 13 | mongoose.Schema.Types.String, 14 | ]; 15 | 16 | const OrganizationSchema = EntitySchemaFunction({ 17 | organizationType: Code, 18 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.135' }, 19 | qrdaOid: { type: String, default: '2.16.840.1.113883.10.20.24.3.163' }, 20 | _type: { type: String, default: 'QDM::Organization' }, 21 | 22 | }); 23 | 24 | module.exports.OrganizationSchema = OrganizationSchema; 25 | class Organization extends mongoose.Document { 26 | constructor(object) { 27 | super(object, OrganizationSchema); 28 | this._type = 'QDM::Organization'; 29 | } 30 | } 31 | 32 | module.exports.Organization = Organization; 33 | 34 | -------------------------------------------------------------------------------- /app/models/qdm/diagnostic_study_performed.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # app/models/qdm/diagnostic_study_performed.rb 3 | class DiagnosticStudyPerformed < DataElement 4 | include Mongoid::Document 5 | embedded_in :patient 6 | field :authorDatetime, type: DateTime 7 | field :relevantDatetime, type: DateTime 8 | field :relevantPeriod, type: QDM::Interval 9 | field :reason, type: QDM::Code 10 | field :result 11 | field :resultDatetime, type: DateTime 12 | field :interpretation, type: QDM::Code 13 | field :status, type: QDM::Code 14 | field :method, type: QDM::Code 15 | field :facilityLocation, type: QDM::FacilityLocation 16 | field :negationRationale, type: QDM::Code 17 | field :components, type: Array 18 | embeds_many :performer, class_name: 'QDM::Entity' 19 | field :relatedTo, type: Array 20 | field :qdmTitle, type: String, default: 'Diagnostic Study, Performed' 21 | field :hqmfOid, type: String, default: '2.16.840.1.113883.10.20.28.4.23' 22 | field :qdmCategory, type: String, default: 'diagnostic_study' 23 | field :qdmStatus, type: String, default: 'performed' 24 | field :qdmVersion, type: String, default: '5.6' 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /app/assets/javascripts/basetypes/Code.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | const cql = require('cql-execution'); 3 | 4 | function Code(key, options) { 5 | mongoose.SchemaType.call(this, key, options, 'Code'); 6 | } 7 | Code.prototype = Object.create(mongoose.SchemaType.prototype); 8 | 9 | Code.prototype.cast = (code) => { 10 | if (code != null) { 11 | // return code if it doesn't even need casting 12 | if (code.isCode) { 13 | return code; 14 | } 15 | // handles codes that have not yet been cast to a code and those that have already been cast to a code 16 | if (code.code && code.system) { 17 | const val = { code: code.code, system: code.system }; 18 | val.display = (typeof code.display !== 'undefined') ? code.display : null; 19 | val.version = (typeof code.version !== 'undefined') ? code.version : null; 20 | 21 | return new cql.Code(val.code, val.system, val.version, val.display); 22 | } 23 | throw new Error(`Expected a code. Received ${code}.`); 24 | } else { 25 | // returns a null or undefined if what is passed in is null or undefined 26 | return code; 27 | } 28 | }; 29 | 30 | mongoose.Schema.Types.Code = Code; 31 | module.exports = Code; 32 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "airbnb-base", 3 | "rules": { 4 | "max-len": ["error", {"code": 200, "ignoreComments": true}], 5 | "no-multiple-empty-lines": "off", 6 | "import/extensions": "off", 7 | "max-classes-per-file": "off", 8 | "operator-linebreak": "off", 9 | "no-else-return": "off", 10 | "no-unused-vars": ["error", { "varsIgnorePattern": "EntitySchema|Identifier|IdentifierSchema|DataElementSchema|ComponentSchema|FacilityLocationSchema|Code|Quantity|Interval|Integer|Array|Float|Time|Number|Date|Mixed|Any" }], 11 | "camelcase": "off", 12 | "arrow-parens": "off", 13 | "comma-dangle": ["error", { 14 | "arrays": "always-multiline", 15 | "objects": "always-multiline", 16 | "imports": "always-multiline", 17 | "exports": "always-multiline", 18 | "functions": "ignore"}], 19 | "no-underscore-dangle": [ 20 | "error", 21 | { 22 | "allow": [ 23 | "_id", "_type", "_doc" 24 | ] 25 | } 26 | ], 27 | "no-param-reassign": [ 28 | "error", 29 | { 30 | "props": false 31 | } 32 | ] 33 | }, 34 | "env": { 35 | "jasmine": true, 36 | "browser": true, 37 | "node": true 38 | } 39 | } 40 | 41 | -------------------------------------------------------------------------------- /app/assets/javascripts/attributes/Practitioner.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { EntitySchemaFunction } = require('./Entity'); 4 | const Code = require('../basetypes/Code'); 5 | const Interval = require('../basetypes/Interval'); 6 | const Quantity = require('../basetypes/Quantity'); 7 | const DateTime = require('../basetypes/DateTime'); 8 | const QDMDate = require('../basetypes/QDMDate'); 9 | const Any = require('../basetypes/Any'); 10 | 11 | const [Number, String] = [ 12 | mongoose.Schema.Types.Number, 13 | mongoose.Schema.Types.String, 14 | ]; 15 | 16 | const PractitionerSchema = EntitySchemaFunction({ 17 | role: Code, 18 | specialty: Code, 19 | qualification: Code, 20 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.137' }, 21 | qrdaOid: { type: String, default: '2.16.840.1.113883.10.20.24.3.162' }, 22 | _type: { type: String, default: 'QDM::Practitioner' }, 23 | 24 | }); 25 | 26 | module.exports.PractitionerSchema = PractitionerSchema; 27 | class Practitioner extends mongoose.Document { 28 | constructor(object) { 29 | super(object, PractitionerSchema); 30 | this._type = 'QDM::Practitioner'; 31 | } 32 | } 33 | 34 | module.exports.Practitioner = Practitioner; 35 | 36 | -------------------------------------------------------------------------------- /app/assets/javascripts/cqm/Patient.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | const Code = require('../basetypes/Code'); 3 | const Interval = require('../basetypes/Interval'); 4 | const Quantity = require('../basetypes/Quantity'); 5 | const DateTime = require('../basetypes/DateTime'); 6 | const { QDMPatientSchema, QDMPatient } = require('../QDMPatient'); 7 | const { ProviderSchema } = require('./Provider'); 8 | 9 | const [Schema, Number, String, Mixed] = [ 10 | mongoose.Schema, 11 | mongoose.Schema.Types.Number, 12 | mongoose.Schema.Types.String, 13 | mongoose.Schema.Types.Mixed, 14 | ]; 15 | 16 | const PatientSchema = new Schema({ 17 | 18 | givenNames: [String], 19 | familyName: String, 20 | bundleId: String, 21 | expectedValues: [], 22 | notes: String, 23 | qdmPatient: QDMPatientSchema, 24 | providers: [ProviderSchema], 25 | measure_ids: [String], 26 | 27 | }, { id: false }); 28 | 29 | module.exports.PatientSchema = PatientSchema; 30 | class Patient extends mongoose.Document { 31 | constructor(object) { 32 | super(object, PatientSchema); 33 | if (this.qdmPatient) { 34 | this.qdmPatient = new QDMPatient(this.qdmPatient.toJSON()); 35 | } 36 | } 37 | } 38 | module.exports.Patient = Patient; 39 | -------------------------------------------------------------------------------- /app/assets/javascripts/basetypes/QDMDate.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | const cql = require('cql-execution'); 3 | 4 | // cql.Date constructor name overlaps with Mongoose Date, so a custom class (CqlDate) is added 5 | class CqlDate extends cql.Date {} 6 | function QDMDate(key, options) { 7 | mongoose.SchemaType.call(this, key, options, 'Date'); 8 | } 9 | QDMDate.prototype = Object.create(mongoose.SchemaType.prototype); 10 | 11 | QDMDate.prototype.cast = (date) => { 12 | if (date == null) { 13 | return date; 14 | } 15 | 16 | // Already a CQL Date 17 | if (date.isDate) { 18 | return date; 19 | } 20 | 21 | // Object 22 | if (typeof date === 'object') { 23 | const keys = Object.keys(date); 24 | if (keys.includes('year') && keys.includes('month') && keys.includes('day')) { 25 | return new CqlDate(date.year, date.month, date.day); 26 | } 27 | } 28 | 29 | // Date String 30 | const parsedDate = cql.Date.parse(date); 31 | if (!parsedDate) { 32 | throw new Error(`Date: ${date} is not a valid Date`); 33 | } else { 34 | return new CqlDate(parsedDate.year, parsedDate.month, parsedDate.day); 35 | } 36 | }; 37 | 38 | mongoose.Schema.Types.QDMDate = QDMDate; 39 | module.exports = QDMDate; 40 | -------------------------------------------------------------------------------- /lib/generators/custom_mongo/model_generator.rb: -------------------------------------------------------------------------------- 1 | require 'rails/generators/named_base' 2 | require 'rails/generators/active_model' 3 | require File.join(Gem::Specification.find_by_name('mongoid').gem_dir, 'lib/rails/generators/mongoid/model/model_generator.rb') 4 | 5 | module Rails 6 | module Generators 7 | # Extend this class to add the "default" field used in the generator. 8 | class GeneratedAttribute 9 | attr_accessor :default 10 | end 11 | end 12 | end 13 | 14 | module CustomMongo 15 | module Generators 16 | # Extend this class to add the "default" field. 17 | class ModelGenerator < ::Mongoid::Generators::ModelGenerator 18 | def initialize(args, *options) 19 | custom_attributes = args[1] 20 | args = [args[0]] # "super" expects the name as arg[0], then we custom parse the attributes 21 | super 22 | self.attributes = custom_attributes.map do |attribute| 23 | att = Rails::Generators::GeneratedAttribute.new(attribute[:name], attribute[:type].to_sym) 24 | att.default = attribute[:default] 25 | att 26 | end 27 | end 28 | 29 | def create_model_file 30 | template File.join(File.dirname(__FILE__), 'model.rb.tt'), File.join('app/models', class_path, "#{file_name}.rb") 31 | end 32 | end 33 | end 34 | end 35 | -------------------------------------------------------------------------------- /app/assets/javascripts/basetypes/Interval.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | const cql = require('cql-execution'); 3 | const DateTime = require('./DateTime'); 4 | 5 | function Interval(key, options) { 6 | mongoose.SchemaType.call(this, key, options, 'Interval'); 7 | } 8 | Interval.prototype = Object.create(mongoose.SchemaType.prototype); 9 | 10 | Interval.prototype.cast = (interval) => { 11 | if (interval.isInterval) { 12 | return interval; 13 | } 14 | const casted = new cql.Interval(interval.low, interval.high, interval.lowClosed, interval.highClosed); 15 | 16 | // Cast Low and High values to Quantities if it is a quantity 17 | if (casted.low && casted.low.unit && casted.low.value) { 18 | casted.low = new cql.Quantity(casted.low.value, casted.low.unit); 19 | if (casted.high && casted.high.unit && casted.high.value) { 20 | casted.high = new cql.Quantity(casted.high.value, casted.high.unit); 21 | } 22 | return casted; 23 | } 24 | 25 | // Cast to DateTime if it is a string representing a DateTime 26 | if (casted.low) { 27 | casted.low = DateTime.prototype.cast(casted.low); 28 | } 29 | 30 | if (casted.high) { 31 | casted.high = DateTime.prototype.cast(casted.high); 32 | } 33 | return casted; 34 | }; 35 | 36 | mongoose.Schema.Types.Interval = Interval; 37 | module.exports = Interval; 38 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Pull requests into cqm-models require the following. Submitter and reviewer should :white_check_mark: when done. For items that are not-applicable, note it's not-applicable ("N/A") and :white_check_mark:. 2 | 3 | **Submitter:** 4 | - [ ] This pull request describes why these changes were made. 5 | - [ ] Internal ticket for this PR: 6 | - [ ] Internal ticket links to this PR 7 | - [ ] Code diff has been done and been reviewed 8 | - [ ] Tests are included and test edge cases 9 | - [ ] Tests have been run locally and pass 10 | - [ ] If applicable, the library version number in `package.json` and `cqm-models.gemspec` has been updated 11 | - [ ] Cqm-execution fixtures have been updated with the update_cqm_execution_fixtures.sh script inside server-scripts using this branch in the cqm-converter 12 | 13 | **MADiE Reviewer:** 14 | 15 | Name: 16 | - [ ] Code is maintainable and reusable, reuses existing code and infrastructure where appropriate, and accomplishes the task’s purpose 17 | - [ ] The tests appropriately test the new code, including edge cases 18 | - [ ] You have tried to break the code 19 | 20 | **Cypress Reviewer:** 21 | 22 | Name: 23 | - [ ] Code is maintainable and reusable, reuses existing code and infrastructure where appropriate, and accomplishes the task’s purpose 24 | - [ ] The tests appropriately test the new code, including edge cases 25 | - [ ] You have tried to break the code 26 | -------------------------------------------------------------------------------- /spec/cqm/individual_result_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | RSpec.describe CQM::IndividualResult do 4 | it 'preserves all statement results in array hash conversion' do 5 | results = JSON.parse(File.read(File.join('spec', 'fixtures', 'results', 'example_results.json'))) 6 | result = results['5b479b890a97b16d73ba4740']['PopulationCriteria1'] 7 | individual_result = CQM::IndividualResult.new(result) 8 | statement_result_length = individual_result.statement_results.length 9 | results_hash = individual_result.statement_results_by_statement 10 | hash_total = results_hash['DischargedonStatinMedication'].length + results_hash['TJC_Overall'].length + results_hash['MATGlobalCommonFunctions'].length 11 | expect(statement_result_length).to equal hash_total 12 | end 13 | 14 | it 'preserves all clause results in array hash conversion' do 15 | results = JSON.parse(File.read(File.join('spec', 'fixtures', 'results', 'example_results.json'))) 16 | result = results['5b479b890a97b16d73ba4740']['PopulationCriteria1'] 17 | individual_result = CQM::IndividualResult.new(result) 18 | clause_result_length = individual_result.clause_results.length 19 | results_hash = individual_result.clause_results_by_clause 20 | hash_total = results_hash['DischargedonStatinMedication'].length + results_hash['TJC_Overall'].length + results_hash['MATGlobalCommonFunctions'].length 21 | expect(clause_result_length).to equal hash_total 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /app/assets/javascripts/cqm/StatementResult.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const [String, Mixed] = [ 4 | mongoose.Schema.Types.String, 5 | mongoose.Schema.Types.Mixed, 6 | ]; 7 | 8 | const StatementResultSchema = mongoose.Schema({ 9 | // Library the statement this result is for is in 10 | library_name: String, 11 | // Statement this result is for is in 12 | statement_name: String, 13 | // Result, processed for display, of the statement this result is for 14 | pretty: String, 15 | // Final, processed result of raw calculation 16 | final: String, 17 | // Raw result of clause calculation 18 | raw: Mixed, 19 | /* 20 | * 'NA' - Not applicable. This statement is not relevant to any population calculation in this population_set. Common 21 | * for unused library statements or statements only used for other population sets. 22 | * 23 | * 'FALSE' - This statement is not relevant to any of this patient's population inclusion calculations. 24 | * 25 | * 'TRUE' - This statement is relevant for one or more of the population inclusion calculations. 26 | */ 27 | relevance: { 28 | type: String, 29 | enum: ['NA', 'TRUE', 'FALSE'], 30 | default: 'NA', 31 | }, 32 | }); 33 | 34 | 35 | module.exports.StatementResultSchema = StatementResultSchema; 36 | class StatementResult extends mongoose.Document { 37 | constructor(object) { 38 | super(object, StatementResultSchema); 39 | } 40 | } 41 | module.exports.StatementResult = StatementResult; 42 | -------------------------------------------------------------------------------- /cqm-models.gemspec: -------------------------------------------------------------------------------- 1 | lib = File.expand_path('lib', __dir__) 2 | 3 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 4 | 5 | Gem::Specification.new do |spec| 6 | spec.name = 'cqm-models' 7 | spec.version = '4.2.5' 8 | spec.authors = ['aholmes@mitre.org', 'mokeefe@mitre.org', 'lades@mitre.org'] 9 | 10 | spec.summary = 'Mongo models that correspond to the QDM specification.' 11 | spec.description = 'This library contains auto generated Mongo (Mongoid) models that correspond to the QDM (Quality Data Model) specification.' 12 | spec.homepage = 'https://github.com/projecttacoma/cqm-models' 13 | spec.license = 'Apache-2.0' 14 | 15 | spec.files = `git ls-files -z`.split("\x0").reject do |f| 16 | f.match(%r{^(test|spec|features)/}) 17 | end 18 | spec.bindir = 'exe' 19 | spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } 20 | spec.require_paths = ['lib'] 21 | 22 | spec.add_development_dependency 'bundle-audit' 23 | spec.add_development_dependency 'byebug', '~> 11.0.1' 24 | spec.add_development_dependency 'codecov' 25 | spec.add_development_dependency 'mongoid', '~> 8' 26 | spec.add_development_dependency 'nokogiri', '>= 1.16.2' 27 | spec.add_development_dependency 'rails', '~> 7.1' 28 | spec.add_development_dependency 'rake', '~> 12.3.3' 29 | spec.add_development_dependency 'rspec', '~> 3.0' 30 | spec.add_development_dependency 'rubocop', '~> 0.63.0' 31 | spec.add_development_dependency 'simplecov' 32 | end 33 | -------------------------------------------------------------------------------- /app/assets/javascripts/Participation.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const ParticipationSchema = DataElementSchema({ 23 | participationPeriod: Interval, 24 | qdmTitle: { type: String, default: 'Participation' }, 25 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.130' }, 26 | qdmCategory: { type: String, default: 'participation' }, 27 | qdmVersion: { type: String, default: '5.6' }, 28 | _type: { type: String, default: 'QDM::Participation' }, 29 | 30 | }); 31 | 32 | module.exports.ParticipationSchema = ParticipationSchema; 33 | class Participation extends mongoose.Document { 34 | constructor(object) { 35 | super(object, ParticipationSchema); 36 | this._type = 'QDM::Participation'; 37 | } 38 | } 39 | 40 | module.exports.Participation = Participation; 41 | 42 | -------------------------------------------------------------------------------- /app/assets/javascripts/RelatedPerson.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const RelatedPersonSchema = DataElementSchema({ 23 | identifier: IdentifierSchema, 24 | linkedPatientId: String, 25 | qdmTitle: { type: String, default: 'Related Person' }, 26 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.141' }, 27 | qdmCategory: { type: String, default: 'related_person' }, 28 | qdmVersion: { type: String, default: '5.6' }, 29 | _type: { type: String, default: 'QDM::RelatedPerson' }, 30 | 31 | }); 32 | 33 | module.exports.RelatedPersonSchema = RelatedPersonSchema; 34 | class RelatedPerson extends mongoose.Document { 35 | constructor(object) { 36 | super(object, RelatedPersonSchema); 37 | this._type = 'QDM::RelatedPerson'; 38 | } 39 | } 40 | 41 | module.exports.RelatedPerson = RelatedPerson; 42 | 43 | -------------------------------------------------------------------------------- /app/assets/javascripts/CareGoal.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const CareGoalSchema = DataElementSchema({ 23 | statusDate: QDMDate, 24 | relevantPeriod: Interval, 25 | relatedTo: [String], 26 | targetOutcome: Any, 27 | performer: [AnyEntity], 28 | qdmTitle: { type: String, default: 'Care Goal' }, 29 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.7' }, 30 | qdmCategory: { type: String, default: 'care_goal' }, 31 | qdmVersion: { type: String, default: '5.6' }, 32 | _type: { type: String, default: 'QDM::CareGoal' }, 33 | 34 | }); 35 | 36 | module.exports.CareGoalSchema = CareGoalSchema; 37 | class CareGoal extends mongoose.Document { 38 | constructor(object) { 39 | super(object, CareGoalSchema); 40 | this._type = 'QDM::CareGoal'; 41 | } 42 | } 43 | 44 | module.exports.CareGoal = CareGoal; 45 | 46 | -------------------------------------------------------------------------------- /spec/javascript/unit/individual_result_spec.js: -------------------------------------------------------------------------------- 1 | const CQM = require('./../../../app/assets/javascripts/cqm/AllCQMModels') 2 | const results_file = require('../../fixtures/results/example_results.json') 3 | 4 | describe('CQM', () => { 5 | describe('IndividualResult', () => { 6 | it ('preserves all statement results in array hash conversion', () => { 7 | result = results_file['5b479b890a97b16d73ba4740']['PopulationCriteria1'] 8 | individual_result = new CQM.IndividualResult(result) 9 | statement_result_length = individual_result.statement_results.length 10 | results_hash = individual_result.statement_results_by_statement() 11 | hash_total = Object.keys(results_hash['DischargedonStatinMedication']).length 12 | hash_total += Object.keys(results_hash['TJC_Overall']).length 13 | hash_total += Object.keys(results_hash['MATGlobalCommonFunctions']).length 14 | expect(statement_result_length).toEqual(hash_total) 15 | }); 16 | 17 | it ('preserves all clause results in array hash conversion', () => { 18 | result = results_file['5b479b890a97b16d73ba4740']['PopulationCriteria1'] 19 | individual_result = new CQM.IndividualResult(result) 20 | clause_result_length = individual_result.clause_results.length 21 | results_hash = individual_result.clause_results_by_clause() 22 | hash_total = Object.keys(results_hash['DischargedonStatinMedication']).length 23 | hash_total += Object.keys(results_hash['TJC_Overall']).length 24 | hash_total += Object.keys(results_hash['MATGlobalCommonFunctions']).length 25 | expect(clause_result_length).toEqual(hash_total) 26 | }); 27 | }); 28 | }); -------------------------------------------------------------------------------- /app/assets/javascripts/Symptom.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const SymptomSchema = DataElementSchema({ 23 | prevalencePeriod: Interval, 24 | severity: Code, 25 | recorder: [AnyEntity], 26 | qdmTitle: { type: String, default: 'Symptom' }, 27 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.116' }, 28 | qrdaOid: { type: String, default: '2.16.840.1.113883.10.20.24.3.136' }, 29 | qdmCategory: { type: String, default: 'symptom' }, 30 | qdmVersion: { type: String, default: '5.6' }, 31 | _type: { type: String, default: 'QDM::Symptom' }, 32 | 33 | }); 34 | 35 | module.exports.SymptomSchema = SymptomSchema; 36 | class Symptom extends mongoose.Document { 37 | constructor(object) { 38 | super(object, SymptomSchema); 39 | this._type = 'QDM::Symptom'; 40 | } 41 | } 42 | 43 | module.exports.Symptom = Symptom; 44 | 45 | -------------------------------------------------------------------------------- /app/models/qdm/basetypes/quantity.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # Represents a Quantity 3 | class Quantity 4 | attr_accessor :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, _type: 'QDM::Quantity' } 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 | 26 | object = object.symbolize_keys 27 | QDM::Quantity.new(object[:value], object[:unit]) if object.is_a?(Hash) 28 | end 29 | 30 | # Takes any possible object and converts it to how it would be 31 | # stored in the database. 32 | def mongoize(object) 33 | case object 34 | when nil then nil 35 | when QDM::Quantity then object.mongoize 36 | when Hash 37 | object = object.symbolize_keys 38 | QDM::Quantity.new(object[:value], object[:unit]).mongoize 39 | else object 40 | end 41 | end 42 | 43 | # Converts the object that was supplied to a criteria and converts it 44 | # into a database friendly form. 45 | def evolve(object) 46 | case object 47 | when QDM::Quantity then object.mongoize 48 | else object 49 | end 50 | end 51 | end 52 | end 53 | end 54 | -------------------------------------------------------------------------------- /app/assets/javascripts/PatientCharacteristic.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const PatientCharacteristicSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | qdmTitle: { type: String, default: 'Patient Characteristic' }, 25 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.53' }, 26 | qdmCategory: { type: String, default: 'patient_characteristic' }, 27 | qdmVersion: { type: String, default: '5.6' }, 28 | _type: { type: String, default: 'QDM::PatientCharacteristic' }, 29 | 30 | }); 31 | 32 | module.exports.PatientCharacteristicSchema = PatientCharacteristicSchema; 33 | class PatientCharacteristic extends mongoose.Document { 34 | constructor(object) { 35 | super(object, PatientCharacteristicSchema); 36 | this._type = 'QDM::PatientCharacteristic'; 37 | } 38 | } 39 | 40 | module.exports.PatientCharacteristic = PatientCharacteristic; 41 | 42 | -------------------------------------------------------------------------------- /app/assets/javascripts/DeviceOrder.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const DeviceOrderSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | negationRationale: Code, 25 | reason: Code, 26 | requester: [AnyEntity], 27 | qdmTitle: { type: String, default: 'Device, Order' }, 28 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.15' }, 29 | qdmCategory: { type: String, default: 'device' }, 30 | qdmStatus: { type: String, default: 'order' }, 31 | qdmVersion: { type: String, default: '5.6' }, 32 | _type: { type: String, default: 'QDM::DeviceOrder' }, 33 | 34 | }); 35 | 36 | module.exports.DeviceOrderSchema = DeviceOrderSchema; 37 | class DeviceOrder extends mongoose.Document { 38 | constructor(object) { 39 | super(object, DeviceOrderSchema); 40 | this._type = 'QDM::DeviceOrder'; 41 | } 42 | } 43 | 44 | module.exports.DeviceOrder = DeviceOrder; 45 | 46 | -------------------------------------------------------------------------------- /app/assets/javascripts/PatientCareExperience.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const PatientCareExperienceSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | recorder: [AnyEntity], 25 | qdmTitle: { type: String, default: 'Patient Care Experience' }, 26 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.52' }, 27 | qdmCategory: { type: String, default: 'care_experience' }, 28 | qdmVersion: { type: String, default: '5.6' }, 29 | _type: { type: String, default: 'QDM::PatientCareExperience' }, 30 | 31 | }); 32 | 33 | module.exports.PatientCareExperienceSchema = PatientCareExperienceSchema; 34 | class PatientCareExperience extends mongoose.Document { 35 | constructor(object) { 36 | super(object, PatientCareExperienceSchema); 37 | this._type = 'QDM::PatientCareExperience'; 38 | } 39 | } 40 | 41 | module.exports.PatientCareExperience = PatientCareExperience; 42 | 43 | -------------------------------------------------------------------------------- /app/assets/javascripts/ProviderCareExperience.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const ProviderCareExperienceSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | recorder: [AnyEntity], 25 | qdmTitle: { type: String, default: 'Provider Care Experience' }, 26 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.70' }, 27 | qdmCategory: { type: String, default: 'care_experience' }, 28 | qdmVersion: { type: String, default: '5.6' }, 29 | _type: { type: String, default: 'QDM::ProviderCareExperience' }, 30 | 31 | }); 32 | 33 | module.exports.ProviderCareExperienceSchema = ProviderCareExperienceSchema; 34 | class ProviderCareExperience extends mongoose.Document { 35 | constructor(object) { 36 | super(object, ProviderCareExperienceSchema); 37 | this._type = 'QDM::ProviderCareExperience'; 38 | } 39 | } 40 | 41 | module.exports.ProviderCareExperience = ProviderCareExperience; 42 | 43 | -------------------------------------------------------------------------------- /app/assets/javascripts/FamilyHistory.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const FamilyHistorySchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | relationship: Code, 25 | recorder: [AnyEntity], 26 | qdmTitle: { type: String, default: 'Family History' }, 27 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.111' }, 28 | qrdaOid: { type: String, default: '2.16.840.1.113883.10.20.24.3.12' }, 29 | qdmCategory: { type: String, default: 'family_history' }, 30 | qdmVersion: { type: String, default: '5.6' }, 31 | _type: { type: String, default: 'QDM::FamilyHistory' }, 32 | 33 | }); 34 | 35 | module.exports.FamilyHistorySchema = FamilyHistorySchema; 36 | class FamilyHistory extends mongoose.Document { 37 | constructor(object) { 38 | super(object, FamilyHistorySchema); 39 | this._type = 'QDM::FamilyHistory'; 40 | } 41 | } 42 | 43 | module.exports.FamilyHistory = FamilyHistory; 44 | 45 | -------------------------------------------------------------------------------- /app/assets/javascripts/AdverseEvent.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const AdverseEventSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | relevantDatetime: DateTime, 25 | severity: Code, 26 | facilityLocation: FacilityLocationSchema, 27 | type: Code, 28 | recorder: [AnyEntity], 29 | qdmTitle: { type: String, default: 'Adverse Event' }, 30 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.120' }, 31 | qdmCategory: { type: String, default: 'adverse_event' }, 32 | qdmVersion: { type: String, default: '5.6' }, 33 | _type: { type: String, default: 'QDM::AdverseEvent' }, 34 | 35 | }); 36 | 37 | module.exports.AdverseEventSchema = AdverseEventSchema; 38 | class AdverseEvent extends mongoose.Document { 39 | constructor(object) { 40 | super(object, AdverseEventSchema); 41 | this._type = 'QDM::AdverseEvent'; 42 | } 43 | } 44 | 45 | module.exports.AdverseEvent = AdverseEvent; 46 | 47 | -------------------------------------------------------------------------------- /app/assets/javascripts/PatientCharacteristicSex.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const PatientCharacteristicSexSchema = DataElementSchema({ 23 | qdmTitle: { type: String, default: 'Patient Characteristic Sex' }, 24 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.55' }, 25 | qdmCategory: { type: String, default: 'patient_characteristic' }, 26 | qdmStatus: { type: String, default: 'gender' }, 27 | qdmVersion: { type: String, default: '5.6' }, 28 | _type: { type: String, default: 'QDM::PatientCharacteristicSex' }, 29 | 30 | }); 31 | 32 | module.exports.PatientCharacteristicSexSchema = PatientCharacteristicSexSchema; 33 | class PatientCharacteristicSex extends mongoose.Document { 34 | constructor(object) { 35 | super(object, PatientCharacteristicSexSchema); 36 | this._type = 'QDM::PatientCharacteristicSex'; 37 | } 38 | } 39 | 40 | module.exports.PatientCharacteristicSex = PatientCharacteristicSex; 41 | 42 | -------------------------------------------------------------------------------- /app/assets/javascripts/AssessmentOrder.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const AssessmentOrderSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | negationRationale: Code, 25 | reason: Code, 26 | requester: [AnyEntity], 27 | qdmTitle: { type: String, default: 'Assessment, Order' }, 28 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.131' }, 29 | qdmCategory: { type: String, default: 'assessment' }, 30 | qdmStatus: { type: String, default: 'order' }, 31 | qdmVersion: { type: String, default: '5.6' }, 32 | _type: { type: String, default: 'QDM::AssessmentOrder' }, 33 | 34 | }); 35 | 36 | module.exports.AssessmentOrderSchema = AssessmentOrderSchema; 37 | class AssessmentOrder extends mongoose.Document { 38 | constructor(object) { 39 | super(object, AssessmentOrderSchema); 40 | this._type = 'QDM::AssessmentOrder'; 41 | } 42 | } 43 | 44 | module.exports.AssessmentOrder = AssessmentOrder; 45 | 46 | -------------------------------------------------------------------------------- /app/assets/javascripts/Diagnosis.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const DiagnosisSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | prevalencePeriod: Interval, 25 | anatomicalLocationSite: Code, 26 | severity: Code, 27 | recorder: [AnyEntity], 28 | qdmTitle: { type: String, default: 'Diagnosis' }, 29 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.110' }, 30 | qrdaOid: { type: String, default: '2.16.840.1.113883.10.20.24.3.135' }, 31 | qdmCategory: { type: String, default: 'condition' }, 32 | qdmVersion: { type: String, default: '5.6' }, 33 | _type: { type: String, default: 'QDM::Diagnosis' }, 34 | 35 | }); 36 | 37 | module.exports.DiagnosisSchema = DiagnosisSchema; 38 | class Diagnosis extends mongoose.Document { 39 | constructor(object) { 40 | super(object, DiagnosisSchema); 41 | this._type = 'QDM::Diagnosis'; 42 | } 43 | } 44 | 45 | module.exports.Diagnosis = Diagnosis; 46 | 47 | -------------------------------------------------------------------------------- /app/assets/javascripts/PatientCharacteristicRace.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const PatientCharacteristicRaceSchema = DataElementSchema({ 23 | qdmTitle: { type: String, default: 'Patient Characteristic Race' }, 24 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.59' }, 25 | qdmCategory: { type: String, default: 'patient_characteristic' }, 26 | qdmStatus: { type: String, default: 'race' }, 27 | qdmVersion: { type: String, default: '5.6' }, 28 | _type: { type: String, default: 'QDM::PatientCharacteristicRace' }, 29 | 30 | }); 31 | 32 | module.exports.PatientCharacteristicRaceSchema = PatientCharacteristicRaceSchema; 33 | class PatientCharacteristicRace extends mongoose.Document { 34 | constructor(object) { 35 | super(object, PatientCharacteristicRaceSchema); 36 | this._type = 'QDM::PatientCharacteristicRace'; 37 | } 38 | } 39 | 40 | module.exports.PatientCharacteristicRace = PatientCharacteristicRace; 41 | 42 | -------------------------------------------------------------------------------- /app/models/qdm/basetypes/ratio.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # Represents a Ratio 3 | class Ratio 4 | attr_accessor :numerator, :denominator 5 | 6 | # Numerator and denominator are required 7 | def initialize(numerator, denominator) 8 | @numerator = numerator 9 | @denominator = denominator 10 | end 11 | 12 | # Converts an object of this instance into a database friendly value. 13 | def mongoize 14 | { numerator: @numerator, denominator: @denominator, _type: 'QDM::Ratio' } 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 2 elements used in mongoize, i.e. 22 | # [ numerator, denominator ]. 23 | def demongoize(object) 24 | return nil unless object 25 | 26 | object = object.symbolize_keys 27 | QDM::Ratio.new(object[:numerator], object[:denominator]) if object.is_a?(Hash) 28 | end 29 | 30 | # Takes any possible object and converts it to how it would be 31 | # stored in the database. 32 | def mongoize(object) 33 | case object 34 | when nil then nil 35 | when QDM::Ratio then object.mongoize 36 | when Hash 37 | object = object.symbolize_keys 38 | QDM::Ratio.new(object[:numerator], object[:denominator]).mongoize 39 | else object 40 | end 41 | end 42 | 43 | # Converts the object that was supplied to a criteria and converts it 44 | # into a database friendly form. 45 | def evolve(object) 46 | case object 47 | when QDM::Ratio then object.mongoize 48 | else object 49 | end 50 | end 51 | end 52 | end 53 | end 54 | -------------------------------------------------------------------------------- /app/assets/javascripts/DeviceRecommended.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const DeviceRecommendedSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | negationRationale: Code, 25 | reason: Code, 26 | requester: [AnyEntity], 27 | qdmTitle: { type: String, default: 'Device, Recommended' }, 28 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.16' }, 29 | qdmCategory: { type: String, default: 'device' }, 30 | qdmStatus: { type: String, default: 'recommended' }, 31 | qdmVersion: { type: String, default: '5.6' }, 32 | _type: { type: String, default: 'QDM::DeviceRecommended' }, 33 | 34 | }); 35 | 36 | module.exports.DeviceRecommendedSchema = DeviceRecommendedSchema; 37 | class DeviceRecommended extends mongoose.Document { 38 | constructor(object) { 39 | super(object, DeviceRecommendedSchema); 40 | this._type = 'QDM::DeviceRecommended'; 41 | } 42 | } 43 | 44 | module.exports.DeviceRecommended = DeviceRecommended; 45 | 46 | -------------------------------------------------------------------------------- /app/assets/javascripts/InterventionOrder.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const InterventionOrderSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | reason: Code, 25 | negationRationale: Code, 26 | requester: [AnyEntity], 27 | qdmTitle: { type: String, default: 'Intervention, Order' }, 28 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.35' }, 29 | qdmCategory: { type: String, default: 'intervention' }, 30 | qdmStatus: { type: String, default: 'order' }, 31 | qdmVersion: { type: String, default: '5.6' }, 32 | _type: { type: String, default: 'QDM::InterventionOrder' }, 33 | 34 | }); 35 | 36 | module.exports.InterventionOrderSchema = InterventionOrderSchema; 37 | class InterventionOrder extends mongoose.Document { 38 | constructor(object) { 39 | super(object, InterventionOrderSchema); 40 | this._type = 'QDM::InterventionOrder'; 41 | } 42 | } 43 | 44 | module.exports.InterventionOrder = InterventionOrder; 45 | 46 | -------------------------------------------------------------------------------- /app/assets/javascripts/basetypes/AnyEntity.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | const { PatientEntity } = require('../attributes/PatientEntity'); 3 | const { Practitioner } = require('../attributes/Practitioner'); 4 | const { CarePartner } = require('../attributes/CarePartner'); 5 | const { Organization } = require('../attributes/Organization'); 6 | const { Location } = require('../attributes/Location'); 7 | 8 | function AnyEntity(key, options) { 9 | mongoose.SchemaType.call(this, key, options, 'AnyEntity'); 10 | } 11 | AnyEntity.prototype = Object.create(mongoose.SchemaType.prototype); 12 | 13 | AnyEntity.prototype.cast = (entity) => { 14 | if (entity == null) { 15 | return null; 16 | } 17 | 18 | if (entity instanceof PatientEntity || entity instanceof Practitioner || entity instanceof CarePartner || entity instanceof Organization || entity instanceof Location) { 19 | return entity; 20 | } 21 | 22 | if (entity._type != null) { 23 | // copy _id to id if it isn't defined 24 | if (entity.id == null && entity._id != null) { 25 | entity.id = entity._id; 26 | } 27 | switch (entity._type) { 28 | case 'QDM::PatientEntity': 29 | return new PatientEntity(entity); 30 | case 'QDM::Practitioner': 31 | return new Practitioner(entity); 32 | case 'QDM::CarePartner': 33 | return new CarePartner(entity); 34 | case 'QDM::Organization': 35 | return new Organization(entity); 36 | case 'QDM::Location': 37 | return new Location(entity); 38 | default: 39 | throw new Error(`Could not find entity type "${entity._type}".`); 40 | } 41 | } else { 42 | throw new Error('Could not find _type indicator for entity.'); 43 | } 44 | }; 45 | 46 | mongoose.Schema.Types.AnyEntity = AnyEntity; 47 | module.exports = AnyEntity; 48 | -------------------------------------------------------------------------------- /app/assets/javascripts/LaboratoryTestOrder.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const LaboratoryTestOrderSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | reason: Code, 25 | negationRationale: Code, 26 | requester: [AnyEntity], 27 | qdmTitle: { type: String, default: 'Laboratory Test, Order' }, 28 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.41' }, 29 | qdmCategory: { type: String, default: 'laboratory_test' }, 30 | qdmStatus: { type: String, default: 'order' }, 31 | qdmVersion: { type: String, default: '5.6' }, 32 | _type: { type: String, default: 'QDM::LaboratoryTestOrder' }, 33 | 34 | }); 35 | 36 | module.exports.LaboratoryTestOrderSchema = LaboratoryTestOrderSchema; 37 | class LaboratoryTestOrder extends mongoose.Document { 38 | constructor(object) { 39 | super(object, LaboratoryTestOrderSchema); 40 | this._type = 'QDM::LaboratoryTestOrder'; 41 | } 42 | } 43 | 44 | module.exports.LaboratoryTestOrder = LaboratoryTestOrder; 45 | 46 | -------------------------------------------------------------------------------- /app/assets/javascripts/PatientCharacteristicPayer.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const PatientCharacteristicPayerSchema = DataElementSchema({ 23 | relevantPeriod: Interval, 24 | qdmTitle: { type: String, default: 'Patient Characteristic Payer' }, 25 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.58' }, 26 | qdmCategory: { type: String, default: 'patient_characteristic' }, 27 | qdmStatus: { type: String, default: 'payer' }, 28 | qdmVersion: { type: String, default: '5.6' }, 29 | _type: { type: String, default: 'QDM::PatientCharacteristicPayer' }, 30 | 31 | }); 32 | 33 | module.exports.PatientCharacteristicPayerSchema = PatientCharacteristicPayerSchema; 34 | class PatientCharacteristicPayer extends mongoose.Document { 35 | constructor(object) { 36 | super(object, PatientCharacteristicPayerSchema); 37 | this._type = 'QDM::PatientCharacteristicPayer'; 38 | } 39 | } 40 | 41 | module.exports.PatientCharacteristicPayer = PatientCharacteristicPayer; 42 | 43 | -------------------------------------------------------------------------------- /app/assets/javascripts/AllergyIntolerance.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const AllergyIntoleranceSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | prevalencePeriod: Interval, 25 | type: Code, 26 | severity: Code, 27 | recorder: [AnyEntity], 28 | qdmTitle: { type: String, default: 'Allergy/Intolerance' }, 29 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.119' }, 30 | qdmCategory: { type: String, default: 'allergy' }, 31 | qdmStatus: { type: String, default: 'intolerance' }, 32 | qdmVersion: { type: String, default: '5.6' }, 33 | _type: { type: String, default: 'QDM::AllergyIntolerance' }, 34 | 35 | }); 36 | 37 | module.exports.AllergyIntoleranceSchema = AllergyIntoleranceSchema; 38 | class AllergyIntolerance extends mongoose.Document { 39 | constructor(object) { 40 | super(object, AllergyIntoleranceSchema); 41 | this._type = 'QDM::AllergyIntolerance'; 42 | } 43 | } 44 | 45 | module.exports.AllergyIntolerance = AllergyIntolerance; 46 | 47 | -------------------------------------------------------------------------------- /app/assets/javascripts/EncounterOrder.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const EncounterOrderSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | reason: Code, 25 | facilityLocation: FacilityLocationSchema, 26 | negationRationale: Code, 27 | requester: [AnyEntity], 28 | priority: Code, 29 | qdmTitle: { type: String, default: 'Encounter, Order' }, 30 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.27' }, 31 | qdmCategory: { type: String, default: 'encounter' }, 32 | qdmStatus: { type: String, default: 'order' }, 33 | qdmVersion: { type: String, default: '5.6' }, 34 | _type: { type: String, default: 'QDM::EncounterOrder' }, 35 | 36 | }); 37 | 38 | module.exports.EncounterOrderSchema = EncounterOrderSchema; 39 | class EncounterOrder extends mongoose.Document { 40 | constructor(object) { 41 | super(object, EncounterOrderSchema); 42 | this._type = 'QDM::EncounterOrder'; 43 | } 44 | } 45 | 46 | module.exports.EncounterOrder = EncounterOrder; 47 | 48 | -------------------------------------------------------------------------------- /app/assets/javascripts/DiagnosticStudyOrder.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const DiagnosticStudyOrderSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | reason: Code, 25 | negationRationale: Code, 26 | requester: [AnyEntity], 27 | qdmTitle: { type: String, default: 'Diagnostic Study, Order' }, 28 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.22' }, 29 | qdmCategory: { type: String, default: 'diagnostic_study' }, 30 | qdmStatus: { type: String, default: 'order' }, 31 | qdmVersion: { type: String, default: '5.6' }, 32 | _type: { type: String, default: 'QDM::DiagnosticStudyOrder' }, 33 | 34 | }); 35 | 36 | module.exports.DiagnosticStudyOrderSchema = DiagnosticStudyOrderSchema; 37 | class DiagnosticStudyOrder extends mongoose.Document { 38 | constructor(object) { 39 | super(object, DiagnosticStudyOrderSchema); 40 | this._type = 'QDM::DiagnosticStudyOrder'; 41 | } 42 | } 43 | 44 | module.exports.DiagnosticStudyOrder = DiagnosticStudyOrder; 45 | 46 | -------------------------------------------------------------------------------- /app/assets/javascripts/MedicationActive.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const MedicationActiveSchema = DataElementSchema({ 23 | relevantDatetime: DateTime, 24 | relevantPeriod: Interval, 25 | dosage: Quantity, 26 | frequency: Code, 27 | route: Code, 28 | recorder: [AnyEntity], 29 | qdmTitle: { type: String, default: 'Medication, Active' }, 30 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.44' }, 31 | qdmCategory: { type: String, default: 'medication' }, 32 | qdmStatus: { type: String, default: 'active' }, 33 | qdmVersion: { type: String, default: '5.6' }, 34 | _type: { type: String, default: 'QDM::MedicationActive' }, 35 | 36 | }); 37 | 38 | module.exports.MedicationActiveSchema = MedicationActiveSchema; 39 | class MedicationActive extends mongoose.Document { 40 | constructor(object) { 41 | super(object, MedicationActiveSchema); 42 | this._type = 'QDM::MedicationActive'; 43 | } 44 | } 45 | 46 | module.exports.MedicationActive = MedicationActive; 47 | 48 | -------------------------------------------------------------------------------- /app/assets/javascripts/PatientCharacteristicEthnicity.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const PatientCharacteristicEthnicitySchema = DataElementSchema({ 23 | qdmTitle: { type: String, default: 'Patient Characteristic Ethnicity' }, 24 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.56' }, 25 | qdmCategory: { type: String, default: 'patient_characteristic' }, 26 | qdmStatus: { type: String, default: 'ethnicity' }, 27 | qdmVersion: { type: String, default: '5.6' }, 28 | _type: { type: String, default: 'QDM::PatientCharacteristicEthnicity' }, 29 | 30 | }); 31 | 32 | module.exports.PatientCharacteristicEthnicitySchema = PatientCharacteristicEthnicitySchema; 33 | class PatientCharacteristicEthnicity extends mongoose.Document { 34 | constructor(object) { 35 | super(object, PatientCharacteristicEthnicitySchema); 36 | this._type = 'QDM::PatientCharacteristicEthnicity'; 37 | } 38 | } 39 | 40 | module.exports.PatientCharacteristicEthnicity = PatientCharacteristicEthnicity; 41 | 42 | -------------------------------------------------------------------------------- /app/assets/javascripts/PhysicalExamOrder.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const PhysicalExamOrderSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | reason: Code, 25 | anatomicalLocationSite: Code, 26 | negationRationale: Code, 27 | requester: [AnyEntity], 28 | qdmTitle: { type: String, default: 'Physical Exam, Order' }, 29 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.61' }, 30 | qdmCategory: { type: String, default: 'physical_exam' }, 31 | qdmStatus: { type: String, default: 'order' }, 32 | qdmVersion: { type: String, default: '5.6' }, 33 | _type: { type: String, default: 'QDM::PhysicalExamOrder' }, 34 | 35 | }); 36 | 37 | module.exports.PhysicalExamOrderSchema = PhysicalExamOrderSchema; 38 | class PhysicalExamOrder extends mongoose.Document { 39 | constructor(object) { 40 | super(object, PhysicalExamOrderSchema); 41 | this._type = 'QDM::PhysicalExamOrder'; 42 | } 43 | } 44 | 45 | module.exports.PhysicalExamOrder = PhysicalExamOrder; 46 | 47 | -------------------------------------------------------------------------------- /app/assets/javascripts/ProcedureOrder.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const ProcedureOrderSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | reason: Code, 25 | anatomicalLocationSite: Code, 26 | rank: Number, 27 | priority: Code, 28 | negationRationale: Code, 29 | requester: [AnyEntity], 30 | qdmTitle: { type: String, default: 'Procedure, Order' }, 31 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.66' }, 32 | qdmCategory: { type: String, default: 'procedure' }, 33 | qdmStatus: { type: String, default: 'order' }, 34 | qdmVersion: { type: String, default: '5.6' }, 35 | _type: { type: String, default: 'QDM::ProcedureOrder' }, 36 | 37 | }); 38 | 39 | module.exports.ProcedureOrderSchema = ProcedureOrderSchema; 40 | class ProcedureOrder extends mongoose.Document { 41 | constructor(object) { 42 | super(object, ProcedureOrderSchema); 43 | this._type = 'QDM::ProcedureOrder'; 44 | } 45 | } 46 | 47 | module.exports.ProcedureOrder = ProcedureOrder; 48 | 49 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cqm-models", 3 | "version": "4.3.1", 4 | "description": "This library contains auto generated Mongo (Mongoose.js) models that correspond to the QDM (Quality Data Model) specification.", 5 | "license": "ISC", 6 | "main": "app/assets/javascripts/index.js", 7 | "browser": { 8 | "index.js": "dist/index.js" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/projecttacoma/cqm-models.git" 13 | }, 14 | "homepage": "https://github.com/projecttacoma/cqm-models#readme", 15 | "contributors": [ 16 | "Louis Ades ", 17 | "Michael O'Keefe ", 18 | "Adam Holmes ", 19 | "Chris Hossenlopp " 20 | ], 21 | "dependencies": { 22 | "cql-execution": "3.3.0", 23 | "mongoose": "^7.8.4" 24 | }, 25 | "devDependencies": { 26 | "browserify": "^17.0.0", 27 | "eslint": "^8.53.0", 28 | "eslint-config-airbnb-base": "^15.0.0", 29 | "eslint-plugin-import": "^2.29.0", 30 | "jest": "^29.7.0" 31 | }, 32 | "resolutions": { 33 | "browserify-sign": "^4.2.2", 34 | "semver": "^7.5.4", 35 | "@babel/traverse": "^7.23.3" 36 | }, 37 | "scripts": { 38 | "prepublish": "./bin/build_cql_execution.sh", 39 | "test": "npx jest", 40 | "coverage": "npx jest --coverage", 41 | "lint": "eslint 'app/assets/javascripts/**/*.js'", 42 | "dist": "yarn && browserify app/assets/javascripts/index.js > dist/index.js", 43 | "browser": "browserify app/assets/javascripts/browser.js > dist/browser.js", 44 | "browser_test": "browserify app/assets/javascripts/browser.js > tmp/dist/browser.js", 45 | "dist_test": "browserify app/assets/javascripts/index.js > tmp/dist/index.js", 46 | "build-cql": "cd ./node_modules/cql-execution && yarn install && cd ../../" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/assets/javascripts/AssessmentRecommended.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const AssessmentRecommendedSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | negationRationale: Code, 25 | reason: Code, 26 | requester: [AnyEntity], 27 | qdmTitle: { type: String, default: 'Assessment, Recommended' }, 28 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.118' }, 29 | qdmCategory: { type: String, default: 'assessment' }, 30 | qdmStatus: { type: String, default: 'recommended' }, 31 | qdmVersion: { type: String, default: '5.6' }, 32 | _type: { type: String, default: 'QDM::AssessmentRecommended' }, 33 | 34 | }); 35 | 36 | module.exports.AssessmentRecommendedSchema = AssessmentRecommendedSchema; 37 | class AssessmentRecommended extends mongoose.Document { 38 | constructor(object) { 39 | super(object, AssessmentRecommendedSchema); 40 | this._type = 'QDM::AssessmentRecommended'; 41 | } 42 | } 43 | 44 | module.exports.AssessmentRecommended = AssessmentRecommended; 45 | 46 | -------------------------------------------------------------------------------- /templates/identifier_extension.rb.erb: -------------------------------------------------------------------------------- 1 | 2 | def initialize(options = {}) 3 | super(options) 4 | end 5 | 6 | # Returns the attribute requested on the datatype. 7 | def get(attribute) 8 | send(attribute) if has_attribute?(attribute) 9 | end 10 | 11 | def mongoize 12 | json_representation = {} 13 | attribute_names.each do |field| 14 | json_representation[field] = send(field).mongoize 15 | end 16 | json_representation 17 | end 18 | 19 | # Include '_type' in any JSON output. This is necessary for deserialization. 20 | def to_json(options = nil) 21 | serializable_hash(methods: :_type).to_json(options) 22 | end 23 | 24 | class << self 25 | # Get the object as it was stored in the database, and instantiate 26 | # this custom class from it. 27 | def demongoize(object) 28 | return nil unless object 29 | object = object.symbolize_keys 30 | if object.is_a?(Hash) 31 | # This will turn the object into the concrete type eg: facilityLocation 32 | data_element = QDM::Identifier.new 33 | data_element.attribute_names.each do |field| 34 | data_element.send(field + '=', object[field.to_sym]) 35 | end 36 | data_element 37 | else object 38 | end 39 | end 40 | 41 | # Takes any possible object and converts it to how it would be 42 | # stored in the database. 43 | def mongoize(object) 44 | case object 45 | when nil then nil 46 | when QDM::Identifier then object.mongoize 47 | when Hash 48 | object = object.symbolize_keys 49 | data_element = QDM::Identifier.new 50 | data_element.attribute_names.each do |field| 51 | data_element.send(field + '=', object[field.to_sym]) 52 | end 53 | data_element.mongoize 54 | else object 55 | end 56 | end 57 | end 58 | end -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Continuous Integration 2 | on: 3 | pull_request: 4 | branches: 5 | - master 6 | - cqm_models_3_x 7 | 8 | jobs: 9 | build: 10 | 11 | runs-on: ubuntu-latest 12 | 13 | strategy: 14 | matrix: 15 | ruby-version: [3.0] 16 | mongodb-version: [4.2, 4.4] 17 | node-version: [18.x] 18 | 19 | steps: 20 | - uses: actions/checkout@v3 21 | - name: Use Ruby ${{ matrix.ruby-version }} 22 | uses: ruby/setup-ruby@v1 23 | with: 24 | ruby-version: ${{ matrix.ruby-version }} 25 | bundler: 2.3.17 26 | - name: Install dependencies 27 | run: bundle install 28 | - name: Start MongoDB 29 | uses: supercharge/mongodb-github-action@1.10.0 30 | with: 31 | mongodb-version: ${{ matrix.mongodb-version }} 32 | - name: Run audit 33 | run: | 34 | bundle exec bundle-audit check --update 35 | bundle exec bundle-audit check 36 | - name: Run rake 37 | run: bundle exec rake 38 | - name: Upload coverage to Codecov 39 | uses: codecov/codecov-action@v4 40 | with: 41 | file: coverage/.resultset.json 42 | fail_ci_if_error: true 43 | token: ${{ secrets.CODECOV_TOKEN }} 44 | 45 | - name: Run rubocop 46 | run: bundle exec rubocop 47 | - name: Use Node.js ${{ matrix.node-version }} 48 | uses: actions/setup-node@v3 49 | with: 50 | node-version: ${{ matrix.node-version }} 51 | - name: Install Yarn 52 | run: npm install -g yarn 53 | - name: Run yarn 54 | run: | 55 | yarn install 56 | yarn run lint 57 | yarn run test 58 | npm audit --omit=dev --audit-level=${{ secrets.NPM_AUDIT_LEVEL }} 59 | - name: Run validation 60 | run: | 61 | ./bin/validate_dist.sh 62 | ./bin/validate_browser.sh 63 | -------------------------------------------------------------------------------- /app/assets/javascripts/InterventionRecommended.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const InterventionRecommendedSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | reason: Code, 25 | negationRationale: Code, 26 | requester: [AnyEntity], 27 | qdmTitle: { type: String, default: 'Intervention, Recommended' }, 28 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.37' }, 29 | qdmCategory: { type: String, default: 'intervention' }, 30 | qdmStatus: { type: String, default: 'recommended' }, 31 | qdmVersion: { type: String, default: '5.6' }, 32 | _type: { type: String, default: 'QDM::InterventionRecommended' }, 33 | 34 | }); 35 | 36 | module.exports.InterventionRecommendedSchema = InterventionRecommendedSchema; 37 | class InterventionRecommended extends mongoose.Document { 38 | constructor(object) { 39 | super(object, InterventionRecommendedSchema); 40 | this._type = 'QDM::InterventionRecommended'; 41 | } 42 | } 43 | 44 | module.exports.InterventionRecommended = InterventionRecommended; 45 | 46 | -------------------------------------------------------------------------------- /app/assets/javascripts/PatientCharacteristicBirthdate.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const PatientCharacteristicBirthdateSchema = DataElementSchema({ 23 | birthDatetime: DateTime, 24 | qdmTitle: { type: String, default: 'Patient Characteristic Birthdate' }, 25 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.54' }, 26 | qdmCategory: { type: String, default: 'patient_characteristic' }, 27 | qdmStatus: { type: String, default: 'birthdate' }, 28 | qdmVersion: { type: String, default: '5.6' }, 29 | _type: { type: String, default: 'QDM::PatientCharacteristicBirthdate' }, 30 | 31 | }); 32 | 33 | module.exports.PatientCharacteristicBirthdateSchema = PatientCharacteristicBirthdateSchema; 34 | class PatientCharacteristicBirthdate extends mongoose.Document { 35 | constructor(object) { 36 | super(object, PatientCharacteristicBirthdateSchema); 37 | this._type = 'QDM::PatientCharacteristicBirthdate'; 38 | } 39 | } 40 | 41 | module.exports.PatientCharacteristicBirthdate = PatientCharacteristicBirthdate; 42 | 43 | -------------------------------------------------------------------------------- /app/assets/javascripts/PatientCharacteristicExpired.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const PatientCharacteristicExpiredSchema = DataElementSchema({ 23 | expiredDatetime: DateTime, 24 | cause: Code, 25 | qdmTitle: { type: String, default: 'Patient Characteristic Expired' }, 26 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.57' }, 27 | qdmCategory: { type: String, default: 'patient_characteristic' }, 28 | qdmStatus: { type: String, default: 'expired' }, 29 | qdmVersion: { type: String, default: '5.6' }, 30 | _type: { type: String, default: 'QDM::PatientCharacteristicExpired' }, 31 | 32 | }); 33 | 34 | module.exports.PatientCharacteristicExpiredSchema = PatientCharacteristicExpiredSchema; 35 | class PatientCharacteristicExpired extends mongoose.Document { 36 | constructor(object) { 37 | super(object, PatientCharacteristicExpiredSchema); 38 | this._type = 'QDM::PatientCharacteristicExpired'; 39 | } 40 | } 41 | 42 | module.exports.PatientCharacteristicExpired = PatientCharacteristicExpired; 43 | 44 | -------------------------------------------------------------------------------- /app/assets/javascripts/EncounterRecommended.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const EncounterRecommendedSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | reason: Code, 25 | facilityLocation: FacilityLocationSchema, 26 | negationRationale: Code, 27 | requester: [AnyEntity], 28 | qdmTitle: { type: String, default: 'Encounter, Recommended' }, 29 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.28' }, 30 | qdmCategory: { type: String, default: 'encounter' }, 31 | qdmStatus: { type: String, default: 'recommended' }, 32 | qdmVersion: { type: String, default: '5.6' }, 33 | _type: { type: String, default: 'QDM::EncounterRecommended' }, 34 | 35 | }); 36 | 37 | module.exports.EncounterRecommendedSchema = EncounterRecommendedSchema; 38 | class EncounterRecommended extends mongoose.Document { 39 | constructor(object) { 40 | super(object, EncounterRecommendedSchema); 41 | this._type = 'QDM::EncounterRecommended'; 42 | } 43 | } 44 | 45 | module.exports.EncounterRecommended = EncounterRecommended; 46 | 47 | -------------------------------------------------------------------------------- /app/assets/javascripts/ProcedureRecommended.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const ProcedureRecommendedSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | reason: Code, 25 | anatomicalLocationSite: Code, 26 | rank: Number, 27 | requester: [AnyEntity], 28 | negationRationale: Code, 29 | qdmTitle: { type: String, default: 'Procedure, Recommended' }, 30 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.68' }, 31 | qdmCategory: { type: String, default: 'procedure' }, 32 | qdmStatus: { type: String, default: 'recommended' }, 33 | qdmVersion: { type: String, default: '5.6' }, 34 | _type: { type: String, default: 'QDM::ProcedureRecommended' }, 35 | 36 | }); 37 | 38 | module.exports.ProcedureRecommendedSchema = ProcedureRecommendedSchema; 39 | class ProcedureRecommended extends mongoose.Document { 40 | constructor(object) { 41 | super(object, ProcedureRecommendedSchema); 42 | this._type = 'QDM::ProcedureRecommended'; 43 | } 44 | } 45 | 46 | module.exports.ProcedureRecommended = ProcedureRecommended; 47 | 48 | -------------------------------------------------------------------------------- /app/assets/javascripts/LaboratoryTestRecommended.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const LaboratoryTestRecommendedSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | reason: Code, 25 | negationRationale: Code, 26 | requester: [AnyEntity], 27 | qdmTitle: { type: String, default: 'Laboratory Test, Recommended' }, 28 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.43' }, 29 | qdmCategory: { type: String, default: 'laboratory_test' }, 30 | qdmStatus: { type: String, default: 'recommended' }, 31 | qdmVersion: { type: String, default: '5.6' }, 32 | _type: { type: String, default: 'QDM::LaboratoryTestRecommended' }, 33 | 34 | }); 35 | 36 | module.exports.LaboratoryTestRecommendedSchema = LaboratoryTestRecommendedSchema; 37 | class LaboratoryTestRecommended extends mongoose.Document { 38 | constructor(object) { 39 | super(object, LaboratoryTestRecommendedSchema); 40 | this._type = 'QDM::LaboratoryTestRecommended'; 41 | } 42 | } 43 | 44 | module.exports.LaboratoryTestRecommended = LaboratoryTestRecommended; 45 | 46 | -------------------------------------------------------------------------------- /app/models/qdm/basetypes/code.rb: -------------------------------------------------------------------------------- 1 | module QDM 2 | # Represents a Code 3 | class Code 4 | attr_accessor :code, :display, :system, :version 5 | 6 | # Code and code system are required (at minimum). 7 | def initialize(code, sys, display = nil, version = nil) 8 | @code = code 9 | @system = sys 10 | @display = display 11 | @version = version 12 | end 13 | 14 | # Converts an object of this instance into a database friendly value. 15 | def mongoize 16 | { code: @code, system: @system, display: @display, version: @version, _type: 'QDM::Code' } 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 | # [ code, system, display, version ]. 25 | def demongoize(object) 26 | return nil unless object 27 | 28 | object = object.symbolize_keys 29 | QDM::Code.new(object[:code], object[:system], object[:display], 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 | QDM::Code.new(object[:code], object[:system], object[:display], object[:version]).mongoize 41 | else object 42 | end 43 | end 44 | 45 | # Converts the object that was supplied to a criteria and converts it 46 | # into a database friendly form. 47 | def evolve(object) 48 | case object 49 | when QDM::Code then object.mongoize 50 | else object 51 | end 52 | end 53 | end 54 | end 55 | end 56 | -------------------------------------------------------------------------------- /app/assets/javascripts/ImmunizationOrder.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const ImmunizationOrderSchema = DataElementSchema({ 23 | activeDatetime: DateTime, 24 | authorDatetime: DateTime, 25 | dosage: Quantity, 26 | supply: Quantity, 27 | reason: Code, 28 | route: Code, 29 | negationRationale: Code, 30 | requester: [AnyEntity], 31 | qdmTitle: { type: String, default: 'Immunization, Order' }, 32 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.113' }, 33 | qdmCategory: { type: String, default: 'immunization' }, 34 | qdmStatus: { type: String, default: 'order' }, 35 | qdmVersion: { type: String, default: '5.6' }, 36 | _type: { type: String, default: 'QDM::ImmunizationOrder' }, 37 | 38 | }); 39 | 40 | module.exports.ImmunizationOrderSchema = ImmunizationOrderSchema; 41 | class ImmunizationOrder extends mongoose.Document { 42 | constructor(object) { 43 | super(object, ImmunizationOrderSchema); 44 | this._type = 'QDM::ImmunizationOrder'; 45 | } 46 | } 47 | 48 | module.exports.ImmunizationOrder = ImmunizationOrder; 49 | 50 | -------------------------------------------------------------------------------- /app/assets/javascripts/PhysicalExamRecommended.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const PhysicalExamRecommendedSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | reason: Code, 25 | anatomicalLocationSite: Code, 26 | negationRationale: Code, 27 | requester: [AnyEntity], 28 | qdmTitle: { type: String, default: 'Physical Exam, Recommended' }, 29 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.63' }, 30 | qdmCategory: { type: String, default: 'physical_exam' }, 31 | qdmStatus: { type: String, default: 'recommended' }, 32 | qdmVersion: { type: String, default: '5.6' }, 33 | _type: { type: String, default: 'QDM::PhysicalExamRecommended' }, 34 | 35 | }); 36 | 37 | module.exports.PhysicalExamRecommendedSchema = PhysicalExamRecommendedSchema; 38 | class PhysicalExamRecommended extends mongoose.Document { 39 | constructor(object) { 40 | super(object, PhysicalExamRecommendedSchema); 41 | this._type = 'QDM::PhysicalExamRecommended'; 42 | } 43 | } 44 | 45 | module.exports.PhysicalExamRecommended = PhysicalExamRecommended; 46 | 47 | -------------------------------------------------------------------------------- /app/assets/javascripts/SubstanceOrder.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const SubstanceOrderSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | relevantPeriod: Interval, 25 | reason: Code, 26 | dosage: Quantity, 27 | supply: Quantity, 28 | frequency: Code, 29 | refills: Number, 30 | route: Code, 31 | negationRationale: Code, 32 | requester: [AnyEntity], 33 | qdmTitle: { type: String, default: 'Substance, Order' }, 34 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.77' }, 35 | qdmCategory: { type: String, default: 'substance' }, 36 | qdmStatus: { type: String, default: 'order' }, 37 | qdmVersion: { type: String, default: '5.6' }, 38 | _type: { type: String, default: 'QDM::SubstanceOrder' }, 39 | 40 | }); 41 | 42 | module.exports.SubstanceOrderSchema = SubstanceOrderSchema; 43 | class SubstanceOrder extends mongoose.Document { 44 | constructor(object) { 45 | super(object, SubstanceOrderSchema); 46 | this._type = 'QDM::SubstanceOrder'; 47 | } 48 | } 49 | 50 | module.exports.SubstanceOrder = SubstanceOrder; 51 | 52 | -------------------------------------------------------------------------------- /app/assets/javascripts/SubstanceRecommended.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const SubstanceRecommendedSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | reason: Code, 25 | dosage: Quantity, 26 | frequency: Code, 27 | refills: Number, 28 | route: Code, 29 | negationRationale: Code, 30 | requester: [AnyEntity], 31 | qdmTitle: { type: String, default: 'Substance, Recommended' }, 32 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.78' }, 33 | qdmCategory: { type: String, default: 'substance' }, 34 | qdmStatus: { type: String, default: 'recommended' }, 35 | qdmVersion: { type: String, default: '5.6' }, 36 | _type: { type: String, default: 'QDM::SubstanceRecommended' }, 37 | 38 | }); 39 | 40 | module.exports.SubstanceRecommendedSchema = SubstanceRecommendedSchema; 41 | class SubstanceRecommended extends mongoose.Document { 42 | constructor(object) { 43 | super(object, SubstanceRecommendedSchema); 44 | this._type = 'QDM::SubstanceRecommended'; 45 | } 46 | } 47 | 48 | module.exports.SubstanceRecommended = SubstanceRecommended; 49 | 50 | -------------------------------------------------------------------------------- /app/assets/javascripts/DiagnosticStudyRecommended.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const DiagnosticStudyRecommendedSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | negationRationale: Code, 25 | requester: [AnyEntity], 26 | qdmTitle: { type: String, default: 'Diagnostic Study, Recommended' }, 27 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.24' }, 28 | qrdaOid: { type: String, default: '2.16.840.1.113883.10.20.24.3.19' }, 29 | qdmCategory: { type: String, default: 'diagnostic_study' }, 30 | qdmStatus: { type: String, default: 'recommended' }, 31 | qdmVersion: { type: String, default: '5.6' }, 32 | _type: { type: String, default: 'QDM::DiagnosticStudyRecommended' }, 33 | 34 | }); 35 | 36 | module.exports.DiagnosticStudyRecommendedSchema = DiagnosticStudyRecommendedSchema; 37 | class DiagnosticStudyRecommended extends mongoose.Document { 38 | constructor(object) { 39 | super(object, DiagnosticStudyRecommendedSchema); 40 | this._type = 'QDM::DiagnosticStudyRecommended'; 41 | } 42 | } 43 | 44 | module.exports.DiagnosticStudyRecommended = DiagnosticStudyRecommended; 45 | 46 | -------------------------------------------------------------------------------- /app/assets/javascripts/SubstanceAdministered.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const SubstanceAdministeredSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | relevantDatetime: DateTime, 25 | relevantPeriod: Interval, 26 | dosage: Quantity, 27 | frequency: Code, 28 | route: Code, 29 | negationRationale: Code, 30 | performer: [AnyEntity], 31 | qdmTitle: { type: String, default: 'Substance, Administered' }, 32 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.73' }, 33 | qdmCategory: { type: String, default: 'substance' }, 34 | qdmStatus: { type: String, default: 'administered' }, 35 | qdmVersion: { type: String, default: '5.6' }, 36 | _type: { type: String, default: 'QDM::SubstanceAdministered' }, 37 | 38 | }); 39 | 40 | module.exports.SubstanceAdministeredSchema = SubstanceAdministeredSchema; 41 | class SubstanceAdministered extends mongoose.Document { 42 | constructor(object) { 43 | super(object, SubstanceAdministeredSchema); 44 | this._type = 'QDM::SubstanceAdministered'; 45 | } 46 | } 47 | 48 | module.exports.SubstanceAdministered = SubstanceAdministered; 49 | 50 | -------------------------------------------------------------------------------- /app/assets/javascripts/MedicationDischarge.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const MedicationDischargeSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | refills: Number, 25 | dosage: Quantity, 26 | supply: Quantity, 27 | frequency: Code, 28 | daysSupplied: Number, 29 | route: Code, 30 | negationRationale: Code, 31 | prescriber: [AnyEntity], 32 | recorder: [AnyEntity], 33 | qdmTitle: { type: String, default: 'Medication, Discharge' }, 34 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.48' }, 35 | qdmCategory: { type: String, default: 'medication' }, 36 | qdmStatus: { type: String, default: 'discharge' }, 37 | qdmVersion: { type: String, default: '5.6' }, 38 | _type: { type: String, default: 'QDM::MedicationDischarge' }, 39 | 40 | }); 41 | 42 | module.exports.MedicationDischargeSchema = MedicationDischargeSchema; 43 | class MedicationDischarge extends mongoose.Document { 44 | constructor(object) { 45 | super(object, MedicationDischargeSchema); 46 | this._type = 'QDM::MedicationDischarge'; 47 | } 48 | } 49 | 50 | module.exports.MedicationDischarge = MedicationDischarge; 51 | 52 | -------------------------------------------------------------------------------- /app/assets/javascripts/InterventionPerformed.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const InterventionPerformedSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | relevantDatetime: DateTime, 25 | relevantPeriod: Interval, 26 | reason: Code, 27 | result: Any, 28 | status: Code, 29 | negationRationale: Code, 30 | performer: [AnyEntity], 31 | relatedTo: [String], 32 | qdmTitle: { type: String, default: 'Intervention, Performed' }, 33 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.36' }, 34 | qdmCategory: { type: String, default: 'intervention' }, 35 | qdmStatus: { type: String, default: 'performed' }, 36 | qdmVersion: { type: String, default: '5.6' }, 37 | _type: { type: String, default: 'QDM::InterventionPerformed' }, 38 | 39 | }); 40 | 41 | module.exports.InterventionPerformedSchema = InterventionPerformedSchema; 42 | class InterventionPerformed extends mongoose.Document { 43 | constructor(object) { 44 | super(object, InterventionPerformedSchema); 45 | this._type = 'QDM::InterventionPerformed'; 46 | } 47 | } 48 | 49 | module.exports.InterventionPerformed = InterventionPerformed; 50 | 51 | -------------------------------------------------------------------------------- /app/assets/javascripts/MedicationAdministered.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const MedicationAdministeredSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | relevantDatetime: DateTime, 25 | relevantPeriod: Interval, 26 | dosage: Quantity, 27 | frequency: Code, 28 | route: Code, 29 | reason: Code, 30 | negationRationale: Code, 31 | performer: [AnyEntity], 32 | qdmTitle: { type: String, default: 'Medication, Administered' }, 33 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.45' }, 34 | qdmCategory: { type: String, default: 'medication' }, 35 | qdmStatus: { type: String, default: 'administered' }, 36 | qdmVersion: { type: String, default: '5.6' }, 37 | _type: { type: String, default: 'QDM::MedicationAdministered' }, 38 | 39 | }); 40 | 41 | module.exports.MedicationAdministeredSchema = MedicationAdministeredSchema; 42 | class MedicationAdministered extends mongoose.Document { 43 | constructor(object) { 44 | super(object, MedicationAdministeredSchema); 45 | this._type = 'QDM::MedicationAdministered'; 46 | } 47 | } 48 | 49 | module.exports.MedicationAdministered = MedicationAdministered; 50 | 51 | -------------------------------------------------------------------------------- /app/assets/javascripts/CommunicationPerformed.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const CommunicationPerformedSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | category: Code, 25 | medium: Code, 26 | sender: [AnyEntity], 27 | recipient: [AnyEntity], 28 | relatedTo: [String], 29 | sentDatetime: DateTime, 30 | receivedDatetime: DateTime, 31 | negationRationale: Code, 32 | qdmTitle: { type: String, default: 'Communication, Performed' }, 33 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.132' }, 34 | qdmCategory: { type: String, default: 'communication' }, 35 | qdmStatus: { type: String, default: 'performed' }, 36 | qdmVersion: { type: String, default: '5.6' }, 37 | _type: { type: String, default: 'QDM::CommunicationPerformed' }, 38 | 39 | }); 40 | 41 | module.exports.CommunicationPerformedSchema = CommunicationPerformedSchema; 42 | class CommunicationPerformed extends mongoose.Document { 43 | constructor(object) { 44 | super(object, CommunicationPerformedSchema); 45 | this._type = 'QDM::CommunicationPerformed'; 46 | } 47 | } 48 | 49 | module.exports.CommunicationPerformed = CommunicationPerformed; 50 | 51 | -------------------------------------------------------------------------------- /app/assets/javascripts/MedicationOrder.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const MedicationOrderSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | relevantPeriod: Interval, 25 | refills: Number, 26 | dosage: Quantity, 27 | supply: Quantity, 28 | frequency: Code, 29 | daysSupplied: Number, 30 | route: Code, 31 | setting: Code, 32 | reason: Code, 33 | negationRationale: Code, 34 | prescriber: [AnyEntity], 35 | relatedTo: [String], 36 | qdmTitle: { type: String, default: 'Medication, Order' }, 37 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.51' }, 38 | qdmCategory: { type: String, default: 'medication' }, 39 | qdmStatus: { type: String, default: 'order' }, 40 | qdmVersion: { type: String, default: '5.6' }, 41 | _type: { type: String, default: 'QDM::MedicationOrder' }, 42 | 43 | }); 44 | 45 | module.exports.MedicationOrderSchema = MedicationOrderSchema; 46 | class MedicationOrder extends mongoose.Document { 47 | constructor(object) { 48 | super(object, MedicationOrderSchema); 49 | this._type = 'QDM::MedicationOrder'; 50 | } 51 | } 52 | 53 | module.exports.MedicationOrder = MedicationOrder; 54 | 55 | -------------------------------------------------------------------------------- /app/assets/javascripts/AssessmentPerformed.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const AssessmentPerformedSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | relevantDatetime: DateTime, 25 | relevantPeriod: Interval, 26 | negationRationale: Code, 27 | reason: Code, 28 | method: Code, 29 | result: Any, 30 | interpretation: Code, 31 | components: [ComponentSchema], 32 | relatedTo: [String], 33 | performer: [AnyEntity], 34 | qdmTitle: { type: String, default: 'Assessment, Performed' }, 35 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.117' }, 36 | qdmCategory: { type: String, default: 'assessment' }, 37 | qdmStatus: { type: String, default: 'performed' }, 38 | qdmVersion: { type: String, default: '5.6' }, 39 | _type: { type: String, default: 'QDM::AssessmentPerformed' }, 40 | 41 | }); 42 | 43 | module.exports.AssessmentPerformedSchema = AssessmentPerformedSchema; 44 | class AssessmentPerformed extends mongoose.Document { 45 | constructor(object) { 46 | super(object, AssessmentPerformedSchema); 47 | this._type = 'QDM::AssessmentPerformed'; 48 | } 49 | } 50 | 51 | module.exports.AssessmentPerformed = AssessmentPerformed; 52 | 53 | -------------------------------------------------------------------------------- /app/assets/javascripts/ImmunizationAdministered.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const ImmunizationAdministeredSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | relevantDatetime: DateTime, 25 | reason: Code, 26 | dosage: Quantity, 27 | route: Code, 28 | negationRationale: Code, 29 | performer: [AnyEntity], 30 | qdmTitle: { type: String, default: 'Immunization, Administered' }, 31 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.112' }, 32 | qrdaOid: { type: String, default: '2.16.840.1.113883.10.20.24.3.140' }, 33 | qdmCategory: { type: String, default: 'immunization' }, 34 | qdmStatus: { type: String, default: 'administered' }, 35 | qdmVersion: { type: String, default: '5.6' }, 36 | _type: { type: String, default: 'QDM::ImmunizationAdministered' }, 37 | 38 | }); 39 | 40 | module.exports.ImmunizationAdministeredSchema = ImmunizationAdministeredSchema; 41 | class ImmunizationAdministered extends mongoose.Document { 42 | constructor(object) { 43 | super(object, ImmunizationAdministeredSchema); 44 | this._type = 'QDM::ImmunizationAdministered'; 45 | } 46 | } 47 | 48 | module.exports.ImmunizationAdministered = ImmunizationAdministered; 49 | 50 | -------------------------------------------------------------------------------- /app/assets/javascripts/PhysicalExamPerformed.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const PhysicalExamPerformedSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | relevantDatetime: DateTime, 25 | relevantPeriod: Interval, 26 | reason: Code, 27 | method: Code, 28 | result: Any, 29 | anatomicalLocationSite: Code, 30 | negationRationale: Code, 31 | components: [ComponentSchema], 32 | performer: [AnyEntity], 33 | relatedTo: [String], 34 | qdmTitle: { type: String, default: 'Physical Exam, Performed' }, 35 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.62' }, 36 | qdmCategory: { type: String, default: 'physical_exam' }, 37 | qdmStatus: { type: String, default: 'performed' }, 38 | qdmVersion: { type: String, default: '5.6' }, 39 | _type: { type: String, default: 'QDM::PhysicalExamPerformed' }, 40 | 41 | }); 42 | 43 | module.exports.PhysicalExamPerformedSchema = PhysicalExamPerformedSchema; 44 | class PhysicalExamPerformed extends mongoose.Document { 45 | constructor(object) { 46 | super(object, PhysicalExamPerformedSchema); 47 | this._type = 'QDM::PhysicalExamPerformed'; 48 | } 49 | } 50 | 51 | module.exports.PhysicalExamPerformed = PhysicalExamPerformed; 52 | 53 | -------------------------------------------------------------------------------- /app/assets/javascripts/MedicationDispensed.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const MedicationDispensedSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | relevantDatetime: DateTime, 25 | relevantPeriod: Interval, 26 | refills: Number, 27 | dosage: Quantity, 28 | supply: Quantity, 29 | frequency: Code, 30 | daysSupplied: Number, 31 | route: Code, 32 | prescriber: [AnyEntity], 33 | dispenser: [AnyEntity], 34 | negationRationale: Code, 35 | relatedTo: [String], 36 | qdmTitle: { type: String, default: 'Medication, Dispensed' }, 37 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.49' }, 38 | qdmCategory: { type: String, default: 'medication' }, 39 | qdmStatus: { type: String, default: 'dispensed' }, 40 | qdmVersion: { type: String, default: '5.6' }, 41 | _type: { type: String, default: 'QDM::MedicationDispensed' }, 42 | 43 | }); 44 | 45 | module.exports.MedicationDispensedSchema = MedicationDispensedSchema; 46 | class MedicationDispensed extends mongoose.Document { 47 | constructor(object) { 48 | super(object, MedicationDispensedSchema); 49 | this._type = 'QDM::MedicationDispensed'; 50 | } 51 | } 52 | 53 | module.exports.MedicationDispensed = MedicationDispensed; 54 | 55 | -------------------------------------------------------------------------------- /app/assets/javascripts/attributes/Component.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const Code = require('../basetypes/Code'); 4 | const Interval = require('../basetypes/Interval'); 5 | const Quantity = require('../basetypes/Quantity'); 6 | const DateTime = require('../basetypes/DateTime'); 7 | const QDMDate = require('../basetypes/QDMDate'); 8 | const Any = require('../basetypes/Any'); 9 | 10 | const [Schema] = [mongoose.Schema]; 11 | 12 | const [Number, String] = [ 13 | mongoose.Schema.Types.Number, 14 | mongoose.Schema.Types.String, 15 | ]; 16 | 17 | const ComponentSchema = new mongoose.Schema({ 18 | code: Code, 19 | result: Any, 20 | qdmVersion: { type: String, default: '5.6' }, 21 | _type: { type: String, default: 'QDM::Component' }, 22 | 23 | }); 24 | 25 | module.exports.ComponentSchema = ComponentSchema; 26 | class Component extends mongoose.Document { 27 | constructor(object) { 28 | super(object, ComponentSchema); 29 | this._type = 'QDM::Component'; 30 | } 31 | } 32 | 33 | function ComponentSchemaFunction(add, options) { 34 | const extended = new Schema({ 35 | code: Code, 36 | result: Any, 37 | qdmVersion: { type: String, default: '5.6' }, 38 | _type: { type: String, default: 'QDM::Component' }, 39 | 40 | 41 | }, options); 42 | 43 | if (add) { 44 | extended.add(add); 45 | } 46 | 47 | /* eslint no-underscore-dangle: 0 */ 48 | extended.methods._is = function _is(typeSpecifier) { 49 | return this._typeHierarchy().some( 50 | t => t.type === typeSpecifier.type && t.name === typeSpecifier.name 51 | ); 52 | }; 53 | 54 | extended.methods._typeHierarchy = function _typeHierarchy() { 55 | const typeName = this._type.replace(/QDM::/, ''); 56 | const ver = this.qdmVersion.replace('.', '_'); 57 | return [ 58 | { 59 | name: `{urn:healthit-gov:qdm:v${ver}}${typeName}`, 60 | type: 'NamedTypeSpecifier', 61 | }, 62 | ]; 63 | }; 64 | return extended; 65 | } 66 | 67 | module.exports.Component = Component; 68 | module.exports.ComponentSchemaFunction = ComponentSchemaFunction; 69 | -------------------------------------------------------------------------------- /app/assets/javascripts/ProcedurePerformed.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose/browser'); 2 | 3 | const { IdentifierSchema } = require('./attributes/Identifier'); 4 | const { DataElementSchema } = require('./basetypes/DataElement'); 5 | const Code = require('./basetypes/Code'); 6 | const Interval = require('./basetypes/Interval'); 7 | const Quantity = require('./basetypes/Quantity'); 8 | const DateTime = require('./basetypes/DateTime'); 9 | const QDMDate = require('./basetypes/QDMDate'); 10 | const Any = require('./basetypes/Any'); 11 | const AnyEntity = require('./basetypes/AnyEntity'); 12 | const { ComponentSchema } = require('./attributes/Component'); 13 | const { FacilityLocationSchema } = require('./attributes/FacilityLocation'); 14 | const { EntitySchema } = require('./attributes/Entity'); 15 | 16 | 17 | const [Number, String] = [ 18 | mongoose.Schema.Types.Number, 19 | mongoose.Schema.Types.String, 20 | ]; 21 | 22 | const ProcedurePerformedSchema = DataElementSchema({ 23 | authorDatetime: DateTime, 24 | relevantDatetime: DateTime, 25 | relevantPeriod: Interval, 26 | reason: Code, 27 | method: Code, 28 | result: Any, 29 | status: Code, 30 | anatomicalLocationSite: Code, 31 | rank: Number, 32 | incisionDatetime: DateTime, 33 | negationRationale: Code, 34 | components: [ComponentSchema], 35 | performer: [AnyEntity], 36 | relatedTo: [String], 37 | qdmTitle: { type: String, default: 'Procedure, Performed' }, 38 | hqmfOid: { type: String, default: '2.16.840.1.113883.10.20.28.4.67' }, 39 | qdmCategory: { type: String, default: 'procedure' }, 40 | qdmStatus: { type: String, default: 'performed' }, 41 | qdmVersion: { type: String, default: '5.6' }, 42 | _type: { type: String, default: 'QDM::ProcedurePerformed' }, 43 | 44 | }); 45 | 46 | module.exports.ProcedurePerformedSchema = ProcedurePerformedSchema; 47 | class ProcedurePerformed extends mongoose.Document { 48 | constructor(object) { 49 | super(object, ProcedurePerformedSchema); 50 | this._type = 'QDM::ProcedurePerformed'; 51 | } 52 | } 53 | 54 | module.exports.ProcedurePerformed = ProcedurePerformed; 55 | 56 | -------------------------------------------------------------------------------- /app/models/qdm/attributes/attribute.rb: -------------------------------------------------------------------------------- 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 | 34 | object = object.symbolize_keys 35 | if object.is_a?(Hash) 36 | # This will turn the object into the concrete type eg: facilityLocation 37 | data_element = QDM.const_get(object[:_type]).new 38 | data_element.attribute_names.each do |field| 39 | data_element.send(field + '=', object[field.to_sym]) 40 | end 41 | data_element 42 | else object 43 | end 44 | end 45 | 46 | # Takes any possible object and converts it to how it would be 47 | # stored in the database. 48 | def mongoize(object) 49 | case object 50 | when nil then nil 51 | when QDM::Attribute then object.mongoize 52 | when Hash 53 | object = object.symbolize_keys 54 | data_element = QDM.const_get(object[:_type]).new 55 | data_element.attribute_names.each do |field| 56 | data_element.send(field + '=', object[field.to_sym]) 57 | end 58 | data_element.mongoize 59 | else object 60 | end 61 | end 62 | end 63 | end 64 | end 65 | --------------------------------------------------------------------------------