From fb3201c26a62b191f0ca4d4f2999ad183eef3242 Mon Sep 17 00:00:00 2001 From: David Czulada Date: Fri, 5 Sep 2025 15:15:03 -0400 Subject: [PATCH 1/7] validate TINs in ACO eCQMs --- app/controllers/vendors_controller.rb | 1 + app/models/c1_task.rb | 1 + app/models/measure_test.rb | 3 ++- app/models/vendor.rb | 1 + app/views/vendors/preferences.html.erb | 1 + config/cypress.yml | 6 ++++++ lib/ext/cqm/provider.rb | 3 ++- lib/validators/tin_validator.rb | 30 ++++++++++++++++++++++++++ 8 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 lib/validators/tin_validator.rb diff --git a/app/controllers/vendors_controller.rb b/app/controllers/vendors_controller.rb index 824dc723f..ae07e01a1 100644 --- a/app/controllers/vendors_controller.rb +++ b/app/controllers/vendors_controller.rb @@ -99,6 +99,7 @@ def update_preferences # save preferences to vendor preferred_code_systems @vendor.preferred_code_systems = JSON.parse(params['vendor_preferences']) @vendor.preferred_ccn = params['preferred_ccn'] unless params['preferred_ccn'] == '' + @vendor.preferred_tin = params['preferred_tin'] unless params['preferred_tin'] == '' @vendor.save redirect_to vendor_path(@vendor) end diff --git a/app/models/c1_task.rb b/app/models/c1_task.rb index ad1bec1cd..338185cbd 100644 --- a/app/models/c1_task.rb +++ b/app/models/c1_task.rb @@ -12,6 +12,7 @@ class C1Task < Task def validators @validators = if product_test.c1_test [::Validators::CalculatingSmokingGunValidator.new(product_test.measures, product_test.patients, product_test.id), + ::Validators::TinValidator.new, ::Validators::QrdaCat1Validator.new(product_test.bundle, false, product_test.c3_test, true, product_test.measures)] else # A C1 task is created whenever C3 is selected. If C1 isn't also selected, this task doesn't perform any validations diff --git a/app/models/measure_test.rb b/app/models/measure_test.rb index b63243ddb..df553e26e 100644 --- a/app/models/measure_test.rb +++ b/app/models/measure_test.rb @@ -30,7 +30,8 @@ def generate_provider return unless provider.nil? self.provider = Provider.generate_provider(measure_type: measures.first.reporting_program_type, - preferred_ccn: product.vendor.preferred_ccn) + preferred_ccn: product.vendor.preferred_ccn, + preferred_tin: product.vendor.preferred_tin) end # passing only if both c1 and c3_cat1 tasks pass diff --git a/app/models/vendor.rb b/app/models/vendor.rb index a21240098..75a1e05ca 100644 --- a/app/models/vendor.rb +++ b/app/models/vendor.rb @@ -21,6 +21,7 @@ class Vendor field :zip, type: String field :preferred_code_systems, type: Hash, default: {} field :preferred_ccn, type: String + field :preferred_tin, type: String field :favorite_user_ids, type: Array, default: [] field :vendor_patient_analysis, type: Hash, default: {} diff --git a/app/views/vendors/preferences.html.erb b/app/views/vendors/preferences.html.erb index 9a5dd055f..e6639a0e2 100644 --- a/app/views/vendors/preferences.html.erb +++ b/app/views/vendors/preferences.html.erb @@ -27,6 +27,7 @@
<%= f.text_field :preferred_ccn, help: 'Health IT may be tailored for certain facility types (e.g., Critical Access Hospitals ). In these scenarios it is appropriate to use a preferred CMS Certification Number appropriate for the facility.', label: 'Preferred CMS Certification Number', autocomplete: 'off', value: @vendor.preferred_ccn %> + <%= f.text_field :preferred_tin, help: 'Health IT may be tailored for certain provider. It is appropriate to use a preferred TIN for the provider.', label: 'Preferred TIN', autocomplete: 'off', value: @vendor.preferred_tin %>