From 63c9d1d1ac1f9ab64864babbc3fd6cb4210a3147 Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Thu, 17 Aug 2023 11:41:44 -0400 Subject: [PATCH 01/28] add user#establishing_in_person_enrollment_with_address used this method to check for in_person_enrollments. the user has an establishing enrollment with an address selected which means they are ready for the next steps for in person proofing --- app/models/user.rb | 5 +++++ spec/models/user_spec.rb | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/app/models/user.rb b/app/models/user.rb index 5a69f8ef074..5aaa0adabec 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -198,6 +198,11 @@ def in_person_pending_profile pending_profile if pending_profile&.in_person_verification_pending? end + def establishing_in_person_enrollment_with_address? + establishing_in_person_enrollment && + proofing_component&.document_check == Idp::Constants::Vendors::USPS + end + def personal_key_generated_at encrypted_recovery_code_digest_generated_at || active_profile&.verified_at || diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index b49bbca9140..d13bab7c66e 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -314,6 +314,15 @@ expect(user.establishing_in_person_enrollment).to eq establishing_enrollment end end + + describe '#establishing_in_person_enrollment_with_address?' do + it 'returns the establishing IPP enrollment that has an address' do + ProofingComponent.find_or_create_by(user: user). + update!(document_check: Idp::Constants::Vendors::USPS) + + expect(user.establishing_in_person_enrollment_with_address?).to eq(true) + end + end end describe 'deleting identities' do From 9b00d51547a2aeb6f00d54fd2ce8903e4260cfe6 Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Fri, 18 Aug 2023 15:03:53 -0400 Subject: [PATCH 02/28] use user#establishing_in_person_enrollment_with_address? --- app/forms/gpo_verify_form.rb | 6 +----- app/services/idv/session.rb | 5 +++-- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/app/forms/gpo_verify_form.rb b/app/forms/gpo_verify_form.rb index df85c6c2f0b..877a678da52 100644 --- a/app/forms/gpo_verify_form.rb +++ b/app/forms/gpo_verify_form.rb @@ -22,7 +22,7 @@ def submit if result pending_profile&.remove_gpo_deactivation_reason - if profile_has_pending_in_person_enrollment? + if user.establishing_in_person_enrollment_with_address? schedule_in_person_enrollment_and_deactivate_profile elsif fraud_check_failed && threatmetrix_enabled? pending_profile&.deactivate_for_fraud_review @@ -61,10 +61,6 @@ def gpo_confirmation_code pending_profile.gpo_confirmation_codes.first_with_otp(otp) end - def profile_has_pending_in_person_enrollment? - pending_profile&.pending_in_person_enrollment? - end - def schedule_in_person_enrollment_and_deactivate_profile UspsInPersonProofing::EnrollmentHelper.schedule_in_person_enrollment(user, pii) pending_profile&.deactivate_for_in_person_verification diff --git a/app/services/idv/session.rb b/app/services/idv/session.rb index 0b445c03650..a77d7e0e091 100644 --- a/app/services/idv/session.rb +++ b/app/services/idv/session.rb @@ -103,7 +103,8 @@ def clear end def associate_in_person_enrollment_with_profile - return unless pending_in_person_enrollment? && current_user.establishing_in_person_enrollment + return unless current_user.establishing_in_person_enrollment_with_address? + current_user.establishing_in_person_enrollment.update(profile: profile) end @@ -140,7 +141,7 @@ def add_failed_phone_step_number(phone) end def pending_in_person_enrollment? - current_user.proofing_component&.document_check == Idp::Constants::Vendors::USPS + current_user.establishing_in_person_enrollment_with_address? end def verify_info_step_complete? From b0ffacf8aee0eda8f7ef22182f4003bbf6e0de2a Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Fri, 18 Aug 2023 15:15:21 -0400 Subject: [PATCH 03/28] changing ipp method for step indicator concern --- app/controllers/concerns/idv/step_indicator_concern.rb | 2 +- spec/controllers/concerns/idv/step_indicator_concern_spec.rb | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/controllers/concerns/idv/step_indicator_concern.rb b/app/controllers/concerns/idv/step_indicator_concern.rb index 613fc43ef1f..bc4df60a235 100644 --- a/app/controllers/concerns/idv/step_indicator_concern.rb +++ b/app/controllers/concerns/idv/step_indicator_concern.rb @@ -39,7 +39,7 @@ def step_indicator_steps private def in_person_proofing? - proofing_components_as_hash['document_check'] == Idp::Constants::Vendors::USPS + current_user&.establishing_in_person_enrollment_with_address? end def gpo_address_verification? diff --git a/spec/controllers/concerns/idv/step_indicator_concern_spec.rb b/spec/controllers/concerns/idv/step_indicator_concern_spec.rb index 167cbaadfb0..65c472d744e 100644 --- a/spec/controllers/concerns/idv/step_indicator_concern_spec.rb +++ b/spec/controllers/concerns/idv/step_indicator_concern_spec.rb @@ -97,6 +97,8 @@ def force_gpo end it 'returns in person gpo steps' do + ProofingComponent.create(user: user, document_check: Idp::Constants::Vendors::USPS) + create(:in_person_enrollment, :establishing, user: user) expect(steps).to eq in_person_step_indicator_steps_gpo end end @@ -104,6 +106,7 @@ def force_gpo context 'via current idv session' do before do ProofingComponent.create(user: user, document_check: Idp::Constants::Vendors::USPS) + create(:in_person_enrollment, :establishing, user: user) end it 'returns in person steps' do From 8b609ba398023d69d3a7568882385a1b7a0ff23f Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Fri, 18 Aug 2023 15:16:03 -0400 Subject: [PATCH 04/28] remove proofing component methods from step_indicator_concern --- .../concerns/idv/step_indicator_concern.rb | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/app/controllers/concerns/idv/step_indicator_concern.rb b/app/controllers/concerns/idv/step_indicator_concern.rb index bc4df60a235..ce28961798e 100644 --- a/app/controllers/concerns/idv/step_indicator_concern.rb +++ b/app/controllers/concerns/idv/step_indicator_concern.rb @@ -49,22 +49,5 @@ def gpo_address_verification? return idv_session&.address_verification_mechanism == 'gpo' if defined?(idv_session) end - - def proofing_components - return {} if !current_user - - if current_user.pending_profile - current_user.pending_profile.proofing_components - else - ProofingComponent.find_by(user: current_user).as_json - end - end - - def proofing_components_as_hash - # A proofing component record exists as a zero-or-one-to-one relation with a user, and values - # are set during identity verification. These values are recorded to the profile at creation, - # including for a pending profile. - @proofing_components_as_hash ||= proofing_components.to_h - end end end From 2539c28c20d4daea1e737bbf6ed2d76374836047 Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Mon, 21 Aug 2023 11:40:03 -0400 Subject: [PATCH 05/28] use in_person selected location details to determine if ipp ready --- app/models/user.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 5aaa0adabec..db4149f3369 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -199,8 +199,7 @@ def in_person_pending_profile end def establishing_in_person_enrollment_with_address? - establishing_in_person_enrollment && - proofing_component&.document_check == Idp::Constants::Vendors::USPS + in_person_enrollments.order(created_at: :desc).first&.selected_location_details.present? end def personal_key_generated_at From 99731836a6b0eb9136cbe1740e534e225d082359 Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Mon, 21 Aug 2023 16:00:44 -0400 Subject: [PATCH 06/28] changed name to user#has_in_person_enrollment? --- app/controllers/concerns/idv/step_indicator_concern.rb | 2 +- app/forms/gpo_verify_form.rb | 2 +- app/models/user.rb | 2 +- app/services/idv/session.rb | 8 ++++---- spec/models/user_spec.rb | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/controllers/concerns/idv/step_indicator_concern.rb b/app/controllers/concerns/idv/step_indicator_concern.rb index ce28961798e..31a170597df 100644 --- a/app/controllers/concerns/idv/step_indicator_concern.rb +++ b/app/controllers/concerns/idv/step_indicator_concern.rb @@ -39,7 +39,7 @@ def step_indicator_steps private def in_person_proofing? - current_user&.establishing_in_person_enrollment_with_address? + current_user&.has_in_person_enrollment? end def gpo_address_verification? diff --git a/app/forms/gpo_verify_form.rb b/app/forms/gpo_verify_form.rb index 877a678da52..e25e19faf11 100644 --- a/app/forms/gpo_verify_form.rb +++ b/app/forms/gpo_verify_form.rb @@ -22,7 +22,7 @@ def submit if result pending_profile&.remove_gpo_deactivation_reason - if user.establishing_in_person_enrollment_with_address? + if user.has_in_person_enrollment? schedule_in_person_enrollment_and_deactivate_profile elsif fraud_check_failed && threatmetrix_enabled? pending_profile&.deactivate_for_fraud_review diff --git a/app/models/user.rb b/app/models/user.rb index db4149f3369..238cc336243 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -198,7 +198,7 @@ def in_person_pending_profile pending_profile if pending_profile&.in_person_verification_pending? end - def establishing_in_person_enrollment_with_address? + def has_in_person_enrollment? in_person_enrollments.order(created_at: :desc).first&.selected_location_details.present? end diff --git a/app/services/idv/session.rb b/app/services/idv/session.rb index a77d7e0e091..6a128930f5e 100644 --- a/app/services/idv/session.rb +++ b/app/services/idv/session.rb @@ -57,7 +57,7 @@ def create_profile_from_applicant_with_password(user_password) profile = profile_maker.save_profile( fraud_pending_reason: threatmetrix_fraud_pending_reason, gpo_verification_needed: gpo_verification_needed?, - in_person_verification_needed: pending_in_person_enrollment?, + in_person_verification_needed: has_in_person_enrollment?, ) profile.activate unless profile.reason_not_to_activate @@ -103,7 +103,7 @@ def clear end def associate_in_person_enrollment_with_profile - return unless current_user.establishing_in_person_enrollment_with_address? + return unless current_user.has_in_person_enrollment? current_user.establishing_in_person_enrollment.update(profile: profile) end @@ -140,8 +140,8 @@ def add_failed_phone_step_number(phone) failed_phone_step_numbers << phone_e164 if !failed_phone_step_numbers.include?(phone_e164) end - def pending_in_person_enrollment? - current_user.establishing_in_person_enrollment_with_address? + def has_in_person_enrollment? + current_user.has_in_person_enrollment? end def verify_info_step_complete? diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index d13bab7c66e..5810a1e279f 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -315,12 +315,12 @@ end end - describe '#establishing_in_person_enrollment_with_address?' do + describe '#has_in_person_enrollment?' do it 'returns the establishing IPP enrollment that has an address' do ProofingComponent.find_or_create_by(user: user). update!(document_check: Idp::Constants::Vendors::USPS) - expect(user.establishing_in_person_enrollment_with_address?).to eq(true) + expect(user.has_in_person_enrollment?).to eq(true) end end end From 287a2c1127b4e80002dce2bf1bad82fcb4839e58 Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Mon, 21 Aug 2023 16:00:55 -0400 Subject: [PATCH 07/28] add changelog changelog: Internal, IdV IPP, consolidate in_person_enrollment? methods From 8a1ce6a3fb99521540c6d89f00410f37ccc2ac0b Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Mon, 21 Aug 2023 16:05:16 -0400 Subject: [PATCH 08/28] remove profile#pending_in_person_enrollment? --- app/models/profile.rb | 4 ---- spec/models/profile_spec.rb | 20 -------------------- 2 files changed, 24 deletions(-) diff --git a/app/models/profile.rb b/app/models/profile.rb index 3f9d45e6508..acc6a2b84f4 100644 --- a/app/models/profile.rb +++ b/app/models/profile.rb @@ -254,10 +254,6 @@ def self.build_compound_pii(pii) values.join(':') end - def pending_in_person_enrollment? - proofing_components&.[]('document_check') == Idp::Constants::Vendors::USPS - end - def includes_phone_check? return false if proofing_components.blank? proofing_components['address_check'] == 'lexis_nexis_address' diff --git a/spec/models/profile_spec.rb b/spec/models/profile_spec.rb index 2c74834dc3b..dab731843df 100644 --- a/spec/models/profile_spec.rb +++ b/spec/models/profile_spec.rb @@ -46,26 +46,6 @@ end end - describe '#pending_in_person_enrollment?' do - it 'returns true if the document_check component is usps' do - profile = create(:profile, proofing_components: { document_check: 'usps' }) - - expect(profile.pending_in_person_enrollment?).to eq(true) - end - - it 'returns false if the document_check component is something else' do - profile = create(:profile, proofing_components: { document_check: 'something_else' }) - - expect(profile.pending_in_person_enrollment?).to eq(false) - end - - it 'returns false if proofing_components is blank' do - profile = create(:profile, proofing_components: '') - - expect(profile.pending_in_person_enrollment?).to eq(false) - end - end - describe '#includes_phone_check?' do it 'returns true if the address_check component is lexis_nexis_address' do profile = create(:profile, proofing_components: { address_check: 'lexis_nexis_address' }) From 50a3917690cac58820d7ca8f2df3a34b34f05968 Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Tue, 22 Aug 2023 11:45:52 -0400 Subject: [PATCH 09/28] use new has_in_person_enrollment? --- app/forms/gpo_verify_form.rb | 2 +- app/services/idv/session.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/forms/gpo_verify_form.rb b/app/forms/gpo_verify_form.rb index e25e19faf11..808b3e52832 100644 --- a/app/forms/gpo_verify_form.rb +++ b/app/forms/gpo_verify_form.rb @@ -43,7 +43,7 @@ def submit letter_count: letter_count, attempts: attempts, pii_like_keypaths: [[:errors, :otp], [:error_details, :otp]], - pending_in_person_enrollment: pending_profile&.pending_in_person_enrollment?, + pending_in_person_enrollment: user.has_in_person_enrollment?, fraud_check_failed: fraud_check_failed, }, ) diff --git a/app/services/idv/session.rb b/app/services/idv/session.rb index 6a128930f5e..90950b0fb9d 100644 --- a/app/services/idv/session.rb +++ b/app/services/idv/session.rb @@ -73,7 +73,7 @@ def create_profile_from_applicant_with_password(user_password) move_pii_to_user_session elsif address_verification_mechanism == 'gpo' create_gpo_entry - elsif pending_in_person_enrollment? + elsif has_in_person_enrollment? UspsInPersonProofing::EnrollmentHelper.schedule_in_person_enrollment( current_user, pii, From 80f45cfa74f36f28bc05aad8b67a5f65f9fb18fb Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Tue, 22 Aug 2023 13:55:13 -0400 Subject: [PATCH 10/28] fix error in idv step concern --- app/controllers/concerns/idv_step_concern.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/concerns/idv_step_concern.rb b/app/controllers/concerns/idv_step_concern.rb index e18ef728bad..bd6db9d5600 100644 --- a/app/controllers/concerns/idv_step_concern.rb +++ b/app/controllers/concerns/idv_step_concern.rb @@ -60,7 +60,7 @@ def confirm_document_capture_complete def confirm_verify_info_step_complete return if idv_session.verify_info_step_complete? - if idv_session.pending_in_person_enrollment? + if idv_session.has_in_person_enrollment? redirect_to idv_in_person_verify_info_url else redirect_to idv_verify_info_url From dc0f123cbeb687053929fb44615903d8538365ff Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Tue, 22 Aug 2023 14:56:34 -0400 Subject: [PATCH 11/28] fix idv_step_concern spec --- spec/controllers/concerns/idv_step_concern_spec.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/spec/controllers/concerns/idv_step_concern_spec.rb b/spec/controllers/concerns/idv_step_concern_spec.rb index 839cecedc33..6868fd455c2 100644 --- a/spec/controllers/concerns/idv_step_concern_spec.rb +++ b/spec/controllers/concerns/idv_step_concern_spec.rb @@ -171,13 +171,17 @@ def show end context 'the user has not completed the verify info step with an in-person enrollment' do + let(:selected_location_details) do + JSON.parse(UspsInPersonProofing::Mock::Fixtures.enrollment_selected_location_details) + end + it 'redirects to the in-person verify info step' do idv_session.resolution_successful = nil - ProofingComponent.find_or_create_by( + InPersonEnrollment.find_or_create_by( user: user, ).update!( - document_check: Idp::Constants::Vendors::USPS, + selected_location_details: selected_location_details, ) get :show From 39025a08447bda9d30fbe0471fe0e94eef60e272 Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Tue, 22 Aug 2023 17:48:21 -0400 Subject: [PATCH 12/28] only check for establishing or pending ipp statuses --- app/models/user.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index 238cc336243..018a4bf89d1 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -199,7 +199,7 @@ def in_person_pending_profile end def has_in_person_enrollment? - in_person_enrollments.order(created_at: :desc).first&.selected_location_details.present? + in_person_enrollments.where(status: [:establishing, :pending]).order(created_at: :desc).first&.selected_location_details.present? end def personal_key_generated_at From 42f386113e82c10578305e547467d4e00d598516 Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Wed, 23 Aug 2023 11:23:58 -0400 Subject: [PATCH 13/28] linty mclinterson --- app/models/user.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index 018a4bf89d1..a9f24d8cca7 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -199,7 +199,8 @@ def in_person_pending_profile end def has_in_person_enrollment? - in_person_enrollments.where(status: [:establishing, :pending]).order(created_at: :desc).first&.selected_location_details.present? + in_person_enrollments.where(status: [:establishing, :pending]). + order(created_at: :desc).first&.selected_location_details.present? end def personal_key_generated_at From 3fc021c450dfa36925b80bcca647b9c84627394b Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Thu, 24 Aug 2023 10:39:55 -0400 Subject: [PATCH 14/28] check profile in person enrollment on gpo verify --- app/forms/gpo_verify_form.rb | 8 ++++++-- app/models/user.rb | 3 +-- app/services/idv/session.rb | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/forms/gpo_verify_form.rb b/app/forms/gpo_verify_form.rb index 808b3e52832..ff8d0d25f76 100644 --- a/app/forms/gpo_verify_form.rb +++ b/app/forms/gpo_verify_form.rb @@ -22,7 +22,7 @@ def submit if result pending_profile&.remove_gpo_deactivation_reason - if user.has_in_person_enrollment? + if has_in_person_enrollment? schedule_in_person_enrollment_and_deactivate_profile elsif fraud_check_failed && threatmetrix_enabled? pending_profile&.deactivate_for_fraud_review @@ -43,7 +43,7 @@ def submit letter_count: letter_count, attempts: attempts, pii_like_keypaths: [[:errors, :otp], [:error_details, :otp]], - pending_in_person_enrollment: user.has_in_person_enrollment?, + pending_in_person_enrollment: has_in_person_enrollment?, fraud_check_failed: fraud_check_failed, }, ) @@ -66,6 +66,10 @@ def schedule_in_person_enrollment_and_deactivate_profile pending_profile&.deactivate_for_in_person_verification end + def has_in_person_enrollment? + pending_profile&.in_person_enrollment&.establishing? + end + def which_letter return if !valid_otp? pending_profile.gpo_confirmation_codes.sort_by(&:code_sent_at). diff --git a/app/models/user.rb b/app/models/user.rb index a9f24d8cca7..2d718ac6bd3 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -199,8 +199,7 @@ def in_person_pending_profile end def has_in_person_enrollment? - in_person_enrollments.where(status: [:establishing, :pending]). - order(created_at: :desc).first&.selected_location_details.present? + pending_in_person_enrollment.present? || establishing_in_person_enrollment.present? end def personal_key_generated_at diff --git a/app/services/idv/session.rb b/app/services/idv/session.rb index db5e9f3e700..f0337f5256c 100644 --- a/app/services/idv/session.rb +++ b/app/services/idv/session.rb @@ -106,7 +106,7 @@ def clear end def associate_in_person_enrollment_with_profile - return unless current_user.has_in_person_enrollment? + return unless has_in_person_enrollment? current_user.establishing_in_person_enrollment.update(profile: profile) end From ce180bcda3d4a84297fe8452e90018c0a5f7a855 Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Thu, 24 Aug 2023 11:28:42 -0400 Subject: [PATCH 15/28] add #has_pending_in_person_enrollment --- app/forms/gpo_verify_form.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/forms/gpo_verify_form.rb b/app/forms/gpo_verify_form.rb index ff8d0d25f76..b19dec959f7 100644 --- a/app/forms/gpo_verify_form.rb +++ b/app/forms/gpo_verify_form.rb @@ -43,7 +43,7 @@ def submit letter_count: letter_count, attempts: attempts, pii_like_keypaths: [[:errors, :otp], [:error_details, :otp]], - pending_in_person_enrollment: has_in_person_enrollment?, + pending_in_person_enrollment: has_pending_in_person_enrollment?, fraud_check_failed: fraud_check_failed, }, ) @@ -70,6 +70,11 @@ def has_in_person_enrollment? pending_profile&.in_person_enrollment&.establishing? end + def has_pending_in_person_enrollment? + pending_profile&.in_person_enrollment.present? && + pending_profile&.in_person_enrollment&.pending? + end + def which_letter return if !valid_otp? pending_profile.gpo_confirmation_codes.sort_by(&:code_sent_at). From da85d74a013b923017772e89384cb0b549691213 Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Fri, 25 Aug 2023 15:58:00 -0400 Subject: [PATCH 16/28] make current_user#has_in_person_enrollment more explicit in idv session --- app/forms/gpo_verify_form.rb | 5 ++--- app/services/idv/session.rb | 10 +++------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/app/forms/gpo_verify_form.rb b/app/forms/gpo_verify_form.rb index b19dec959f7..6d394f742d0 100644 --- a/app/forms/gpo_verify_form.rb +++ b/app/forms/gpo_verify_form.rb @@ -22,7 +22,7 @@ def submit if result pending_profile&.remove_gpo_deactivation_reason - if has_in_person_enrollment? + if pending_profile&.in_person_enrollment&.establishing? schedule_in_person_enrollment_and_deactivate_profile elsif fraud_check_failed && threatmetrix_enabled? pending_profile&.deactivate_for_fraud_review @@ -71,8 +71,7 @@ def has_in_person_enrollment? end def has_pending_in_person_enrollment? - pending_profile&.in_person_enrollment.present? && - pending_profile&.in_person_enrollment&.pending? + !!pending_profile&.in_person_enrollment&.pending? end def which_letter diff --git a/app/services/idv/session.rb b/app/services/idv/session.rb index f0337f5256c..bb57f9e1e31 100644 --- a/app/services/idv/session.rb +++ b/app/services/idv/session.rb @@ -60,7 +60,7 @@ def create_profile_from_applicant_with_password(user_password) profile = profile_maker.save_profile( fraud_pending_reason: threatmetrix_fraud_pending_reason, gpo_verification_needed: gpo_verification_needed?, - in_person_verification_needed: has_in_person_enrollment?, + in_person_verification_needed: current_user.has_in_person_enrollment?, ) profile.activate unless profile.reason_not_to_activate @@ -76,7 +76,7 @@ def create_profile_from_applicant_with_password(user_password) move_pii_to_user_session elsif address_verification_mechanism == 'gpo' create_gpo_entry - elsif has_in_person_enrollment? + elsif current_user.has_in_person_enrollment? UspsInPersonProofing::EnrollmentHelper.schedule_in_person_enrollment( current_user, pii, @@ -106,7 +106,7 @@ def clear end def associate_in_person_enrollment_with_profile - return unless has_in_person_enrollment? + return unless current_user.has_in_person_enrollment? current_user.establishing_in_person_enrollment.update(profile: profile) end @@ -143,10 +143,6 @@ def add_failed_phone_step_number(phone) failed_phone_step_numbers << phone_e164 if !failed_phone_step_numbers.include?(phone_e164) end - def has_in_person_enrollment? - current_user.has_in_person_enrollment? - end - def verify_info_step_complete? resolution_successful end From 0db91ba0982d78a8ca4fb968a4f14819fc750c7a Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Fri, 25 Aug 2023 18:09:34 -0400 Subject: [PATCH 17/28] fix method missing --- app/controllers/concerns/idv_step_concern.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/concerns/idv_step_concern.rb b/app/controllers/concerns/idv_step_concern.rb index 39219d11b7c..3770cff1419 100644 --- a/app/controllers/concerns/idv_step_concern.rb +++ b/app/controllers/concerns/idv_step_concern.rb @@ -71,7 +71,7 @@ def confirm_document_capture_complete def confirm_verify_info_step_complete return if idv_session.verify_info_step_complete? - if idv_session.has_in_person_enrollment? + if current_user.has_in_person_enrollment? redirect_to idv_in_person_verify_info_url else redirect_to idv_verify_info_url From 1008f7ea0580000ce42b9ab607f215fbeed60dda Mon Sep 17 00:00:00 2001 From: Kimball Bighorse Date: Mon, 28 Aug 2023 14:05:54 -1000 Subject: [PATCH 18/28] Remove unused private method --- app/forms/gpo_verify_form.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/forms/gpo_verify_form.rb b/app/forms/gpo_verify_form.rb index 6d394f742d0..18c08d2f27f 100644 --- a/app/forms/gpo_verify_form.rb +++ b/app/forms/gpo_verify_form.rb @@ -66,10 +66,6 @@ def schedule_in_person_enrollment_and_deactivate_profile pending_profile&.deactivate_for_in_person_verification end - def has_in_person_enrollment? - pending_profile&.in_person_enrollment&.establishing? - end - def has_pending_in_person_enrollment? !!pending_profile&.in_person_enrollment&.pending? end From 13c7edb1e84a3d6677712fceef074d6f9ceeb578 Mon Sep 17 00:00:00 2001 From: Kimball Bighorse Date: Mon, 28 Aug 2023 14:07:18 -1000 Subject: [PATCH 19/28] Replace private method with inline boolean computation --- app/forms/gpo_verify_form.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/forms/gpo_verify_form.rb b/app/forms/gpo_verify_form.rb index 18c08d2f27f..a6409583d74 100644 --- a/app/forms/gpo_verify_form.rb +++ b/app/forms/gpo_verify_form.rb @@ -43,7 +43,7 @@ def submit letter_count: letter_count, attempts: attempts, pii_like_keypaths: [[:errors, :otp], [:error_details, :otp]], - pending_in_person_enrollment: has_pending_in_person_enrollment?, + pending_in_person_enrollment: !!pending_profile&.in_person_enrollment&.pending?, fraud_check_failed: fraud_check_failed, }, ) @@ -66,10 +66,6 @@ def schedule_in_person_enrollment_and_deactivate_profile pending_profile&.deactivate_for_in_person_verification end - def has_pending_in_person_enrollment? - !!pending_profile&.in_person_enrollment&.pending? - end - def which_letter return if !valid_otp? pending_profile.gpo_confirmation_codes.sort_by(&:code_sent_at). From 3f24605b3d477d62c911b8554f34690abb6ea8b9 Mon Sep 17 00:00:00 2001 From: Kimball Bighorse Date: Mon, 28 Aug 2023 15:04:10 -1000 Subject: [PATCH 20/28] Use `User#has_in_person_enrollment?` in `GpoVerifyForm#submit` --- app/forms/gpo_verify_form.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/forms/gpo_verify_form.rb b/app/forms/gpo_verify_form.rb index a6409583d74..532c0a443d8 100644 --- a/app/forms/gpo_verify_form.rb +++ b/app/forms/gpo_verify_form.rb @@ -22,7 +22,7 @@ def submit if result pending_profile&.remove_gpo_deactivation_reason - if pending_profile&.in_person_enrollment&.establishing? + if user.has_in_person_enrollment? schedule_in_person_enrollment_and_deactivate_profile elsif fraud_check_failed && threatmetrix_enabled? pending_profile&.deactivate_for_fraud_review From 78fd989fd92030573fbdac94a05a5d174de15473 Mon Sep 17 00:00:00 2001 From: Kimball Bighorse Date: Tue, 29 Aug 2023 12:28:33 -1000 Subject: [PATCH 21/28] Format establishing in person enrollment in gpo form spec --- spec/forms/gpo_verify_form_spec.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/spec/forms/gpo_verify_form_spec.rb b/spec/forms/gpo_verify_form_spec.rb index 5de76c9ca60..074a4c57d4a 100644 --- a/spec/forms/gpo_verify_form_spec.rb +++ b/spec/forms/gpo_verify_form_spec.rb @@ -118,13 +118,20 @@ expect(result.to_h[:enqueued_at]).to eq(confirmation_code.code_sent_at) end - context 'pending in person enrollment' do + context 'establishing in person enrollment' do let!(:enrollment) do - create(:in_person_enrollment, :establishing, profile: pending_profile, user: user) + create( + :in_person_enrollment, + :establishing, + profile: pending_profile, + user: user, + ) end + let(:proofing_components) do ProofingComponent.create(user: user, document_check: Idp::Constants::Vendors::USPS) end + before do allow(IdentityConfig.store).to receive(:in_person_proofing_enabled).and_return(true) end From a00f10203d5414b033b073188e8206f3f4b9d069 Mon Sep 17 00:00:00 2001 From: Kimball Bighorse Date: Tue, 29 Aug 2023 12:33:51 -1000 Subject: [PATCH 22/28] Name test object better --- spec/forms/gpo_verify_form_spec.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spec/forms/gpo_verify_form_spec.rb b/spec/forms/gpo_verify_form_spec.rb index 074a4c57d4a..1e9e3bbccb9 100644 --- a/spec/forms/gpo_verify_form_spec.rb +++ b/spec/forms/gpo_verify_form_spec.rb @@ -119,7 +119,7 @@ end context 'establishing in person enrollment' do - let!(:enrollment) do + let!(:establishing_enrollment) do create( :in_person_enrollment, :establishing, @@ -149,11 +149,11 @@ it 'updates establishing in-person enrollment to pending' do subject.submit - enrollment.reload + establishing_enrollment.reload - expect(enrollment.status).to eq(InPersonEnrollment::STATUS_PENDING) - expect(enrollment.user_id).to eq(user.id) - expect(enrollment.enrollment_code).to be_a(String) + expect(establishing_enrollment.status).to eq(InPersonEnrollment::STATUS_PENDING) + expect(establishing_enrollment.user_id).to eq(user.id) + expect(establishing_enrollment.enrollment_code).to be_a(String) end end From 403edcc430758a754ee9eb0718309fd9bbb8fb28 Mon Sep 17 00:00:00 2001 From: Kimball Bighorse Date: Tue, 29 Aug 2023 12:35:26 -1000 Subject: [PATCH 23/28] Test pending in person enrollment --- spec/forms/gpo_verify_form_spec.rb | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/spec/forms/gpo_verify_form_spec.rb b/spec/forms/gpo_verify_form_spec.rb index 1e9e3bbccb9..e0c51b0da20 100644 --- a/spec/forms/gpo_verify_form_spec.rb +++ b/spec/forms/gpo_verify_form_spec.rb @@ -157,6 +157,35 @@ end end + context 'pending in person enrollment' do + let!(:pending_enrollment) do + create( + :in_person_enrollment, + :pending, + profile: pending_profile, + user: user, + ) + end + + let(:proofing_components) do + ProofingComponent.create(user: user, document_check: Idp::Constants::Vendors::USPS) + end + + before do + allow(IdentityConfig.store).to receive(:in_person_proofing_enabled).and_return(true) + end + + it 'sets profile to pending in person verification' do + subject.submit + pending_profile.reload + + expect(pending_profile).not_to be_active + expect(pending_profile.deactivation_reason).to eq('in_person_verification_pending') + expect(pending_profile.in_person_verification_pending_at).to be_present + expect(pending_profile.gpo_verification_pending?).to eq(false) + end + end + context 'ThreatMetrix rejection' do let(:pending_profile) do create(:profile, :verify_by_mail_pending, :fraud_pending_reason, user: user) From 0bacc8e45d2a880eaa445624f50c1814ecfccd19 Mon Sep 17 00:00:00 2001 From: Kimball Bighorse Date: Tue, 29 Aug 2023 14:30:39 -1000 Subject: [PATCH 24/28] Call `User.has_establishing_in_person_enrollment_safe?` from `GpoVerifyForm#submit` There is a possibility that `User` has inconsistent enrollment data, so we trust the enrollment associated with its `pending_profile` object instead for safety. We capture this scenario in a new user spec. This can be re-implemented once enrollment data is consistent. --- app/forms/gpo_verify_form.rb | 2 +- app/models/user.rb | 11 ++++++++++ spec/forms/gpo_verify_form_spec.rb | 6 +++--- spec/models/user_spec.rb | 33 ++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/app/forms/gpo_verify_form.rb b/app/forms/gpo_verify_form.rb index 532c0a443d8..cb19d512430 100644 --- a/app/forms/gpo_verify_form.rb +++ b/app/forms/gpo_verify_form.rb @@ -22,7 +22,7 @@ def submit if result pending_profile&.remove_gpo_deactivation_reason - if user.has_in_person_enrollment? + if user.has_establishing_in_person_enrollment_safe? schedule_in_person_enrollment_and_deactivate_profile elsif fraud_check_failed && threatmetrix_enabled? pending_profile&.deactivate_for_fraud_review diff --git a/app/models/user.rb b/app/models/user.rb index 2d718ac6bd3..4ee8a243c0f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -202,6 +202,17 @@ def has_in_person_enrollment? pending_in_person_enrollment.present? || establishing_in_person_enrollment.present? end + # Trust `pending_profile` rather than enrollment assocations + # `Profile#in_person_enrollment` could be either `pending` or `establishing`, but + # `Profile#establishing_in_person_enrollment` can only be `establishing`, + # so both these implementations are logically equivalent. + # This method can be replaced with `User#establishing_in_person_enrollment.present?` + # once enrollment status data is consistent + def has_establishing_in_person_enrollment_safe? + !!pending_profile&.in_person_enrollment&.establishing? + # !!pending_profile&.establishing_in_person_enrollment.present? + end + def personal_key_generated_at encrypted_recovery_code_digest_generated_at || active_profile&.verified_at || diff --git a/spec/forms/gpo_verify_form_spec.rb b/spec/forms/gpo_verify_form_spec.rb index e0c51b0da20..36c2d7e3b6b 100644 --- a/spec/forms/gpo_verify_form_spec.rb +++ b/spec/forms/gpo_verify_form_spec.rb @@ -179,9 +179,9 @@ subject.submit pending_profile.reload - expect(pending_profile).not_to be_active - expect(pending_profile.deactivation_reason).to eq('in_person_verification_pending') - expect(pending_profile.in_person_verification_pending_at).to be_present + expect(pending_profile).to be_active + expect(pending_profile.deactivation_reason).to be_nil + expect(pending_profile.in_person_verification_pending_at).to be_nil expect(pending_profile.gpo_verification_pending?).to eq(false) end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index a8275af602b..c13b0200fc2 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -323,6 +323,39 @@ expect(user.has_in_person_enrollment?).to eq(true) end end + + # We don't know yet if #establishing_in_person_enrollment is, in fact, `establishing` + # so we trust the pending profile in the meantime + describe '#has_establishing_in_person_enrollment_safe?' do + let(:new_user) { create(:user, :fully_registered) } + let(:proofing_components) { nil } + let(:new_pending_profile) do + create( + :profile, + :verify_by_mail_pending, + user: new_user, + proofing_components: proofing_components, + ) + end + let!(:establishing_enrollment) do + create( + :in_person_enrollment, + :establishing, + profile: new_pending_profile, + user: new_user, + ) + end + + it 'returns the establishing IPP enrollment through the pending profile' do + # don't trust has_one association(s) + expect(new_user.establishing_in_person_enrollment).to be_nil + expect(new_user.pending_in_person_enrollment).to be_nil + expect(new_user.has_in_person_enrollment?).to eq(false) + + # trust pending_profile only + expect(new_user.has_establishing_in_person_enrollment_safe?).to eq(true) + end + end end describe 'deleting identities' do From 09ba7dba9adac697286035f33ae8d2666382d43f Mon Sep 17 00:00:00 2001 From: Kimball Bighorse Date: Tue, 29 Aug 2023 14:39:40 -1000 Subject: [PATCH 25/28] Correctly describe spec --- spec/forms/gpo_verify_form_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/forms/gpo_verify_form_spec.rb b/spec/forms/gpo_verify_form_spec.rb index 36c2d7e3b6b..0e4c6680a1c 100644 --- a/spec/forms/gpo_verify_form_spec.rb +++ b/spec/forms/gpo_verify_form_spec.rb @@ -175,7 +175,7 @@ allow(IdentityConfig.store).to receive(:in_person_proofing_enabled).and_return(true) end - it 'sets profile to pending in person verification' do + it 'changes profile from pending to active' do subject.submit pending_profile.reload From 0e74149e3e1e81f10faeae8512c859432016e3bc Mon Sep 17 00:00:00 2001 From: Kimball Bighorse Date: Wed, 30 Aug 2023 09:29:08 -1000 Subject: [PATCH 26/28] Remove unnecessary expectation in user spec --- spec/models/user_spec.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index c13b0200fc2..8861d19dccf 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -350,7 +350,6 @@ # don't trust has_one association(s) expect(new_user.establishing_in_person_enrollment).to be_nil expect(new_user.pending_in_person_enrollment).to be_nil - expect(new_user.has_in_person_enrollment?).to eq(false) # trust pending_profile only expect(new_user.has_establishing_in_person_enrollment_safe?).to eq(true) From 390fe2cd40e2b073a36b5e122bde5b6939a28fed Mon Sep 17 00:00:00 2001 From: Kimball Bighorse Date: Wed, 30 Aug 2023 10:08:25 -1000 Subject: [PATCH 27/28] Remove unnecessary expectation in user spec --- spec/models/user_spec.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 8861d19dccf..88a125c61f2 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -347,11 +347,7 @@ end it 'returns the establishing IPP enrollment through the pending profile' do - # don't trust has_one association(s) - expect(new_user.establishing_in_person_enrollment).to be_nil - expect(new_user.pending_in_person_enrollment).to be_nil - - # trust pending_profile only + # trust pending_profile expect(new_user.has_establishing_in_person_enrollment_safe?).to eq(true) end end From 347ca0057410f0cc483c985bcd8dfa4d3bfc4ce2 Mon Sep 17 00:00:00 2001 From: Kimball Bighorse Date: Wed, 30 Aug 2023 11:00:41 -1000 Subject: [PATCH 28/28] We will always trust `pending_profile` for this value --- app/models/user.rb | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 4ee8a243c0f..07ee98c87a0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -202,15 +202,9 @@ def has_in_person_enrollment? pending_in_person_enrollment.present? || establishing_in_person_enrollment.present? end - # Trust `pending_profile` rather than enrollment assocations - # `Profile#in_person_enrollment` could be either `pending` or `establishing`, but - # `Profile#establishing_in_person_enrollment` can only be `establishing`, - # so both these implementations are logically equivalent. - # This method can be replaced with `User#establishing_in_person_enrollment.present?` - # once enrollment status data is consistent + # Trust `pending_profile` rather than enrollment associations def has_establishing_in_person_enrollment_safe? !!pending_profile&.in_person_enrollment&.establishing? - # !!pending_profile&.establishing_in_person_enrollment.present? end def personal_key_generated_at