From 0f69a3338069f31d8dcb7cfcbd3d8244c2c56aa5 Mon Sep 17 00:00:00 2001 From: Loren Yu Date: Fri, 17 Oct 2025 15:45:12 -0700 Subject: [PATCH 1/5] Add actionable scope to case --- app/models/strata/case.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/models/strata/case.rb b/app/models/strata/case.rb index 26517607..bbb5a276 100644 --- a/app/models/strata/case.rb +++ b/app/models/strata/case.rb @@ -21,6 +21,12 @@ class Case < ApplicationRecord has_many :tasks, as: :case, class_name: "Strata::Task" + # Cases that are currently in a staff-facing step + scope :actionable, -> do + staff_task_steps = business_process.steps.select { |step_name, step| step.is_a?(Strata::StaffTask) }.keys + where(business_process_current_step: staff_task_steps) + end + # Returns the base attributes that should be included in all case migrations. # IMPORTANT: When adding new attributes to the Case model, add them here as well # to ensure they're included in migrations created by the generator. From 03e9b7aa80fed7d5ce2a6ebf36a19b9774febcfb Mon Sep 17 00:00:00 2001 From: Loren Yu Date: Fri, 17 Oct 2025 15:45:23 -0700 Subject: [PATCH 2/5] Simplify passport business process --- .../passport_business_process.rb | 25 +++---------------- .../services/identity_verification_service.rb | 1 + 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/spec/dummy/app/business_processes/passport_business_process.rb b/spec/dummy/app/business_processes/passport_business_process.rb index 86df8097..9b324e3b 100644 --- a/spec/dummy/app/business_processes/passport_business_process.rb +++ b/spec/dummy/app/business_processes/passport_business_process.rb @@ -8,32 +8,13 @@ class PassportBusinessProcess < Strata::BusinessProcess IdentityVerificationService.new(kase).verify_identity }) - staff_task('manual_adjudicator_review', PassportTask) - - system_process('review_passport_photo', ->(kase) { - PhotoVerificationService.new(kase).verify_photo - }) - - system_process('notify_user_passport_approved', ->(kase) { - UserNotificationService.new(kase).send_notification("approval") - }) - - system_process('notify_user_passport_rejected', ->(kase) { - UserNotificationService.new(kase).send_notification("rejection") - }) + staff_task('review_passport_photo', PassportPhotoTask) # Define start step start_on_application_form_created('submit_application') # Define transitions transition('submit_application', 'PassportApplicationFormSubmitted', 'verify_identity') - transition('submit_application', 'application_cancelled', 'end') - transition('verify_identity', 'identity_verified', 'review_passport_photo') - transition('verify_identity', 'identity_warning', 'manual_adjudicator_review') - transition('manual_adjudicator_review', 'identity_verified', 'review_passport_photo') - transition('manual_adjudicator_review', 'identity_rejected', 'application_rejected') - transition('review_passport_photo', 'passport_photo_approved', 'notify_user_passport_approved') - transition('review_passport_photo', 'passport_photo_rejected', 'review_passport_photo') - transition('notify_user_passport_approved', 'notification_completed', 'end') - transition('notify_user_passport_rejected', 'notification_completed', 'end') + transition('verify_identity', 'IdentityVerified', 'review_passport_photo') + transition('review_passport_photo', 'PassportPhotoApproved', 'end') end diff --git a/spec/dummy/app/services/identity_verification_service.rb b/spec/dummy/app/services/identity_verification_service.rb index 562c2914..abaa05f1 100644 --- a/spec/dummy/app/services/identity_verification_service.rb +++ b/spec/dummy/app/services/identity_verification_service.rb @@ -6,5 +6,6 @@ def initialize(kase) end def verify_identity + Strata::EventManager.publish("IdentityVerified", { case_id: @kase.id }) end end From 5301795766a5a1c86fa4fe5fb0930ba6b277e730 Mon Sep 17 00:00:00 2001 From: Loren Yu Date: Fri, 17 Oct 2025 15:47:18 -0700 Subject: [PATCH 3/5] Only show actionable cases --- spec/dummy/app/controllers/passport_cases_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spec/dummy/app/controllers/passport_cases_controller.rb b/spec/dummy/app/controllers/passport_cases_controller.rb index db4f7055..5ffff843 100644 --- a/spec/dummy/app/controllers/passport_cases_controller.rb +++ b/spec/dummy/app/controllers/passport_cases_controller.rb @@ -4,7 +4,8 @@ class PassportCasesController < StaffController before_action :set_case, only: %i[ show application_details documents history notes tasks ] def index - @cases = PassportCase.order(created_at: :desc) + @cases = PassportCase.actionable + .order(created_at: :desc) .all end From 530e1066be5613f4ab656b3b7bf4d12bc47d4bc9 Mon Sep 17 00:00:00 2001 From: Loren Yu Date: Fri, 17 Oct 2025 15:55:39 -0700 Subject: [PATCH 4/5] Add spec --- spec/models/strata/case_spec.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/spec/models/strata/case_spec.rb b/spec/models/strata/case_spec.rb index f9222ee3..48f27b93 100644 --- a/spec/models/strata/case_spec.rb +++ b/spec/models/strata/case_spec.rb @@ -101,6 +101,31 @@ end end + describe '.actionable scope' do + it 'returns cases that are in staff task steps' do + # Create cases in different steps + staff_case1 = create(:test_case) + staff_case1.update!(business_process_current_step: 'staff_task') + + staff_case2 = create(:test_case) + staff_case2.update!(business_process_current_step: 'staff_task_2') + + system_case = create(:test_case) + system_case.update!(business_process_current_step: 'system_process') + + applicant_case = create(:test_case) + applicant_case.update!(business_process_current_step: 'applicant_task') + + third_party_case = create(:test_case) + third_party_case.update!(business_process_current_step: 'third_party_task') + + actionable_cases = TestCase.actionable.to_a + + expect(actionable_cases).to include(staff_case1, staff_case2) + expect(actionable_cases).not_to include(system_case, applicant_case, third_party_case) + end + end + describe '.migrate_business_process_current_step' do let(:from_step) { Faker::Alphanumeric.alpha(number: rand(5..15)) } let(:to_step) { Faker::Alphanumeric.alpha(number: rand(5..15)) } From ba33df2d3194c403bc40ca51bbd8b674e414b5da Mon Sep 17 00:00:00 2001 From: MichaelCrawfordNava Date: Mon, 20 Oct 2025 14:46:08 -0500 Subject: [PATCH 5/5] Fix test --- .../passport_business_process_spec.rb | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/spec/dummy/spec/business_processes/passport_business_process_spec.rb b/spec/dummy/spec/business_processes/passport_business_process_spec.rb index 6217c332..3c5cf22f 100644 --- a/spec/dummy/spec/business_processes/passport_business_process_spec.rb +++ b/spec/dummy/spec/business_processes/passport_business_process_spec.rb @@ -29,20 +29,10 @@ test_form.save! test_form.submit_application kase.reload - expect(kase.business_process_instance.current_step).to eq ("verify_identity") - - # verify identity (simulate action that an adjudicator takes) - Strata::EventManager.publish("identity_verified", { case_id: kase.id }) - kase.reload expect(kase.business_process_instance.current_step).to eq ("review_passport_photo") # approve passport photo - Strata::EventManager.publish("passport_photo_approved", { case_id: kase.id }) - kase.reload - expect(kase.business_process_instance.current_step).to eq ("notify_user_passport_approved") - - # notify user - Strata::EventManager.publish("notification_completed", { case_id: kase.id }) + Strata::EventManager.publish("PassportPhotoApproved", { case_id: kase.id }) # check case status kase.reload