├── .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 |
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 | Email
6 | Role
7 | Approved
8 | Assignments
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 | <%= user.email %>
19 | <%= role.name if role %>
20 | <%= user.approved %>
21 |
22 |
23 | <% assignments.each do |ass|
24 | if ass.resource
25 | %>
26 | <%= ass.name %> <%= ass.resource.name %>
27 | <% end
28 | end
29 | %>
30 |
31 |
32 | <%= icon('fas fa-fw', 'wrench', :"aria-hidden" => true) %>Edit User
33 |
34 | <% end %>
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/app/views/application/_action_modal.html.erb:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 |
9 |
10 |
11 | Enter to .
12 |
13 |
14 | name
15 |
16 |
17 |
18 |
22 |
23 |
24 |
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 |
5 |
6 |
7 | <% instructions.each do |instruction| %>
8 | <%= instruction %>
9 | <% end %>
10 |
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 |
3 | <% instructions.each do |instruction| %>
4 | <%= instruction['instruction'] %>
5 | <% if instruction['subinstructions'] %>
6 |
7 | <% instruction['subinstructions'].each do |subinstruction| %>
8 | <%= subinstruction %>
9 | <% end %>
10 |
11 | <% end %>
12 |
13 | <% end %>
14 |
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 |
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 |
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 |
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 |
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 |
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 |
2 | <%= link_to 'Go To Dashboard', vendors_path, class: 'btn btn-lg btn-primary',
3 | data: {no_turbolink: true}
4 | %>
5 | <%= link_to 'Report bug', 'https://oncprojectracking.healthit.gov/support/secure/CreateIssue!default.jspa', class: 'btn btn-lg btn-default' %>
6 |
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 |
15 | <% tasks.each do |task| %>
16 |
17 | <% task.product_test.options.filters.each_with_index do |(key, val), index| %>
18 | <%= ' , ' unless index.zero? %>
19 | <%= "#{key.titleize}: " %> <%= display_filter_val(key, task.bundle.randomization, val) %>
20 | <% end %>
21 |
22 | <% end %>
23 |
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 |
15 | <% tasks.each do |task| %>
16 | <% test = task.product_test %>
17 | <%= "#{test.cms_id} #{test.name}" %>
18 | <% end %>
19 |
20 |
--------------------------------------------------------------------------------
/app/views/products/report/_status_icon.html.erb:
--------------------------------------------------------------------------------
1 | <%
2 |
3 | # local variable 'passing'
4 |
5 | %>
6 |
7 | '><%= passing ? '✓'.html_safe : '❌'.html_safe %>
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 |
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 |
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 |
17 |
--------------------------------------------------------------------------------
/app/views/records/_missing_population_table.html.erb:
--------------------------------------------------------------------------------
1 |
2 |
3 | Measure
4 | Population Set
5 | Population
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 | <%= measure_id %>
13 | <%= split_population[0]%>
14 | <%= split_population[1]%>
15 |
16 | <% end %>
17 | <% end %>
18 |
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 | <%= JSON.pretty_generate(rv_value) %>
5 |
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 | <%= key %>
5 | <% rv_value[:values].each do |encounter_id, values| %>
6 | <% if values.is_a? Hash %>
7 | <% if values.values.compact.empty? %>
8 |
9 | <% else %>
10 | <%= "Encounter #{encounter_ids.index(encounter_id) + 1}" %>
11 | <% values.each do |key, value| %>
12 | <% next unless value %>
13 | <%= "#{key} - #{value}"%>
14 | <% end %>
15 | <% end %>
16 | <% else %>
17 | <% if encounter_id == "Other" %>
18 |
19 | <% else %>
20 | <%= "Encounter #{encounter_ids.index(encounter_id) + 1}"%> <%= " - #{values}" if values != 'Encounter, Performed' %>
21 | <% end %>
22 | <% end %>
23 | <% end %>
24 |
25 | <% end %>
--------------------------------------------------------------------------------
/app/views/records/_uncovered_code_table.html.erb:
--------------------------------------------------------------------------------
1 |
2 |
3 | ValueSet OID/Code
4 | ValueSet Name
5 | Uncovered Code Systems
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 | <%= vs.concepts.first.code + "(drc)"%>
13 | <% else %>
14 | <%= vs.oid%>
15 | <% end %>
16 | <%= vs.display_name%>
17 |
18 | <%= code_sys.map { |cs|HQMF::Util::CodeSystemHelper.code_system_for(cs) }.join(',') %>
19 |
20 |
21 | <% end %>
22 | <% end %>
23 |
24 |
--------------------------------------------------------------------------------
/app/views/records/_uncovered_valueset_table.html.erb:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | ValueSet OID/Code
5 | ValueSet Name
6 | Measures
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 | <%= vs.concepts.first.code + "(drc)"%>
14 | <% else %>
15 | <%= vs.oid%>
16 | <% end %>
17 | <%= vs.display_name%>
18 | <%= Measure.where(:value_set_ids => vs.id).pluck(:cms_id).join(", ") %>
19 |
20 | <% end %>
21 |
--------------------------------------------------------------------------------
/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 |
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 | <%= "#{message_title} message" %>
19 | <% unless export %>
20 | Go To in XML
21 | <% end %>
22 |
23 |
24 |
25 | <% errors.sort { |a, b| compare_error_locations_across_files(a, b) }.each do |error| %>
26 |
27 | <%= error.message %>
28 |
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 |
34 |
35 | <% end %>
36 |
37 |
38 |
--------------------------------------------------------------------------------
/app/views/test_executions/results/_xmlnav.html.erb:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | <%= icon('fas fa-fw', 'fast-backward', :"aria-hidden" => true) %> First
6 |
7 |
8 |
9 | <%= icon('fas fa-fw', 'step-backward', :"aria-hidden" => true) %> Prev
10 |
11 |
12 |
13 | Next <%= icon('fas fa-fw', 'step-forward', :"aria-hidden" => true) %>
14 |
15 |
16 |
17 | Last <%= icon('fas fa-fw', 'fast-forward', :"aria-hidden" => true) %>
18 |
19 |
20 |
25 |
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 | }
--------------------------------------------------------------------------------