+
+
+
<%= t('headings.residential_address') %>
+
+
+
- <%= t('idv.form.address1') %>:
+ - <%= @pii[:address1] %>
+
+
+
- <%= t('idv.form.address2') %>:
+ - <%= @pii[:address2].presence %>
+
+
+
- <%= t('idv.form.city') %>:
+ - <%= @pii[:city] %>
+
+
+
- <%= t('idv.form.state') %>:
+ - <%= @pii[:state] %>
+
+
+
- <%= t('idv.form.zipcode') %>:
+ - <%= @pii[:zipcode] %>
+
+
+
+ <%= link_to(
+ t('idv.buttons.change_label'),
+ idv_in_person_address_url,
+ 'aria-label': t('idv.buttons.change_address_label'),
+ ) %>
+
+
diff --git a/app/views/idv/in_person/verify_info/_ssn_section.html.erb b/app/views/idv/in_person/verify_info/_ssn_section.html.erb
new file mode 100644
index 00000000000..6dbbbe6b96d
--- /dev/null
+++ b/app/views/idv/in_person/verify_info/_ssn_section.html.erb
@@ -0,0 +1,26 @@
+
+
+
+
<%= t('headings.ssn') %>
+
+ <%= t('idv.form.ssn') %>:
+ <%= render(
+ 'shared/masked_text',
+ text: SsnFormatter.format(@ssn),
+ masked_text: SsnFormatter.format_masked(@ssn),
+ accessible_masked_text: t(
+ 'idv.accessible_labels.masked_ssn',
+ first_number: @ssn[0],
+ last_number: @ssn[-1],
+ ),
+ toggle_label: t('forms.ssn.show'),
+ ) %>
+
+
+ <%= link_to(
+ t('idv.buttons.change_label'),
+ idv_in_person_ssn_url,
+ 'aria-label': t('idv.buttons.change_ssn_label'),
+ ) %>
+
+
diff --git a/app/views/idv/in_person/verify_info/_state_id_section.html.erb b/app/views/idv/in_person/verify_info/_state_id_section.html.erb
new file mode 100644
index 00000000000..21dcf709b4a
--- /dev/null
+++ b/app/views/idv/in_person/verify_info/_state_id_section.html.erb
@@ -0,0 +1,56 @@
+
+
+
+
<%= t('headings.state_id') %>
+
+
+
- <%= t('idv.form.first_name') %>:
+ - <%= @pii[:first_name] %>
+
+
+
- <%= t('idv.form.last_name') %>:
+ - <%= @pii[:last_name] %>
+
+
+
- <%= t('idv.form.dob') %>:
+ -
+ <%= I18n.l(Date.parse(@pii[:dob]), format: I18n.t('time.formats.event_date')) %>
+
+
+
+
- <%= t('idv.form.issuing_state') %>:
+ - <%= @pii[:state_id_jurisdiction] %>
+
+
+
- <%= t('idv.form.id_number') %>:
+ - <%= @pii[:state_id_number] %>
+
+
+
- <%= t('idv.form.address1') %>:
+ - <%= @pii[:identity_doc_address1] %>
+
+
+
- <%= t('idv.form.address2') %>:
+ - <%= @pii[:identity_doc_address2].presence %>
+
+
+
- <%= t('idv.form.city') %>:
+ - <%= @pii[:identity_doc_city] %>
+
+
+
- <%= t('idv.form.state') %>:
+ - <%= @pii[:identity_doc_address_state] %>
+
+
+
- <%= t('idv.form.zipcode') %>:
+ - <%= @pii[:identity_doc_zipcode] %>
+
+
+
+ <%= link_to(
+ idv_in_person_state_id_url,
+ class: 'usa-button usa-button--unstyled padding-y-1',
+ 'aria-label': t('idv.buttons.change_state_id_label'),
+ ) { t('idv.buttons.change_label') } %>
+
+
diff --git a/app/views/idv/in_person/verify_info/show.html.erb b/app/views/idv/in_person/verify_info/show.html.erb
index 0f5f79aa2c0..86701c7377d 100644
--- a/app/views/idv/in_person/verify_info/show.html.erb
+++ b/app/views/idv/in_person/verify_info/show.html.erb
@@ -23,140 +23,29 @@ locals:
<%= render PageHeadingComponent.new.with_content(t('headings.verify')) %>
-
-
-
-
<%= t('headings.state_id') %>
-
-
-
- <%= t('idv.form.first_name') %>:
- - <%= @pii[:first_name] %>
-
-
-
- <%= t('idv.form.last_name') %>:
- - <%= @pii[:last_name] %>
-
-
-
- <%= t('idv.form.dob') %>:
- -
- <%= I18n.l(Date.parse(@pii[:dob]), format: I18n.t('time.formats.event_date')) %>
-
-
-
-
- <%= t('idv.form.issuing_state') %>:
- - <%= @pii[:state_id_jurisdiction] %>
-
-
-
- <%= t('idv.form.id_number') %>:
- - <%= @pii[:state_id_number] %>
-
-
-
- <%= t('idv.form.address1') %>:
- - <%= @pii[:identity_doc_address1] %>
-
-
-
- <%= t('idv.form.address2') %>:
- - <%= @pii[:identity_doc_address2].presence %>
-
-
-
- <%= t('idv.form.city') %>:
- - <%= @pii[:identity_doc_city] %>
-
-
-
- <%= t('idv.form.state') %>:
- - <%= @pii[:identity_doc_address_state] %>
-
-
-
- <%= t('idv.form.zipcode') %>:
- - <%= @pii[:identity_doc_zipcode] %>
-
-
-
- <%= link_to(
- idv_in_person_state_id_url,
- class: 'usa-button usa-button--unstyled padding-y-1',
- 'aria-label': t('idv.buttons.change_state_id_label'),
- ) { t('idv.buttons.change_label') } %>
-
-
-
-
-
-
<%= t('headings.residential_address') %>
-
-
-
- <%= t('idv.form.address1') %>:
- - <%= @pii[:address1] %>
-
-
-
- <%= t('idv.form.address2') %>:
- - <%= @pii[:address2].presence %>
-
-
-
- <%= t('idv.form.city') %>:
- - <%= @pii[:city] %>
-
-
-
- <%= t('idv.form.state') %>:
- - <%= @pii[:state] %>
-
-
-
- <%= t('idv.form.zipcode') %>:
- - <%= @pii[:zipcode] %>
-
-
-
- <%= link_to(
- t('idv.buttons.change_label'),
- idv_in_person_address_url,
- 'aria-label': t('idv.buttons.change_address_label'),
- ) %>
-
-
-
-
-
-
<%= t('headings.ssn') %>
-
- <%= t('idv.form.ssn') %>:
- <%= render(
- 'shared/masked_text',
- text: SsnFormatter.format(@ssn),
- masked_text: SsnFormatter.format_masked(@ssn),
- accessible_masked_text: t(
- 'idv.accessible_labels.masked_ssn',
- first_number: @ssn[0],
- last_number: @ssn[-1],
- ),
- toggle_label: t('forms.ssn.show'),
- ) %>
-
-
- <%= link_to(
- t('idv.buttons.change_label'),
- idv_in_person_ssn_url,
- 'aria-label': t('idv.buttons.change_ssn_label'),
- ) %>
-
-
+ <% if !@pii[:state_id_number].nil? %>
+ <%= render 'state_id_section', pii: @pii %>
+ <% end %>
+ <%= render 'address_section', pii: @pii %>
+ <%= render 'ssn_section', ssn: @ssn %>
- <%= render SpinnerButtonComponent.new(
- url: idv_in_person_verify_info_path,
- big: true,
- wide: true,
- action_message: t('idv.messages.verifying'),
- method: :put,
- form: {
- class: 'button_to',
- data: {
- form_steps_wait: '',
- error_message: t('idv.failure.exceptions.internal_error'),
- alert_target: '#form-steps-wait-alert',
- wait_step_path: idv_in_person_verify_info_path,
- poll_interval_ms: IdentityConfig.store.poll_rate_for_verify_in_seconds * 1000,
- },
+ <%= render SpinnerButtonComponent.new(
+ url: idv_in_person_verify_info_path,
+ big: true,
+ wide: true,
+ action_message: t('idv.messages.verifying'),
+ method: :put,
+ form: {
+ class: 'button_to',
+ data: {
+ form_steps_wait: '',
+ error_message: t('idv.failure.exceptions.internal_error'),
+ alert_target: '#form-steps-wait-alert',
+ wait_step_path: idv_in_person_verify_info_path,
+ poll_interval_ms: IdentityConfig.store.poll_rate_for_verify_in_seconds * 1000,
},
- ).with_content(t('forms.buttons.submit.default')) %>
+ },
+ ).with_content(t('forms.buttons.submit.default')) %>
diff --git a/config/application.yml.default b/config/application.yml.default
index ddf2b9a2b37..6d561995292 100644
--- a/config/application.yml.default
+++ b/config/application.yml.default
@@ -104,6 +104,8 @@ doc_auth_client_sharpness_threshold: 50
doc_auth_error_dpi_threshold: 290
doc_auth_error_glare_threshold: 40
doc_auth_error_sharpness_threshold: 40
+doc_auth_manual_upload_disabled_a_b_testing_enabled: false
+doc_auth_manual_upload_disabled_a_b_testing_percent: 0
doc_auth_max_attempts: 5
doc_auth_max_capture_attempts_before_native_camera: 3
doc_auth_max_submission_attempts_before_native_camera: 3
diff --git a/config/initializers/ab_tests.rb b/config/initializers/ab_tests.rb
index dfba4cc0605..2a91282c308 100644
--- a/config/initializers/ab_tests.rb
+++ b/config/initializers/ab_tests.rb
@@ -127,4 +127,19 @@ def self.all
) do |service_provider:, session:, user:, user_session:, **|
user&.uuid
end.freeze
+
+ DOC_AUTH_MANUAL_UPLOAD_DISABLED = AbTest.new(
+ experiment_name: 'Doc Auth Manual Upload Disabled',
+ should_log: [
+ 'Idv: doc auth hybrid handoff visited',
+ 'IdV: doc auth document_capture visited',
+ ],
+ buckets: {
+ manual_upload_disabled:
+ IdentityConfig.store.doc_auth_manual_upload_disabled_a_b_testing_enabled ?
+ IdentityConfig.store.doc_auth_manual_upload_disabled_a_b_testing_percent : 0,
+ },
+ ) do |service_provider:, session:, user:, user_session:, **|
+ user&.uuid
+ end.freeze
end
diff --git a/config/locales/en.yml b/config/locales/en.yml
index f9f919454f8..bc3d4e1b994 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -597,7 +597,8 @@ doc_auth.headers.low_resolution: Your device’s camera may not be supported.
doc_auth.headers.unaccepted_id_type: Use a driver’s license or a state ID
doc_auth.headers.underage: Age requirement not met
doc_auth.headers.unreadable_id: We could not read your ID
-doc_auth.headings.address: Update your current residential address
+doc_auth.headings.address: Enter your current residential address
+doc_auth.headings.address_update: Update your current residential address
doc_auth.headings.back: Back of your driver’s license or state ID
doc_auth.headings.capture_complete: We verified your identity document
doc_auth.headings.capture_scan_warning_html: We couldn’t read the barcode on your ID. If the information below is incorrect, please %{link_html} of your ID.
@@ -1284,7 +1285,7 @@ in_person_proofing.body.location.po_search.state_label: State
in_person_proofing.body.location.po_search.usps_facilities_api_error_body_html: Please continue verifying your identity. You can use our