Skip to content

Commit 545e81c

Browse files
authored
Merge pull request #12867 from colinux/fix-empty-fc
ETQ usager, je peux remplir mon identité quand FranceConnect ne l'a pas pré-remplie (ou pas entièrement)
2 parents d1a7d6c + 14175e9 commit 545e81c

8 files changed

Lines changed: 67 additions & 8 deletions

File tree

app/components/dossiers/individual_form_component.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ def can_personal_data_be_transmitted?
1616
end
1717

1818
def identity_locked?
19-
!for_tiers? && @dossier.france_connected_with_one_identity?
19+
!for_tiers? && @dossier.identity_from_fc?
2020
end
2121

2222
def mandataire_identity_locked?
23-
@dossier.france_connected_with_one_identity?
23+
@dossier.identity_from_fc?
2424
end
2525

26+
private
27+
2628
def back_url
2729
helpers.commencer_path(path: @dossier.procedure.path)
2830
end

app/components/dossiers/individual_form_component/individual_form_component.html.erb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<h2 class="fr-h5"><%= t('.for_self.self_title') %></h2>
1919
</legend>
2020

21-
<% if @dossier.france_connected_with_one_identity? %>
21+
<% if mandataire_identity_locked? %>
2222
<div class="fr-highlight fr-text--sm">
2323
<%= t('.identity_locked_by_france_connect') %>
2424
</div>
@@ -54,7 +54,7 @@
5454
</h2>
5555
</legend>
5656

57-
<% if @dossier.france_connected_with_one_identity? && !for_tiers? %>
57+
<% if identity_locked? %>
5858
<div class="fr-highlight fr-text--sm">
5959
<%= t('.identity_locked_by_france_connect') %>
6060
</div>

app/controllers/users/dossiers_controller.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,9 @@ def identite
155155
@no_description = true
156156

157157
respond_to do |format|
158-
format.html
158+
format.html do
159+
@dossier.prefill_individual_from_france_connect if @dossier.identity_from_fc?
160+
end
159161
format.turbo_stream do
160162
@dossier.assign_for_tiers(params.dig(:dossier, :for_tiers) == 'true')
161163
end
@@ -488,11 +490,11 @@ def deleted_dossiers
488490
private
489491

490492
def identity_locked?(dossier)
491-
dossier.france_connected_with_one_identity?
493+
dossier.identity_from_fc?
492494
end
493495

494496
def mandataire_identity_locked?(dossier)
495-
dossier.for_tiers? && dossier.france_connected_with_one_identity?
497+
dossier.for_tiers? && dossier.identity_from_fc?
496498
end
497499

498500
# if the status tab is filled, then this tab

app/models/dossier.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ def classer_sans_suite(motivation: nil, instructeur: nil, processed_at: Time.zon
171171
after_destroy_commit :log_destroy
172172

173173
accepts_nested_attributes_for :champs
174-
accepts_nested_attributes_for :individual
174+
accepts_nested_attributes_for :individual, update_only: true
175175

176176
include AASM
177177

@@ -465,6 +465,10 @@ def with_champs(blob: false)
465465
delegate :siret, :siren, to: :etablissement, allow_nil: true
466466
delegate :france_connected_with_one_identity?, to: :user, allow_nil: true
467467

468+
def identity_from_fc?
469+
user&.can_prefill_from_fc?(with_gender: !procedure.no_gender?)
470+
end
471+
468472
after_save :send_web_hook
469473
after_save :update_expired_at, if: :brouillon?
470474

app/models/france_connect_information.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ def clean_tokens_and_requested_email
7474
self.requested_email = nil
7575
end
7676

77+
def complete?(with_gender:)
78+
given_name.present? && family_name.present? && (!with_gender || gender.present?)
79+
end
80+
7781
def full_name
7882
[given_name, family_name].compact.join(" ")
7983
end

app/models/user.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,10 @@ def france_connected_with_one_identity?
219219
france_connect_informations.size == 1
220220
end
221221

222+
def can_prefill_from_fc?(with_gender:)
223+
france_connected_with_one_identity? && france_connect_informations.first.complete?(with_gender:)
224+
end
225+
222226
def can_be_deleted?
223227
!administrateur? && !instructeur? && !expert?
224228
end

spec/components/dossiers/individual_form_component_spec.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,18 @@
2323
end
2424
end
2525

26+
context "for self, when France Connect did not provide all identity fields" do
27+
let(:user) { create(:user, france_connect_informations: [build(:france_connect_information, family_name: nil)]) }
28+
29+
it "all identity fields are editable" do
30+
subject
31+
expect(page).to have_field("Prénom", disabled: false)
32+
expect(page).to have_field("Nom", disabled: false)
33+
expect(page).not_to have_css("input[name='dossier[individual_attributes][gender]'][disabled]")
34+
expect(page).not_to have_text("par FranceConnect et ne peuvent pas être modifiées")
35+
end
36+
end
37+
2638
context "for tiers" do
2739
let(:dossier) { create(:dossier, :for_tiers_without_notification, procedure:, user:) }
2840

spec/system/users/dossier_creation_spec.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,37 @@
7272
it_behaves_like 'the user can create a new draft'
7373
end
7474

75+
context 'when user is connected via France Connect with incomplete identity' do
76+
let(:procedure) { create(:procedure, :published, :for_individual, :with_service, libelle:) }
77+
let(:user) { create(:user, france_connect_informations: [build(:france_connect_information, family_name: nil)]) }
78+
79+
it 'allows the user to fill in missing fields and edit them later' do
80+
find('label', text: "Pour vous").click
81+
82+
expect(page).to have_field('Prénom', disabled: false)
83+
expect(page).to have_field('Nom', disabled: false)
84+
expect(page).not_to have_text("par FranceConnect et ne peuvent pas être modifiées")
85+
86+
fill_in('Prénom', with: 'prenom')
87+
fill_in('Nom', with: 'nom')
88+
89+
within "#identite-form" do
90+
click_button('Continuer')
91+
end
92+
93+
dossier = procedure.dossiers.last
94+
expect(page).to have_current_path(brouillon_dossier_path(dossier))
95+
expect(dossier.individual.reload.prenom).to eq('prenom')
96+
expect(dossier.individual.nom).to eq('nom')
97+
98+
# Return to identity page to verify values are preserved
99+
visit identite_dossier_path(dossier)
100+
101+
expect(page).to have_field('Prénom', with: 'prenom', disabled: false)
102+
expect(page).to have_field('Nom', with: 'nom', disabled: false)
103+
end
104+
end
105+
75106
context 'when for tiers is disabled' do
76107
let(:procedure) { create(:procedure, :published, :for_individual, :with_service, for_tiers_enabled: false, libelle:) }
77108

0 commit comments

Comments
 (0)