├── .dockerignore ├── .eslintignore ├── .eslintrc.yml ├── .gitattributes ├── .github ├── PULL_REQUEST_TEMPLATE.md └── workflows │ └── ruby.yml ├── .gitignore ├── .overcommit.yml ├── .pkgr.yml ├── .rubocop.yml ├── .rubocop_todo.yml ├── .ruby-version ├── .scss-lint.yml ├── .travis └── mongoid.yml ├── Dockerfile ├── Gemfile ├── Gemfile.lock ├── LICENSE.txt ├── Procfile ├── README.md ├── Rakefile ├── api ├── api.raml ├── documentation.html └── schema │ └── json │ ├── bundle.json │ ├── bundles.json │ ├── errors.json │ ├── execution_error.json │ ├── execution_errors.json │ ├── measure.json │ ├── measures.json │ ├── point_of_contact.json │ ├── product.json │ ├── product_test.json │ ├── product_tests.json │ ├── products.json │ ├── qrda_validation.json │ ├── qrda_validations.json │ ├── task.json │ ├── tasks.json │ ├── test_execution.json │ ├── test_executions.json │ ├── vendor.json │ ├── vendors.json │ └── version.json ├── app ├── assets │ ├── fonts │ │ ├── NotoSans-Bold.ttf │ │ ├── NotoSans-BoldItalic.ttf │ │ ├── NotoSans-Italic.ttf │ │ ├── NotoSans-Regular.ttf │ │ ├── Ubuntu-Light.ttf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ └── fontawesome-webfont.woff │ ├── images │ │ ├── .keep │ │ ├── cypress_bg_cropped.png │ │ ├── geometry2.png │ │ └── icon.svg │ ├── javascripts │ │ ├── action_modal.js │ │ ├── admin.js │ │ ├── application.js │ │ ├── bundles.js │ │ ├── checklist_measures.js │ │ ├── collapsible.js │ │ ├── form_validations.js │ │ ├── infinite-scroll.js │ │ ├── info_popup.js │ │ ├── measure_selection.js │ │ ├── measure_tests.js │ │ ├── products.js │ │ ├── records.js │ │ ├── sessions.js │ │ ├── test_executions.js │ │ └── xml_navigator.js │ └── stylesheets │ │ ├── _bootstrap-variables.scss │ │ ├── _bootstrap.scss │ │ ├── _globals.scss │ │ ├── _parsley.scss │ │ ├── _variables-dark.scss │ │ ├── _variables.scss │ │ ├── application.scss │ │ └── cypress │ │ ├── _alerts.scss │ │ ├── _analysis.scss │ │ ├── _buttons.scss │ │ ├── _cards.scss │ │ ├── _fonts.scss │ │ ├── _forms.scss │ │ ├── _markup.scss │ │ ├── _measure_tests.scss │ │ ├── _modal.scss │ │ ├── _navbar.scss │ │ ├── _print_report.scss │ │ ├── _products.scss │ │ ├── _record.scss │ │ ├── _sessions.scss │ │ ├── _tables.scss │ │ ├── _tabs.scss │ │ ├── _test_executions.scss │ │ ├── _text.scss │ │ ├── _toggle.scss │ │ ├── _valuesets.scss │ │ ├── _vendor.scss │ │ └── _xml_view.scss ├── controllers │ ├── admin │ │ ├── bundles_controller.rb │ │ ├── settings_controller.rb │ │ ├── trackers_controller.rb │ │ └── users_controller.rb │ ├── admin_controller.rb │ ├── application_controller.rb │ ├── bundle_downloads_controller.rb │ ├── bundles_controller.rb │ ├── checklist_tests_controller.rb │ ├── concerns │ │ └── .keep │ ├── home_controller.rb │ ├── measures_controller.rb │ ├── product_tests_controller.rb │ ├── products_controller.rb │ ├── program_tests_controller.rb │ ├── qrda_uploads_controller.rb │ ├── records_controller.rb │ ├── registrations_controller.rb │ ├── sessions_controller.rb │ ├── static_pages_controller.rb │ ├── tasks_controller.rb │ ├── test_executions_controller.rb │ ├── vendors │ │ └── records_controller.rb │ ├── vendors_controller.rb │ └── version_controller.rb ├── helpers │ ├── application_helper.rb │ ├── checklist_tests_helper.rb │ ├── filtering_tests_helper.rb │ ├── measures_helper.rb │ ├── patient_analysis_helper.rb │ ├── products_helper.rb │ ├── qrda_helper.rb │ ├── records_helper.rb │ ├── test_executions_helper.rb │ ├── test_executions_results_helper.rb │ ├── users_helper.rb │ ├── vendors_helper.rb │ ├── version_config_helper.rb │ └── xml_view_helper.rb ├── jobs │ ├── application_job.rb │ ├── bundle_deprecate_job.rb │ ├── bundle_destroy_job.rb │ ├── bundle_upload_job.rb │ ├── checklist_test_setup_job.rb │ ├── cms_test_execution_job.rb │ ├── filter_test_setup_job.rb │ ├── measure_evaluation_job.rb │ ├── mpl_download_create_job.rb │ ├── patient_analysis_job.rb │ ├── product_test_setup_job.rb │ ├── single_measure_calculation_job.rb │ ├── test_execution_job.rb │ └── vendor_patient_upload_job.rb ├── lib │ └── job │ │ └── status.rb ├── mailers │ └── .keep ├── models │ ├── ability.rb │ ├── artifact.rb │ ├── bundle_download.rb │ ├── c1_checklist_task.rb │ ├── c1_task.rb │ ├── c2_task.rb │ ├── c3_cat1_task.rb │ ├── c3_cat3_task.rb │ ├── c3_checklist_task.rb │ ├── cat1_filter_task.rb │ ├── cat3_filter_task.rb │ ├── checklist_source_data_criteria.rb │ ├── checklist_test.rb │ ├── cms_program_task.rb │ ├── cms_program_test.rb │ ├── concerns │ │ └── .keep │ ├── execution_error.rb │ ├── filtering_test.rb │ ├── measure_test.rb │ ├── multi_measure_cat1_task.rb │ ├── multi_measure_cat3_task.rb │ ├── multi_measure_test.rb │ ├── point_of_contact.rb │ ├── product.rb │ ├── product_test.rb │ ├── program_criterion.rb │ ├── qrda_upload.rb │ ├── qrda_upload_task.rb │ ├── role.rb │ ├── settings.rb │ ├── task.rb │ ├── test_execution.rb │ ├── tracker.rb │ ├── user.rb │ └── vendor.rb ├── representers │ ├── bundle_representer.rb │ ├── measure_representer.rb │ ├── product_representer.rb │ ├── product_test_representer.rb │ ├── qrda_upload_representer.rb │ ├── task_representer.rb │ ├── test_execution_representer.rb │ └── vendor_representer.rb ├── uploaders │ ├── document_uploader.rb │ ├── patient_archive_uploader.rb │ └── supplement_uploader.rb └── views │ ├── admin │ ├── _application_status.html.erb │ ├── _bundle_list.html.erb │ ├── _show_settings.html.erb │ ├── _user_list.html.erb │ ├── bundles │ │ └── new.html.erb │ ├── settings │ │ └── edit.html.erb │ ├── show.html.erb │ ├── show.js.erb │ └── users │ │ ├── edit.html.erb │ │ └── index.html.erb │ ├── application │ ├── _action_button.html.erb │ ├── _action_modal.html.erb │ ├── _alert.html.erb │ ├── _certification_bar.html.erb │ ├── _certification_status_table.html.erb │ ├── _checklist_execution_results.html.erb │ ├── _checklist_status_display.html.erb │ ├── _cvu_plus_status_table.html.erb │ ├── _demo_warning.html.erb │ ├── _execution_status_message.html.erb │ ├── _header_product.html.erb │ ├── _header_vendor.html.erb │ ├── _info_popup.html.erb │ ├── _instructions.html.erb │ ├── _navbar.html.erb │ ├── _product_status_table.html.erb │ └── _remove_panel.html.erb │ ├── bundle_downloads │ └── index.html.erb │ ├── checklist_tests │ ├── _checklist_instructions.html.erb │ ├── _checklist_measure.html.erb │ ├── _checklist_measures.html.erb │ ├── _checklist_modal.html.erb │ ├── _field_values.html.erb │ ├── measure.html.erb │ ├── print_criteria.html.erb │ ├── print_filtering.html.erb │ ├── show.html.erb │ └── show.js.erb │ ├── devise │ ├── confirmations │ │ └── new.html.erb │ ├── mailer │ │ ├── confirmation_instructions.html.erb │ │ ├── reset_password_instructions.html.erb │ │ └── unlock_instructions.html.erb │ ├── passwords │ │ ├── edit.html.erb │ │ └── new.html.erb │ ├── registrations │ │ ├── _recent_activity.html.erb │ │ ├── edit.html.erb │ │ ├── edit.js.erb │ │ └── new.html.erb │ ├── sessions │ │ └── new.html.erb │ ├── shared │ │ └── _links.html.erb │ └── unlocks │ │ └── new.html.erb │ ├── errors │ ├── 404.html.erb │ └── 500.html.erb │ ├── layouts │ ├── _error_links.html.erb │ ├── application.html.erb │ ├── errors.html.erb │ └── report.html.erb │ ├── product_tests │ └── show.html.erb │ ├── products │ ├── _bulk_download.html.erb │ ├── _certification_product.html.erb │ ├── _cvu_plus_product.html.erb │ ├── _filtering_test_link.html.erb │ ├── _filtering_test_status_display.html.erb │ ├── _measure_selection.html.erb │ ├── _measure_selection.json.jbuilder │ ├── _measure_test_link.html.erb │ ├── _measure_tests_table.html.erb │ ├── _measure_tests_table_row.html.erb │ ├── _product_form.html.erb │ ├── _product_test_upload.html.erb │ ├── edit.html.erb │ ├── favorite.js.erb │ ├── new.html.erb │ ├── report.html.erb │ ├── report │ │ ├── _certification_report.html.erb │ │ ├── _cvu_plus_report.html.erb │ │ ├── _failing_measure_tests.html.erb │ │ ├── _filtering_tests_list.html.erb │ │ ├── _measure_tests_list.html.erb │ │ ├── _measure_tests_with_warnings.html.erb │ │ └── _status_icon.html.erb │ ├── show.html.erb │ └── show.js.erb │ ├── program_tests │ ├── _cms_program_test.html.erb │ ├── _hl7_program_test.html.erb │ ├── _program_fields.html.erb │ ├── _upload_panel.html.erb │ ├── show.html.erb │ └── show.js.erb │ ├── records │ ├── _calculation_result_icon.html.erb │ ├── _calculation_results.html.erb │ ├── _core_clinical_data_elements_display.html.erb │ ├── _logic_coverage_table.html.erb │ ├── _missing_population_table.html.erb │ ├── _mpl_download.html.erb │ ├── _patient_analysis_tracker.html.erb │ ├── _patient_measure_highlighting.html.erb │ ├── _records_list.html.erb │ ├── _risk_variable_display.html.erb │ ├── _risk_variable_display.html.old.erb │ ├── _uncovered_code_table.html.erb │ ├── _uncovered_valueset_table.html.erb │ ├── _vendor_upload_jobs.html.erb │ ├── by_filter_task.html.erb │ ├── by_measure.js.erb │ ├── index.html.erb │ ├── index.js.erb │ ├── new.html.erb │ ├── patient_analysis.html.erb │ ├── patient_analysis.js.erb │ └── show.html.erb │ ├── static_pages │ └── terms_and_conditions.html.erb │ ├── test_executions │ ├── _execution_download.html.erb │ ├── _execution_results.html.erb │ ├── _execution_upload.html.erb │ ├── _expected_result_icon.html.erb │ ├── _expected_results.html.erb │ ├── _filter_instructions.html.erb │ ├── _task_status.html.erb │ ├── _task_status_wrapper.html.erb │ ├── _test_info.html.erb │ ├── create.js.erb │ ├── file_result.html.erb │ ├── results │ │ ├── _calculation_results_for_file.html.erb │ │ ├── _error_table.html.erb │ │ ├── _execution_results_for_file.html.erb │ │ ├── _node.html.erb │ │ ├── _passing_result.html.erb │ │ ├── _supplemental_data_error_table.html.erb │ │ └── _xmlnav.html.erb │ ├── show.html.erb │ └── show.js.erb │ └── vendors │ ├── _vendor.html.erb │ ├── _vendor_form.html.erb │ ├── edit.html.erb │ ├── favorite.js.erb │ ├── index.html.erb │ ├── new.html.erb │ ├── preferences.html.erb │ ├── show.html.erb │ └── show.js.erb ├── bin ├── brakeman ├── bundle ├── cucumber ├── delayed_job ├── overcommit ├── queue_job ├── rails ├── rake ├── rubocop ├── setup ├── update └── yarn ├── codecov.yml ├── config.ru ├── config ├── application.rb ├── boot.rb ├── brakeman.ignore ├── cat1checklist.yml ├── cms_ig.yml ├── cucumber.yml ├── cypress.yml ├── environment.rb ├── environments │ ├── development.rb │ ├── production.rb │ └── test.rb ├── initializers │ ├── application_controller_renderer.rb │ ├── assets.rb │ ├── backtrace_silencers.rb │ ├── content_security_policy.rb │ ├── cookies_serializer.rb │ ├── cqm_execution_service.rb │ ├── cypress.rb │ ├── delayed_job.rb │ ├── devise.rb │ ├── filter_parameter_logging.rb │ ├── inflections.rb │ ├── mime_types.rb │ ├── mongo.rb │ ├── mongoid.rb │ ├── new_framework_defaults_6_1.rb │ ├── new_framework_defaults_7_0.rb │ ├── permissions_policy.rb │ ├── rolify.rb │ ├── session_store.rb │ ├── smtp.rb │ ├── uri_escape.rb │ ├── version.rb │ ├── wrap_parameters.rb │ └── zeitwerk.rb ├── locales │ ├── devise.en.yml │ └── en.yml ├── mongoid.yml ├── names.yml ├── rails_best_practices.yml ├── routes.rb ├── secrets.yml ├── testing_attributes.yml └── unicorn.rb ├── contrib ├── README.md ├── cypress.json ├── install_files │ ├── meta-data │ ├── preseed.cfg │ └── user-data ├── scripts │ ├── cleanup.sh │ ├── create_env_prod.sh │ └── vmx_to_ova.sh ├── upgrade_cypress_30.sh ├── upgrade_cypress_300_to_301.sh ├── upgrade_cypress_32.sh ├── upgrade_cypress_40.sh ├── upgrade_cypress_50.sh ├── upgrade_cypress_60.sh └── upgrade_cypress_70.sh ├── db └── seeds.rb ├── docker-compose.yml ├── docker_delayed_job.sh ├── docker_unicorn_start.sh ├── features ├── admin │ └── show.feature ├── checklist_tests │ ├── edit.feature │ └── show.feature ├── filtering_tests │ └── show.feature ├── measure_tests │ ├── records_list.feature │ └── show.feature ├── multi_measure_tests │ ├── records_list.feature │ └── show.feature ├── products │ ├── edit.feature │ ├── edit_deprecated.feature │ ├── new.feature │ └── show.feature ├── program_tests │ ├── edit.feature │ └── show.feature ├── records │ ├── index.feature │ └── show.feature ├── step_definitions │ ├── .gitkeep │ ├── admin.rb │ ├── bundle.rb │ ├── checklist_test.rb │ ├── filtering_test.rb │ ├── measure_test.rb │ ├── multi_measure_test.rb │ ├── product.rb │ ├── program_test.rb │ ├── record.rb │ ├── record_list.rb │ ├── user.rb │ └── vendor.rb ├── support │ ├── debugging.rb │ ├── env.rb │ └── warden.rb ├── users │ ├── account.feature │ ├── login.feature │ ├── login_no_bundle.feature │ └── register.feature └── vendors │ ├── edit.feature │ └── new.feature ├── lib ├── api.rb ├── assets │ └── .keep ├── bootstrap_breadcrumbs_builder.rb ├── cypress.rb ├── cypress │ ├── api_measure_evaluator.rb │ ├── clinical_randomizer.rb │ ├── cql_bundle_importer.rb │ ├── cqm_execution_calc.rb │ ├── create_download_zip.rb │ ├── create_total_test_zip.rb │ ├── criteria_picker.rb │ ├── data_criteria_attribute_builder.rb │ ├── data_criteria_selector.rb │ ├── demographics_randomizer.rb │ ├── error_collector.rb │ ├── example_patient_finder.rb │ ├── expected_results_calculator.rb │ ├── mbi_generator.rb │ ├── measure_evaluator.rb │ ├── name_randomizer.rb │ ├── npi_generator.rb │ ├── patient_filter.rb │ ├── patient_zipper.rb │ ├── population_clone_job.rb │ ├── product_status_values.rb │ ├── provider_filter.rb │ ├── qrda_post_processor.rb │ └── scoop_and_filter.rb ├── ext │ ├── bundle.rb │ ├── cqm │ │ ├── individual_result.rb │ │ ├── measure.rb │ │ ├── patient.rb │ │ └── provider.rb │ ├── moped.rb │ ├── qdm │ │ ├── data_element.rb │ │ └── id.rb │ ├── string.rb │ ├── value_set.rb │ └── zip_file_generator.rb ├── hash.rb ├── highlighting │ ├── highlighting.mustache │ ├── highlighting.rb │ └── highlighting_clause.mustache ├── tasks │ ├── .keep │ ├── admin.rake │ ├── bundle.rake │ ├── bundle_eval.rake │ ├── cucumber.rake │ ├── cypress.rake │ ├── evaluator.rake │ └── tmp.rake └── validators │ ├── calculating_augmented_records.rb │ ├── calculating_augmented_results.rb │ ├── calculating_smoking_gun_validator.rb │ ├── cat3_population_validator.rb │ ├── checklist_criteria_validator.rb │ ├── cms_schematron_validator.rb │ ├── core_clinical_data_element_validator.rb │ ├── ehr_certification_id_validator.rb │ ├── encounter_validator.rb │ ├── expected_results_validator.rb │ ├── expected_supplemental_results.rb │ ├── measure_period_validator.rb │ ├── program_criteria_validator.rb │ ├── program_validator.rb │ ├── provider_type_validator.rb │ ├── qrda_cat1_validator.rb │ ├── qrda_cat3_validator.rb │ ├── qrda_file_validator.rb │ ├── qrda_upload_validator.rb │ ├── smoking_gun_validator.rb │ └── validator.rb ├── log └── .keep ├── mongo └── docker_mongod.conf ├── notice.md ├── public ├── errors │ ├── 404.html │ └── 50x.html ├── favicon.ico └── robots.txt ├── resources └── schematron │ ├── 2016.0.0 │ ├── EH │ │ ├── EH_CAT_I.sch │ │ └── voc.xml │ └── EP │ │ ├── EP_CAT_III.sch │ │ └── voc.xml │ ├── 2017.0.0 │ ├── EH │ │ ├── EH_CAT_I.sch │ │ └── voc.xml │ └── EP │ │ ├── EP_CAT_III.sch │ │ └── voc.xml │ ├── 2018.0.0 │ ├── EH │ │ ├── EH_CAT_I.sch │ │ └── voc.xml │ └── EP │ │ ├── EP_CAT_III.sch │ │ └── voc.xml │ ├── 2019.0.0 │ ├── EH │ │ ├── EH_CAT_I.sch │ │ └── voc.xml │ └── EP │ │ ├── EP_CAT_III.sch │ │ └── voc.xml │ ├── 2020.0.0 │ ├── EH │ │ ├── EH_CAT_I.sch │ │ └── voc.xml │ └── EP │ │ ├── EP_CAT_III.sch │ │ └── voc.xml │ ├── 2021.0.0 │ ├── EH │ │ ├── EH_CAT_I.sch │ │ └── voc.xml │ └── EP │ │ ├── EP_CAT_III.sch │ │ └── voc.xml │ ├── 2022.0.0 │ ├── EH │ │ ├── EH_CAT_I.sch │ │ └── voc.xml │ └── EP │ │ ├── EP_CAT_III.sch │ │ └── voc.xml │ ├── 2023.0.0 │ ├── EH │ │ ├── EH_CAT_I.sch │ │ └── voc.xml │ └── EP │ │ ├── EP_CAT_III.sch │ │ └── voc.xml │ ├── 2024.0.0 │ ├── EH │ │ ├── EH_CAT_I.sch │ │ └── voc.xml │ └── EP │ │ ├── EP_CAT_III.sch │ │ └── voc.xml │ ├── 2025.0.0 │ └── EH │ │ ├── EH_CAT_I.sch │ │ └── voc.xml │ └── bundle_2_9_9 │ ├── EH │ ├── EH_CAT_I.sch │ └── voc.xml │ └── EP │ ├── EP_CAT_I.sch │ ├── EP_CAT_III.sch │ └── voc.xml ├── script ├── cucumber └── generate_cat1_preference.rb ├── test ├── api_test.rb ├── controllers │ ├── .keep │ ├── admin │ │ ├── bundles_controller_test.rb │ │ ├── settings_controller_test.rb │ │ ├── trackers_controller_test.rb │ │ └── users_controller_test.rb │ ├── admin_controller_test.rb │ ├── bundles_controller_test.rb │ ├── checklist_tests_controller_test.rb │ ├── home_controller_test.rb │ ├── measures_controller_test.rb │ ├── product_tests_controller_test.rb │ ├── products_controller_test.rb │ ├── qrda_uploads_controller_test.rb │ ├── records_controller_test.rb │ ├── tasks_controller_test.rb │ ├── test_executions_controller_test.rb │ ├── vendor_records_controller_test.rb │ ├── vendors_controller_test.rb │ └── version_controller_test.rb ├── factories │ ├── bundles.rb │ ├── execution_error.rb │ ├── filter_tests.rb │ ├── individual_result.rb │ ├── measures.rb │ ├── multi_measure_tests.rb │ ├── patients.rb │ ├── pocs.rb │ ├── product_tests.rb │ ├── products.rb │ ├── providers.rb │ ├── qdm_patient.rb │ ├── roles.rb │ ├── tasks.rb │ ├── test_executions.rb │ ├── users.rb │ ├── value_sets.rb │ └── vendors.rb ├── fixtures │ ├── artifacts │ │ ├── CMS134v6.json │ │ ├── CMS142v9.zip │ │ ├── CMS249v3.zip │ │ ├── cms32v7.json │ │ ├── full_fail_patient_upload.zip │ │ ├── good_file_extension.xml │ │ ├── good_file_extension.zip │ │ ├── good_patient_shift.zip │ │ ├── good_patient_upload.zip │ │ ├── half_fail_patient_upload.zip │ │ └── qrda.zip │ ├── bundles │ │ ├── minimal_bundle_qdm_5_4.zip │ │ ├── minimal_bundle_qdm_5_5.zip │ │ ├── minimal_bundle_qdm_5_5_with_calcs.zip │ │ ├── minimal_bundle_qdm_5_6.zip │ │ └── minimal_bundle_qdm_5_6_with_calcs.zip │ ├── qrda │ │ ├── cat_I │ │ │ ├── c1_checklist_correct_codes.zip │ │ │ ├── c1_checklist_correct_codes_bad_form.zip │ │ │ ├── c1_checklist_incorrect_codes.zip │ │ │ ├── ep_qrda_bad_calculation.zip │ │ │ ├── ep_qrda_bad_calculation_aug.zip │ │ │ ├── ep_qrda_test_ccde.zip │ │ │ ├── ep_qrda_test_ccde_lowercase.zip │ │ │ ├── ep_qrda_test_future_encounter.zip │ │ │ ├── ep_qrda_test_good.zip │ │ │ ├── ep_qrda_test_good_aug.zip │ │ │ ├── ep_qrda_test_good_quarter.zip │ │ │ ├── ep_qrda_test_good_shift.zip │ │ │ ├── ep_qrda_test_too_many_files.zip │ │ │ ├── ep_qrda_test_wrong_ecqm.zip │ │ │ ├── ep_qrda_test_wrong_names.zip │ │ │ ├── good_cat1_single_encounter.xml │ │ │ ├── import_warnings.xml │ │ │ ├── qrda_test_2_npi.zip │ │ │ ├── sample_patient_bad_schema.xml │ │ │ ├── sample_patient_bad_schema.zip │ │ │ ├── sample_patient_error_in_encounter.xml │ │ │ ├── sample_patient_good.xml │ │ │ ├── sample_patient_good_quarter.xml │ │ │ ├── sample_patient_good_telehealth.xml │ │ │ ├── sample_patient_no_result.xml │ │ │ ├── sample_patient_single_code.xml │ │ │ ├── sample_patient_too_much_data.xml │ │ │ ├── sample_patient_unit_mismatch.xml │ │ │ └── sample_patient_unit_missing.xml │ │ └── cat_III │ │ │ ├── cms_test_qrda_cat3.xml │ │ │ ├── cms_test_qrda_cat3_cv.xml │ │ │ ├── ep_test_qrda_cat3_bad_mp.xml │ │ │ ├── ep_test_qrda_cat3_bad_performance_rate.xml │ │ │ ├── ep_test_qrda_cat3_bad_schematron.xml │ │ │ ├── ep_test_qrda_cat3_bad_strat.xml │ │ │ ├── ep_test_qrda_cat3_extra_male.xml │ │ │ ├── ep_test_qrda_cat3_extra_supplemental.xml │ │ │ ├── ep_test_qrda_cat3_extra_supplemental_is_zero.xml │ │ │ ├── ep_test_qrda_cat3_good.xml │ │ │ ├── ep_test_qrda_cat3_good_invalid_id.xml │ │ │ ├── ep_test_qrda_cat3_missing_measure.xml │ │ │ ├── ep_test_qrda_cat3_missing_supplemental.xml │ │ │ ├── ep_test_qrda_cat3_missing_supplemental_two_extra_male.xml │ │ │ ├── ep_test_qrda_cat3_no_end.xml │ │ │ ├── ep_test_qrda_cat3_no_start.xml │ │ │ └── ep_test_qrda_cat3_shifted.xml │ └── vcr_cassettes │ │ ├── bundle_download.yml │ │ ├── bundle_download_2023.yml │ │ └── mini_bundle_download.yml ├── helpers │ ├── .keep │ ├── caching_test.rb │ ├── checklist_tests_helper_test.rb │ ├── filtering_tests_helper_test.rb │ ├── measure_helper_test.rb │ ├── patient_analysis_helper_test.rb │ ├── products_helper_test.rb │ ├── test_executions_helper_test.rb │ ├── vendors_helper_test.rb │ └── xml_view_helper_test.rb ├── integration │ ├── .keep │ └── api_measure_evaluator_test.rb ├── jobs │ ├── filter_test_setup_job_test.rb │ ├── job_tracker.rb │ ├── measure_evaluation_job_test.rb │ ├── mpl_download_create_job_test.rb │ ├── product_test_setup_job_test.rb │ ├── single_measure_calculation_job_test.rb │ └── test_execution_job_test.rb ├── mailers │ └── .keep ├── models │ ├── artifact_test.rb │ ├── c1_checklist_task_test.rb │ ├── c1_task_test.rb │ ├── c2_task_test.rb │ ├── c3_cat1_task_test.rb │ ├── c3_cat3_task_test.rb │ ├── c3_checklist_task_test.rb │ ├── cat1_filter_task_test.rb │ ├── cat3_filter_task_test.rb │ ├── checklist_source_data_criteria_test.rb │ ├── checklist_test_test.rb │ ├── cms_program_task_test.rb │ ├── filtering_test_test.rb │ ├── individual_result_test.rb │ ├── measure_test_test.rb │ ├── multi_measure_cat1_task_test.rb │ ├── multi_measure_cat3_task_test.rb │ ├── multi_measure_test_test.rb │ ├── patient_test.rb │ ├── product_test.rb │ ├── product_test_test.rb │ ├── role_test.rb │ ├── test_execution_test.rb │ ├── user_test.rb │ └── vendor_test.rb ├── test_helper.rb ├── unit │ ├── default_provider_test.rb │ ├── html_test.rb │ ├── lib │ │ ├── clinical_randomizer_test.rb │ │ ├── create_download_zip_test.rb │ │ ├── cypress │ │ │ ├── cql_bundle_importer_test.rb │ │ │ ├── data_criteria_attribute_builder_test.rb │ │ │ ├── highlighting_test.rb │ │ │ └── qrda_post_processor_test.rb │ │ ├── demographics_randomizer_test.rb │ │ ├── name_randomizer_test.rb │ │ ├── patient_zipper_test.rb │ │ ├── population_clone_job_test.rb │ │ ├── provider_filter_test.rb │ │ ├── record_filter_test.rb │ │ └── validators │ │ │ ├── calculating_augmented_records_test.rb │ │ │ ├── cat3_population_validator_test.rb │ │ │ ├── checklist_criteria_validator_test.rb │ │ │ ├── encounter_validator_test.rb │ │ │ ├── expected_results_validator_test.rb │ │ │ ├── measure_period_validator_test.rb │ │ │ ├── program_validator_test.rb │ │ │ ├── qrda_cat1_validator_test.rb │ │ │ └── qrda_cat3_validator_test.rb │ └── product_report_test.rb └── vcr_setup.rb └── vendor └── assets ├── javascripts ├── .keep ├── assets_framework │ ├── assets.core.js │ ├── assets.responsive.js │ ├── assets.tracking.js │ ├── breadcrumb.js │ └── hc-detect.js ├── dragon_drop │ └── dragon-drop.js └── parsley │ └── parsley.js └── stylesheets ├── .keep └── assets_framework ├── _custom-input.scss ├── _custom-mixins.scss ├── _helpers.scss ├── adobeBlank ├── adobe-blank.css ├── adobe-blank.scss └── font │ ├── AdobeBlank.b64.txt │ ├── AdobeBlank.eot │ ├── AdobeBlank.otf │ ├── AdobeBlank.otf.woff │ ├── AdobeBlank.ttf │ └── AdobeBlank.ttf.woff ├── breadcrumb.scss ├── fonts ├── AdobeBlank.eot ├── AdobeBlank.otf.woff ├── AdobeBlank.ttf └── AdobeBlank.ttf.woff ├── formvalidator-3.0.css ├── global-template.scss ├── reset-3.0.css └── widgets ├── _accordion.scss ├── _alerts.scss ├── _buttons.scss ├── _carousel.scss ├── _collapsible.scss ├── _datepicker.scss ├── _dialog.scss ├── _dropdowns.scss ├── _equalize.scss ├── _errors.scss ├── _expand-collapse.scss ├── _form.scss ├── _inputs.scss ├── _progressbar.scss ├── _slider.scss ├── _tabs.scss ├── _tooltips.scss ├── alerts.css ├── buttons.css ├── carousel.css ├── collapsible.css ├── dropdowns.css ├── modal-styles.css ├── modalstyles.css └── tooltips.css /.dockerignore: -------------------------------------------------------------------------------- 1 | .git/ 2 | public/data/* 3 | public/uploads/* 4 | tmp/* 5 | uploads/* 6 | bundles/* 7 | log/* 8 | contrib/* 9 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | vendor/assets/javascripts/ 2 | test/fixtures/ 3 | coverage/ 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | resources/* linguist-vendored 2 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Pull requests into Cypress 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 | 11 | **Reviewer 1:** 12 | 13 | Name: 14 | - [ ] Code is maintainable and reusable, reuses existing code and infrastructure where appropriate, and accomplishes the task’s purpose 15 | - [ ] The tests appropriately test the new code, including edge cases 16 | - [ ] You have tried to break the code 17 | 18 | **Reviewer 2:** 19 | 20 | Name: 21 | - [ ] Code is maintainable and reusable, reuses existing code and infrastructure where appropriate, and accomplishes the task’s purpose 22 | - [ ] The tests appropriately test the new code, including edge cases 23 | - [ ] You have tried to break the code -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | npm-debug.log 2 | lantana 3 | .bundle 4 | /bundles 5 | db/** 6 | !db/migrate/ 7 | log/*.log 8 | tmp/ 9 | data/ 10 | config/ccr.xsd 11 | config/deploy.rb 12 | coverage/ 13 | coverage.* 14 | *.rdb 15 | *.DS_Store 16 | nbproject/ 17 | .sass-cache/ 18 | nohup.* 19 | public/current_mpl_results.txt 20 | coverage 21 | 22 | resources/schematron/qrda/qrda_cat_1/generic-schematron/*.xml 23 | oid_errors.txt 24 | .DS_Store 25 | Thumbs.db 26 | !resources/schematron/qrda/qrda_cat_1/generic-schematron/voc.xml 27 | !db/migrate/* 28 | 29 | ### Packer ### 30 | # Cache objects 31 | contrib/packer_cache/ 32 | contrib/cookbooks/ 33 | 34 | # AWS Environment file 35 | contrib/aws_env.json 36 | 37 | # For built boxes 38 | contrib/output* 39 | contrib/*.gz 40 | contrib/*.ova 41 | 42 | # test executions 43 | public/data* 44 | public/uploads* 45 | 46 | .byebug_history 47 | 48 | # Docker 49 | .env-prod 50 | 51 | # temp folder 52 | temp/ 53 | -------------------------------------------------------------------------------- /.pkgr.yml: -------------------------------------------------------------------------------- 1 | env: 2 | - DISABLE_DB=true 3 | dependencies: 4 | - libcurl4 5 | before: 6 | - mkdir -p /tmp/db 7 | targets: 8 | ubuntu-22.04: 9 | ubuntu-20.04: 10 | ubuntu-18.04: 11 | -------------------------------------------------------------------------------- /.rubocop_todo.yml: -------------------------------------------------------------------------------- 1 | # Below are Cops that return errors that had not be caught 2 | Style/Documentation: 3 | Enabled: false 4 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 3.3.5 -------------------------------------------------------------------------------- /.scss-lint.yml: -------------------------------------------------------------------------------- 1 | scss_files: 'app/assets/stylesheets/**/*.scss' 2 | 3 | exclude: 4 | - 'app/assets/stylesheets/_bootstrap-variables.scss' 5 | - 'app/assets/stylesheets/cypress/_xml_view.scss' 6 | - 'app/assets/stylesheets/cypress/_select2.scss' 7 | 8 | linters: 9 | Comment: 10 | exclude: 'app/assets/stylesheets/application.scss' 11 | 12 | HexNotation: 13 | enabled: false 14 | 15 | EmptyLineBetweenBlocks: 16 | severity: error 17 | 18 | EmptyRules: 19 | severity: error 20 | 21 | IdSelector: 22 | severity: error 23 | exclude: 'app/assets/stylesheets/_globals.scss' 24 | 25 | NestingDepth: 26 | severity: error 27 | max_depth: 5 28 | 29 | PlaceholderInExtend: 30 | enabled: false 31 | 32 | SelectorDepth: 33 | severity: error 34 | max_depth: 5 35 | 36 | SelectorFormat: 37 | enabled: false 38 | 39 | PropertySortOrder: 40 | enabled: false 41 | 42 | VariableForProperty: 43 | enabled: true 44 | severity: error 45 | properties: 46 | - color 47 | - background-color 48 | 49 | VendorPrefix: 50 | enabled: true 51 | identifier_list: 52 | - base 53 | -------------------------------------------------------------------------------- /.travis/mongoid.yml: -------------------------------------------------------------------------------- 1 | # Mongoid Configuration for Travis CI 2 | # =================================== 3 | # 4 | development: 5 | clients: 6 | default: 7 | database: cypress_development 8 | hosts: 9 | - 127.0.0.1:27017 10 | test: 11 | clients: 12 | default: 13 | database: cypress_test 14 | hosts: 15 | - <%= ENV['TEST_DB_HOST'] || '127.0.0.1' %>:27017 16 | 17 | production: 18 | clients: 19 | default: 20 | database: cypress_production 21 | hosts: 22 | - 127.0.0.1:27017 23 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb 2 | worker: bundle exec rake jobs:work 3 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Add your own tasks in files placed in lib/tasks ending in .rake, 4 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. 5 | 6 | require File.expand_path('config/application', __dir__) 7 | 8 | Rails.application.load_tasks 9 | -------------------------------------------------------------------------------- /api/schema/json/bundle.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Bundle", 3 | "id": "http://cypress.healthit.gov/schemas/bundle.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "object", 6 | "properties": { 7 | "title": {"type": "string"}, 8 | "version": {"type": "string"} 9 | }, 10 | "links": [ 11 | { 12 | "rel": "self", 13 | "href": "/bundles/{id}" 14 | }, { 15 | "rel": "measures", 16 | "href": "/bundles/{id}/measures" 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /api/schema/json/bundles.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Bundles", 3 | "id": "http://cypress.healthit.gov/schemas/bundles.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "array", 6 | "items": { "$ref": "bundle" } 7 | } -------------------------------------------------------------------------------- /api/schema/json/errors.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Errors", 3 | "id": "http://cypress.healthit.gov/schemas/errors.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "object", 6 | "properties": { 7 | "errors": { 8 | "type": "array", 9 | "items": { 10 | "type": "object", 11 | "properties": { 12 | "field": { 13 | "type": "string" 14 | }, 15 | "messages": { 16 | "type": "array", 17 | "items": { "type" : "string" } 18 | } 19 | } 20 | } 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /api/schema/json/execution_error.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Execution Error", 3 | "id": "http://cypress.healthit.gov/schemas/execution_error.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "object", 6 | "properties": { 7 | "message": {"type": "string"}, 8 | "msg_type": {"type": "string"}, 9 | "file_name": {"type": "string"}, 10 | "location": {"type": "string"}, 11 | "validator": {"type": "string"} 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /api/schema/json/execution_errors.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Execution Errors", 3 | "id": "http://cypress.healthit.gov/schemas/execution_errors.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "array", 6 | "items": { "$ref": "execution_error" } 7 | } -------------------------------------------------------------------------------- /api/schema/json/measure.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Measure", 3 | "id": "http://cypress.healthit.gov/schemas/measure.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "object", 6 | "properties": { 7 | "name": {"type": "string"}, 8 | "cms_id": {"type": "string"}, 9 | "hqmf_id": {"type": "string"}, 10 | "type": {"type": "string"}, 11 | "description": {"type": "string"}, 12 | "category": {"type": "string"} 13 | } 14 | } -------------------------------------------------------------------------------- /api/schema/json/measures.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Measures", 3 | "id": "http://cypress.healthit.gov/schemas/measures.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "array", 6 | "items": { "$ref": "measure" } 7 | } -------------------------------------------------------------------------------- /api/schema/json/point_of_contact.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Point of Contact", 3 | "id": "http://cypress.healthit.gov/schemas/point_of_contact.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "object", 6 | "properties": { 7 | "name": {"type": "string"}, 8 | "email": {"type": "string"}, 9 | "phone": {"type": "string"}, 10 | "contact_type": {"type": "string"} 11 | } 12 | } -------------------------------------------------------------------------------- /api/schema/json/product.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Product", 3 | "id": "http://cypress.healthit.gov/schemas/product.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "object", 6 | "properties": { 7 | "name": {"type": "string"}, 8 | "version": {"type": "string"}, 9 | "description": {"type": "string"}, 10 | "bundle_id": {"type": "string"}, 11 | "c1_test": {"type": "boolean"}, 12 | "c2_test": {"type": "boolean"}, 13 | "c3_test": {"type": "boolean"}, 14 | "c4_test": {"type": "boolean"}, 15 | "cures_update": {"type": "boolean"}, 16 | "all_eh": {"type": "boolean"}, 17 | "all_ep": {"type": "boolean"}, 18 | "randomize_patients": {"type": "boolean"}, 19 | "duplicate_patients": {"type": "boolean"}, 20 | "shift_patients": {"type": "boolean"}, 21 | "measure_ids": {"type": "array"}, 22 | "created_at": {"type": "string", "format": "date-time"}, 23 | "updated_at": {"type": "string", "format": "date-time"} 24 | }, 25 | "links": [ 26 | { 27 | "rel": "self", 28 | "href": "/vendors/{vendor_id}/products/{id}" 29 | }, 30 | { 31 | "rel": "product_tests", 32 | "href": "/products/{id}/product_tests" 33 | }, 34 | { 35 | "rel": "patients", 36 | "href": "/vendors/{vendor_id}/products/{id}/patients" 37 | } 38 | ] 39 | } 40 | -------------------------------------------------------------------------------- /api/schema/json/product_tests.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Product Tests", 3 | "id": "http://cypress.healthit.gov/schemas/product_tests.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "array", 6 | "items": { "$ref": "product_test" } 7 | } -------------------------------------------------------------------------------- /api/schema/json/products.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Products", 3 | "id": "http://cypress.healthit.gov/schemas/products.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "array", 6 | "items": { "$ref": "product" } 7 | } -------------------------------------------------------------------------------- /api/schema/json/qrda_validation.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "QRDA Validation", 3 | "id": "http://cypress.healthit.gov/schemas/qrda_validation.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "object", 6 | "properties": { 7 | "validator": {"type": "string"}, 8 | "path": {"type": "string"}, 9 | "execution_errors": {"type": "array", "items": { "$ref": "execution_error" } } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /api/schema/json/qrda_validations.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "QRDA Validatons", 3 | "id": "http://cypress.healthit.gov/schemas/qrda_validatons.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "array", 6 | "items": { "$ref": "qrda_validaton" } 7 | } -------------------------------------------------------------------------------- /api/schema/json/task.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Task", 3 | "id": "http://cypress.healthit.gov/schemas/product.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "object", 6 | "properties": { 7 | "type": {"type": "string"} 8 | }, 9 | "links": [ 10 | { 11 | "rel": "self", 12 | "href": "/product_tests/{product_test_id}/tasks/{id}" 13 | }, 14 | { 15 | "rel": "executions", 16 | "href": "/tasks/{task_id}/test_executions" 17 | } 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /api/schema/json/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Tasks", 3 | "id": "http://cypress.healthit.gov/schemas/tasks.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "array", 6 | "items": { "$ref": "task" } 7 | } -------------------------------------------------------------------------------- /api/schema/json/test_execution.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Test Execution", 3 | "id": "http://cypress.healthit.gov/schemas/test_execution.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "object", 6 | "properties": { 7 | "state": {"type": "string"}, 8 | "execution_errors": {"type": "array", "items": { "$ref": "execution_error" } }, 9 | "created_at": {"type": "string", "format": "date-time"} 10 | }, 11 | "links": [ 12 | { 13 | "rel": "self", 14 | "href": "/tasks{task_id}/test_executions/{id}" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /api/schema/json/test_executions.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Test Executions", 3 | "id": "http://cypress.healthit.gov/schemas/test_executions.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "array", 6 | "items": { "$ref": "test_executions" } 7 | } -------------------------------------------------------------------------------- /api/schema/json/vendor.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Vendor", 3 | "id": "http://cypress.healthit.gov/schemas/vendor.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "object", 6 | "properties": { 7 | "vendor_id": {"type": "string"}, 8 | "name": {"type": "string"}, 9 | "url": {"type": "string"}, 10 | "address": {"type": "string"}, 11 | "zip": {"type": "string"}, 12 | "state": {"type": "string"}, 13 | "points_of_contact": { "type": "array", "items": { "$ref": "point_of_contact" } }, 14 | "created_at": {"type": "string", "format": "date-time"}, 15 | "updated_at": {"type": "string", "format": "date-time"} 16 | }, 17 | "links": [ 18 | { 19 | "rel": "self", 20 | "href": "/vendors/{id}" 21 | }, 22 | { 23 | "rel": "products", 24 | "href": "/vendors/{id}/products" 25 | } 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /api/schema/json/vendors.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Vendors", 3 | "id": "http://cypress.healthit.gov/schemas/vendors.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "array", 6 | "items": { "$ref": "vendor" } 7 | } -------------------------------------------------------------------------------- /api/schema/json/version.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Version", 3 | "id": "http://cypress.healthit.gov/schemas/version.json", 4 | "$schema": "http://json-schema.org/schema#", 5 | "type": "object", 6 | "properties": { 7 | "version": {"type": "string"} 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /app/assets/fonts/NotoSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/app/assets/fonts/NotoSans-Bold.ttf -------------------------------------------------------------------------------- /app/assets/fonts/NotoSans-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/app/assets/fonts/NotoSans-BoldItalic.ttf -------------------------------------------------------------------------------- /app/assets/fonts/NotoSans-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/app/assets/fonts/NotoSans-Italic.ttf -------------------------------------------------------------------------------- /app/assets/fonts/NotoSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/app/assets/fonts/NotoSans-Regular.ttf -------------------------------------------------------------------------------- /app/assets/fonts/Ubuntu-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/app/assets/fonts/Ubuntu-Light.ttf -------------------------------------------------------------------------------- /app/assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/app/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /app/assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/app/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /app/assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/app/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /app/assets/images/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/app/assets/images/.keep -------------------------------------------------------------------------------- /app/assets/images/cypress_bg_cropped.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/app/assets/images/cypress_bg_cropped.png -------------------------------------------------------------------------------- /app/assets/images/geometry2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/app/assets/images/geometry2.png -------------------------------------------------------------------------------- /app/assets/javascripts/bundles.js: -------------------------------------------------------------------------------- 1 | function elementContainsText(selector, text) { 2 | return $(selector).text().indexOf(text) > -1; 3 | } 4 | 5 | var updateBundleStatus = function() { 6 | if (elementContainsText('.tracker-status', 'queued') || elementContainsText('.tracker-status', 'working')) { 7 | $.ajax({url: window.location.pathname, type: "GET", dataType: 'script', data: { partial: 'bundle_list'}}); 8 | } 9 | } 10 | 11 | $(document).on('page:change', updateBundleStatus); 12 | -------------------------------------------------------------------------------- /app/assets/javascripts/collapsible.js: -------------------------------------------------------------------------------- 1 | var collapse_ready; 2 | collapse_ready = function() { 3 | $(document).on('click', '.collapsible', function(e) { 4 | this.classList.toggle("active"); 5 | var content = this.nextElementSibling; 6 | if (content.style.display === "block") { 7 | content.style.display = "none"; 8 | } else { 9 | content.style.display = "block"; 10 | } 11 | }); 12 | }; 13 | $(document).ready(collapse_ready); 14 | // $(document).on('page:load page:restore page:partial-load', collapse_ready); 15 | -------------------------------------------------------------------------------- /app/assets/javascripts/form_validations.js: -------------------------------------------------------------------------------- 1 | $(document).on('page:change', function(event) { 2 | // Since autofocus fires before Parsley/Turbolinks, this fixes 3 | // Parsley validation on autofocus elements @SS 4 | $("input[autofocus='autofocus']").focus(); 5 | }); 6 | 7 | 8 | $(function() { 9 | // add custom validation for password field 10 | window.Parsley 11 | .addValidator('passwordcomplexity', { 12 | requirementType: 'regexp', 13 | validateString: function(value, requirement) { 14 | var matches = 0; 15 | [/\d/, /[A-Z]/, /[a-z]/, /[\W]/].forEach(function(pattern){ 16 | if (value.match(pattern)) { matches++ } 17 | }); 18 | return (matches >= 3); 19 | }, 20 | messages: { 21 | en: 'Does not have at least 3 of the specified character types.', 22 | } 23 | }); 24 | 25 | window.Parsley 26 | .addValidator('phonenumber', { 27 | requirementType: 'regexp', 28 | validateString: function(value, requirement) { 29 | return value.search(/[A-Za-z]/) == -1; 30 | }, 31 | messages: { 32 | en: 'This value may not contain letters.' 33 | } 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /app/assets/javascripts/info_popup.js: -------------------------------------------------------------------------------- 1 | // When the user clicks on div, open the popup 2 | function popup(id) { 3 | var popup_element = document.getElementById(id); 4 | if(popup_element !== null){ 5 | popup_element.classList.toggle("show"); 6 | } 7 | } 8 | 9 | $(document).ready(popup); 10 | $(document).on('page:load', popup); 11 | -------------------------------------------------------------------------------- /app/assets/javascripts/measure_tests.js: -------------------------------------------------------------------------------- 1 | var ready; 2 | ready = function() { 3 | // instatiate the tabs on the measure test page 4 | $('.measure-test-tabs').tabs() 5 | $('.measure-test-tabs > ul > li').removeClass("ui-corner-top"); 6 | } 7 | 8 | $(document).ready(ready); 9 | $(document).on('page:load', ready); 10 | -------------------------------------------------------------------------------- /app/assets/javascripts/sessions.js: -------------------------------------------------------------------------------- 1 | var placeSignInPanel = function() { 2 | if ($(".splash-title-container").length) { 3 | var signInLeft = $(".sign-in-panel-container").offset().left 4 | var titleWidth = $(".splash-title-container").width() 5 | var roomForSignInPanel = signInLeft >= titleWidth; 6 | if ($(".sign-in-panel-container").parent().is(".splash-panel") && !roomForSignInPanel) { 7 | $(".sign-in-panel-container").addClass("sign-in-panel-container-moved"); 8 | } else if ($(".sign-in-panel-container").parent().is(".splash-panel") && roomForSignInPanel) { 9 | $(".sign-in-panel-container").removeClass("sign-in-panel-container-moved"); 10 | } 11 | } 12 | }; 13 | 14 | $(window).resize(placeSignInPanel); 15 | $(document).ready(placeSignInPanel); 16 | $(document).on("page:change", placeSignInPanel); 17 | -------------------------------------------------------------------------------- /app/assets/stylesheets/_globals.scss: -------------------------------------------------------------------------------- 1 | @import 'bootstrap'; 2 | @import 'font-awesome-sprockets'; 3 | @import 'font-awesome'; 4 | 5 | // Turbolinks progress bar 6 | #cypress::before { 7 | background-color: $secondary; 8 | height: 6px; 9 | } 10 | 11 | // Mixins 12 | @mixin hidden-cell() { 13 | // we want visually reduce the appearance, but it's ok to reveal to screen readers 14 | color: $gray-600; 15 | border: 0; 16 | } 17 | 18 | @mixin hidden-header-cell() { 19 | color: $gray-600; 20 | border-bottom: 0; 21 | } 22 | -------------------------------------------------------------------------------- /app/assets/stylesheets/_parsley.scss: -------------------------------------------------------------------------------- 1 | .parsley-success { 2 | // color: $success-text-emphasis; 3 | // border: 1px solid $success-border-subtle; 4 | } 5 | 6 | .parsley-error { 7 | color: $danger-text-emphasis; 8 | background-color: $danger-bg-subtle; 9 | border: 1px solid $danger-border-subtle; 10 | } 11 | 12 | .parsley-errors-list { 13 | color: $danger-text-emphasis; 14 | margin: 2px 0 3px; 15 | padding: 0; 16 | list-style-type: none; 17 | font-size: .9em; 18 | line-height: .9em; 19 | opacity: 0; 20 | 21 | transition: all .3s ease-in; 22 | -o-transition: all .3s ease-in; 23 | -moz-transition: all .3s ease-in; 24 | -webkit-transition: all .3s ease-in; 25 | 26 | &.filled { 27 | opacity: 1; 28 | padding: 1em 0; 29 | 30 | &::before { 31 | font-family: FontAwesome; 32 | content: $fa-var-wrench; 33 | } 34 | 35 | li { 36 | display: inline-block; 37 | padding: 0 .5em; 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/assets/stylesheets/application.scss: -------------------------------------------------------------------------------- 1 | /* 2 | *= require jquery-ui/core 3 | *= require jquery-ui/accordion 4 | *= require jquery-ui/autocomplete 5 | *= require jquery-ui/button 6 | *= require jquery-ui/datepicker 7 | *= require jquery-ui/dialog 8 | *= require jquery-ui/menu 9 | *= require jquery-ui/progressbar 10 | *= require jquery-ui/selectmenu 11 | *= require jquery-ui/slider 12 | *= require jquery-ui/spinner 13 | *= require jquery-ui/tabs 14 | *= require jquery-ui/tooltip 15 | *= require rails_bootstrap_forms 16 | *= require jasny-bootstrap.min 17 | *= require dataTables/jquery.dataTables 18 | */ 19 | 20 | @import 'globals'; 21 | @import './assets_framework/custom-mixins'; 22 | @import './assets_framework/breadcrumb'; 23 | @import './assets_framework/widgets/_alerts'; 24 | @import './parsley'; 25 | @import './cypress/**/*'; 26 | -------------------------------------------------------------------------------- /app/assets/stylesheets/cypress/_alerts.scss: -------------------------------------------------------------------------------- 1 | @mixin alert-border($color, $bg) { 2 | $faded-background-color: rgba($bg, .2); 3 | border-left: 5px solid $color; 4 | background-color: $faded-background-color; 5 | } 6 | 7 | .alert { 8 | &.alert-success { @include alert-border($success-text-emphasis, $success); } 9 | &.alert-info { @include alert-border($info-text-emphasis, $info); } 10 | &.alert-warning { @include alert-border($warning-text-emphasis, $warning); } 11 | &.alert-danger { @include alert-border($danger-text-emphasis, $danger); } 12 | 13 | .fa-times { font-size: 1.4em; } 14 | 15 | .iconSpan { 16 | border-right: 0; 17 | padding: 0 1em 0 0; 18 | } 19 | 20 | .alertContent { 21 | border-left: 1px solid $black; 22 | vertical-align: middle; 23 | 24 | p { 25 | padding: 0 0.5em; 26 | 27 | a { 28 | color: $black; 29 | } 30 | } 31 | } 32 | } 33 | 34 | // add margin for the alerts shown at the top of the page 35 | .container > .alert, 36 | .breadcrumb-responsive + .alert { 37 | margin: .0em 1em .5em; 38 | } 39 | // or for alerts shown after a .control-label 40 | .control-label + .alert { 41 | margin: 1em auto; 42 | } 43 | -------------------------------------------------------------------------------- /app/assets/stylesheets/cypress/_fonts.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Ubuntu'; 3 | font-display: fallback; 4 | src: asset-url('Ubuntu-Light.ttf') format('truetype'); 5 | font-weight: 300; 6 | font-style: normal; 7 | } 8 | 9 | @font-face { 10 | font-family: 'NotoSans'; 11 | font-display: fallback; 12 | src: asset-url('NotoSans-Bold.ttf') format('truetype'); 13 | font-weight: 700; 14 | font-style: normal; 15 | } 16 | 17 | @font-face { 18 | font-family: 'NotoSans'; 19 | font-display: fallback; 20 | src: asset-url('NotoSans-BoldItalic.ttf') format('truetype'); 21 | font-weight: 700; 22 | font-style: italic; 23 | } 24 | 25 | @font-face { 26 | font-family: 'NotoSans'; 27 | font-display: fallback; 28 | src: asset-url('NotoSans-Italic.ttf') format('truetype'); 29 | font-weight: 300; 30 | font-style: italic; 31 | } 32 | 33 | @font-face { 34 | font-family: 'NotoSans'; 35 | font-display: auto; 36 | src: asset-url('NotoSans-Regular.ttf') format('truetype'); 37 | font-weight: fallback; 38 | font-style: normal; 39 | } 40 | -------------------------------------------------------------------------------- /app/assets/stylesheets/cypress/_markup.scss: -------------------------------------------------------------------------------- 1 | .cql-logic { 2 | 3 | .cql-statement-group { 4 | font-weight: bold; 5 | font-size: large; 6 | } 7 | 8 | .cql-statement-name { 9 | font-weight: bold; 10 | } 11 | 12 | .clause-true { 13 | background-color: $success-bg-subtle; 14 | color: $success-text-emphasis; 15 | border-bottom-color: $success-text-emphasis; 16 | border-bottom-style: solid; 17 | } 18 | 19 | .clause-false { 20 | background-color: $danger-bg-subtle; 21 | color: $danger-text-emphasis; 22 | border-bottom-color: $danger-text-emphasis; 23 | border-bottom-style: double; 24 | } 25 | 26 | .cql-statement { 27 | white-space: pre-wrap; 28 | padding-bottom: 8px; 29 | border-top: 1px solid gray; 30 | border-left: 1px solid gray; 31 | border-right: 1px solid gray; 32 | border-bottom: 1px solid gray; 33 | 34 | span { 35 | border-bottom-width: 4px; 36 | line-height: 1.8; 37 | } 38 | 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/assets/stylesheets/cypress/_measure_tests.scss: -------------------------------------------------------------------------------- 1 | .product-information dt { 2 | width: 100px; 3 | } 4 | 5 | .product-information dd { 6 | margin-left: 110px; 7 | } 8 | 9 | .mark-img { 10 | height: 14px; 11 | } 12 | -------------------------------------------------------------------------------- /app/assets/stylesheets/cypress/_modal.scss: -------------------------------------------------------------------------------- 1 | .modal-footer { 2 | text-align: left; 3 | } 4 | 5 | .modal { 6 | overflow: hidden; 7 | } 8 | 9 | .modal-body { 10 | height: modal-sm; 11 | overflow: auto; 12 | } 13 | -------------------------------------------------------------------------------- /app/assets/stylesheets/cypress/_print_report.scss: -------------------------------------------------------------------------------- 1 | .product-report { 2 | dl { 3 | background-color: $gray-200; 4 | padding: 1em; 5 | } 6 | 7 | .section-report { 8 | padding-left: 30px; 9 | } 10 | } 11 | 12 | @media print { 13 | header { display: none; } 14 | 15 | .product-report { 16 | section:not(:first-child) { page-break-before: always; } 17 | h1, h2, h3 { page-break-after: avoid; } 18 | thead { display: table-header-group; } 19 | tr { page-break-inside: avoid;} 20 | 21 | // overrides bootstrap's forced transparent backgrounds 22 | dl { background-color: $gray-200 !important; } 23 | } 24 | 25 | @page { margin: 2cm 1.4cm; } 26 | } 27 | -------------------------------------------------------------------------------- /app/assets/stylesheets/cypress/_tables.scss: -------------------------------------------------------------------------------- 1 | .table { 2 | .abbreviated { 3 | max-width: 16em; 4 | white-space: nowrap; 5 | overflow: hidden; 6 | text-overflow: ellipsis; 7 | 8 | &:hover { 9 | white-space: normal; 10 | overflow: hidden; 11 | } 12 | } 13 | 14 | .result-marker { 15 | .fa-circle { color: $primary; } 16 | .fa-circle-thin { color: $success-text-emphasis; } 17 | 18 | .result-text { 19 | color: $white; 20 | font-weight: normal; 21 | } 22 | 23 | .result-text-positive-contrast { 24 | color: $success-text-emphasis; 25 | font-weight: normal; 26 | } 27 | } 28 | 29 | .empty-marker { 30 | color: $warning-border-subtle; 31 | } 32 | } 33 | 34 | .table-info { 35 | --bs-table-bg: #e0eff4; 36 | } 37 | 38 | .table > thead > tr > th, 39 | .table > thead > tr > td, 40 | .table > tbody > tr > th, 41 | .table > tbody > tr > td, 42 | .table > tfoot > tr > th, 43 | .table > tfoot > tr > td { 44 | vertical-align: middle; 45 | } 46 | 47 | .dataTable thead th { 48 | padding-right: 1.5em; // make sure the sorting icon is visible 49 | } 50 | -------------------------------------------------------------------------------- /app/assets/stylesheets/cypress/_test_executions.scss: -------------------------------------------------------------------------------- 1 | @import './xml_view'; 2 | 3 | .page-title { 4 | margin-bottom: 1em; 5 | } 6 | 7 | .inline { 8 | display: inline; 9 | } 10 | 11 | .tab-content { 12 | margin-top: 1em; 13 | } 14 | 15 | .task-switch-link { 16 | color: $gray-800; 17 | } 18 | 19 | .task-panel { 20 | border: 0; 21 | box-shadow: none; 22 | } 23 | 24 | .nested-link { 25 | font-weight: bold; 26 | } 27 | 28 | .margin-top-1 { 29 | margin-top: 1em; 30 | } 31 | 32 | .panel-inactive:hover { 33 | .nested-link { 34 | text-decoration: underline; 35 | } 36 | } 37 | 38 | .cert-bar { 39 | width: 25%; 40 | margin-bottom: 2.5em; 41 | 42 | .text-center { 43 | display: inline-block; 44 | width: 25%; 45 | box-sizing: border-box; 46 | float: left; 47 | font-size: 16px; 48 | } 49 | 50 | div:not(:first-child) { 51 | border-left: 1px solid $gray; 52 | } 53 | 54 | .active-cert { 55 | color: $primary-text-emphasis; 56 | background: $card-title-color; 57 | } 58 | 59 | .inactive-cert { 60 | font-weight: 200; 61 | color: $card-subtitle-color; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /app/assets/stylesheets/cypress/_text.scss: -------------------------------------------------------------------------------- 1 | a.label { 2 | color: $white; 3 | } 4 | 5 | .summary-title { 6 | line-height: normal; 7 | margin-top: 10px; 8 | max-width: 30em; 9 | white-space: nowrap; 10 | overflow: hidden; 11 | text-overflow: ellipsis; 12 | 13 | &:hover { 14 | white-space: normal; 15 | overflow: hidden; 16 | } 17 | } 18 | 19 | .terms { 20 | div { 21 | font-weight: bold; 22 | font-size: 12px; 23 | } 24 | } 25 | 26 | .error-page { 27 | background: url('geometry2.png'); 28 | 29 | body { 30 | background-color: inherit; 31 | } 32 | } 33 | 34 | .error-message { 35 | text-align: center; 36 | width: 60%; 37 | margin-top: 5em; 38 | 39 | h1 { 40 | font-size: 4em; 41 | font-family: 'Ubuntu'; 42 | font-weight: 100; 43 | line-height: 1.2; 44 | } 45 | 46 | .error-links { 47 | margin-top: 1em; 48 | } 49 | } 50 | 51 | main:focus { outline: none; } 52 | 53 | .configured-banner { margin-bottom: 2em; } 54 | 55 | .configured-mailer { 56 | dt { 57 | font-weight: normal; 58 | text-align: left; 59 | } 60 | 61 | dd { font-weight: bold; } 62 | } 63 | 64 | .xml-content { 65 | font-size: .8em; 66 | } 67 | 68 | .execution-status { 69 | padding: 1em; 70 | color: $black; 71 | } 72 | 73 | .valueset-listitem { 74 | padding: .5em; 75 | } 76 | -------------------------------------------------------------------------------- /app/assets/stylesheets/cypress/_toggle.scss: -------------------------------------------------------------------------------- 1 | $color-checkbox-success:#4cd964; 2 | $color-checkbox-default:#8E8E93; 3 | $transition: .3s cubic-bezier(.95, .05, .795, .035); 4 | $width: 4em; 5 | $height: $width / 2; 6 | $background-color: rgba(#000, .06); 7 | $after-background-color: #fff; 8 | $box-shadow: rgba(#000, .4); 9 | 10 | .toggle { 11 | 12 | .toggle-control { 13 | transition: $transition; 14 | width: $width; 15 | height: $height; 16 | display: block; 17 | border: 2px solid $color-checkbox-default; 18 | border-radius: $height; 19 | background-color: $background-color; 20 | position: relative; 21 | 22 | &::after { 23 | transition: $transition; 24 | content: ''; 25 | width: $width / 2; 26 | height: $height; 27 | display: block; 28 | background-color: $after-background-color; 29 | border-radius: 50%; 30 | box-shadow: 0 1px 2px $box-shadow, 0 3px 2px $box-shadow; 31 | position: absolute; 32 | top: 0; 33 | left: 0; 34 | } 35 | } 36 | 37 | input { 38 | 39 | display: none; 40 | 41 | &:checked + .toggle-control { 42 | border-color: $color-checkbox-success; 43 | background-color: $color-checkbox-success; 44 | 45 | &::after { 46 | left: $width / 2; 47 | } 48 | } 49 | } 50 | } 51 | 52 | -------------------------------------------------------------------------------- /app/assets/stylesheets/cypress/_valuesets.scss: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | .value-set-group { 5 | @extend .btn; 6 | padding: 4px; 7 | text-align: left; 8 | color: $headings-color; 9 | border: 0; 10 | width: 100%; 11 | box-shadow: $input-box-shadow; 12 | } 13 | 14 | .set-menu { 15 | background-color: $card-border-color; 16 | border-bottom-color: $gray-200; 17 | box-shadow: $input-box-shadow; 18 | 19 | &:hover { 20 | color: $headings-color; 21 | background-color: $gray-200; 22 | border: 0; 23 | } 24 | } 25 | 26 | .value-set-list { 27 | @extend .list-group; 28 | margin-bottom: 8px; 29 | background-color: $list-group-bg; 30 | } 31 | 32 | .value-set-item-header { 33 | @extend .list-group-item; 34 | font-weight: bold; 35 | padding: 2px 8px; 36 | background-color: $gray-200; 37 | } 38 | 39 | .value-set-item-oid { 40 | @extend .list-group-item; 41 | padding: 2px 8px; 42 | margin-bottom: 8px; 43 | background-color: $list-group-bg; 44 | } 45 | -------------------------------------------------------------------------------- /app/controllers/admin/settings_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module Admin 4 | class SettingsController < AdminController 5 | def show 6 | redirect_to admin_path(anchor: 'application_settings') 7 | end 8 | 9 | def edit 10 | add_breadcrumb 'Edit Settings', :edit_settings_path 11 | render locals: Settings.locals_edit(application_mode_settings) 12 | end 13 | 14 | def update 15 | update_application_mode params[:mode], params[:custom_options] 16 | Settings.current.update(update_settings) 17 | redirect_to admin_path(anchor: 'application_settings') 18 | end 19 | 20 | private 21 | 22 | def update_application_mode(mode_name, options = {}) 23 | case mode_name 24 | when 'internal' 25 | mode_internal 26 | when 'demo' 27 | mode_demo 28 | when 'atl' 29 | mode_atl 30 | when 'custom' 31 | mode_custom options 32 | end 33 | end 34 | 35 | def update_settings 36 | params.permit(:banner, :umls, :http_proxy, :website_domain, :website_port, :banner_message, :warning_message, 37 | :mailer_address, :mailer_port, :mailer_domain, :mailer_user_name, :mailer_password, :api_documentation, 38 | :api_documentation_path, :downloadable_bundles, :downloadable_bundles_path) 39 | end 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /app/controllers/admin/trackers_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module Admin 4 | class TrackersController < AdminController 5 | before_action :find_tracker 6 | 7 | def destroy 8 | @tracker.destroy if @tracker.status == :failed 9 | redirect_to admin_path(anchor: 'bundles') if @tracker[:job_class] == 'BundleUploadJob' 10 | redirect_to vendor_records_path(@tracker[:options]['vendor_id']) if @tracker[:job_class] == 'VendorPatientUploadJob' 11 | redirect_to patient_analysis_vendor_records_path(@tracker[:options]['vendor_id']) if @tracker[:job_class] == 'PatientAnalysisJob' 12 | end 13 | 14 | private 15 | 16 | def find_tracker 17 | @tracker = Tracker.find(params['id']) 18 | end 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /app/controllers/bundles_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class BundlesController < ApplicationController 4 | include Api::Controller 5 | respond_to :xml, :json 6 | 7 | def index 8 | @bundles = Bundle.available.all 9 | respond_with(@bundles.to_a) 10 | end 11 | 12 | def show 13 | @bundle = Bundle.available.find(params['id']) 14 | respond_with(@bundle) 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /app/controllers/concerns/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/app/controllers/concerns/.keep -------------------------------------------------------------------------------- /app/controllers/home_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class HomeController < ApplicationController 4 | def index 5 | if current_user 6 | redirect_to :vendors 7 | else 8 | redirect_to :new_user_session 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /app/controllers/measures_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class MeasuresController < ApplicationController 4 | include Api::Controller 5 | 6 | def index 7 | @measures = Bundle.find(params[:bundle_id]).measures 8 | respond_with(@measures.to_a) 9 | end 10 | 11 | def grouped 12 | @bundle = Bundle.find(params[:bundle_id]) 13 | @measures = @bundle.measures.only(:cms_id, :description, :title, :category, :hqmf_id, :reporting_program_type) 14 | @measures_categories = @measures.group_by(&:category) 15 | render partial: 'products/measure_selection', locals: { measures_categories: @measures_categories } 16 | end 17 | 18 | def filtered 19 | # Only allow word characters and whitespace characters in the filter 20 | @filter = Regexp.escape(params[:filter]) if params[:filter] 21 | @bundle = Bundle.find(params[:bundle_id]) 22 | @measures = @bundle.measures.and( 23 | Measure.any_of({ title: /#{@filter}/i }, cms_id: /#{@filter}/i).selector 24 | ).only(:hqmf_id, :category, :reporting_program_type) 25 | @measures_categories = @measures.group_by(&:category) 26 | render partial: 'products/measure_selection', formats: :json, handlers: :jbuilder 27 | end 28 | end 29 | -------------------------------------------------------------------------------- /app/controllers/program_tests_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class ProgramTestsController < ProductTestsController 4 | respond_to :js, only: [:show] 5 | 6 | def show 7 | @product = @product_test.product 8 | set_breadcrumbs 9 | @task = Task.find(params[:task_id]) if params[:task_id] 10 | respond_with(@product, @product_test, &:js) 11 | end 12 | 13 | def update 14 | @product = @product_test.product 15 | @product_test.update_with_program_tests(program_test_params) 16 | respond_to do |format| 17 | format.html { redirect_to product_program_test_path(@product, @product_test) } 18 | end 19 | rescue Mongoid::Errors::Validations 20 | @product = @product_test.product 21 | set_measures 22 | set_breadcrumbs 23 | render :show 24 | end 25 | 26 | def set_breadcrumbs 27 | add_breadcrumb 'Dashboard', :vendors_path 28 | add_breadcrumb "Vendor: #{@product.vendor_name}", vendor_path(@product.vendor_id) 29 | add_breadcrumb "Product: #{@product.name}", vendor_product_path(@product.vendor_id, @product) 30 | add_breadcrumb 'Program Test', product_program_test_path(@product, @product_test) 31 | end 32 | 33 | def program_test_params 34 | params[:product_test].permit(program_criteria_attributes: %i[id entered_value]) 35 | end 36 | end 37 | -------------------------------------------------------------------------------- /app/controllers/registrations_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class RegistrationsController < Devise::RegistrationsController 4 | add_breadcrumb 'New Account', :new_user_registration_path, only: %i[new create] 5 | add_breadcrumb 'Edit User', :edit_user_registration_path, only: %i[edit update] 6 | add_breadcrumb 'Cancel Account', :cancel_user_registration_path, only: [:cancel] 7 | 8 | before_action :configure_permitted_parameters 9 | before_action :load_test_executions, only: %i[edit update] 10 | 11 | respond_to :js, only: [:edit] 12 | 13 | def new 14 | @title = 'Create Account' 15 | super 16 | end 17 | 18 | def edit 19 | @title = 'Edit User' 20 | super 21 | end 22 | 23 | protected 24 | 25 | def load_test_executions 26 | @all_executions = current_user.test_executions.order(%i[updated_at desc]) 27 | @test_executions = Kaminari.paginate_array(@all_executions).page(params[:page]).per(15) 28 | end 29 | 30 | def configure_permitted_parameters 31 | devise_parameter_sanitizer.permit(:sign_up, keys: [:terms_and_conditions]) 32 | end 33 | end 34 | -------------------------------------------------------------------------------- /app/controllers/sessions_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class SessionsController < Devise::SessionsController 4 | def new 5 | @title = 'Sign In' 6 | super 7 | end 8 | 9 | def create 10 | validated_nlm = Settings.current.umls && valid_nlm_user? 11 | if validated_nlm || Settings.current.umls == false 12 | super 13 | elsif Settings.current.umls && validated_nlm == false 14 | flash[:danger] = 'Could not verify NLM User Account.' 15 | redirect_to user_session_path 16 | end 17 | end 18 | 19 | protected 20 | 21 | def valid_nlm_user? 22 | # Try to grab a simple valueset to see if credentials are valid 23 | validate_nlm_user('https://vsac.nlm.nih.gov/vsac/svs/RetrieveValueSet?id=2.16.840.1.113762.1.4.1', 24 | Settings.current.http_proxy, 25 | params[:user][:umls_password]) 26 | end 27 | 28 | def validate_nlm_user(nlm_url, proxy, apikey) 29 | RestClient.proxy = proxy 30 | begin 31 | nlm_result = RestClient::Request.execute(method: :get, 32 | url: nlm_url, 33 | user: '', 34 | password: apikey) 35 | nlm_result.code == 200 36 | rescue StandardError 37 | false 38 | end 39 | end 40 | end 41 | -------------------------------------------------------------------------------- /app/controllers/static_pages_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class StaticPagesController < ApplicationController 4 | skip_before_action :authenticate_user! 5 | def terms_and_conditions; end 6 | end 7 | -------------------------------------------------------------------------------- /app/controllers/version_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class VersionController < ApplicationController 4 | respond_to only: [:index] 5 | 6 | def index 7 | @version = { 'version' => Cypress::Application::VERSION } 8 | respond_to do |format| 9 | format.xml { render xml: @version.to_xml(root: 'version') } 10 | format.json { render json: @version } 11 | end 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/helpers/users_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module UsersHelper 4 | def options_for_owner_vendor 5 | options_for_select([%w[Owner owner], %w[Vendor vendor]]) 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/helpers/xml_view_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: false 2 | 3 | module XmlViewHelper 4 | include Cypress::ErrorCollector 5 | # used for errors popup in node partial 6 | # returns title of popup, popup button text, and message in popup 7 | def popup_attributes(errors) 8 | return unless errors.count.positive? 9 | 10 | title = "Execution #{'Error'.pluralize(errors.count)} (#{errors.count})" 11 | button_text = " view #{'error'.pluralize(errors.count)} (#{errors.count})" 12 | message = '' 13 | if errors.count > 1 14 | errors.each do |error| 15 | # error_#{error.id} class is added so error can be highlighted if popup contains multiple errors 16 | message << "
  • #{error.message}
  • " 17 | end 18 | else 19 | message << errors.first.message 20 | end 21 | 22 | [title, button_text, message] 23 | end 24 | 25 | private 26 | 27 | def data_to_doc(data) 28 | if data.is_a? String 29 | Nokogiri::XML(data) 30 | else 31 | data 32 | end 33 | end 34 | end 35 | -------------------------------------------------------------------------------- /app/jobs/application_job.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class ApplicationJob < ActiveJob::Base 4 | end 5 | -------------------------------------------------------------------------------- /app/jobs/bundle_deprecate_job.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class BundleDeprecateJob < ApplicationJob 4 | include Job::Status 5 | after_enqueue do |job| 6 | tracker = job.tracker 7 | tracker.options['bundle_title'] = job.arguments[1] 8 | tracker.save 9 | end 10 | def perform(bundle_id, bundle_title) 11 | tracker.log("Deprecating #{bundle_title}") 12 | bundle = Bundle.find(bundle_id) 13 | bundle.deprecate 14 | 15 | # clear this cache just in case it's pointing to the bundle just deprecated 16 | Rails.cache.delete('any_installed_bundle') 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /app/jobs/bundle_destroy_job.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class BundleDestroyJob < ApplicationJob 4 | include Job::Status 5 | after_enqueue do |job| 6 | tracker = job.tracker 7 | tracker.options['bundle_title'] = job.arguments[1] 8 | tracker.save 9 | end 10 | def perform(bundle_id, bundle_title) 11 | tracker.log("Removing #{bundle_title}") 12 | bundle = Bundle.find(bundle_id) 13 | bundle.destroy 14 | 15 | # clear this cache just in case it's pointing to the bundle just deprecated 16 | Rails.cache.delete('any_installed_bundle') 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /app/jobs/checklist_test_setup_job.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class ChecklistTestSetupJob < ApplicationJob 4 | queue_as :product_test_setup 5 | include Job::Status 6 | def perform(checklist_test) 7 | # It is not necessary to monitor the status of this job, since this task 8 | # will be completed on the frontend if the users tries to download 9 | # criteria results before this has run. 10 | checklist_test.archive_patients if checklist_test.patient_archive.path.nil? 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/jobs/mpl_download_create_job.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class MplDownloadCreateJob < ApplicationJob 4 | include Job::Status 5 | after_enqueue do |job| 6 | tracker = job.tracker 7 | tracker.options['bundle_id'] = job.arguments[0] 8 | tracker.save 9 | end 10 | def perform(bundle_id) 11 | tracker.log('Creating Download') 12 | bundle = Bundle.find(bundle_id) 13 | path = Rails.root.join('tmp', 'cache', 'bundle_download', bundle.id.to_s) 14 | Cypress::CreateDownloadZip.bundle_directory(bundle, path) 15 | zfg = ZipFileGenerator.new(path, bundle.mpl_path) 16 | zfg.write 17 | FileUtils.rm_rf(path) 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /app/jobs/patient_analysis_job.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class PatientAnalysisJob < ApplicationJob 4 | include Job::Status 5 | include PatientAnalysisHelper 6 | 7 | after_enqueue do |job| 8 | tracker = job.tracker 9 | tracker.options['bundle_id'] = job.arguments[0] 10 | tracker.options['vendor_id'] = job.arguments[1] 11 | tracker.save 12 | end 13 | 14 | def perform(bundle_id, vendor_id) 15 | bundle = Bundle.find(bundle_id) 16 | vendor = Vendor.find(vendor_id) 17 | tracker.log('Analyzing') 18 | vendor.vendor_patient_analysis[bundle_id] = generate_analysis(vendor.patients, nil, bundle) 19 | vendor.save 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /app/jobs/single_measure_calculation_job.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class SingleMeasureCalculationJob < ApplicationJob 4 | queue_as :measure_calculation 5 | include Job::Status 6 | 7 | def perform(patient_ids, measure_id, correlation_id, options) 8 | measure = Measure.find(measure_id) 9 | valueset_oids = measure.value_sets.distinct(:oid) 10 | patients = Patient.find(patient_ids) 11 | qdm_patients = patients.map do |patient| 12 | patient.normalize_date_times(measure.cms_id) 13 | patient.nullify_unnessissary_negations(valueset_oids) 14 | patient.check_for_elements_after_mp(options, measure.cms_id) if APP_CONSTANTS['measures_without_future_data'].include? measure.hqmf_id 15 | patient.qdmPatient 16 | end 17 | calc_job = Cypress::CQMExecutionCalc.new(qdm_patients, 18 | [measure], 19 | correlation_id, 20 | options) 21 | results = calc_job.execute(save: true) 22 | patients.map { |patient| patient.denormalize_date_times(measure.cms_id) } 23 | patients.map(&:reestablish_negations) 24 | patients.map(&:reestablish_elements_after_mp) if APP_CONSTANTS['measures_without_future_data'].include? measure.hqmf_id 25 | results 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /app/jobs/test_execution_job.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class TestExecutionJob < ApplicationJob 4 | include Job::Status 5 | queue_as :default 6 | 7 | after_enqueue do |job| 8 | job.tracker.add_options(test_execution_id: job.arguments[0].id, 9 | task_id: job.arguments[1].id) 10 | end 11 | def perform(test_execution, task, options = {}) 12 | test_execution.state = :running 13 | task.latest_test_execution_id = test_execution.id.to_s 14 | task.save 15 | test_execution.validate_artifact(task.validators, test_execution.artifact, options.merge('test_execution' => test_execution, 'task' => task)) 16 | test_execution.save 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /app/lib/job/status.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module Job 4 | module Status 5 | extend ActiveSupport::Concern 6 | 7 | included do 8 | before_enqueue do |job| 9 | job.tracker.queued 10 | end 11 | 12 | around_perform do |job, block| 13 | job.tracker.working 14 | begin 15 | block.call 16 | job.tracker.finished 17 | job.tracker.destroy 18 | rescue StandardError => e 19 | tracker.failed e 20 | end 21 | end 22 | 23 | def tracker 24 | @tracker ||= Tracker.find_or_create_by(job_id: @job_id, job_class: self.class.to_s) 25 | end 26 | end 27 | 28 | class_methods do 29 | def tracker_for_job(job_id) 30 | Tracker.where(job_id:, job_class: to_s) 31 | end 32 | 33 | def trackers 34 | Tracker.where(job_class: to_s) 35 | end 36 | end 37 | end 38 | end 39 | -------------------------------------------------------------------------------- /app/mailers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/app/mailers/.keep -------------------------------------------------------------------------------- /app/models/bundle_download.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class BundleDownload 4 | include ActiveModel::Model 5 | 6 | attr_accessor :api_key, :bundle_year 7 | end 8 | -------------------------------------------------------------------------------- /app/models/c1_checklist_task.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'validators/checklist_criteria_validator' 4 | 5 | class C1ChecklistTask < Task 6 | include Mongoid::Attributes::Dynamic 7 | include ::Validators 8 | 9 | # C1 = Record and Export 10 | # - Record all the data needed to calculate CQMs 11 | # - Export data as Cat 1 12 | # 13 | # Also, if the parent product test includes a C3 Task, 14 | # do that validation here 15 | def validators 16 | @validators = [ChecklistCriteriaValidator.new(product_test), 17 | ::Validators::QrdaCat1Validator.new(product_test.bundle, false, product_test.c3_test, true, product_test.measures)] 18 | @validators 19 | end 20 | 21 | def execute(file, user) 22 | te = test_executions.new(artifact: Artifact.new(file:), user_id: user) 23 | te.save! 24 | TestExecutionJob.perform_later(te, self) 25 | te.sibling_execution_id = product_test.tasks.c3_checklist_task.execute(file, user, te.id).id if product_test.c3_cat1_task? 26 | te.save 27 | te 28 | end 29 | end 30 | -------------------------------------------------------------------------------- /app/models/c3_cat3_task.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class C3Cat3Task < Task 4 | def validators 5 | @validators = [::Validators::MeasurePeriodValidator.new, 6 | ::Validators::QrdaCat3Validator.new(product_test.expected_results, true, true, product_test.c2_test, product_test.bundle)] 7 | cms_cat3_schematron_validator if product_test.bundle.cms_schematron 8 | @validators 9 | end 10 | 11 | def cms_cat3_schematron_validator 12 | measure = product_test.measures[0] 13 | return unless measure.reporting_program_type == 'ep' 14 | 15 | # If product is not for 21st Centutry Cures, then CMS errors are treated as warnings 16 | @validators << ::Validators::CMSQRDA3SchematronValidator.new(product_test.bundle.version, as_warnings: !product_test.cures_update) 17 | end 18 | 19 | def execute(file, user, sibling_execution_id) 20 | te = test_executions.new(expected_results:, artifact: Artifact.new(file:), user_id: user) 21 | te.save! 22 | TestExecutionJob.perform_later(te, self, validate_reporting: product_test.c3_test) 23 | te.sibling_execution_id = sibling_execution_id 24 | te.save 25 | te 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /app/models/c3_checklist_task.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class C3ChecklistTask < Task 4 | # include Mongoid::Attributes::Dynamic 5 | include ::Validators 6 | 7 | def validators 8 | @validators = [::Validators::QrdaCat1Validator.new(product_test.bundle, true, true, product_test.c1_test, product_test.measures)] 9 | @validators 10 | end 11 | 12 | def execute(file, user, sibling_execution_id) 13 | te = test_executions.new(artifact: Artifact.new(file:), user_id: user) 14 | te.save! 15 | TestExecutionJob.perform_later(te, self) 16 | te.sibling_execution_id = sibling_execution_id 17 | te.save 18 | te 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /app/models/concerns/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/app/models/concerns/.keep -------------------------------------------------------------------------------- /app/models/execution_error.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class ExecutionError 4 | include Mongoid::Document 5 | include Mongoid::Attributes::Dynamic 6 | 7 | embedded_in :test_execution 8 | field :message, type: String 9 | field :msg_type, type: Symbol 10 | field :measure_id, type: String 11 | field :validation_type, type: String 12 | field :validator_type, type: Symbol 13 | field :validator, type: String 14 | field :stratification, type: String 15 | field :location 16 | field :file_name, type: String 17 | field :cms, type: Boolean, default: false 18 | validates :msg_type, presence: true 19 | validates :message, presence: true 20 | 21 | scope :by_type, ->(type) { where(msg_type: type) } 22 | scope :by_validation_type, ->(type) { where(validator_type: type) } 23 | scope :by_file, ->(file) { where(file_name: file) } 24 | 25 | def self.only_errors 26 | by_type(:error).entries 27 | end 28 | 29 | def self.only_warnings 30 | by_type(:warning).entries 31 | end 32 | 33 | def empty_location? 34 | location.nil? || location == '/' 35 | end 36 | end 37 | -------------------------------------------------------------------------------- /app/models/multi_measure_cat1_task.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class MultiMeasureCat1Task < Task 4 | def validators 5 | @validators = [::Validators::CalculatingSmokingGunValidator.new(product_test.measures, product_test.patients, product_test.id), 6 | ::Validators::MeasurePeriodValidator.new, 7 | ::Validators::CMSQRDA1HQRSchematronValidator.new(product_test.bundle.version, as_warnings: false), 8 | ::Validators::CoreClinicalDataElementValidator.new(product_test.measures), 9 | ::Validators::QrdaCat1Validator.new(product_test.bundle, true, true, false, product_test.measures)] 10 | @validators 11 | end 12 | 13 | def execute(file, user) 14 | te = test_executions.new(expected_results:, artifact: Artifact.new(file:), user_id: user) 15 | te.save! 16 | TestExecutionJob.perform_later(te, self, validate_reporting: true) 17 | te.save 18 | te 19 | end 20 | 21 | def patients 22 | patient_ids = product_test.results.where('IPP' => { '$gt' => 0 }).collect(&:patient_id) 23 | product_test.patients.find(patient_ids) 24 | end 25 | 26 | def good_results 27 | Cypress::CreateDownloadZip.create_zip(patients, 'qrda').read 28 | end 29 | end 30 | -------------------------------------------------------------------------------- /app/models/multi_measure_cat3_task.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class MultiMeasureCat3Task < Task 4 | def validators 5 | @validators = [::Validators::MeasurePeriodValidator.new, 6 | ::Validators::QrdaCat3Validator.new(product_test.expected_results, true, true, false, product_test.bundle), 7 | ::Validators::CMSQRDA3SchematronValidator.new(product_test.bundle.version, as_warnings: false), 8 | ::Validators::ExpectedResultsValidator.new(product_test.expected_results, product_test.bundle.randomization)] 9 | @validators 10 | end 11 | 12 | def execute(file, user) 13 | te = test_executions.new(expected_results:, artifact: Artifact.new(file:), user_id: user) 14 | te.save! 15 | TestExecutionJob.perform_later(te, self, validate_reporting: true) 16 | te.save 17 | te 18 | end 19 | 20 | def good_results 21 | # Set the Submission Program to MIPS_INDIV 22 | options = { provider: product_test.patients.first.providers.first, submission_program: 'MIPS_INDIV', 23 | start_time: start_date, end_time: end_date, ry2025_submission: product_test.bundle.major_version == '2024', 24 | ry2026_submission: product_test.bundle.major_version == '2025' } 25 | Qrda3.new(product_test.expected_results_with_all_supplemental_codes, product_test.measures, options).render 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /app/models/multi_measure_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class MultiMeasureTest < ProductTest 4 | field :reporting_program_type, type: String 5 | 6 | after_create do |product_test| 7 | product_test.queued 8 | ProductTestSetupJob.perform_later(product_test) 9 | create_tasks 10 | end 11 | 12 | def create_tasks 13 | MultiMeasureCat3Task.new(product_test: self).save! if reporting_program_type == 'ep' 14 | MultiMeasureCat1Task.new(product_test: self).save! if reporting_program_type == 'eh' 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /app/models/program_criterion.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class ProgramCriterion 4 | include Mongoid::Document 5 | 6 | field :criterion_key, type: String 7 | field :criterion_name, type: String 8 | field :criterion_description, type: String 9 | field :criterion_xpath, type: String 10 | field :cms_conf, type: String 11 | field :entered_value, type: String 12 | field :criterion_verified, type: Boolean, default: false 13 | field :criterion_optional, type: Boolean, default: false 14 | field :file_name, type: String 15 | 16 | embedded_in :cms_program_test 17 | 18 | def reset_criterion 19 | self.criterion_verified = false 20 | end 21 | 22 | def entered_values 23 | return nil unless entered_value 24 | 25 | entered_value.delete(' ').split(',') 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /app/models/qrda_upload.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class QrdaUpload 4 | include Mongoid::Document 5 | 6 | field :validator, type: String 7 | field :path, type: String 8 | embeds_many :execution_errors 9 | end 10 | -------------------------------------------------------------------------------- /app/models/role.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class Role 4 | include Mongoid::Document 5 | has_and_belongs_to_many :users 6 | belongs_to :resource, polymorphic: true, optional: true 7 | 8 | field :name, type: String 9 | 10 | index({ 11 | name: 1, 12 | resource_type: 1, 13 | resource_id: 1 14 | }, 15 | unique: true) 16 | 17 | validates :resource_type, 18 | inclusion: { in: Rolify.resource_types }, 19 | allow_nil: true 20 | 21 | scopify 22 | end 23 | -------------------------------------------------------------------------------- /app/models/tracker.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class Tracker 4 | include Mongoid::Document 5 | field :job_id 6 | field :job_class, type: String 7 | field :status, type: Symbol 8 | field :log_message, type: Array, default: [] 9 | field :options, type: Hash, default: {} 10 | 11 | scope :working, -> { where(status: :working) } 12 | scope :failed, -> { where(status: :failed) } 13 | scope :queued, -> { where(status: :queued) } 14 | 15 | def log(data) 16 | log_message.push(data) 17 | save 18 | end 19 | 20 | def failed(error) 21 | self.status = :failed 22 | log(error.message) 23 | end 24 | 25 | def queued 26 | self.status = :queued 27 | log('queued') 28 | end 29 | 30 | def working 31 | self.status = :working 32 | log('working') 33 | end 34 | 35 | def finished 36 | self.status = :completed 37 | log('completed') 38 | end 39 | 40 | def add_options(opts) 41 | self.options = opts 42 | save 43 | end 44 | end 45 | -------------------------------------------------------------------------------- /app/representers/bundle_representer.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module BundleRepresenter 4 | include Api::Representer 5 | 6 | property :title 7 | property :version 8 | 9 | self.links = { 10 | self: proc { bundle_path(self) }, 11 | measures: proc { bundle_measures_path(self) } 12 | } 13 | end 14 | -------------------------------------------------------------------------------- /app/representers/measure_representer.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module MeasureRepresenter 4 | include Api::Representer 5 | 6 | property :hqmf_id 7 | property :cms_id 8 | property :description 9 | property :reporting_program_type 10 | property :category 11 | end 12 | -------------------------------------------------------------------------------- /app/representers/product_representer.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module ProductRepresenter 4 | include Api::Representer 5 | 6 | property :name 7 | property :version 8 | property :description 9 | property :c1_test 10 | property :c2_test 11 | property :c3_test 12 | property :c4_test 13 | property :cures_update 14 | property :randomize_patients 15 | property :duplicate_patients 16 | collection :measure_ids 17 | property :created_at 18 | property :updated_at 19 | 20 | self.collections = { 21 | # key is collection name, value is element name for XML only 22 | measure_ids: 'measure_id' 23 | } 24 | 25 | self.links = { 26 | self: proc { vendor_product_path(vendor, self) }, 27 | product_tests: proc { product_product_tests_path(self) }, 28 | patients: proc { patients_vendor_product_path(vendor, self) } 29 | } 30 | end 31 | -------------------------------------------------------------------------------- /app/representers/qrda_upload_representer.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module QrdaUploadRepresenter 4 | include Api::Representer 5 | property :validator 6 | property :path 7 | property :execution_errors 8 | 9 | self.embedded = { 10 | execution_errors: %i[file_name message validator] 11 | } 12 | end 13 | -------------------------------------------------------------------------------- /app/representers/task_representer.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module TaskRepresenter 4 | include Api::Representer 5 | 6 | property :type, getter: ->(_args) { _type.delete('Task') } 7 | 8 | self.links = { 9 | self: proc { product_test_task_path(product_test, self) }, 10 | executions: proc { task_test_executions_path(self) }, 11 | most_recent_execution: proc { most_recent_execution ? task_test_execution_path(self, most_recent_execution) : nil } 12 | } 13 | end 14 | -------------------------------------------------------------------------------- /app/representers/test_execution_representer.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module TestExecutionRepresenter 4 | include Api::Representer 5 | 6 | property :state 7 | property :execution_errors 8 | property :created_at 9 | 10 | self.links = { 11 | self: proc { task_test_execution_path(task, self) }, 12 | sibling_execution: proc { sibling_execution ? task_test_execution_path(sibling_execution.task, sibling_execution) : nil } 13 | } 14 | 15 | self.embedded = { 16 | execution_errors: %i[file_name location message msg_type stratification validator_type validator] 17 | } 18 | end 19 | -------------------------------------------------------------------------------- /app/representers/vendor_representer.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module VendorRepresenter 4 | include Api::Representer 5 | 6 | property :vendor_id 7 | property :name 8 | property :url 9 | property :address 10 | property :zip 11 | property :state 12 | property :created_at 13 | property :updated_at 14 | 15 | self.embedded = { 16 | points_of_contact: %i[name email phone contact_type] 17 | } 18 | 19 | self.links = { 20 | self: proc { vendor_path(self) }, 21 | products: proc { vendor_products_path(self) } 22 | } 23 | end 24 | -------------------------------------------------------------------------------- /app/uploaders/document_uploader.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class DocumentUploader < CarrierWave::Uploader::Base 4 | storage :file 5 | 6 | def store_dir 7 | "#{APP_CONSTANTS['file_upload_root']}/test_executions/#{model.id}" 8 | end 9 | 10 | def extension_allowlist 11 | %w[xml zip] 12 | end 13 | 14 | def uploaded_filename 15 | file.filename 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /app/uploaders/patient_archive_uploader.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class PatientArchiveUploader < CarrierWave::Uploader::Base 4 | storage :file 5 | 6 | def store_dir 7 | "#{APP_CONSTANTS['file_upload_root']}/product_test/#{model.id}" 8 | end 9 | 10 | def uploaded_filename 11 | file.filename 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/uploaders/supplement_uploader.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class SupplementUploader < CarrierWave::Uploader::Base 4 | storage :file 5 | 6 | def store_dir 7 | "#{APP_CONSTANTS['file_upload_root']}/products/#{model.id}" 8 | end 9 | 10 | def extension_allowlist 11 | %w[doc docx xls xlsx ppt pptx jpg jpeg pdf png zip] 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/views/admin/bundles/new.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |

    Import Bundle

    3 | 4 | <%= bootstrap_form_tag url: admin_bundles_path, html: {id: "add_bundle_form"} do |f| %> 5 |
    6 | <%= f.file_field :file, label: 'Bundle', accept: 'application/zip' %> 7 |
    8 | 9 | 13 | <% end %> 14 | 15 |
    16 | -------------------------------------------------------------------------------- /app/views/admin/show.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | # local variables: 3 | # 4 | # banner_message, smtp_settings, default_url_options, mode, mode_settings, debug_features 5 | %> 6 | <% if server_needs_restart %> 7 | <%= render 'alert', :alert_type => 'warning', :messages => 'Please restart your Cypress service or reboot your Cypress instance when convenient in order to apply settings.' %> 8 | <% end %> 9 | 10 |
    11 | 16 | 17 |
    18 | <%= render 'show_settings', locals_admin_show %> 19 |
    20 | 21 |
    22 | <%= render "user_list" %> 23 |
    24 | 25 |
    26 |
    27 | <%= render "bundle_list", :bundles => @bundles %> 28 |
    29 | <%= render 'action_modal' %> 30 |
    31 | 32 |
    33 | <%= render 'application_status', :system_usage_stats => @system_usage_stats %> 34 |
    35 | 36 |
    37 | -------------------------------------------------------------------------------- /app/views/admin/show.js.erb: -------------------------------------------------------------------------------- 1 | <% if params[:partial] == 'bundle_list' %> 2 | <% if BundleUploadJob.trackers.or({ :status => :queued }, { :status => :working }).count.positive? %> 3 | setTimeout(function(){ 4 | $('#display_bundle_list').html("<%= escape_javascript render '/admin/bundle_list', :bundles => @bundles %>"); 5 | }, 2000); 6 | <% else %> 7 | $('#display_bundle_list').html("<%= escape_javascript render '/admin/bundle_list', :bundles => @bundles %>"); 8 | <% end %> 9 | <% elsif params[:partial] == 'application_status' %> 10 | setTimeout(function(){ 11 | $('#application_status').html("<%= escape_javascript render '/admin/application_status', :system_usage_stats => @system_usage_stats %>"); 12 | }, 10000); 13 | <% end %> 14 | -------------------------------------------------------------------------------- /app/views/admin/users/index.html.erb: -------------------------------------------------------------------------------- 1 |
    2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | <% @users.each do |user| 14 | role = user.roles.where({resource_id: nil}).first 15 | assignments = user.roles.where({resource_id: {"$ne"=> nil}}) 16 | %> 17 | 18 | 19 | 20 | 21 | 32 | 33 | 34 | <% end %> 35 | 36 | 37 |
    EmailRoleApprovedAssignments
    <%= user.email %><%= role.name if role %><%= user.approved %> 22 | 23 | <% assignments.each do |ass| 24 | if ass.resource 25 | %> 26 | 27 | <% end 28 | end 29 | %> 30 |
    <%= ass.name %><%= ass.resource.name %>
    31 |
    <%= icon('fas fa-fw', 'wrench', :"aria-hidden" => true) %>Edit User
    38 | 39 |
    40 | -------------------------------------------------------------------------------- /app/views/application/_action_modal.html.erb: -------------------------------------------------------------------------------- 1 | 25 | -------------------------------------------------------------------------------- /app/views/application/_certification_bar.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | 3 | # local variables 4 | # 5 | # product 6 | # active_certs (Array of booleans) [c1, c2, c3, c4] 7 | 8 | %> 9 | 10 | <% product_certs = [product.c1_test, product.c2_test, product.c3_test, product.c4_test] %> 11 | 12 |
    13 | <% ['C1', 'C2', 'C3', 'C4'].each_with_index do |cert, i| %> 14 |
    <%= cert if product_certs[i] %>
    15 | <% end %> 16 |
    17 | -------------------------------------------------------------------------------- /app/views/application/_demo_warning.html.erb: -------------------------------------------------------------------------------- 1 | <% if Settings.current.banner %> 2 |
    3 | <%= Settings.current.warning_message %> 4 |
    5 | <% end #if %> 6 | -------------------------------------------------------------------------------- /app/views/application/_info_popup.html.erb: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /app/views/application/_instructions.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |

    Instructions

    4 |
    5 |
    6 | 11 |
    12 |
    -------------------------------------------------------------------------------- /app/views/application/_product_status_table.html.erb: -------------------------------------------------------------------------------- 1 | <%# 2 | local variable 'product' and 'show_product_link' boolean 3 | %> 4 | <% show_product_link ||= false %> 5 | <% if product.cvuplus %> 6 | <%= render 'cvu_plus_status_table', :product => product, :show_product_link => show_product_link %> 7 | <% else %> 8 | <%= render 'certification_status_table', :product => product, :show_product_link => show_product_link %> 9 | <% end %> 10 | -------------------------------------------------------------------------------- /app/views/bundle_downloads/index.html.erb: -------------------------------------------------------------------------------- 1 | <%= bootstrap_form_for(@bundle_download) do |f| %> 2 |
    3 | Available Bundles 4 | 5 | <%= f.form_group :bundle_year, help: "Select the bundle you would like to download." do %> 6 | <% @bundle_years.each do |bundle_year| %> 7 | <%= f.radio_button :bundle_year, bundle_year, label: "bundle-#{bundle_year}.zip", label_class: "btn btn-checkbox", required: true %> 8 | <% end # bundle loop %> 9 | <% end # form_group %> 10 |
    11 | <%= f.password_field :api_key, label: 'UMLS API Key', autocomplete: "off", autocapitalize: 'off', autocorrect: 'off' %> 12 | <%= f.submit "Download Bundle" %> 13 | <% end %> -------------------------------------------------------------------------------- /app/views/checklist_tests/_checklist_instructions.html.erb: -------------------------------------------------------------------------------- 1 |
    2 | 15 |
    -------------------------------------------------------------------------------- /app/views/checklist_tests/_checklist_measures.html.erb: -------------------------------------------------------------------------------- 1 | 2 | <% if product_test.tasks.first.most_recent_execution && product_test.tasks.first.most_recent_execution.incomplete? %> 3 | 6 | <% end %> 7 | 8 |
    9 | <% unless product_test.status != 'passing' %> 10 | <%= render 'alert', :alert_type => 'warning', :messages => 'Saving this checklist will override previous results.', :confirmation => 'Yes, let me save this checklist' %> 11 | <% end %> 12 |
    13 | 14 | 15 | <%= render 'checklist_measure', :product => product_test.product, :product_test => product_test, :measures => measures %> 16 | 17 | -------------------------------------------------------------------------------- /app/views/checklist_tests/measure.html.erb: -------------------------------------------------------------------------------- 1 | <% product = @product_test.product %> 2 | 3 | <%= render partial: 'application/certification_bar', locals: { product: product, active_certs: [true, false, product.c3_test, false] } %> 4 | 5 |
    6 | <%= link_to(product_checklist_test_path(@product, @product_test), class: 'btn btn-primary') do %> 7 | <%= icon('fas fa-fw', 'bolt', :"aria-hidden" => true) %>Return to Record Sample 8 | <% end %> 9 | 10 |
    11 |
    12 |
    13 |

    1<%= icon('fas fa-fw', 'bolt', :"aria-hidden" => true) %>Checklist Instructions

    14 |
    15 | <%= render 'checklist_instructions', :instructions => APP_CONSTANTS['tests']['ChecklistTest']['instructions'] %> 16 |
    17 |
    18 | 19 |
    20 | <% unless @product_test.status != 'passing' %> 21 | <%= render 'alert', :alert_type => 'warning', :messages => 'Saving this checklist will overide previous results.', :confirmation => 'Yes, let me save this checklist' %> 22 | <% end %> 23 |
    24 | 25 | <%= render 'checklist_measure', :product => @product_test.product, :product_test => @product_test, :measures => @measures, :measure => @measure %> 26 | -------------------------------------------------------------------------------- /app/views/devise/confirmations/new.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |

    Resend confirmation instructions

    4 |
    5 | 6 | <%= bootstrap_form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %> 7 | 8 |
    9 | <%= f.email_field :email, autocapitalize: 'off', autocorrect: 'off', autofocus: true, 10 | value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) %> 11 |
    12 | 13 | 16 | <% end %> 17 |
    18 | 19 | <%= render "devise/shared/links" %> 20 | -------------------------------------------------------------------------------- /app/views/devise/mailer/confirmation_instructions.html.erb: -------------------------------------------------------------------------------- 1 |

    Welcome <%= @email %>!

    2 | 3 |

    You can confirm your account email through the link below:

    4 | 5 |

    <%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %>

    6 | -------------------------------------------------------------------------------- /app/views/devise/mailer/reset_password_instructions.html.erb: -------------------------------------------------------------------------------- 1 |

    Hello <%= @resource.email %>!

    2 | 3 |

    Someone has requested a link to change your password. You can do this through the link below.

    4 | 5 |

    <%= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token) %>

    6 | 7 |

    If you didn't request this, please ignore this email.

    8 |

    Your password won't change until you access the link above and create a new one.

    9 | -------------------------------------------------------------------------------- /app/views/devise/mailer/unlock_instructions.html.erb: -------------------------------------------------------------------------------- 1 |

    Hello <%= @resource.email %>!

    2 | 3 |

    Your account has been locked due to an excessive number of unsuccessful sign in attempts.

    4 | 5 |

    Click the link below to unlock your account:

    6 | 7 |

    <%= link_to 'Unlock my account', unlock_url(@resource, unlock_token: @token) %>

    8 | -------------------------------------------------------------------------------- /app/views/devise/passwords/edit.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |

    Change your password

    4 |
    5 | 6 | <%= bootstrap_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put, "data-parsley-validate": '' }) do |f| %> 7 | <%= f.hidden_field :reset_password_token %> 8 |
    9 | <%= f.password_field :password, autofocus: true, autocomplete: "off", autocapitalize: 'off', autocorrect: 'off' %> 10 | <%= f.password_field :password_confirmation, autocomplete: "off", autocapitalize: 'off', autocorrect: 'off', 11 | help: '8 characters minimum and include at least 3 of the following: lowercase letters, uppercase letters, digits, and special characters.', 12 | 'data-parsley-required': '', 13 | 'data-parsley-minlength': "8", 14 | 'data-parsley-minlength-message': "Password must be at least 8 characters long.", 15 | 'data-parsley-passwordcomplexity': '', 16 | 'data-parsley-trigger': 'change' %> 17 |
    18 | 19 | 22 | <% end %> 23 |
    24 | 25 | <%= render "devise/shared/links" %> 26 | -------------------------------------------------------------------------------- /app/views/devise/passwords/new.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |

    Forgot your password?

    4 |
    5 | 6 | <%= bootstrap_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %> 7 |
    8 | <%= f.email_field :email, autocapitalize: 'off', autocorrect: 'off', autofocus: true %> 9 |
    10 | 11 | 14 | <% end %> 15 |
    16 | 17 | <%= render "devise/shared/links" %> 18 | -------------------------------------------------------------------------------- /app/views/devise/registrations/edit.js.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | $('.recent-activity-table').html("<%= escape_javascript render 'recent_activity', :test_executions => @test_executions %>"); 4 | Turbolinks.ProgressBar.done(); 5 | 6 | $('.activity-paginate').click(function (event) { 7 | Turbolinks.ProgressBar.start(); 8 | Turbolinks.ProgressBar.advanceTo(25); 9 | }); 10 | -------------------------------------------------------------------------------- /app/views/devise/shared/_links.html.erb: -------------------------------------------------------------------------------- 1 | <%- if controller_name != 'sessions' %> 2 | <%= link_to "Sign in", new_session_path(resource_name) %>
    3 | <% end -%> 4 | 5 | <%- if devise_mapping.registerable? && controller_name != 'registrations' %> 6 | <%= link_to "Sign up", new_registration_path(resource_name) %>
    7 | <% end -%> 8 | 9 | <%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %> 10 | <%= link_to "Reset password", new_password_path(resource_name) %>
    11 | <% end -%> 12 | 13 | <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %> 14 | <%= link_to "Resend confirmation email", new_confirmation_path(resource_name) %>
    15 | <% end -%> 16 | 17 | <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %> 18 | <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %>
    19 | <% end -%> 20 | 21 | <%- if devise_mapping.omniauthable? %> 22 | <%- resource_class.omniauth_providers.each do |provider| %> 23 | <%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider) %>
    24 | <% end -%> 25 | <% end -%> 26 | -------------------------------------------------------------------------------- /app/views/devise/unlocks/new.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |

    Resend unlock instructions

    4 |
    5 | 6 | <%= bootstrap_form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %> 7 | 8 |
    9 | <%= f.email_field :email, autocapitalize: 'off', autocorrect: 'off', autofocus: true %> 10 |
    11 | 12 | 15 | <% end %> 16 |
    17 | 18 | <%= render "devise/shared/links" %> 19 | -------------------------------------------------------------------------------- /app/views/errors/404.html.erb: -------------------------------------------------------------------------------- 1 |

    Page Not Found

    2 |

    3 | 4 | <%= icon('fas fa-3x', 'question-circle', :"aria-hidden" => true) %> 5 | 6 |

    7 |

    We're sorry but Cypress can't find this page. You might have followed a bad link or mis-typed a URL.

    8 | 9 | <%= render 'layouts/error_links' %> 10 | -------------------------------------------------------------------------------- /app/views/errors/500.html.erb: -------------------------------------------------------------------------------- 1 |

    Server Error

    2 |

    3 | 4 | <%= icon('fas fa-3x', 'exclamation-circle', :"aria-hidden" => true) %> 5 | 6 |

    7 |

    Something went wrong with this request. This is likely a problem with Cypress rather than a mistake on your part.

    8 | 9 | <%= render 'layouts/error_links' %> 10 | -------------------------------------------------------------------------------- /app/views/layouts/_error_links.html.erb: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /app/views/layouts/errors.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <%= response.status %> Error 10 | 11 | 12 | 13 | <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %> 14 | <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> 15 | <%= csrf_meta_tags %> 16 | 17 | 18 | 19 | <% if Settings.current.banner %> 20 |
    <%= Settings.current.banner_message %>
    21 | <% end %> 22 | 23 |
    24 |
    25 | <%= yield %> 26 |
    27 |
    28 | 29 | 30 | -------------------------------------------------------------------------------- /app/views/layouts/report.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <%= make_title %> 10 | 11 | 12 | 13 | 16 | 17 | 18 |
    19 |
    20 | <%= yield %> 21 |
    22 |
    23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/views/products/_measure_selection.json.jbuilder: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | json.measures @measures.map(&:hqmf_id) 4 | 5 | # Guarantee that measure tabs will still show up in the result even if it is empty below 6 | json.measure_tabs({}) 7 | json.set! 'measure_tabs' do 8 | @measures_categories.each do |category, measures| 9 | json.set! get_div_name(category), formatted_type_counts(category, measures) 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /app/views/products/_measure_test_link.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | 3 | # local variables 4 | # 5 | # task (Task) for MeasureTest: should be C1Task or C2Task. should NOT be C3Cat1Task or C3Cat3Task since c3 test executions are executed 6 | 7 | %> 8 | 9 | <% test = task.product_test %> 10 | <% tasks = with_c3_task(task) %> 11 | 12 | <% if test.state != :ready %> 13 | <% if test.state == :queued %> 14 | <%= icon('far fa-fw text-muted', 'circle', :"aria-hidden" => true) %> 15 | queued 16 | <% elsif test.state == :building %> 17 | <%= icon('fas fa-fw fa-spin', 'cog', :"aria-hidden" => true) %> 18 | building 19 | <% elsif test.state == :errored %> 20 | <%= icon('fas', 'exclamation-triangle', :"aria-hidden" => true) %> 21 | <% end %> 22 | <% else %> 23 | <% case tasks_status(tasks) %> 24 | <% when 'pending' %> 25 | <%= icon('fas fa-fw fa-spin text-testing', 'gavel', :"aria-hidden" => true) %> 26 | testing... 27 | <% else %> 28 | <%= icon('fas fa-fw invisible', 'gavel', :"aria-hidden" => true) %> 29 | <%= render partial: '/products/product_test_upload', locals: { task: task, label_class: 'btn btn-outline-info' } %> 30 | <% end %> 31 | <% end %> 32 | -------------------------------------------------------------------------------- /app/views/products/_product_test_upload.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | 3 | # local variables: 4 | # 5 | # task 6 | # label_class [optional] 7 | 8 | %> 9 | 10 | <% label_class ||= 'btn btn-outline-info' %> 11 | 12 | <% accept_type = displaying_cat1?(task) ? 'application/zip' : 'text/xml' %> 13 | <% unique_id = task.id # value unique to this form %> 14 | 15 | <%= form_for(TestExecution.new, html: { method: :post, multipart: true, id: "multi-upload-form-#{unique_id}", class: 'inline' }, :authenticity_token => true, remote: true, url: task_test_executions_path(task)) do |f| %> 16 | <%= f.label :results, 'upload', class: "inline label #{label_class} pointer-on-hover btn-sm", for: "multi-upload-field-#{unique_id}" do %> 17 | upload<%= f.file_field :results, class: 'd-none multi-upload-field', accept: accept_type, id: "multi-upload-field-#{unique_id}" %> 18 | <% end %> 19 | <%= f.submit 'my submit button', class: 'd-none multi-upload-submit', id: "multi-upload-submit-#{unique_id}" %> 20 | <% end %> 21 | 22 | -------------------------------------------------------------------------------- /app/views/products/edit.html.erb: -------------------------------------------------------------------------------- 1 | <%= render 'action_modal' %> 2 | 3 | <%= render 'product_form', :submit_text => "Edit Product", :product => @product, :bundle => @bundle, :measures_categories => @measures_categories, :selected_measure_ids => @selected_measure_ids %> 4 | 5 | <%= render 'remove_panel', :name => @product.name, :type => 'product', :message => 'Removing a product will also delete all associated product tests and test execution results. Be sure you want to do this.', :delete_path => vendor_product_path(@product.vendor_id, @product) %> 6 | -------------------------------------------------------------------------------- /app/views/products/favorite.js.erb: -------------------------------------------------------------------------------- 1 | <% if (@product.favorite_user_ids.include? current_user.id) %> 2 | $('#product-status-<%=@product.id%> th .button_to button i.fa-star').removeClass('far').addClass('fas'); 3 | $('#product-status-<%=@product.id%> th .button_to button span').text("product favorited"); 4 | <% else %> 5 | $('#product-status-<%=@product.id%> th .button_to button i.fa-star').removeClass('fas').addClass('far'); 6 | $('#product-status-<%=@product.id%> th .button_to button span').text("product not favorited"); 7 | <% end %> -------------------------------------------------------------------------------- /app/views/products/new.html.erb: -------------------------------------------------------------------------------- 1 | <%= render 'product_form', :submit_text => "Add Product", :product => @product, bundle: @bundle, :measures_categories => @measures_categories, :selected_measure_ids => @selected_measure_ids %> 2 | -------------------------------------------------------------------------------- /app/views/products/report.html.erb: -------------------------------------------------------------------------------- 1 |
    2 | <%# add_breadcrumb 'Vendor: ' + @product.vendor.name, vendor_path(@product.vendor) %> 3 | <%# add_breadcrumb 'Product: ' + @product.name, product_path(@product) %> 4 | <%# add_breadcrumb 'Report' %> 5 |
    6 |

    Report Summary

    7 |
    8 |
    Report Released
    9 |
    <%= Time.new %>
    10 |
    Vendor
    11 |
    <%= @product.vendor_name %>
    12 |
    Product
    13 |
    <%= @product.name %>
    14 |
    Bundle
    15 |
    <%= "#{@bundle.title} v#{@bundle.version}" %>
    16 |
    Cypress Version
    17 |
    <%= Cypress::Application::VERSION %>
    18 |
    19 |
    20 | <%= render partial: @product.cvuplus ? 'products/report/cvu_plus_report' : 'products/report/certification_report' %> 21 |
    22 | -------------------------------------------------------------------------------- /app/views/products/report/_filtering_tests_list.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | 3 | # local variables: 4 | # 5 | # title (String) 6 | # tasks (Array of tasks) 7 | 8 | %> 9 | 10 | <% return unless tasks && tasks.any? %> 11 | 12 |

    <%= title %>

    13 | 14 | 24 | -------------------------------------------------------------------------------- /app/views/products/report/_measure_tests_list.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | 3 | # local variables: 4 | # 5 | # title (String) 6 | # tasks (Array of tasks) 7 | 8 | %> 9 | 10 | <% return unless tasks && tasks.any? %> 11 | 12 |

    <%= title %>

    13 | 14 | 20 | -------------------------------------------------------------------------------- /app/views/products/report/_status_icon.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | 3 | # local variable 'passing' 4 | 5 | %> 6 | 7 | 8 | <%= passing ? 'passing' : 'failing' %> 9 | -------------------------------------------------------------------------------- /app/views/products/show.html.erb: -------------------------------------------------------------------------------- 1 | <%= render 'header_product', :product => @product %> 2 | <% if @product.cvuplus %> 3 | <%= render 'cvu_plus_product', :product => @product %> 4 | <% else %> 5 | <%= render 'certification_product', :product => @product %> 6 | <% end %> 7 | -------------------------------------------------------------------------------- /app/views/program_tests/_cms_program_test.html.erb: -------------------------------------------------------------------------------- 1 |

    CMS Implementation Guide Checklist (<%= product_test.cms_program %>)

    2 |
    3 |
    4 |
    5 |

    1 <%= icon('fas fa-fw', 'bolt', :"aria-hidden" => true) %> CMS Implementation Guide Checklist Instructions

    6 |
    7 | <%= render 'checklist_tests/checklist_instructions', :instructions => APP_CONSTANTS['tests']['CMSProgramTest']['instructions'] %> 8 |
    9 |
    10 | <%= render 'upload_panel', :product_test => product_test, :panel_index => "2" %> 11 |
    12 | <%= render 'program_fields', :product => product_test.product, :product_test => product_test, :task => product_test.tasks.first %> 13 |
    -------------------------------------------------------------------------------- /app/views/program_tests/_hl7_program_test.html.erb: -------------------------------------------------------------------------------- 1 | <% if product_test.cms_program == "HL7_Cat_III" %> 2 |

    HL7 QRDA Category III Validation

    3 | <% else %> 4 |

    HL7 QRDA Category I Validation

    5 | <% end %> 6 | <%= render 'upload_panel', :product_test => product_test, :panel_index => "1" %> -------------------------------------------------------------------------------- /app/views/program_tests/_upload_panel.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |

    5 | <%= panel_index %> <%= icon('fas fa-fw', 'bolt', :"aria-hidden" => true) %> <%= 'Upload Files' %> 6 |

    7 |
    8 |
    9 | <%= render 'test_executions/execution_upload', :disable => false, :product_test => product_test, :task => product_test.tasks.first %> 10 |
    11 | <%= render 'checklist_execution_results', :task => product_test.tasks.first %> 12 |
    13 |
    14 | <%= render 'checklist_status_display', :product => product_test.product, :product_test => product_test %> 15 |
    16 |
    17 |
    18 |
    -------------------------------------------------------------------------------- /app/views/program_tests/show.html.erb: -------------------------------------------------------------------------------- 1 | <% if %w[HL7_Cat_I HL7_Cat_III].include? @product_test.cms_program %> 2 | <%= render 'hl7_program_test', :product_test => @product_test %> 3 | <% else %> 4 | <%= render 'cms_program_test', :product_test => @product_test %> 5 | <% end %> -------------------------------------------------------------------------------- /app/views/records/_calculation_result_icon.html.erb: -------------------------------------------------------------------------------- 1 | <% if result && result.positive? %> 2 | Pass 3 | 4 | <%= icon('fas fa-stack-2x', 'circle', :"aria-hidden" => true) %> 5 | <% unless result == 1 && !episode_of_care %> 6 | value of <%= result %> 7 | <% end %> 8 | 9 | <% else %> 10 | Fail 11 | <%= icon('far fa-2x empty-marker', 'circle', :"aria-hidden" => true) %> 12 | <% end %> 13 | -------------------------------------------------------------------------------- /app/views/records/_logic_coverage_table.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <% analysis['coverage_per_measure'].sort_by{|k,v| v}.each do |measure, coverage_info|%> 7 | 8 | 11 | 14 | 15 | <% end %> 16 |
    MeasureLogic Coverage
    9 | <%= "#{measure}"%> 10 | 12 | <%= "%.1f%%" % [100*coverage_info]%> 13 |
    17 | -------------------------------------------------------------------------------- /app/views/records/_missing_population_table.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | <% @analysis['unhit_populations_by_measure'].sort_by{ |k,v| Measure.find(k).cms_id }.each do |measure, unhit_populations| 8 | measure_id = Measure.find(measure).cms_id 9 | unhit_populations.each do |unhit_population| 10 | split_population = unhit_population.split('|') %> 11 | 12 | 13 | 14 | 15 | 16 | <% end %> 17 | <% end %> 18 |
    MeasurePopulation SetPopulation
    <%= measure_id %><%= split_population[0]%><%= split_population[1]%>
    19 | -------------------------------------------------------------------------------- /app/views/records/_mpl_download.html.erb: -------------------------------------------------------------------------------- 1 | <% current_mpl_status = bundle.mpl_prepare %> 2 | <% if current_mpl_status == :ready %> 3 | Download <%= bundle.title %> 4 | <%= link_to download_mpl_records_path(bundle), :method => :get, :class => "btn btn-xs btn-default" do %> 5 | Download <%= bundle.title %> 6 | <% end %> 7 | <% else %> 8 | Preparing download for <%= bundle.title %> 9 | <%= icon('fas fa-fw fa-spin', 'sync-alt', :"aria-hidden" => true) %> Preparing Download 10 | <% end %> 11 | <% unless current_mpl_status == :ready %> 12 | 27 | <% end %> 28 | -------------------------------------------------------------------------------- /app/views/records/_patient_measure_highlighting.html.erb: -------------------------------------------------------------------------------- 1 |
    "> 2 | <%= Highlighting.new(measure, individual_result).render.html_safe %> 3 |
    -------------------------------------------------------------------------------- /app/views/records/_risk_variable_display.html.erb: -------------------------------------------------------------------------------- 1 | <% encounter_ids = individual_result.episode_results&.keys %> 2 | <% individual_result.collect_risk_variables.each do |key, rv_value| %> 3 | 6 | <% end %> -------------------------------------------------------------------------------- /app/views/records/_risk_variable_display.html.old.erb: -------------------------------------------------------------------------------- 1 | <% encounter_ids = individual_result.episode_results&.keys %> 2 | <% individual_result.collect_risk_variables.each do |key, rv_value| %> 3 | <% next if rv_value[:values].empty? %> 4 | 25 | <% end %> -------------------------------------------------------------------------------- /app/views/records/_uncovered_code_table.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | <% analysis['uncovered_vs_code_sys'].each do |vs_id, code_sys|%> 8 | <% vs = ValueSet.where(id: vs_id).first %> 9 | <% if code_sys.count > 0 %> 10 | 11 | <% if vs.oid.start_with?("drc") %> 12 | 13 | <% else %> 14 | 15 | <% end %> 16 | 17 | 20 | 21 | <% end %> 22 | <% end %> 23 |
    ValueSet OID/CodeValueSet NameUncovered Code Systems
    <%= vs.concepts.first.code + "(drc)"%><%= vs.oid%><%= vs.display_name%> 18 | <%= code_sys.map { |cs|HQMF::Util::CodeSystemHelper.code_system_for(cs) }.join(',') %> 19 |
    24 | -------------------------------------------------------------------------------- /app/views/records/_uncovered_valueset_table.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <% analysis['uncovered_value_sets'].each do |vs_id|%> 10 | <% vs = ValueSet.where(id: vs_id).first %> 11 | 12 | <% if vs.oid.start_with?("drc") %> 13 | 14 | <% else %> 15 | 16 | <% end %> 17 | 18 | 19 | 20 | <% end %> 21 |
    ValueSet OID/CodeValueSet NameMeasures
    <%= vs.concepts.first.code + "(drc)"%><%= vs.oid%><%= vs.display_name%><%= Measure.where(:value_set_ids => vs.id).pluck(:cms_id).join(", ") %>
    -------------------------------------------------------------------------------- /app/views/records/by_measure.js.erb: -------------------------------------------------------------------------------- 1 | $("#records_list").html("<%= escape_javascript(render 'records_list', :patients => @patients, :measure => @measure, :population_set_hash => @population_set_hash, :product_test => @product_test, :bundle => @bundle, :task => @task, :vendor =>@vendor, :pop_set_key => @pop_set_key) %>"); 2 | // any statically changed form elements require a separate token refresh call 3 | $.rails.refreshCSRFTokens(); 4 | -------------------------------------------------------------------------------- /app/views/records/patient_analysis.js.erb: -------------------------------------------------------------------------------- 1 | <% if params[:partial] == 'patient_analysis_jobs' %> 2 | <% trackers = PatientAnalysisJob.trackers.where('options.vendor_id': @vendor.id.to_s, 'options.bundle_id': @bundle.id.to_s,) %> 3 | <% if trackers.or({ :status => :queued }, { :status => :working }).count.positive? %> 4 | setTimeout(function(){ 5 | $('.patient-analysis-jobs').html("<%= escape_javascript render 'patient_analysis_tracker', :vendor => @vendor, :bundle => @bundle %>"); 6 | }, 2000); 7 | <% end %> 8 | <% end %> -------------------------------------------------------------------------------- /app/views/test_executions/_expected_result_icon.html.erb: -------------------------------------------------------------------------------- 1 | <% if result && result.positive? %> 2 | Pass 3 | 4 | 5 | <% result_string = observation ? "#{result} (#{observation['value']})" : result %> 6 | value of <%= result_string %> 7 | 8 | <% else %> 9 | Fail 10 | <%= icon('far fa-2x empty-marker', 'circle', :"aria-hidden" => true) %> 11 | <% end %> 12 | -------------------------------------------------------------------------------- /app/views/test_executions/_filter_instructions.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | 3 | # local variable 'task'. must be a FilteringTest 4 | 5 | %> 6 | 7 |

    Remove any patients not meeting the following criteria.

    8 | <% task.product_test.options.filters.map do |filter_name, val| %> 9 |
    10 |
    <%= display_filter_title(filter_name, task) %>
    11 |
    12 | <% filter_values = display_filter_val(filter_name, task.bundle.randomization, val) %> 13 | <% filter_values.each do |filter_val| %> 14 | <% if filter_val.is_a?(Hash) %> 15 | <% filter_val.each_pair do |value_key, value_val| %> 16 |

    <%= value_key %> 17 | <%= value_val %>

    18 | <% end %> 19 | <% else %> 20 | <%= filter_val %> 21 | <% end %> 22 | <% end %> 23 | 24 |
    25 |
    26 | <% end %> 27 | -------------------------------------------------------------------------------- /app/views/test_executions/_task_status_wrapper.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | 3 | # local variables: 4 | # 5 | # task 6 | # current_task (boolean) 7 | # 8 | # purpose: wraps task_status partial with link or div with id. div with id used 9 | # in show.js.erb to identify what needs to be reloaded after execution 10 | # is ready 11 | 12 | %> 13 | 14 | <% if current_task %> 15 |
    16 | <% else %> 17 | 18 | <% end %> 19 | 20 | <%= render 'task_status', :task => task, :current_task => current_task %> 21 | 22 | <% if current_task %> 23 |
    24 | <% else %> 25 | 26 | <% end %> -------------------------------------------------------------------------------- /app/views/test_executions/create.js.erb: -------------------------------------------------------------------------------- 1 | <% # currently only used by product show page for ajax call to create test execution %> 2 | 3 | <% # set product for /products/measure_tests_table partial %> 4 | <% @product = @test_execution.task.product_test.product %> 5 | 6 | <% # set PATH_INFO so AJAX call can be made in /products/measure_tests_table partial. this AJAX call is for reloading each product_test_link %> 7 | <% request.env['PATH_INFO'] = vendor_product_path(@product.vendor_id, @product) %> 8 | 9 | <% is_measure_test_execution = @curr_task.product_test.is_a? MeasureTest %> 10 | 11 | <% if is_measure_test_execution %> 12 | $.ajax({url: "<%= request.env['PATH_INFO'] %>", type: "GET", dataType: 'script', data: { partial: 'measure_tests_table_row', task_id: "<%= params[:task_id] %>", has_eh_tests: "<%= @has_eh_tests%>", has_ep_tests: "<%= @has_ep_tests%>" }}); 13 | <% else # is filtering test execution %> 14 | $.ajax({url: "<%= request.env['PATH_INFO'] %>", type: "GET", dataType: 'script', data: { partial: 'filtering_test_link', task_id: "<%= params[:task_id] %>", has_eh_tests: "<%= @has_eh_tests%>", has_ep_tests: "<%= @has_ep_tests%>" }}); 15 | <% end %> 16 | -------------------------------------------------------------------------------- /app/views/test_executions/results/_error_table.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | 3 | # requires local variables: 4 | # errors 5 | # message_title (String) should be 'Error' or 'Warning' 6 | 7 | # Note: all errors should be from the same test execution 8 | 9 | %> 10 | 11 | <% return if errors.count.zero? %> 12 | 13 | 14 | 15 | 16 | <% message_title = 'Error' if message_title == 'Errors' 17 | message_title = 'Warning' if message_title == 'Warnings' %> 18 | 19 | <% unless export %> 20 | 21 | <% end %> 22 | 23 | 24 | 25 | <% errors.sort { |a, b| compare_error_locations_across_files(a, b) }.each do |error| %> 26 | 27 | 28 | 34 | 35 | <% end %> 36 | 37 |
    <%= "#{message_title} message" %>Go To in XML
    <%= error.message %> 29 | <% unless error.empty_location? || export%> 30 | <% line_num = get_line_number(error) %> 31 | data-line-number = <%= line_num %>>jump to error 32 | <% end %> 33 |
    38 | -------------------------------------------------------------------------------- /app/views/test_executions/results/_xmlnav.html.erb: -------------------------------------------------------------------------------- 1 |
    2 | 26 |
    27 | -------------------------------------------------------------------------------- /app/views/vendors/edit.html.erb: -------------------------------------------------------------------------------- 1 |
    2 | 3 | 4 | <%= render 'action_modal' %> 5 | 6 | <%= render 'vendor_form', :vendor => @vendor, :submit_text => 'Save Changes' %> 7 | 8 | <%= render 'remove_panel', :name => @vendor.name, :type => 'vendor', :message => 'Removing a vendor will also delete all associated products, product tests, and test execution results. Be sure you want to do this.', :delete_path => vendor_path(@vendor) %> 9 | 10 |
    11 | -------------------------------------------------------------------------------- /app/views/vendors/favorite.js.erb: -------------------------------------------------------------------------------- 1 | <% if (@vendor.favorite_user_ids.include? current_user.id) %> 2 | $('#vendor-status-<%=@vendor.id%> td .button_to button i.fa-star').removeClass('far').addClass('fas'); 3 | $('#vendor-status-<%=@vendor.id%> td .button_to button span').text("vendor favorited"); 4 | <% else %> 5 | $('#vendor-status-<%=@vendor.id%> td .button_to button i.fa-star').removeClass('fas').addClass('far'); 6 | $('#vendor-status-<%=@vendor.id%> td .button_to button span').text("vendor not favorited"); 7 | <% end %> -------------------------------------------------------------------------------- /app/views/vendors/new.html.erb: -------------------------------------------------------------------------------- 1 |
    2 | 3 | <%= render 'vendor_form', :vendor => @vendor, :submit_text => "Add Vendor" %> 4 | 5 |
    6 | -------------------------------------------------------------------------------- /app/views/vendors/show.js.erb: -------------------------------------------------------------------------------- 1 | $('.infinite-scroll').append("<%=j render(partial:'product_status_table', collection: @products_nonfav, as: :product, locals: { show_product_link: true }) %>"); 2 | 3 | <% if @products_nonfav.current_page == @products_nonfav.total_pages %> 4 | $('#view-more').remove(); 5 | <% else %> 6 | $('#view-more a').attr('href', '<%= url_for(page: @products_nonfav.current_page + 1) %>'); 7 | <% end %> 8 | -------------------------------------------------------------------------------- /bin/brakeman: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # 3 | # This file was generated by Bundler. 4 | # 5 | # The application 'brakeman' is installed as part of a gem, and 6 | # this file is here to facilitate running it. 7 | # 8 | 9 | require 'pathname' 10 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile", 11 | Pathname.new(__FILE__).realpath) 12 | 13 | require 'rubygems' 14 | require 'bundler/setup' 15 | 16 | load Gem.bin_path('brakeman', 'brakeman') 17 | -------------------------------------------------------------------------------- /bin/bundle: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) 3 | load Gem.bin_path('bundler', 'bundle') 4 | -------------------------------------------------------------------------------- /bin/cucumber: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | vendored_cucumber_bin = Dir["#{File.dirname(__FILE__)}/../vendor/{gems,plugins}/cucumber*/bin/cucumber"].first 4 | if vendored_cucumber_bin 5 | load File.expand_path(vendored_cucumber_bin) 6 | else 7 | require 'rubygems' unless ENV['NO_RUBYGEMS'] 8 | require 'cucumber' 9 | load Cucumber::BINARY 10 | end 11 | -------------------------------------------------------------------------------- /bin/delayed_job: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment')) 3 | require 'delayed/command' 4 | Delayed::Command.new(ARGV).daemonize 5 | -------------------------------------------------------------------------------- /bin/overcommit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # 3 | # This file was generated by Bundler. 4 | # 5 | # The application 'overcommit' is installed as part of a gem, and 6 | # this file is here to facilitate running it. 7 | # 8 | 9 | require 'pathname' 10 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile", 11 | Pathname.new(__FILE__).realpath) 12 | 13 | require 'rubygems' 14 | require 'bundler/setup' 15 | 16 | load Gem.bin_path('overcommit', 'overcommit') 17 | -------------------------------------------------------------------------------- /bin/queue_job: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require 'bunny' 3 | require 'json' 4 | 5 | class Calculator 6 | 7 | attr_accessor :patient_ids, :measure_ids, :options 8 | 9 | def initialize (patient_ids, measure_ids, options) 10 | connection = Bunny.new(automatically_recover: false) 11 | connection.start 12 | channel = connection.create_channel 13 | queue=channel.queue('calculation_queue', durable: true) 14 | 15 | message = JSON.dump({patient_ids: patient_ids, measure_ids: measure_ids, options: options}) 16 | queue.publish(message, persistent: true) 17 | 18 | puts " [x] Sent #{message}" 19 | 20 | connection.close 21 | end 22 | end 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /bin/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | APP_PATH = File.expand_path("../config/application", __dir__) 3 | require_relative "../config/boot" 4 | require "rails/commands" 5 | -------------------------------------------------------------------------------- /bin/rake: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require_relative "../config/boot" 3 | require "rake" 4 | Rake.application.run 5 | -------------------------------------------------------------------------------- /bin/rubocop: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # 3 | # This file was generated by Bundler. 4 | # 5 | # The application 'rubocop' is installed as part of a gem, and 6 | # this file is here to facilitate running it. 7 | # 8 | 9 | require 'pathname' 10 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile", 11 | Pathname.new(__FILE__).realpath) 12 | 13 | require 'rubygems' 14 | require 'bundler/setup' 15 | 16 | load Gem.bin_path('rubocop', 'rubocop') 17 | -------------------------------------------------------------------------------- /bin/setup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require "fileutils" 3 | 4 | # path to your application root. 5 | APP_ROOT = File.expand_path("..", __dir__) 6 | 7 | def system!(*args) 8 | system(*args) || abort("\n== Command #{args} failed ==") 9 | end 10 | 11 | FileUtils.chdir APP_ROOT do 12 | # This script is a way to set up or update your development environment automatically. 13 | # This script is idempotent, so that you can run it at any time and get an expectable outcome. 14 | # Add necessary setup steps to this file. 15 | 16 | puts "== Installing dependencies ==" 17 | system! "gem install bundler --conservative" 18 | system("bundle check") || system!("bundle install") 19 | 20 | puts "\n== Removing old logs and tempfiles ==" 21 | system! "bin/rails log:clear tmp:clear" 22 | 23 | puts "\n== Restarting application server ==" 24 | system! "bin/rails restart" 25 | end 26 | -------------------------------------------------------------------------------- /bin/update: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require 'fileutils' 3 | include FileUtils 4 | 5 | # path to your application root. 6 | APP_ROOT = File.expand_path('..', __dir__) 7 | 8 | def system!(*args) 9 | system(*args) || abort("\n== Command #{args} failed ==") 10 | end 11 | 12 | chdir APP_ROOT do 13 | # This script is a way to update your development environment automatically. 14 | # Add necessary update steps to this file. 15 | 16 | puts '== Installing dependencies ==' 17 | system! 'gem install bundler --conservative' 18 | system('bundle check') || system!('bundle install') 19 | 20 | # Install JavaScript dependencies if using Yarn 21 | # system('bin/yarn') 22 | 23 | puts "\n== Removing old logs and tempfiles ==" 24 | system! 'bin/rails log:clear tmp:clear' 25 | 26 | puts "\n== Restarting application server ==" 27 | system! 'bin/rails restart' 28 | end 29 | -------------------------------------------------------------------------------- /bin/yarn: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | APP_ROOT = File.expand_path('..', __dir__) 3 | Dir.chdir(APP_ROOT) do 4 | begin 5 | exec "yarnpkg", *ARGV 6 | rescue Errno::ENOENT 7 | $stderr.puts "Yarn executable was not detected in the system." 8 | $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" 9 | exit 1 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | codecov: 2 | notify: 3 | after_n_builds: 7 4 | require_ci_to_pass: no 5 | token: 5b330fa7-3e02-484f-9a72-d5e22de4332b 6 | comment: 7 | after_n_builds: 7 8 | coverage: 9 | status: 10 | project: 11 | default: 12 | informational: true 13 | patch: 14 | default: 15 | informational: true -------------------------------------------------------------------------------- /config.ru: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # This file is used by Rack-based servers to start the application. 4 | 5 | require File.expand_path('config/environment', __dir__) 6 | run Rails.application 7 | -------------------------------------------------------------------------------- /config/boot.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) 4 | 5 | require 'bundler/setup' # Set up gems listed in the Gemfile. 6 | require 'bootsnap/setup' # Speed up boot time by caching expensive operations. 7 | -------------------------------------------------------------------------------- /config/cucumber.yml: -------------------------------------------------------------------------------- 1 | <% 2 | rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : "" 3 | rerun = rerun.strip.gsub /\s/, ' ' 4 | rerun_opts = rerun.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}" 5 | std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --strict --tags 'not @wip'" 6 | %> 7 | default: <%= std_opts %> features 8 | wip: --tags @wip:3 --wip features 9 | rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags 'not @wip' 10 | -------------------------------------------------------------------------------- /config/environment.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Load the Rails application. 4 | require_relative 'application' 5 | 6 | # Initialize the Rails application. 7 | Rails.application.initialize! 8 | -------------------------------------------------------------------------------- /config/initializers/application_controller_renderer.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # ActiveSupport::Reloader.to_prepare do 4 | # ApplicationController.renderer.defaults.merge!( 5 | # http_host: 'example.org', 6 | # https: false 7 | # ) 8 | # end 9 | -------------------------------------------------------------------------------- /config/initializers/assets.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Version of your assets, change this if you want to expire all your assets. 4 | Rails.application.config.assets.version = "1.0" 5 | 6 | # Add additional assets to the asset load path. 7 | # Rails.application.config.assets.paths << Emoji.images_path 8 | 9 | # Precompile additional assets. 10 | # application.js, application.css, and all non-JS/CSS in the app/assets 11 | # folder are already added. 12 | # Rails.application.config.assets.precompile += %w( admin.js admin.css ) 13 | -------------------------------------------------------------------------------- /config/initializers/backtrace_silencers.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. 4 | # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } 5 | 6 | # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. 7 | # Rails.backtrace_cleaner.remove_silencers! 8 | -------------------------------------------------------------------------------- /config/initializers/content_security_policy.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Define an application-wide content security policy. 4 | # See the Securing Rails Applications Guide for more information: 5 | # https://guides.rubyonrails.org/security.html#content-security-policy-header 6 | 7 | # Rails.application.configure do 8 | # config.content_security_policy do |policy| 9 | # policy.default_src :self, :https 10 | # policy.font_src :self, :https, :data 11 | # policy.img_src :self, :https, :data 12 | # policy.object_src :none 13 | # policy.script_src :self, :https 14 | # policy.style_src :self, :https 15 | # # Specify URI for violation reports 16 | # # policy.report_uri "/csp-violation-report-endpoint" 17 | # end 18 | # 19 | # # Generate session nonces for permitted importmap and inline scripts 20 | # config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s } 21 | # config.content_security_policy_nonce_directives = %w(script-src) 22 | # 23 | # # Report violations without enforcing the policy. 24 | # # config.content_security_policy_report_only = true 25 | # end 26 | -------------------------------------------------------------------------------- /config/initializers/cookies_serializer.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Specify a serializer for the signed and encrypted cookie jars. 4 | # Valid options are :json, :marshal, and :hybrid. 5 | Rails.application.config.action_dispatch.cookies_serializer = :json 6 | -------------------------------------------------------------------------------- /config/initializers/cqm_execution_service.rb: -------------------------------------------------------------------------------- 1 | Rails.application.config.ces_56_host = ENV['CQM_EXECUTION_SERVICE_HOST'] || 'localhost' 2 | Rails.application.config.ces_56_port = ENV['CQM_EXECUTION_SERVICE_PORT'] || '8082' 3 | -------------------------------------------------------------------------------- /config/initializers/cypress.rb: -------------------------------------------------------------------------------- 1 | require 'cqm_validators' 2 | require 'cypress' 3 | 4 | Faker::Config.locale = 'en-US' 5 | -------------------------------------------------------------------------------- /config/initializers/delayed_job.rb: -------------------------------------------------------------------------------- 1 | Delayed::Worker.logger = Logger.new(Rails.root.join('log', 'delayed_job.log')) 2 | Delayed::Worker.logger.level = Logger::INFO 3 | Delayed::Worker.destroy_failed_jobs = false 4 | -------------------------------------------------------------------------------- /config/initializers/filter_parameter_logging.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Configure parameters to be filtered from the log file. Use this to limit dissemination of 4 | # sensitive information. See the ActiveSupport::ParameterFilter documentation for supported 5 | # notations and behaviors. 6 | Rails.application.config.filter_parameters += [ 7 | :passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn 8 | ] 9 | -------------------------------------------------------------------------------- /config/initializers/inflections.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new inflection rules using the following format. Inflections 4 | # are locale specific, and you may define rules for as many different 5 | # locales as you wish. All of these examples are active by default: 6 | # ActiveSupport::Inflector.inflections(:en) do |inflect| 7 | # inflect.plural /^(ox)$/i, "\\1en" 8 | # inflect.singular /^(ox)en/i, "\\1" 9 | # inflect.irregular "person", "people" 10 | # inflect.uncountable %w( fish sheep ) 11 | # end 12 | 13 | # These inflection rules are supported but not enabled by default: 14 | ActiveSupport::Inflector.inflections(:en) do |inflect| 15 | inflect.acronym "CMS" 16 | inflect.acronym "CQM" 17 | inflect.acronym "QDM" 18 | end 19 | -------------------------------------------------------------------------------- /config/initializers/mime_types.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new mime types for use in respond_to blocks: 4 | # Mime::Type.register "text/richtext", :rtf 5 | -------------------------------------------------------------------------------- /config/initializers/mongo.rb: -------------------------------------------------------------------------------- 1 | module QME 2 | Mongoid.logger.level = Logger::INFO 3 | Mongoid.logger = Rails.logger if ENV['MONGO_LOGS'].eql? 'true' 4 | Mongo::Logger.logger.level = Logger::WARN 5 | Mongo::Logger.logger = Rails.logger if ENV['MONGO_LOGS'].eql? 'true' 6 | # BSON::Config.validating_keys = false 7 | end 8 | -------------------------------------------------------------------------------- /config/initializers/mongoid.rb: -------------------------------------------------------------------------------- 1 | module BSON 2 | class ObjectId 3 | def to_json(*args) 4 | to_s.to_json 5 | end 6 | 7 | def as_json(*args) 8 | to_s.as_json 9 | end 10 | end 11 | end 12 | 13 | Mongoid::Tasks::Database.create_indexes if (Rails.env.production? || Rails.env.development?) && !ENV['DISABLE_DB'] 14 | -------------------------------------------------------------------------------- /config/initializers/permissions_policy.rb: -------------------------------------------------------------------------------- 1 | # Define an application-wide HTTP permissions policy. For further 2 | # information see https://developers.google.com/web/updates/2018/06/feature-policy 3 | # 4 | # Rails.application.config.permissions_policy do |f| 5 | # f.camera :none 6 | # f.gyroscope :none 7 | # f.microphone :none 8 | # f.usb :none 9 | # f.fullscreen :self 10 | # f.payment :self, "https://secure.example.com" 11 | # end 12 | -------------------------------------------------------------------------------- /config/initializers/rolify.rb: -------------------------------------------------------------------------------- 1 | Rolify.configure(&:use_mongoid) 2 | -------------------------------------------------------------------------------- /config/initializers/session_store.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | Rails.application.config.session_store :cookie_store, key: '_cypress_session' 4 | -------------------------------------------------------------------------------- /config/initializers/smtp.rb: -------------------------------------------------------------------------------- 1 | # This will apply the current mailer settings on app startup. 2 | 3 | Settings.current&.apply_mailer_settings unless ENV['DISABLE_DB'] 4 | 5 | -------------------------------------------------------------------------------- /config/initializers/uri_escape.rb: -------------------------------------------------------------------------------- 1 | module URI 2 | def URI.escape(url) 3 | url 4 | end 5 | end -------------------------------------------------------------------------------- /config/initializers/version.rb: -------------------------------------------------------------------------------- 1 | module Cypress 2 | class Application 3 | VERSION = '7.3.2'.freeze 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /config/initializers/wrap_parameters.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # This file contains settings for ActionController::ParamsWrapper which 4 | # is enabled by default. 5 | 6 | # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. 7 | ActiveSupport.on_load(:action_controller) do 8 | wrap_parameters format: [:json] 9 | end 10 | -------------------------------------------------------------------------------- /config/initializers/zeitwerk.rb: -------------------------------------------------------------------------------- 1 | # config/initializers/zeitwerk.rb 2 | Rails.autoloaders.each do |autoloader| 3 | autoloader.collapse(Rails.root.join("lib/ext")) 4 | autoloader.collapse(Rails.root.join("lib/highlighting")) 5 | end 6 | -------------------------------------------------------------------------------- /config/locales/en.yml: -------------------------------------------------------------------------------- 1 | # Files in the config/locales directory are used for internationalization 2 | # and are automatically loaded by Rails. If you want to use locales other 3 | # than English, add the necessary files in this directory. 4 | # 5 | # To use the locales, use `I18n.t`: 6 | # 7 | # I18n.t 'hello' 8 | # 9 | # In views, this is aliased to just `t`: 10 | # 11 | # <%= t('hello') %> 12 | # 13 | # To use a different locale, set it with `I18n.locale`: 14 | # 15 | # I18n.locale = :es 16 | # 17 | # This would use the information in config/locales/es.yml. 18 | # 19 | # The following keys must be escaped otherwise they will not be retrieved by 20 | # the default I18n backend: 21 | # 22 | # true, false, on, off, yes, no 23 | # 24 | # Instead, surround them with single quotes. 25 | # 26 | # en: 27 | # 'true': 'foo' 28 | # 29 | # To learn more, please read the Rails Internationalization guide 30 | # available at https://guides.rubyonrails.org/i18n.html. 31 | 32 | en: 33 | hello: "Hello world" 34 | -------------------------------------------------------------------------------- /config/mongoid.yml: -------------------------------------------------------------------------------- 1 | # Mongoid Configuration for Travis CI 2 | # =================================== 3 | # 4 | development: 5 | clients: 6 | default: 7 | database: cypress_development 8 | hosts: 9 | - <%= ENV.fetch('MONGO_PORT_27017_TCP_ADDR', '127.0.0.1') %>:<%= ENV.fetch('MONGO_PORT_27017_TCP_PORT', '27017') %> 10 | 11 | measure_eval: 12 | clients: 13 | default: 14 | database: cypress_eval 15 | hosts: 16 | - <%= ENV.fetch('MONGO_PORT_27017_TCP_ADDR', '127.0.0.1') %>:<%= ENV.fetch('MONGO_PORT_27017_TCP_PORT', '27017') %> 17 | test: 18 | clients: 19 | default: 20 | database: cypress_test 21 | hosts: 22 | - <%= ENV['TEST_DB_HOST'] || '127.0.0.1' %>:27017 23 | production: 24 | clients: 25 | default: 26 | database: cypress_production 27 | hosts: 28 | - <%= ENV.fetch('MONGO_PORT_27017_TCP_ADDR', '127.0.0.1') %>:<%= ENV.fetch('MONGO_PORT_27017_TCP_PORT', '27017') %> 29 | 30 | options: 31 | raise_not_found_error: false 32 | -------------------------------------------------------------------------------- /config/secrets.yml: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Your secret key is used for verifying the integrity of signed cookies. 4 | # If you change this key, all old signed cookies will become invalid! 5 | 6 | # Make sure the secret is at least 30 characters and all random, 7 | # no regular words or you'll be exposed to dictionary attacks. 8 | # You can use `rake secret` to generate a secure secret key. 9 | 10 | # Make sure the secrets in this file are kept private 11 | # if you're sharing your code publicly. 12 | 13 | development: 14 | secret_key_base: 83b09f69eaf39e5dd96b73e60296484abfb6fba47ad1dba3068d010acdbec9d17937dc57d68f9439533da5c42c5a75fc7196d57c11d99c0c4a6c4407d7453384 15 | 16 | test: 17 | secret_key_base: b339849bb47f7d45ffc58a2a54c8c7fe0c8327f59570b0e7a31ee7828a0964b256cbe733a61c91b4dbedeeb1c26cc93125d3c1540b2bd21e966c08258346bab8 18 | 19 | # Do not keep production secrets in the repository, 20 | # instead read values from the environment. 21 | production: 22 | secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> 23 | -------------------------------------------------------------------------------- /config/unicorn.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | ENV['IS_SERVER'] = '1' 4 | timeout 120 5 | worker_processes 4 6 | -------------------------------------------------------------------------------- /contrib/install_files/meta-data: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/contrib/install_files/meta-data -------------------------------------------------------------------------------- /contrib/install_files/user-data: -------------------------------------------------------------------------------- 1 | #cloud-config 2 | autoinstall: 3 | version: 1 4 | identity: 5 | hostname: ubuntu 6 | username: ubuntu 7 | password: '$y$j9T$tJDMoDcWjf3et4SVGinXQ.$4DNtULekpWpr7tJ9LYZKaLXVb7BOh/bAgA0kjRL47/5' 8 | early-commands: 9 | # otherwise packer tries to connect and exceed max attempts: 10 | - systemctl stop ssh 11 | packages: 12 | - openssh-server 13 | ssh: 14 | install-server: yes 15 | allow-pw: yes 16 | late-commands: 17 | # - 'sed -i "s/dhcp4: true/&\n dhcp-identifier: mac/" /target/etc/netplan/00-installer-config.yaml' 18 | - echo 'ubuntu ALL=(ALL) NOPASSWD:ALL' > /target/etc/sudoers.d/ubuntu 19 | - if [ $(virt-what) == "hyperv" ]; then apt-get update && apt-get install -y hyperv-daemons linux-tools-$(uname -r) linux-cloud-tools-$(uname -r) linux-cloud-tools-common cifs-utils && systemctl enable hypervvssd && systemctl enable hypervkvpd && systemctl start hypervvssd && systemctl start hypervkvpd; fi -------------------------------------------------------------------------------- /contrib/scripts/cleanup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -eux 2 | 3 | # Ubuntu 16.04 introduces a new feature that causes ethernet device names to 4 | # no longer be consistent, which causes problems with exported vms. 5 | # This works around the issue by turning the feature off. 6 | echo 'GRUB_CMDLINE_LINUX="biosdevname=0 net.ifnames=0"' >> /etc/default/grub 7 | grub-mkconfig -o /boot/grub/grub.cfg 8 | 9 | echo 'auto eth0' >> /etc/network/interfaces 10 | echo 'iface eth0 inet dhcp' >> /etc/network/interfaces 11 | echo 'auto eth1' >> /etc/network/interfaces 12 | echo 'iface eth1 inet manual' >> /etc/network/interfaces -------------------------------------------------------------------------------- /contrib/scripts/create_env_prod.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "SECRET_KEY_BASE=$(LC_CTYPE=C < /dev/urandom tr -dc A-Za-z0-9 | head -c${1:-128};echo;)" > .env-prod 3 | -------------------------------------------------------------------------------- /contrib/scripts/vmx_to_ova.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Adapted from http://tylerpower.io/post/packer-build-vmware-appliance-on-linux/ 4 | 5 | set -e 6 | if [ ! -z "${DEBUG}" ]; then 7 | set -x 8 | fi 9 | 10 | DEPENDENCIES=("ovftool") 11 | for dep in "${DEPENDENCIES[@]}"; do 12 | if ! [ -x "$(command -v ${dep})" ]; then 13 | echo "${dep} must be available." 14 | exit 1 15 | fi 16 | done 17 | 18 | if [[ -z $PACKER_BUILD_NAME ]]; then 19 | echo "Environment Variable 'PACKER_BUILD_NAME' must be set." 20 | exit 1 21 | fi 22 | 23 | for vmx in "output-${PACKER_BUILD_NAME}"/*.vmx; do 24 | name=$(basename "${vmx}" .vmx).ova 25 | ovftool --shaAlgorithm=sha1 --compress=9 -o "${vmx}" "output-${PACKER_BUILD_NAME}/${name}" 26 | done 27 | 28 | # Cleanup all files that are not the ova 29 | find "output-${PACKER_BUILD_NAME}" -type f ! -name '*.ova' -delete 30 | -------------------------------------------------------------------------------- /contrib/upgrade_cypress_40.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Make sure only root can run our script 4 | if [[ $EUID -ne 0 ]]; then 5 | echo "This script must be run as root" 1>&2 6 | exit 1 7 | fi 8 | 9 | GREEN='\033[0;32m' 10 | RED='\033[0;31m' 11 | NC='\033[0m' # No Color 12 | 13 | printf "${GREEN}---> Running apt update...${NC}\n" 14 | apt-get update 15 | 16 | # If cypress is installed 17 | if [ $(dpkg-query -W -f='${Status}' cypress 2>/dev/null | grep -c "ok installed") -eq 1 ]; 18 | then 19 | printf "${GREEN}---> Attempting to upgrade Cypress...${NC}\n" 20 | apt-get -y --allow-change-held-packages install cypress js-ecqm-engine 21 | cypress run rake db:migrate 22 | systemctl restart cypress js-ecqm-engine 23 | cypress run rake tmp:cache:clear 24 | else 25 | printf "${RED}---> Cypress not found, continuing...${NC}\n" 26 | fi 27 | 28 | # If CVU is installed 29 | if [ $(dpkg-query -W -f='${Status}' cypress-validation-utility 2>/dev/null | grep -c "ok installed") -eq 1 ]; 30 | then 31 | printf "${GREEN}---> Attempting to upgrade Cypress Validation Utility...${NC}\n" 32 | apt-get -y --allow-change-held-packages install cypress-validation-utility 33 | systemctl restart cypress-validation-utility 34 | else 35 | printf "${RED}---> Cypress Validation Utility not found, continuing...${NC}\n" 36 | fi 37 | 38 | echo "Done!" 39 | -------------------------------------------------------------------------------- /contrib/upgrade_cypress_50.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Make sure only root can run our script 4 | if [[ $EUID -ne 0 ]]; then 5 | echo "This script must be run as root" 1>&2 6 | exit 1 7 | fi 8 | 9 | GREEN='\033[0;32m' 10 | RED='\033[0;31m' 11 | NC='\033[0m' # No Color 12 | 13 | printf "${GREEN}---> Running apt update...${NC}\n" 14 | apt-get update 15 | 16 | # If cypress is installed 17 | if [ $(dpkg-query -W -f='${Status}' cypress 2>/dev/null | grep -c "ok installed") -eq 1 ]; 18 | then 19 | printf "${GREEN}---> Attempting to upgrade Cypress...${NC}\n" 20 | apt-get -y --allow-change-held-packages install cypress cqm-execution-service 21 | cypress run rake db:migrate 22 | systemctl restart cypress cqm-execution-service 23 | cypress run rake tmp:cache:clear 24 | cypress run rake db:migrate 25 | systemctl restart cypress cqm-execution-service 26 | cypress run rake tmp:cache:clear 27 | else 28 | printf "${RED}---> Cypress not found, continuing...${NC}\n" 29 | fi 30 | 31 | echo "Done!" 32 | -------------------------------------------------------------------------------- /contrib/upgrade_cypress_60.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ $(id -u) != 0 ]; then 4 | echo "This script requires root permissions" 5 | sudo "$0" "$@" 6 | exit 7 | fi 8 | 9 | #import descriptions false by default 10 | desc='' 11 | 12 | while getopts 'm' flag; do 13 | case "${flag}" in 14 | m) desc="true";; 15 | esac 16 | done 17 | 18 | GREEN='\033[0;32m' 19 | RED='\033[0;31m' 20 | NC='\033[0m' # No Color 21 | 22 | printf "${GREEN}---> Running apt update...${NC}\n" 23 | apt-get update 24 | 25 | # If cypress is installed 26 | if [ $(dpkg-query -W -f='${Status}' cypress 2>/dev/null | grep -c "ok installed") -eq 1 ]; 27 | then 28 | printf "${GREEN}---> Attempting to upgrade Cypress...${NC}\n" 29 | apt-get -y --allow-change-held-packages install cypress cqm-execution-service 30 | cypress run rake db:migrate 31 | systemctl restart cypress cqm-execution-service 32 | cypress run rake tmp:cache:clear 33 | cypress run rake db:migrate 34 | systemctl restart cypress cqm-execution-service 35 | cypress run rake tmp:cache:clear 36 | else 37 | printf "${RED}---> Cypress not found, continuing...${NC}\n" 38 | fi 39 | #if description import flag true 40 | if [ "$desc" ] 41 | then 42 | cypress run rake cypress:import:descriptions 43 | fi 44 | echo "Done!" 45 | -------------------------------------------------------------------------------- /contrib/upgrade_cypress_70.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ $(id -u) != 0 ]; then 4 | echo "This script requires root permissions" 5 | sudo "$0" "$@" 6 | exit 7 | fi 8 | 9 | #import descriptions false by default 10 | desc='' 11 | 12 | while getopts 'm' flag; do 13 | case "${flag}" in 14 | m) desc="true";; 15 | esac 16 | done 17 | 18 | GREEN='\033[0;32m' 19 | RED='\033[0;31m' 20 | NC='\033[0m' # No Color 21 | 22 | printf "${GREEN}---> Running apt update...${NC}\n" 23 | apt-get update 24 | 25 | # If cypress is installed 26 | if [ $(dpkg-query -W -f='${Status}' cypress 2>/dev/null | grep -c "ok installed") -eq 1 ]; 27 | then 28 | printf "${GREEN}---> Attempting to upgrade Cypress...${NC}\n" 29 | apt-get -y --allow-change-held-packages install cypress cqm-execution-service 30 | cypress run rake db:migrate 31 | systemctl restart cypress cqm-execution-service 32 | cypress run rake tmp:cache:clear 33 | cypress run rake db:migrate 34 | systemctl restart cypress cqm-execution-service 35 | cypress run rake tmp:cache:clear 36 | else 37 | printf "${RED}---> Cypress not found, continuing...${NC}\n" 38 | fi 39 | #if description import flag true 40 | if [ "$desc" ] 41 | then 42 | cypress run rake cypress:import:descriptions 43 | fi 44 | echo "Done!" 45 | -------------------------------------------------------------------------------- /db/seeds.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # This file should contain all the record creation needed to seed the database with its default values. 4 | # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). 5 | # 6 | # Examples: 7 | # 8 | # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) 9 | # Mayor.create(name: 'Emanuel', city: cities.first) 10 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | 3 | services: 4 | cypress: 5 | build: 6 | context: . 7 | volumes: 8 | - cypress-vol:/home/app/cypress/public/data 9 | environment: 10 | - MONGO_PORT_27017_TCP_ADDR=mongodb 11 | - MONGO_PORT_27017_TCP_PORT=27017 12 | - CQM_EXECUTION_SERVICE_HOST=cqm-execution-service 13 | - CQM_EXECUTION55_SERVICE_HOST=cqm-execution55-service 14 | ports: 15 | - "3000:3000" 16 | env_file: .env-prod 17 | #.env-prod file required, must have at least the variable SECRET_KEY_BASE=<128_character_randomly_generated_alphanumeric_string> 18 | restart: unless-stopped 19 | networks: 20 | - cypress-net 21 | mongodb: 22 | image: mongo:6.0.6 23 | volumes: 24 | - /data/db 25 | - ./mongo:/etc/mongo 26 | command: --config=/etc/mongo/docker_mongod.conf 27 | restart: unless-stopped 28 | networks: 29 | - cypress-net 30 | ports: 31 | - "27017:27017" 32 | cqm-execution-service: 33 | image: mitrehealthdocker/cqm-execution-service:cypress_v7 34 | networks: 35 | - cypress-net 36 | ports: 37 | - "8082:8082" 38 | cqm-execution55-service: 39 | image: mitrehealthdocker/cqm-execution-service:qdm55 40 | networks: 41 | - cypress-net 42 | ports: 43 | - "8081:8081" 44 | networks: 45 | cypress-net: 46 | 47 | volumes: 48 | cypress-vol: 49 | -------------------------------------------------------------------------------- /docker_delayed_job.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | PROCESS_NAME=$(basename "$(pwd)") 4 | PID_FOLDER="tmp/delayed_pids" 5 | PID_NAME="$PROCESS_NAME.pid" 6 | PID_FULL_PATH="$PID_FOLDER/$PID_NAME" 7 | cd /home/app/cypress 8 | mkdir -p $PID_FOLDER 9 | touch $PID_FULL_PATH 10 | exec /sbin/setuser app bundle exec rake jobs:work >> log/$PROCESS_NAME.log 2>&1 11 | rm $PID_FULL_PATH 12 | -------------------------------------------------------------------------------- /docker_unicorn_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | cd /home/app/cypress 5 | exec /sbin/setuser app bundle exec unicorn -c config/unicorn.rb -p 3000 >>log/unicorn.log 2>&1 6 | -------------------------------------------------------------------------------- /features/measure_tests/records_list.feature: -------------------------------------------------------------------------------- 1 | Feature: Measure Test Records list 2 | 3 | Background: 4 | Given the user is signed in 5 | And the user has created a vendor 6 | And the user has selected a measure 7 | 8 | Scenario: Admin should be able to view calculation results 9 | When the user creates a product with records with tasks c1, c2, c3, c4 10 | And the user is an admin 11 | And the user views task c1 12 | And the user views the task records 13 | Then the user should see calculation results 14 | And the driver is setup for accessability testing 15 | Then the page should be axe clean according to: section508 16 | Then the page should be axe clean according to: wcag2aa 17 | And the driver is returned to the default 18 | -------------------------------------------------------------------------------- /features/multi_measure_tests/show.feature: -------------------------------------------------------------------------------- 1 | Feature: Multi Measure Test Executions 2 | 3 | Background: 4 | Given the user is signed in 5 | And the user has created a vendor 6 | 7 | Scenario: Successfully View a Multi Measure Test 8 | When the user creates a cvu plus product 9 | And the user views multi measure cat3 task 10 | Then the user should see the download test deck link 11 | And the driver is setup for accessability testing 12 | Then the page should be axe clean according to: section508 13 | Then the page should be axe clean according to: wcag2aa 14 | And the driver is returned to the default 15 | 16 | Scenario: Successfully View a Multi Measure Test with expected results 17 | When the user creates a cvu plus product with records 18 | And the user views multi measure cat3 task 19 | Then the user should see the list expected results 20 | And the driver is setup for accessability testing 21 | Then the page should be axe clean according to: section508 22 | Then the page should be axe clean according to: wcag2aa 23 | And the driver is returned to the default 24 | 25 | -------------------------------------------------------------------------------- /features/program_tests/show.feature: -------------------------------------------------------------------------------- 1 | Feature: Program Test Executions 2 | 3 | Background: 4 | Given the user is signed in 5 | And the user has created a vendor 6 | 7 | Scenario: Successfully View a Program Test 8 | When the user creates a cvu plus product 9 | And the user views CPCPLUS program task 10 | Then the user should see instructions 11 | And the driver is setup for accessability testing 12 | Then the page should be axe clean according to: section508 13 | Then the page should be axe clean according to: wcag2aa 14 | And the driver is returned to the default 15 | -------------------------------------------------------------------------------- /features/records/show.feature: -------------------------------------------------------------------------------- 1 | Feature: Show Individual Record 2 | 3 | Background: 4 | Given the user is signed in 5 | 6 | Scenario: Successful view record 7 | When the user visits a record 8 | Then the user sees details 9 | And the driver is setup for accessability testing 10 | Then the page should be axe clean according to: section508 11 | Then the page should be axe clean according to: wcag2aa 12 | And the driver is returned to the default 13 | 14 | Scenario: Successful filter record 15 | When the user visits a record 16 | When the user filters on CMS134v6 17 | Then the user should see text Value Set Name 5 18 | When the user filters on CMS32v7 19 | Then the user should see text Value Set Name 8 20 | Then the user should not see text Value Set Name 5 21 | When the user filters on All Measures 22 | Then the user should see text Value Set Name 8 23 | Then the user should see text Value Set Name 5 24 | And the driver is setup for accessability testing 25 | Then the page should be axe clean according to: section508 26 | Then the page should be axe clean according to: wcag2aa 27 | And the driver is returned to the default -------------------------------------------------------------------------------- /features/step_definitions/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/features/step_definitions/.gitkeep -------------------------------------------------------------------------------- /features/step_definitions/bundle.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | When(/^the default bundle has been deprecated$/) do 4 | active_bundle = Bundle.default 5 | inactive_bundle = FactoryBot.create(:bundle) 6 | 7 | inactive_bundle.update(active: true) 8 | active_bundle.update(active: false) 9 | active_bundle.deprecate 10 | end 11 | -------------------------------------------------------------------------------- /features/step_definitions/record_list.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | include TestExecutionsHelper 4 | 5 | # # # # # # # # # 6 | # G I V E N # 7 | # # # # # # # # # 8 | 9 | # A N D # 10 | 11 | And(/^the user views the task records$/) do 12 | page.click_link 'View Patients' 13 | end 14 | 15 | # T H E N # 16 | 17 | Then(/^the user should see calculation results$/) do 18 | page.assert_text('Template Name') 19 | page.assert_text('IPOP') 20 | page.assert_selector('span.result-marker') 21 | end 22 | -------------------------------------------------------------------------------- /features/support/debugging.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | After do |scenario| 4 | if scenario.failed? 5 | # When a scenario fails, print the page source and stop running tests. 6 | Cucumber.logger.info page.html 7 | Cucumber.wants_to_quit = true 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /features/support/warden.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | Warden.test_mode! 4 | World Warden::Test::Helpers 5 | After { Warden.test_reset! } 6 | -------------------------------------------------------------------------------- /features/users/account.feature: -------------------------------------------------------------------------------- 1 | Feature: Test user account actions 2 | 3 | Background: 4 | Given the user is signed in 5 | 6 | Scenario: User wants to edit account information 7 | When the user clicks an account link 8 | Then the user should see an edit account page 9 | And the driver is setup for accessability testing 10 | Then the page should be axe clean according to: section508 11 | Then the page should be axe clean according to: wcag2aa 12 | And the driver is returned to the default 13 | 14 | Scenario: Successful Logout 15 | # TODO: Why do you fail for undefined method `escape' for URI:Module 16 | When the user logs out 17 | Then the user should be signed out 18 | And the driver is setup for accessability testing 19 | Then the page should be axe clean according to: section508 20 | Then the page should be axe clean according to: wcag2aa 21 | And the driver is returned to the default 22 | 23 | Scenario: User can edit account information 24 | When the user clicks an account link 25 | And the user changes their email 26 | And the user submits the edit user page 27 | And the driver is setup for accessability testing 28 | Then the page should be axe clean according to: section508 29 | Then the page should be axe clean according to: wcag2aa 30 | And the driver is returned to the default 31 | -------------------------------------------------------------------------------- /features/users/login_no_bundle.feature: -------------------------------------------------------------------------------- 1 | Feature: Test Login Features with No Bundle Installed 2 | 3 | Background: 4 | Given a user has an account 5 | And there are no bundles installed 6 | 7 | Scenario: Unsuccessful login 8 | When the user tries to log in with invalid information 9 | Then the user should see an log in error message 10 | And the driver is setup for accessability testing 11 | Then the page should be axe clean according to: section508 12 | Then the page should be axe clean according to: wcag2aa 13 | And the driver is returned to the default 14 | 15 | Scenario: Successful login 16 | When the user logs in 17 | Then the user should see a sign out link 18 | And the driver is setup for accessability testing 19 | Then the page should be axe clean according to: section508 20 | Then the page should be axe clean according to: wcag2aa 21 | And the driver is returned to the default 22 | 23 | Scenario: Not Logged In 24 | When the user navigates to the home page 25 | Then the user should be redirected to the sign in page 26 | And the driver is setup for accessability testing 27 | Then the page should be axe clean according to: section508 28 | Then the page should be axe clean according to: wcag2aa 29 | And the driver is returned to the default -------------------------------------------------------------------------------- /features/users/register.feature: -------------------------------------------------------------------------------- 1 | Feature: Register for an account 2 | 3 | Scenario: Navigate to the Sign Up page 4 | Given the user is on the sign in page 5 | When I click Sign up 6 | Then I should be on the account creation page 7 | And the driver is setup for accessability testing 8 | Then the page should be axe clean according to: section508 9 | Then the page should be axe clean according to: wcag2aa 10 | And the driver is returned to the default 11 | 12 | Scenario: Create an account 13 | Given the user is on the sign up page 14 | When I fill in the form with correct information 15 | And I click Sign up 16 | Then I should have a new account 17 | And the driver is setup for accessability testing 18 | Then the page should be axe clean according to: section508 19 | Then the page should be axe clean according to: wcag2aa 20 | And the driver is returned to the default 21 | 22 | Scenario: Create an account with no terms and conditions 23 | Given the user is on the sign up page 24 | When I fill in the form without accepting the T&C 25 | Then I should not be able to submit the form 26 | And the driver is setup for accessability testing 27 | Then the page should be axe clean according to: section508 28 | Then the page should be axe clean according to: wcag2aa 29 | And the driver is returned to the default 30 | -------------------------------------------------------------------------------- /lib/assets/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/lib/assets/.keep -------------------------------------------------------------------------------- /lib/cypress/example_patient_finder.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module Cypress 4 | class ExamplePatientFinder 5 | # TODO: R2P: get sample patients (for checklist test) with new model 6 | 7 | def self.find_example_patient(measure) 8 | simplest = 100 9 | example_patient = nil 10 | # patient_ids for patients with IndividualResult for the measure specified 11 | patient_ids = IndividualResult.where(correlation_id: measure.bundle_id, measure_id: measure.id).pluck(:patient_id) 12 | CQM::Patient.find(patient_ids).each do |record| 13 | result_value = record.measure_relevance_hash[measure.id.to_s] 14 | 15 | count = population_matches_for_patient(result_value, measure) 16 | return record if [1, 2].include?(count) 17 | 18 | if count < simplest 19 | simplest = count 20 | example_patient = record 21 | end 22 | end 23 | example_patient 24 | end 25 | 26 | def self.population_matches_for_patient(result_value, measure) 27 | sum = 0 28 | populations = measure.measure_scoring == 'CONTINUOUS_VARIABLE' ? %w[IPP MSRPOPL MSRPOPLEX OBSERV] : %w[IPP DENOM NUMER DENEX DENEXCEP] 29 | populations.each do |pop| 30 | sum += 1 if result_value[pop] 31 | end 32 | sum 33 | end 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /lib/cypress/mbi_generator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module Cypress 4 | class MbiGenerator 5 | # 2, 5, 8, and 9 characters are always letters 6 | # 1, 4, 7, 10, and 11 characters are always numbers 7 | # The 3rd and 6th characters are letters or numbers. 8 | # CMS doesnt use dashes in the MBI. 9 | # Position 1 is numeric values 1 thru 9 10 | def self.generate 11 | # cv - Numeric values 1 thru 9 12 | cv = %w[1 2 3 4 5 6 7 8 9].sample(1) 13 | # nv - Numeric values 0 thru 9 14 | nv = %w[0 1 2 3 4 5 6 7 8 9].sample(5) 15 | # av - Alphabetic values A thru Z (minus B, I, L, O, S, Z) 16 | av = %w[a c d e f g h j k m n p q r t u v w x y].sample(5) 17 | 18 | "#{cv[0]}#{av[0]}#{av[1]}#{nv[0]}#{av[2]}#{nv[1]}#{nv[2]}#{av[3]}#{av[4]}#{nv[3]}#{nv[4]}".upcase 19 | end 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /lib/cypress/npi_generator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module Cypress 4 | class NpiGenerator 5 | def self.generate 6 | random_number = rand.to_s[2..9] 7 | random_number = "1#{random_number}" 8 | check_digit = checksum("80840#{random_number}") 9 | random_number + check_digit.to_s 10 | end 11 | 12 | def self.checksum(number) 13 | digits = number.to_s.reverse.scan(/\d/).map(&:to_i) 14 | digits = digits.each_with_index.map do |d, i| 15 | d *= 2 if i.even? 16 | d > 9 ? d - 9 : d 17 | end 18 | sum = digits.inject(0) { |a, e| a + e } 19 | mod = 10 - (sum % 10) 20 | mod == 10 ? 0 : mod 21 | end 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /lib/ext/moped.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | Bson = BSON 4 | module Moped 5 | BSON = Bson 6 | end 7 | -------------------------------------------------------------------------------- /lib/ext/qdm/id.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # The Id model is an extension of app/models/qdm/id.rb as defined by CQM-Models. 4 | module QDM 5 | class Id 6 | # TODO: remove Dynamic attributes. This is only here for supporting 2018.0.1 bundle import functionality. 7 | include Mongoid::Attributes::Dynamic 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /lib/ext/string.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class String 4 | def to_boolean 5 | %w[1 true t].include?(downcase) 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /lib/ext/value_set.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | ValueSet = CQM::ValueSet 4 | Concept = CQM::Concept 5 | 6 | class ValueSet 7 | include Mongoid::Document 8 | store_in collection: 'health_data_standards_svs_value_sets' 9 | 10 | belongs_to :bundle, class_name: 'Bundle', inverse_of: :value_sets 11 | 12 | def snomed_codes? 13 | concepts.any? { |concept| concept.code_system_oid == '2.16.840.1.113883.6.96' } 14 | end 15 | 16 | def first_code 17 | concepts.first.code 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /lib/hash.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class Hash 4 | def method_missing(sym) 5 | if key?(sym.to_s) 6 | self[sym.to_s] 7 | elsif key?(sym) 8 | self[sym] 9 | else 10 | super 11 | end 12 | end 13 | 14 | def respond_to_missing?(method_name, include_private = false) 15 | super 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /lib/highlighting/highlighting.mustache: -------------------------------------------------------------------------------- 1 |
    2 | Populations 3 | {{#population_statements}} 4 | {{> highlighting_clause}} 5 | {{/population_statements}} 6 | Definitions 7 | {{#statements}} 8 | {{> highlighting_clause}} 9 | {{/statements}} 10 |
    11 | -------------------------------------------------------------------------------- /lib/highlighting/highlighting_clause.mustache: -------------------------------------------------------------------------------- 1 |
    {{{statement_name}}}
    {{#clauses}}{{#colored}}{{#is_true}}{{description}}{{/is_true}}{{^is_true}}{{description}}{{/is_true}}{{/colored}}{{^colored}}{{description}}{{/colored}}{{/clauses}}
    -------------------------------------------------------------------------------- /lib/tasks/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/lib/tasks/.keep -------------------------------------------------------------------------------- /lib/tasks/tmp.rake: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'rails/tasks' 4 | 5 | namespace :tmp do 6 | namespace :cache do 7 | # desc "Cleans and then rebuilds the cypress cache" 8 | task rebuild: [:environment] do 9 | puts 'Warming the vendor and product state cache...' 10 | Vendor.each(&:status) 11 | end 12 | 13 | desc 'Rebuilds the MPL Download .zip for all installed bundles' 14 | task mpl_download_rebuild: [:environment] do 15 | puts 'Rebuilding all MPL Downloads...' 16 | Bundle.all.each do |bundle| 17 | puts "\tEnqueuing MPL download for bundle #{bundle.version}" 18 | bundle.mpl_prepare 19 | end 20 | puts 'done' 21 | end 22 | end 23 | end 24 | 25 | Rake::Task['tmp:cache:clear'].enhance do 26 | Rake::Task['tmp:cache:rebuild'].invoke 27 | Rake::Task['tmp:cache:mpl_download_rebuild'].invoke 28 | end 29 | -------------------------------------------------------------------------------- /lib/validators/program_validator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module Validators 4 | class ProgramValidator < QrdaFileValidator 5 | include Validators::Validator 6 | 7 | def initialize(programs) 8 | @programs = programs.map(&:upcase) 9 | end 10 | 11 | def validate(file, options = {}) 12 | @document = get_document(file) 13 | # xpath for informationRecipient, which is where CMS wants the code for the program 14 | prog = @document.at_xpath('//cda:informationRecipient/cda:intendedRecipient/cda:id/@extension') 15 | if !prog 16 | msg = "Expected to find program(s) '#{@programs.join(', ')}' but no program code was found." 17 | add_error(msg, file_name: options[:file_name]) 18 | elsif !@programs.include?(prog.value) 19 | msg = "CMS Program code '#{prog.value}' does not match the expected code for program(s) #{@programs.join(', ')}." 20 | add_error(msg, file_name: options[:file_name]) 21 | end 22 | end 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /lib/validators/qrda_file_validator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module Validators 4 | class QrdaFileValidator 5 | include Validators::Validator 6 | 7 | self.validator_type = :result_validation 8 | 9 | def get_document(doc) 10 | doc = Nokogiri::XML(doc) if doc.is_a?(String) 11 | raise ArgumentError, 'Argument was not an XML document' unless doc.root 12 | 13 | doc.root.add_namespace_definition('cda', 'urn:hl7-org:v3') 14 | doc.root.add_namespace_definition('xsi', 'http://www.w3.org/2001/XMLSchema-instance') 15 | doc.root.add_namespace_definition('sdtc', 'urn:hl7-org:sdtc') 16 | doc 17 | end 18 | 19 | def translate(id) 20 | %{translate(#{id}, "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ")} 21 | end 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /log/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/log/.keep -------------------------------------------------------------------------------- /mongo/docker_mongod.conf: -------------------------------------------------------------------------------- 1 | setParameter: 2 | maxBSONDepth: 250 3 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/public/favicon.ico -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file 2 | # 3 | # To ban all spiders from the entire site uncomment the next two lines: 4 | # User-agent: * 5 | # Disallow: / 6 | -------------------------------------------------------------------------------- /script/cucumber: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # frozen_string_literal: true 3 | 4 | vendored_cucumber_bin = Dir["#{File.dirname(__FILE__)}/../vendor/{gems,plugins}/cucumber*/bin/cucumber"].first 5 | if vendored_cucumber_bin 6 | load File.expand_path(vendored_cucumber_bin) 7 | else 8 | require 'rubygems' unless ENV['NO_RUBYGEMS'] 9 | require 'cucumber' 10 | load Cucumber::BINARY 11 | end 12 | -------------------------------------------------------------------------------- /script/generate_cat1_preference.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'csv' 4 | require 'json' 5 | require 'yaml' 6 | 7 | def vs_from_row(row) 8 | vs_param = {} 9 | vs_param['ValueSet'] = row['ValueSet'] 10 | vs_param['Weight'] = row['Weight'] 11 | vs_param['IsAttribute'] = row['IsAttribute'] == 'TRUE' 12 | vs_param 13 | end 14 | 15 | previous_measure = nil 16 | measures = {} 17 | valuesets = [] 18 | csv_text = File.read('script/export.csv') 19 | csv = CSV.parse(csv_text, headers: true) 20 | csv.each do |row| 21 | previous_measure = row['Measure'] if previous_measure.nil? 22 | if row['Measure'] != previous_measure 23 | measures[previous_measure] = valuesets 24 | previous_measure = row['Measure'] 25 | valuesets = [] 26 | end 27 | valuesets << vs_from_row(row) 28 | end 29 | measures[previous_measure] = valuesets 30 | output = File.open('script/cat1checklist.yml', 'w') 31 | output << measures.to_yaml 32 | output.close 33 | -------------------------------------------------------------------------------- /test/api_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module ApiTest 4 | def assert_has_attributes(hash, attr_names, link_names = nil) 5 | attr_names.each { |key| assert hash.key?(key), "should have key #{key}" } 6 | return unless link_names 7 | 8 | assert_not_nil hash['links'] 9 | assert_equal link_names.sort, hash['links'].map { |l| l['rel'] }.sort 10 | end 11 | 12 | def assert_has_json_errors(hash, errors = nil) 13 | assert hash.key? 'errors' 14 | errors&.each do |field, messages| 15 | assert hash['errors'].any? { |error| error['field'] == field }, "error response should have field #{field}" 16 | assert hash['errors'].any? { |error| error['messages'] == messages }, "error response should have messages #{messages}" 17 | end 18 | end 19 | 20 | def assert_has_xml_errors(hash, errors = nil) 21 | assert hash.key? 'errors' 22 | errors&.each do |field, messages| 23 | assert hash['errors'].any? { |_, v| v['field'] == field }, "error response should have field #{field}" 24 | assert hash['errors'].any? { |_, v| v['messages'].any? { |_mk, mv| messages.include? mv } }, "error response should have messages #{messages}" 25 | end 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /test/controllers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/controllers/.keep -------------------------------------------------------------------------------- /test/controllers/admin/trackers_controller_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'test_helper' 4 | 5 | module Admin 6 | class TrackersControllerTest < ActionController::TestCase 7 | setup do 8 | FactoryBot.create(:admin_user) 9 | @controller = Admin::TrackersController.new 10 | @vendor = FactoryBot.create(:vendor_with_points_of_contact) 11 | end 12 | 13 | test 'should successfully destroy tracker' do 14 | tracker = Tracker.find_or_create_by(job_id: BSON::ObjectId.new, 15 | job_class: 'PatientAnalysisJob', 16 | status: :failed, 17 | options: { vendor_id: @vendor.id }) 18 | for_each_logged_in_user([ADMIN]) do 19 | delete :destroy, params: { id: tracker.id } 20 | assert_response 302 21 | end 22 | assert_equal 0, Tracker.all.size 23 | end 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /test/controllers/admin_controller_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'test_helper' 4 | 5 | class AdminControllerTest < ActionController::TestCase 6 | setup do 7 | FactoryBot.create(:admin_user) 8 | end 9 | 10 | test 'should get show' do 11 | Rails.application.config.action_mailer.smtp_settings = { 12 | address: Settings.current.mailer_address, 13 | port: Settings.current.mailer_port, 14 | domain: Settings.current.mailer_domain, 15 | user_name: Settings.current.mailer_user_name, 16 | password: Settings.current.mailer_password, 17 | authentication: Settings.current.mailer_authentication 18 | } 19 | for_each_logged_in_user([ADMIN]) do 20 | get :show 21 | assert_response :success 22 | end 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /test/controllers/home_controller_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'test_helper' 4 | class HomeControllerTest < ActionController::TestCase 5 | test 'should get index without logged in user' do 6 | get :index 7 | assert_response :redirect 8 | assert_redirected_to controller: 'sessions', action: 'new' 9 | end 10 | 11 | test 'should get index with logged in user' do 12 | FactoryBot.create(:atl_user) 13 | sign_in User.find('4def93dd4f85cf8968000001') 14 | 15 | get :index 16 | assert_response :redirect 17 | assert_redirected_to controller: 'vendors', action: 'index' 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /test/controllers/measures_controller_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'test_helper' 4 | class MeasuresControllerTest < ActionController::TestCase 5 | include Devise::Test::ControllerHelpers 6 | 7 | setup do 8 | FactoryBot.create(:static_bundle) 9 | FactoryBot.create(:atl_user) 10 | sign_in User.find('4def93dd4f85cf8968000001') 11 | end 12 | 13 | # json 14 | 15 | test 'should get index with json' do 16 | bundle = Bundle.default 17 | get :index, params: { format: :json, bundle_id: bundle.id } 18 | assert_response 200, 'response should be OK on product index' 19 | assert_equal bundle.measures.count, JSON.parse(response.body).count, 'response body should have all measures for bundle' 20 | end 21 | 22 | # xml 23 | 24 | test 'should get index with xml' do 25 | bundle = Bundle.default 26 | get :index, params: { format: :json, bundle_id: bundle.id } 27 | assert_response 200, 'response should be OK on product index' 28 | end 29 | 30 | # bad requests 31 | 32 | test 'should not get index with json with bad bundle id' do 33 | get :index, params: { format: :json, bundle_id: 'bad_id' } 34 | assert_response 404, 'response should be Not Found if bad id given' 35 | assert_equal 'Not Found', response.message 36 | end 37 | end 38 | -------------------------------------------------------------------------------- /test/controllers/version_controller_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'test_helper' 4 | class VersionControllerTest < ActionController::TestCase 5 | include ActiveJob::TestHelper 6 | setup do 7 | FactoryBot.create(:admin_user) 8 | @version = { 'version' => Cypress::Application::VERSION } 9 | end 10 | 11 | # # # # # # # 12 | # A P I # 13 | # # # # # # # 14 | 15 | test 'should get index with json request' do 16 | for_each_logged_in_user([ADMIN]) do 17 | get :index, format: :json 18 | assert_response 200, 'response should be OK on version index' 19 | assert_equal @version.to_json, JSON.parse(response.body).to_json 20 | end 21 | end 22 | 23 | test 'should get index with xml request' do 24 | for_each_logged_in_user([ADMIN]) do 25 | get :index, format: :xml 26 | assert_response 200, 'response should be OK on version index' 27 | assert_equal @version.to_xml(root: 'version'), response.body 28 | end 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /test/factories/individual_result.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | FactoryBot.define do 4 | factory :cqm_individual_result, class: CQM::IndividualResult do 5 | measure_id { Measure.find_by(hqmf_id: '40280382-5FA6-FE85-0160-0918E74D2075')._id } 6 | end 7 | 8 | factory :cv_cqm_individual_result, class: CQM::IndividualResult do 9 | measure_id { Measure.find_by(hqmf_id: 'BE65090C-EB1F-11E7-8C3F-9A214CF093AE')._id } 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /test/factories/pocs.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | FactoryBot.define do 4 | factory :poc, class: PointOfContact do 5 | sequence(:name) { |i| "Contact #{i}" } 6 | sequence(:email) { |i| "contact#{i}@example.com" } 7 | phone { '1(222)333-4444' } 8 | contact_type { 'Admin' } 9 | sequence(:id) { |i| i } 10 | 11 | factory :poc1 do 12 | name { 'poc1' } 13 | end 14 | 15 | factory :poc_no_name do 16 | name { nil } 17 | end 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /test/factories/products.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | FactoryBot.define do 4 | factory :product, class: Product do 5 | sequence(:name) { |i| "Product Name #{i}" } 6 | 7 | factory :product_no_name do 8 | name { '' } 9 | end 10 | 11 | factory :product_static_name do 12 | name { 'Product Same Name' } 13 | end 14 | 15 | factory :static_product do 16 | name { 'Product Static Bundle' } 17 | description { 'Product Static Bundle' } 18 | trait :default do 19 | c1_test { true } 20 | c2_test { true } 21 | association :vendor, name: 'Static Bundle Vendor' 22 | end 23 | trait :no_c2 do 24 | c1_test { true } 25 | c2_test { false } 26 | association :vendor, name: '2015 Vendor No C2' 27 | end 28 | measure_ids { ['BE65090C-EB1F-11E7-8C3F-9A214CF093AE'] } 29 | association :bundle, factory: :static_bundle 30 | after(:create) do |p| 31 | p.add_checklist_test 32 | p.save 33 | end 34 | 35 | factory :product_static_bundle, traits: [:default] 36 | factory :product_no_c2, traits: [:no_c2] 37 | end 38 | end 39 | end 40 | -------------------------------------------------------------------------------- /test/factories/roles.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | FactoryBot.define do 4 | factory :role, class: Role do 5 | name { 'user' } 6 | resource { nil } 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /test/factories/tasks.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | FactoryBot.define do 4 | factory :task, class: Task do 5 | association :product_test, factory: :product_test_static_result 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /test/factories/test_executions.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | FactoryBot.define do 4 | factory :test_execution, class: TestExecution do 5 | task 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /test/factories/vendors.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | FactoryBot.define do 4 | factory :vendor, class: Vendor do 5 | sequence(:name) { |i| "Vendor Name #{i}" } 6 | 7 | preferred_code_systems { { 'encounter' => ['2.16.840.1.113883.6.96'] } } 8 | 9 | factory :vendor_with_poc do 10 | points_of_contact { [FactoryBot.build(:poc)] } 11 | end 12 | 13 | factory :vendor_with_points_of_contact do 14 | points_of_contact { [FactoryBot.build(:poc), FactoryBot.build(:poc)] } 15 | end 16 | 17 | factory :vendor_no_name do 18 | name { '' } 19 | end 20 | 21 | factory :vendor_static_name do 22 | name { 'Vendor Same Name' } 23 | end 24 | 25 | # with points_of_contact 26 | 27 | factory :vendor_with_points_of_contact_with_no_name do 28 | points_of_contact { [FactoryBot.build(:poc_no_name)] } 29 | end 30 | 31 | factory :vendor_with_points_of_contact_same_name do 32 | points_of_contact { [FactoryBot.build(:poc1), FactoryBot.build(:poc1)] } 33 | end 34 | 35 | factory :vendor_with_many_points_of_contact do 36 | temp = [] 37 | 1000.times do 38 | temp.push(FactoryBot.build(:poc)) 39 | end 40 | points_of_contact { temp } 41 | end 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /test/fixtures/artifacts/CMS142v9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/artifacts/CMS142v9.zip -------------------------------------------------------------------------------- /test/fixtures/artifacts/CMS249v3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/artifacts/CMS249v3.zip -------------------------------------------------------------------------------- /test/fixtures/artifacts/full_fail_patient_upload.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/artifacts/full_fail_patient_upload.zip -------------------------------------------------------------------------------- /test/fixtures/artifacts/good_file_extension.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/artifacts/good_file_extension.zip -------------------------------------------------------------------------------- /test/fixtures/artifacts/good_patient_shift.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/artifacts/good_patient_shift.zip -------------------------------------------------------------------------------- /test/fixtures/artifacts/good_patient_upload.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/artifacts/good_patient_upload.zip -------------------------------------------------------------------------------- /test/fixtures/artifacts/half_fail_patient_upload.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/artifacts/half_fail_patient_upload.zip -------------------------------------------------------------------------------- /test/fixtures/artifacts/qrda.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/artifacts/qrda.zip -------------------------------------------------------------------------------- /test/fixtures/bundles/minimal_bundle_qdm_5_4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/bundles/minimal_bundle_qdm_5_4.zip -------------------------------------------------------------------------------- /test/fixtures/bundles/minimal_bundle_qdm_5_5.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/bundles/minimal_bundle_qdm_5_5.zip -------------------------------------------------------------------------------- /test/fixtures/bundles/minimal_bundle_qdm_5_5_with_calcs.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/bundles/minimal_bundle_qdm_5_5_with_calcs.zip -------------------------------------------------------------------------------- /test/fixtures/bundles/minimal_bundle_qdm_5_6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/bundles/minimal_bundle_qdm_5_6.zip -------------------------------------------------------------------------------- /test/fixtures/bundles/minimal_bundle_qdm_5_6_with_calcs.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/bundles/minimal_bundle_qdm_5_6_with_calcs.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/c1_checklist_correct_codes.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/c1_checklist_correct_codes.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/c1_checklist_correct_codes_bad_form.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/c1_checklist_correct_codes_bad_form.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/c1_checklist_incorrect_codes.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/c1_checklist_incorrect_codes.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/ep_qrda_bad_calculation.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/ep_qrda_bad_calculation.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/ep_qrda_bad_calculation_aug.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/ep_qrda_bad_calculation_aug.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/ep_qrda_test_ccde.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/ep_qrda_test_ccde.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/ep_qrda_test_ccde_lowercase.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/ep_qrda_test_ccde_lowercase.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/ep_qrda_test_future_encounter.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/ep_qrda_test_future_encounter.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/ep_qrda_test_good.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/ep_qrda_test_good.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/ep_qrda_test_good_aug.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/ep_qrda_test_good_aug.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/ep_qrda_test_good_quarter.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/ep_qrda_test_good_quarter.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/ep_qrda_test_good_shift.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/ep_qrda_test_good_shift.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/ep_qrda_test_too_many_files.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/ep_qrda_test_too_many_files.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/ep_qrda_test_wrong_ecqm.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/ep_qrda_test_wrong_ecqm.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/ep_qrda_test_wrong_names.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/ep_qrda_test_wrong_names.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/qrda_test_2_npi.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/qrda_test_2_npi.zip -------------------------------------------------------------------------------- /test/fixtures/qrda/cat_I/sample_patient_bad_schema.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/fixtures/qrda/cat_I/sample_patient_bad_schema.zip -------------------------------------------------------------------------------- /test/helpers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/helpers/.keep -------------------------------------------------------------------------------- /test/integration/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/integration/.keep -------------------------------------------------------------------------------- /test/jobs/filter_test_setup_job_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'test_helper' 4 | 5 | class FilterTestSetupJobTest < ActiveJob::TestCase 6 | def setup 7 | vendor = FactoryBot.create(:vendor) 8 | @bundle = FactoryBot.create(:static_bundle) 9 | @product = vendor.products.create(name: 'test_product', c4_test: true, randomize_patients: true, bundle_id: @bundle.id, 10 | measure_ids: ['BE65090C-EB1F-11E7-8C3F-9A214CF093AE']) 11 | end 12 | 13 | def test_generate_filter_patients 14 | perform_enqueued_jobs do 15 | FilterTestSetupJob.perform_now(@product.id.to_s) 16 | end 17 | patients = @product.product_tests.filtering_tests.find_by(cms_id: 'CMS32v7').patients 18 | @product.product_tests.filtering_tests.each do |ft| 19 | # each filtering test should share the same patients 20 | assert ft.patients.map { |p| "#{p.first_names} #{p.familyName}" } == patients.map { |p| "#{p.first_names} #{p.familyName}" } 21 | end 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /test/jobs/product_test_setup_job_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'test_helper' 4 | 5 | class ProductTestSetupJobTest < ActiveJob::TestCase 6 | def setup 7 | vendor = FactoryBot.create(:vendor) 8 | @bundle = FactoryBot.create(:static_bundle) 9 | @product = vendor.products.build(name: 'test_product', c2_test: true, randomize_patients: true, bundle_id: @bundle.id, 10 | measure_ids: ['BE65090C-EB1F-11E7-8C3F-9A214CF093AE']) 11 | end 12 | 13 | def test_perform_with_measure_test_creates_provider 14 | test = @product.product_tests.build({ name: "my measure test #{rand}", measure_ids: @product.measure_ids }, MeasureTest) 15 | ProductTestSetupJob.perform_now(test) 16 | @product.save! 17 | test.reload 18 | 19 | assert test.provider 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /test/mailers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/test/mailers/.keep -------------------------------------------------------------------------------- /test/models/c3_checklist_task_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'test_helper' 4 | 5 | class C3ChecklistTaskTest < ActiveSupport::TestCase 6 | include ::Validators 7 | include ActiveJob::TestHelper 8 | 9 | def setup 10 | product = FactoryBot.create(:product_static_bundle) 11 | product.c3_test = true 12 | product.save 13 | @checklist_test = product.product_tests.build({ name: 'c1 visual', measure_ids: ['BE65090C-EB1F-11E7-8C3F-9A214CF093AE'] }, ChecklistTest) 14 | @checklist_test.save! 15 | @checklist_test.create_checked_criteria 16 | simplify_criteria(@checklist_test) 17 | C3ChecklistTask.new(product_test: @checklist_test).save! 18 | end 19 | 20 | def test_validators_exist 21 | task = @checklist_test.tasks[0] 22 | validators = [QrdaCat1Validator] 23 | assert arrays_equivalent(validators, task.validators.collect(&:class)) 24 | end 25 | 26 | # TODO: add tests for good and bad test executions 27 | end 28 | -------------------------------------------------------------------------------- /test/models/cat1_filter_task_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'test_helper' 4 | 5 | class Cat1FilterTaskTest < ActiveSupport::TestCase 6 | include ::Validators 7 | include ActiveJob::TestHelper 8 | 9 | def setup 10 | @product_test = FactoryBot.create(:static_filter_test) 11 | end 12 | 13 | def test_create 14 | assert @product_test.tasks.create({}, Cat1FilterTask) 15 | end 16 | 17 | def test_task_good_results_should_pass 18 | user = User.create(email: 'testvendor@test.com', password: 'TestTest!', password_confirmation: 'TestTest!', terms_and_conditions: '1') 19 | task = @product_test.tasks.create({}, Cat1FilterTask) 20 | testfile = Tempfile.new(['good_results_debug_file', '.zip']) 21 | testfile.write task.good_results 22 | perform_enqueued_jobs do 23 | te = task.execute(testfile, user) 24 | te.reload 25 | assert_empty te.execution_errors, 'test execution with known good results should have no errors' 26 | end 27 | end 28 | end 29 | -------------------------------------------------------------------------------- /test/models/cat3_filter_task_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'test_helper' 4 | 5 | class Cat3FilterTaskTest < ActiveSupport::TestCase 6 | include ::Validators 7 | include ActiveJob::TestHelper 8 | 9 | def setup 10 | @product_test = FactoryBot.create(:static_filter_test) 11 | end 12 | 13 | def test_create 14 | assert @product_test.tasks.create({}, Cat3FilterTask) 15 | end 16 | 17 | def test_task_good_results_should_pass 18 | user = User.create(email: 'vendor@test.com', password: 'TestTest!', password_confirmation: 'TestTest!', terms_and_conditions: '1') 19 | task = @product_test.tasks.create({ expected_results: @product_test.expected_results }, Cat3FilterTask) 20 | xml = Tempfile.new(['good_results_debug_file', '.xml']) 21 | xml.write task.good_results 22 | perform_enqueued_jobs do 23 | te = task.execute(xml, user) 24 | te.reload 25 | assert_empty te.execution_errors, 'test execution with known good results should not have any errors' 26 | assert te.passing?, 'test execution with known good results should pass' 27 | end 28 | end 29 | end 30 | -------------------------------------------------------------------------------- /test/models/role_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'test_helper' 4 | 5 | class RoleTest < ActiveSupport::TestCase 6 | # test "the truth" do 7 | # assert true 8 | # end 9 | end 10 | -------------------------------------------------------------------------------- /test/unit/default_provider_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'test_helper' 4 | class DefaultProviderTest < Minitest::Test 5 | def test_default_provider 6 | assert Provider.default_provider, 'should have created default provider' 7 | end 8 | 9 | def test_generate_provider 10 | assert Provider.generate_provider, 'should have generated a provider' 11 | end 12 | 13 | def test_ccn_length 14 | prov = Provider.generate_provider 15 | assert_equal 6, prov.ccn.length, 'Generated CCN should have exactly 6 characters' 16 | assert Provider.valid_npi?(prov.npi), 'Generated NPI Should be valid' 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /test/unit/lib/name_randomizer_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'test_helper' 4 | require 'fileutils' 5 | 6 | class NameRandomizerTest < ActiveSupport::TestCase 7 | setup do 8 | @pt = FactoryBot.create(:product_test_static_result) 9 | record1 = @pt.patients.first.clone 10 | record1.update(givenNames: ['AA'], familyName: 'BB') 11 | @prng = Random.new(Random.new_seed) 12 | end 13 | 14 | def test_randomize_augmented_record 15 | augmented_patients = [{ first: %w[AA A], last: %w[BB BB] }] 16 | patient_to_clone = @pt.patients.where(familyName: 'BB').first.clone 17 | 20.times do 18 | Cypress::NameRandomizer.randomize_patient_name_first(patient_to_clone, augmented_patients, random: @prng) 19 | assert_not_equal ['A'], patient_to_clone.givenNames 20 | end 21 | end 22 | 23 | def test_randomize_no_nickname 24 | nickname = Cypress::NameRandomizer.nickname(nil, 'AAA', random: @prng) 25 | assert_equal 'A', nickname 26 | end 27 | 28 | def test_randomize_unique_nickname 29 | nickname = Cypress::NameRandomizer.nickname(['AAAA'], 'AAA', random: @prng) 30 | assert_equal 'AAAA', nickname 31 | end 32 | end 33 | -------------------------------------------------------------------------------- /test/unit/lib/validators/qrda_cat3_validator_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'test_helper' 4 | class QrdaCat3ValidatorTest < ActiveSupport::TestCase 5 | include ::Validators 6 | 7 | def setup 8 | @product_test = FactoryBot.create(:product_test_static_result) 9 | 10 | @validator_with_c3 = QrdaCat3Validator.new(@product_test.expected_results, true, true, true, @product_test.bundle) 11 | @validator_without_c3 = QrdaCat3Validator.new(@product_test.expected_results, false, false, true, @product_test.bundle) 12 | end 13 | 14 | def test_validate_good_file 15 | file = File.new(Rails.root.join('test', 'fixtures', 'qrda', 'cat_III', 'ep_test_qrda_cat3_good.xml')).read 16 | 17 | @validator_with_c3.validate(file) 18 | assert_empty @validator_with_c3.errors 19 | 20 | @validator_without_c3.validate(file) 21 | assert_empty @validator_without_c3.errors 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /test/vcr_setup.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'vcr' 4 | require 'webmock/minitest' 5 | 6 | # VCR records HTTP interactions to cassettes that can be replayed during unit tests 7 | # allowing for faster, more predictible web interactions 8 | VCR.configure do |c| 9 | # This is where the various cassettes will be recorded to 10 | c.cassette_library_dir = 'test/fixtures/vcr_cassettes' 11 | c.hook_into :webmock 12 | c.ignore_localhost = true 13 | c.allow_http_connections_when_no_cassette = true 14 | 15 | # To avoid storing plain text VSAC credentials or requiring the VSAC credentials 16 | # be provided at every run of the rake tests, provide the VSAC_USERNAME and VSAC_PASSWORD 17 | # whenever you need to record a cassette that requires valid credentials 18 | ENV['VSAC_USERNAME'] = 'vcrtest' unless ENV['VSAC_USERNAME'] 19 | ENV['VSAC_PASSWORD'] = 'vcrpass' unless ENV['VSAC_PASSWORD'] 20 | 21 | # Ensure plain text passwords do not show up during logging 22 | c.filter_sensitive_data('') { ENV.fetch('VSAC_USERNAME', nil) } 23 | c.filter_sensitive_data('') { URI.encode_www_form_component(ENV.fetch('VSAC_PASSWORD', nil)) } 24 | c.default_cassette_options = { record: :once } 25 | end 26 | -------------------------------------------------------------------------------- /vendor/assets/javascripts/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/javascripts/.keep -------------------------------------------------------------------------------- /vendor/assets/stylesheets/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/.keep -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/adobeBlank/font/AdobeBlank.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/adobeBlank/font/AdobeBlank.eot -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/adobeBlank/font/AdobeBlank.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/adobeBlank/font/AdobeBlank.otf -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/adobeBlank/font/AdobeBlank.otf.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/adobeBlank/font/AdobeBlank.otf.woff -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/adobeBlank/font/AdobeBlank.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/adobeBlank/font/AdobeBlank.ttf -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/adobeBlank/font/AdobeBlank.ttf.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/adobeBlank/font/AdobeBlank.ttf.woff -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/breadcrumb.scss: -------------------------------------------------------------------------------- 1 | .breadcrumb > .active > a { 2 | color: $breadcrumb-active-color; 3 | text-decoration: none; 4 | } 5 | 6 | .breadcrumb-responsive .breadcrumb-left, 7 | .breadcrumb-responsive .breadcrumb-right { 8 | display: none; 9 | margin-top: 10px; 10 | width: 25px; 11 | text-align: center; 12 | } 13 | 14 | .breadcrumb-responsive .breadcrumb-container { 15 | min-height: 36px; 16 | position: relative; 17 | overflow: hidden; 18 | } 19 | 20 | .breadcrumb-responsive .breadcrumb { 21 | left: 0; 22 | top: 0; 23 | width: 1800px; 24 | > li { 25 | // Accessibility to fix focus issues 26 | .sr-only { 27 | text-indent: -999px; 28 | } 29 | } 30 | } 31 | 32 | .breadcrumb-responsive:before, 33 | .breadcrumb-responsive:after { 34 | content: " "; 35 | display: table; 36 | } 37 | 38 | .breadcrumb-responsive:after { 39 | clear: both; 40 | } 41 | 42 | .breadcrumb-responsive.control-left-visible .breadcrumb-left, 43 | .breadcrumb-responsive.control-right-visible .breadcrumb-right { 44 | display: block; 45 | float: left; 46 | } 47 | 48 | .breadcrumb-responsive.control-left-visible .breadcrumb-container, 49 | .breadcrumb-responsive.control-right-visible .breadcrumb-container { 50 | float: left; 51 | } -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/fonts/AdobeBlank.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/fonts/AdobeBlank.eot -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/fonts/AdobeBlank.otf.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/fonts/AdobeBlank.otf.woff -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/fonts/AdobeBlank.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/fonts/AdobeBlank.ttf -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/fonts/AdobeBlank.ttf.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/fonts/AdobeBlank.ttf.woff -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/widgets/_dialog.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/widgets/_dialog.scss -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/widgets/_equalize.scss: -------------------------------------------------------------------------------- 1 | .parentContainer { 2 | float: left; 3 | clear: left; 4 | padding: 0 0 2em; 5 | width: 100%; 6 | .box { 7 | background-color: #02875d; 8 | color: #fff; 9 | display: inline-block; 10 | float: left; 11 | margin-right: 1%; 12 | width: 24%; 13 | border: 1px solid white; 14 | p { 15 | padding: 1em; 16 | } 17 | &:last-child { 18 | margin-right: 0; 19 | } 20 | } 21 | } 22 | 23 | .box-width { 24 | background-color: #02875d; 25 | color: #fff; 26 | display: inline-block; 27 | float: left; 28 | margin-bottom: 1%; 29 | margin-right: 1%; 30 | border: 1px solid white; 31 | p { 32 | float: left; 33 | padding: 0.2em; 34 | } 35 | &:last-child { 36 | margin-right: 0; 37 | } 38 | } 39 | 40 | .variableWidth { 41 | display: inline-block; 42 | } 43 | 44 | .equal-width { 45 | display: inline-block; 46 | } -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/widgets/_errors.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/widgets/_errors.scss -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/widgets/_expand-collapse.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/widgets/_expand-collapse.scss -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/widgets/_form.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/widgets/_form.scss -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/widgets/_progressbar.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/widgets/_progressbar.scss -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/widgets/_slider.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/widgets/_slider.scss -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/widgets/_tabs.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectcypress/cypress/d9354916bb8dfff3bc5c0e32728ddc5146377ebe/vendor/assets/stylesheets/assets_framework/widgets/_tabs.scss -------------------------------------------------------------------------------- /vendor/assets/stylesheets/assets_framework/widgets/modal-styles.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | /* CSS Document */ 3 | 4 | .modalStep { max-width: 600px; } 5 | .ui-widget-header { background: #045C83; } 6 | .ui-dialog .ui-dialog-title { width: auto; } 7 | .ui-dialog-titlebar .icon_circle_remove.fa-times-circle { 8 | background: #045C83; 9 | border: none; 10 | color: #fff; 11 | } 12 | .ui-dialog-titlebar .icon_circle_remove:focus, .ui-dialog-titlebar .icon_circle_remove:hover { color:#fff; } 13 | .ie8 .modalStep, .ie9 .modalStep { 14 | width: 470px; 15 | height: 400px; 16 | } 17 | .ie8 .modalSteps, .ie9 .modalSteps { 18 | width: 480px; 19 | height: 400px; 20 | } --------------------------------------------------------------------------------