diff --git a/app/assets/stylesheets/forms.scss b/app/assets/stylesheets/forms.scss
index 0c44aaead..5984421ba 100644
--- a/app/assets/stylesheets/forms.scss
+++ b/app/assets/stylesheets/forms.scss
@@ -359,7 +359,8 @@
.cnaf-inputs,
.dgfip-inputs,
- .pole-emploi-inputs {
+ .pole-emploi-inputs,
+ .mesri-inputs {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
diff --git a/app/assets/stylesheets/mesri.scss b/app/assets/stylesheets/mesri.scss
new file mode 100644
index 000000000..62f3891c1
--- /dev/null
+++ b/app/assets/stylesheets/mesri.scss
@@ -0,0 +1,30 @@
+@import "constants";
+@import "colors";
+
+table.mesri {
+ margin: 2 * $default-padding 0 $default-padding $default-padding;
+ width: 100%;
+
+ caption {
+ font-weight: bold;
+ margin-left: - $default-padding;
+ margin-bottom: $default-spacer;
+ text-align: left;
+ }
+
+ th,
+ td {
+ font-weight: normal;
+ padding: $default-spacer;
+ }
+
+ th.text-right {
+ text-align: right;
+ }
+
+ &.horizontal {
+ th {
+ border-bottom: 1px solid $grey;
+ }
+ }
+}
diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb
index 4fa81c42f..e6e377969 100644
--- a/app/controllers/users/dossiers_controller.rb
+++ b/app/controllers/users/dossiers_controller.rb
@@ -348,8 +348,8 @@ module Users
def champs_params
params.permit(dossier: {
champs_attributes: [
- :id, :value, :value_other, :external_id, :primary_value, :secondary_value, :numero_allocataire, :code_postal, :identifiant, :numero_fiscal, :reference_avis, :piece_justificative_file, :departement, :code_departement, value: [],
- champs_attributes: [:id, :_destroy, :value, :value_other, :external_id, :primary_value, :secondary_value, :numero_allocataire, :code_postal, :identifiant, :numero_fiscal, :reference_avis, :piece_justificative_file, :departement, :code_departement, value: []]
+ :id, :value, :value_other, :external_id, :primary_value, :secondary_value, :numero_allocataire, :code_postal, :identifiant, :numero_fiscal, :reference_avis, :ine, :piece_justificative_file, :departement, :code_departement, value: [],
+ champs_attributes: [:id, :_destroy, :value, :value_other, :external_id, :primary_value, :secondary_value, :numero_allocataire, :code_postal, :identifiant, :numero_fiscal, :reference_avis, :ine, :piece_justificative_file, :departement, :code_departement, value: []]
]
})
end
diff --git a/app/graphql/schema.graphql b/app/graphql/schema.graphql
index 474cdb5ee..a4a9bf469 100644
--- a/app/graphql/schema.graphql
+++ b/app/graphql/schema.graphql
@@ -1983,6 +1983,11 @@ enum TypeDeChamp {
"""
linked_drop_down_list
+ """
+ Données du Ministère de l'Enseignement Supérieur, de la Recherche et de l'Innovation
+ """
+ mesri
+
"""
Choix multiples
"""
diff --git a/app/lib/api_particulier/api.rb b/app/lib/api_particulier/api.rb
index ba2207c22..8813f8948 100644
--- a/app/lib/api_particulier/api.rb
+++ b/app/lib/api_particulier/api.rb
@@ -4,7 +4,8 @@ class APIParticulier::API
INTROSPECT_RESOURCE_NAME = "introspect"
COMPOSITION_FAMILIALE_RESOURCE_NAME = "v2/composition-familiale"
AVIS_IMPOSITION_RESOURCE_NAME = "v2/avis-imposition"
- SITUATION_POLE_EMPLOI = "v2/situations-pole-emploi"
+ SITUATION_POLE_EMPLOI_RESOURCE_NAME = "v2/situations-pole-emploi"
+ ETUDIANTS_RESOURCE_NAME = "v2/etudiants"
TIMEOUT = 20
@@ -31,7 +32,17 @@ class APIParticulier::API
end
def situation_pole_emploi(identifiant)
- get(SITUATION_POLE_EMPLOI, identifiant: identifiant)
+ get(SITUATION_POLE_EMPLOI_RESOURCE_NAME, identifiant: identifiant)
+ end
+
+ def etudiants(ine)
+ # NOTE: Paramètres d'appel mutuellement exclusifs,
+ # l'appel par INE est réservé aux acteurs de la sphère de l'enseignement
+ # - INE, l'Identifiant National Étudiant
+ # - état civil, constitué du nom, prénom, date de naissance, sexe et lieu de naissance
+
+ # TODO: ajouter le support de l'état civil
+ get(ETUDIANTS_RESOURCE_NAME, ine: ine)
end
private
diff --git a/app/lib/api_particulier/mesri_adapter.rb b/app/lib/api_particulier/mesri_adapter.rb
new file mode 100644
index 000000000..ea27f4168
--- /dev/null
+++ b/app/lib/api_particulier/mesri_adapter.rb
@@ -0,0 +1,48 @@
+class APIParticulier::MesriAdapter
+ class InvalidSchemaError < ::StandardError
+ def initialize(errors)
+ super(errors.map(&:to_json).join("\n"))
+ end
+ end
+
+ def initialize(api_particulier_token, ine, requested_sources)
+ @api = APIParticulier::API.new(api_particulier_token)
+ @ine = ine
+ @requested_sources = requested_sources
+ end
+
+ def to_params
+ @api.etudiants(@ine)
+ .tap { |d| ensure_valid_schema!(d) }
+ .then { |d| extract_requested_sources(d) }
+ end
+
+ private
+
+ def ensure_valid_schema!(data)
+ if !schemer.valid?(data)
+ errors = schemer.validate(data).to_a
+ raise InvalidSchemaError.new(errors)
+ end
+ end
+
+ def schemer
+ @schemer ||= JSONSchemer.schema(Rails.root.join('app/schemas/etudiants.json'))
+ end
+
+ def extract_requested_sources(data)
+ @requested_sources['mesri']&.map do |(scope, sources)|
+ case scope
+ when 'inscriptions'
+ { scope => data[scope].filter_map { |d| d.slice(*sources) if d.key?('dateDebutInscription') } }
+ when 'admissions'
+ { scope => data['inscriptions'].filter_map { |d| d.slice(*sources) if d.key?('dateDebutAdmission') } }
+ when 'etablissements'
+ { scope => data['inscriptions'].map { |d| d['etablissement'].slice(*sources) }.uniq }
+ else
+ { scope => data.slice(*sources) }
+ end
+ end
+ &.flatten&.reduce(&:deep_merge) || {}
+ end
+end
diff --git a/app/lib/api_particulier/services/sources_service.rb b/app/lib/api_particulier/services/sources_service.rb
index f17aad76d..72aa605e1 100644
--- a/app/lib/api_particulier/services/sources_service.rb
+++ b/app/lib/api_particulier/services/sources_service.rb
@@ -8,6 +8,7 @@ module APIParticulier
def available_sources
@procedure.api_particulier_scopes
.filter_map { |provider_and_scope| raw_scopes[provider_and_scope] }
+ .uniq # remove provider/scope tuples duplicates (e.g. mesri inscriptions)
.map { |provider, scope| extract_sources(provider, scope) }
.reduce({}) { |acc, el| acc.deep_merge(el) { |_, this_val, other_val| this_val + other_val } }
end
@@ -80,7 +81,13 @@ module APIParticulier
'pole_emploi_identite' => ['pole_emploi', 'identite'],
'pole_emploi_adresse' => ['pole_emploi', 'adresse'],
'pole_emploi_contact' => ['pole_emploi', 'contact'],
- 'pole_emploi_inscription' => ['pole_emploi', 'inscription']
+ 'pole_emploi_inscription' => ['pole_emploi', 'inscription'],
+ 'mesri_identifiant' => ['mesri', 'identifiant'],
+ 'mesri_identite' => ['mesri', 'identite'],
+ 'mesri_inscription_etudiant' => ['mesri', 'inscriptions'],
+ 'mesri_inscription_autre' => ['mesri', 'inscriptions'],
+ 'mesri_admission' => ['mesri', 'admissions'],
+ 'mesri_etablissements' => ['mesri', 'etablissements']
}
end
@@ -123,6 +130,13 @@ module APIParticulier
'adresse' => ['INSEECommune', 'codePostal', 'localite', 'ligneVoie', 'ligneComplementDestinataire', 'ligneComplementAdresse', 'ligneComplementDistribution', 'ligneNom'],
'contact' => ['email', 'telephone', 'telephone2'],
'inscription' => ['dateInscription', 'dateCessationInscription', 'codeCertificationCNAV', 'codeCategorieInscription', 'libelleCategorieInscription']
+ },
+ 'mesri' => {
+ 'identifiant' => ['ine'],
+ 'identite' => ['nom', 'prenom', 'dateNaissance'],
+ 'inscriptions' => ['statut', 'regime', 'dateDebutInscription', 'dateFinInscription', 'codeCommune'],
+ 'admissions' => ['statut', 'regime', 'dateDebutAdmission', 'dateFinAdmission', 'codeCommune'],
+ 'etablissements' => ['uai', 'nom']
}
}
end
diff --git a/app/models/champs/mesri_champ.rb b/app/models/champs/mesri_champ.rb
new file mode 100644
index 000000000..b61cb0f60
--- /dev/null
+++ b/app/models/champs/mesri_champ.rb
@@ -0,0 +1,47 @@
+# == Schema Information
+#
+# Table name: champs
+#
+# id :integer not null, primary key
+# data :jsonb
+# fetch_external_data_exceptions :string is an Array
+# private :boolean default(FALSE), not null
+# rebased_at :datetime
+# row :integer
+# type :string
+# value :string
+# value_json :jsonb
+# created_at :datetime
+# updated_at :datetime
+# dossier_id :integer
+# etablissement_id :integer
+# external_id :string
+# parent_id :bigint
+# type_de_champ_id :integer
+#
+class Champs::MesriChamp < Champs::TextChamp
+ # see https://github.com/betagouv/api-particulier/blob/master/src/presentation/middlewares/mesri-input-validation.middleware.ts
+ store_accessor :value_json, :ine
+
+ def blank?
+ external_id.nil?
+ end
+
+ def fetch_external_data?
+ true
+ end
+
+ def fetch_external_data
+ return if !valid?
+
+ APIParticulier::MesriAdapter.new(
+ procedure.api_particulier_token,
+ ine,
+ procedure.api_particulier_sources
+ ).to_params
+ end
+
+ def external_id
+ { ine: ine }.to_json if ine.present?
+ end
+end
diff --git a/app/models/procedure.rb b/app/models/procedure.rb
index 5137b4b2d..d75e4372a 100644
--- a/app/models/procedure.rb
+++ b/app/models/procedure.rb
@@ -734,6 +734,10 @@ class Procedure < ApplicationRecord
api_particulier_sources['pole_emploi'].present?
end
+ def mesri_enabled?
+ api_particulier_sources['mesri'].present?
+ end
+
private
def validate_for_publication?
diff --git a/app/models/type_de_champ.rb b/app/models/type_de_champ.rb
index b9b5dd0ca..229c56c46 100644
--- a/app/models/type_de_champ.rb
+++ b/app/models/type_de_champ.rb
@@ -52,7 +52,8 @@ class TypeDeChamp < ApplicationRecord
annuaire_education: 'annuaire_education',
cnaf: 'cnaf',
dgfip: 'dgfip',
- pole_emploi: 'pole_emploi'
+ pole_emploi: 'pole_emploi',
+ mesri: 'mesri'
}
belongs_to :revision, class_name: 'ProcedureRevision', optional: true
@@ -330,6 +331,8 @@ class TypeDeChamp < ApplicationRecord
procedure.dgfip_enabled?
when TypeDeChamp.type_champs.fetch(:pole_emploi)
procedure.pole_emploi_enabled?
+ when TypeDeChamp.type_champs.fetch(:mesri)
+ procedure.mesri_enabled?
else
true
end
diff --git a/app/models/types_de_champ/mesri_type_de_champ.rb b/app/models/types_de_champ/mesri_type_de_champ.rb
new file mode 100644
index 000000000..1e1455fe1
--- /dev/null
+++ b/app/models/types_de_champ/mesri_type_de_champ.rb
@@ -0,0 +1,2 @@
+class TypesDeChamp::MesriTypeDeChamp < TypesDeChamp::TextTypeDeChamp
+end
diff --git a/app/schemas/etudiants.json b/app/schemas/etudiants.json
new file mode 100644
index 000000000..2b302ed20
--- /dev/null
+++ b/app/schemas/etudiants.json
@@ -0,0 +1,57 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "http://demarches-simplifiees.fr/etudiants.schema.json",
+ "title": "statut étudiant",
+ "type": "object",
+ "properties": {
+ "ine": {
+ "type": "string"
+ },
+ "nom": {
+ "type": "string"
+ },
+ "prenom": {
+ "type": "string"
+ },
+ "dateNaissance": {
+ "format": "date",
+ "type": "string"
+ },
+ "inscriptions": {
+ "type": "array",
+ "items" : {
+ "type": "object",
+ "properties": {
+ "dateDebutInscription": {
+ "format": "date",
+ "type": "string"
+ },
+ "dateFinInscription": {
+ "format": "date",
+ "type": "string"
+ },
+ "statut": {
+ "enum": ["admis", "inscrit"]
+ },
+ "regime": {
+ "enum": ["formation initiale", "formation continue"]
+ },
+ "codeCommune": {
+ "type": "string"
+ },
+ "etablissement": {
+ "type": "object",
+ "properties": {
+ "uai": {
+ "type": "string"
+ },
+ "nom": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/schemas/situation-pole-emploi.json b/app/schemas/situation-pole-emploi.json
index 01d6619ed..08fdbc69b 100644
--- a/app/schemas/situation-pole-emploi.json
+++ b/app/schemas/situation-pole-emploi.json
@@ -38,34 +38,32 @@
"email": {
"type": "string"
},
- "$defs": {
- "adresse": {
- "type": "object",
- "properties": {
- "codePostal": {
- "type": "string"
- },
- "INSEECommune": {
- "type": "string"
- },
- "localite": {
- "type": "string"
- },
- "ligneVoie": {
- "type": "string"
- },
- "ligneComplementDestinataire": {
- "type": "string"
- },
- "ligneComplementAdresse": {
- "type": "string"
- },
- "ligneComplementDistribution": {
- "type": "string"
- },
- "ligneNom": {
- "type": "string"
- }
+ "adresse": {
+ "type": "object",
+ "properties": {
+ "codePostal": {
+ "type": "string"
+ },
+ "INSEECommune": {
+ "type": "string"
+ },
+ "localite": {
+ "type": "string"
+ },
+ "ligneVoie": {
+ "type": "string"
+ },
+ "ligneComplementDestinataire": {
+ "type": "string"
+ },
+ "ligneComplementAdresse": {
+ "type": "string"
+ },
+ "ligneComplementDistribution": {
+ "type": "string"
+ },
+ "ligneNom": {
+ "type": "string"
}
}
},
diff --git a/app/views/shared/champs/mesri/_admissions.html.haml b/app/views/shared/champs/mesri/_admissions.html.haml
new file mode 100644
index 000000000..78889945a
--- /dev/null
+++ b/app/views/shared/champs/mesri/_admissions.html.haml
@@ -0,0 +1,11 @@
+%table.mesri
+ %caption #{t("api_particulier.providers.mesri.scopes.#{scope}.libelle")} :
+ - admissions.each do |admission|
+ - admission.slice('statut', 'regime', 'dateDebutAdmission', 'dateFinAdmission', 'codeCommune').keys.each do |key|
+ %tr
+ %th= t("api_particulier.providers.mesri.scopes.#{scope}.#{key}")
+ - case key
+ - when 'dateDebutAdmission', 'dateFinAdmission'
+ %td= try_format_date(Date.strptime(admission[key], "%Y-%m-%d"))
+ - else
+ %td= admission[key]
diff --git a/app/views/shared/champs/mesri/_etablissements.html.haml b/app/views/shared/champs/mesri/_etablissements.html.haml
new file mode 100644
index 000000000..b9317446b
--- /dev/null
+++ b/app/views/shared/champs/mesri/_etablissements.html.haml
@@ -0,0 +1,7 @@
+%table.mesri
+ %caption #{t("api_particulier.providers.mesri.scopes.#{scope}.libelle")} :
+ - etablissements.each do |etablissement|
+ - etablissement.slice('uai', 'nom').keys.each do |key|
+ %tr
+ %th= t("api_particulier.providers.mesri.scopes.#{scope}.#{key}")
+ %td= etablissement[key]
diff --git a/app/views/shared/champs/mesri/_identifiant.html.haml b/app/views/shared/champs/mesri/_identifiant.html.haml
new file mode 100644
index 000000000..3027ada03
--- /dev/null
+++ b/app/views/shared/champs/mesri/_identifiant.html.haml
@@ -0,0 +1,6 @@
+%table.mesri
+ %caption #{t("api_particulier.providers.mesri.scopes.#{scope}.libelle")} :
+ - identifiant.slice('ine').keys.each do |key|
+ %tr
+ %th= t("api_particulier.providers.mesri.scopes.#{scope}.#{key}")
+ %td= identifiant[key]
diff --git a/app/views/shared/champs/mesri/_identite.html.haml b/app/views/shared/champs/mesri/_identite.html.haml
new file mode 100644
index 000000000..fdba5ab18
--- /dev/null
+++ b/app/views/shared/champs/mesri/_identite.html.haml
@@ -0,0 +1,10 @@
+%table.mesri
+ %caption #{t("api_particulier.providers.mesri.scopes.#{scope}.libelle")} :
+ - identite.slice('nom', 'prenom', 'dateNaissance').keys.each do |key|
+ %tr
+ %th= t("api_particulier.providers.mesri.scopes.#{scope}.#{key}")
+ - case key
+ - when 'dateNaissance'
+ %td= try_format_date(Date.strptime(identite[key], "%Y-%m-%d"))
+ - else
+ %td= identite[key]
diff --git a/app/views/shared/champs/mesri/_inscriptions.html.haml b/app/views/shared/champs/mesri/_inscriptions.html.haml
new file mode 100644
index 000000000..2171af239
--- /dev/null
+++ b/app/views/shared/champs/mesri/_inscriptions.html.haml
@@ -0,0 +1,11 @@
+%table.mesri
+ %caption #{t("api_particulier.providers.mesri.scopes.#{scope}.libelle")} :
+ - inscriptions.each do |inscription|
+ - inscription.slice('statut', 'regime', 'dateDebutInscription', 'dateFinInscription', 'codeCommune').keys.each do |key|
+ %tr
+ %th= t("api_particulier.providers.mesri.scopes.#{scope}.#{key}")
+ - case key
+ - when 'dateDebutInscription', 'dateFinInscription'
+ %td= try_format_date(Date.strptime(inscription[key], "%Y-%m-%d"))
+ - else
+ %td= inscription[key]
diff --git a/app/views/shared/champs/mesri/_show.html.haml b/app/views/shared/champs/mesri/_show.html.haml
new file mode 100644
index 000000000..309adfd7d
--- /dev/null
+++ b/app/views/shared/champs/mesri/_show.html.haml
@@ -0,0 +1,25 @@
+- if champ.blank?
+ %p= t('.not_filled')
+- elsif champ.data.blank?
+ %p= t('.fetching_data', ine: champ.ine)
+- else
+ - if profile == 'usager'
+ - sources = champ.procedure.api_particulier_sources['mesri'].keys
+ - i18n_sources = sources.map { |s| I18n.t("#{s}.libelle", scope: 'api_particulier.providers.mesri.scopes') }
+ %p= t('.data_fetched', sources: i18n_sources.to_sentence, ine: champ.ine)
+
+ - if profile == 'instructeur'
+ %p= t('.data_fetched_title')
+
+ - champ.data.slice('identifiant', 'identite', 'inscriptions', 'admissions', 'etablissements').keys.each do |scope|
+ - case scope
+ - when 'identifiant'
+ = render partial: 'shared/champs/mesri/identifiant', locals: { scope: scope, identifiant: champ.data[scope] }
+ - when 'identite'
+ = render partial: 'shared/champs/mesri/identite', locals: { scope: scope, identite: champ.data[scope] }
+ - when 'inscriptions'
+ = render partial: 'shared/champs/mesri/inscriptions', locals: { scope: scope, inscriptions: champ.data[scope] }
+ - when 'admissions'
+ = render partial: 'shared/champs/mesri/admissions', locals: { scope: scope, admissions: champ.data[scope] }
+ - when 'etablissements'
+ = render partial: 'shared/champs/mesri/etablissements', locals: { scope: scope, etablissements: champ.data[scope] }
diff --git a/app/views/shared/dossiers/_champ_row.html.haml b/app/views/shared/dossiers/_champ_row.html.haml
index ea171bc8e..b20011dc6 100644
--- a/app/views/shared/dossiers/_champ_row.html.haml
+++ b/app/views/shared/dossiers/_champ_row.html.haml
@@ -42,6 +42,8 @@
= render partial: "shared/champs/dgfip/show", locals: { champ: c, profile: profile }
- when TypeDeChamp.type_champs.fetch(:pole_emploi)
= render partial: "shared/champs/pole_emploi/show", locals: { champ: c, profile: profile }
+ - when TypeDeChamp.type_champs.fetch(:mesri)
+ = render partial: "shared/champs/mesri/show", locals: { champ: c, profile: profile }
- when TypeDeChamp.type_champs.fetch(:address)
= render partial: "shared/champs/address/show", locals: { champ: c }
- when TypeDeChamp.type_champs.fetch(:communes)
diff --git a/app/views/shared/dossiers/editable_champs/_mesri.html.haml b/app/views/shared/dossiers/editable_champs/_mesri.html.haml
new file mode 100644
index 000000000..cf90abcb7
--- /dev/null
+++ b/app/views/shared/dossiers/editable_champs/_mesri.html.haml
@@ -0,0 +1,7 @@
+.mesri-inputs
+ %div
+ = form.label :ine, t('.ine_label')
+ %p.notice= t('.ine_notice')
+ = form.text_field :ine,
+ required: champ.mandatory?,
+ aria: { describedby: describedby_id(champ) }
diff --git a/config/locales/api_particulier.en.yml b/config/locales/api_particulier.en.yml
index ddaadb426..fe0cd508a 100644
--- a/config/locales/api_particulier.en.yml
+++ b/config/locales/api_particulier.en.yml
@@ -104,3 +104,32 @@ en:
codeCertificationCNAV: CNAV certification code
codeCategorieInscription: registration category code
libelleCategorieInscription: registration category label
+ mesri:
+ libelle: Student status
+ scopes:
+ identifiant:
+ libelle: Identifier
+ ine: INE
+ identite:
+ libelle: Identity
+ nom: last name
+ prenom: first name
+ dateNaissance: date of birth
+ inscriptions:
+ libelle: Registrations
+ statut: status
+ regime: system
+ dateDebutInscription: start date of registration
+ dateFinInscription: end date of registration
+ codeCommune: postal code
+ admissions:
+ libelle: Admissions
+ statut: status
+ regime: system
+ dateDebutAdmission: start date of admission
+ dateFinAdmission: end date of admission
+ codeCommune: postal code
+ etablissements:
+ libelle: Institutions
+ uai: UAI
+ nom: name
diff --git a/config/locales/api_particulier.fr.yml b/config/locales/api_particulier.fr.yml
index 53828cb6b..27a985faf 100644
--- a/config/locales/api_particulier.fr.yml
+++ b/config/locales/api_particulier.fr.yml
@@ -104,3 +104,32 @@ fr:
codeCertificationCNAV: code de certification CNAV
codeCategorieInscription: code de catégorie d’inscription
libelleCategorieInscription: libellé de catégorie d’inscription
+ mesri:
+ libelle: Statut étudiant
+ scopes:
+ identifiant:
+ libelle: Identifiant
+ ine: INE
+ identite:
+ libelle: Identité
+ nom: nom
+ prenom: prénom
+ dateNaissance: date de naissance
+ inscriptions:
+ libelle: Inscriptions
+ statut: statut
+ regime: régime
+ dateDebutInscription: date de début d'inscription
+ dateFinInscription: date de fin d'inscription
+ codeCommune: code de la commune
+ admissions:
+ libelle: Admissions
+ statut: statut
+ regime: régime
+ dateDebutAdmission: date de début d'admission
+ dateFinAdmission: date de fin d'admission
+ codeCommune: code de la commune
+ etablissements:
+ libelle: Établissements
+ uai: UAI
+ nom: nom
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index db3984d4e..73d8381f8 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -421,7 +421,7 @@ fr:
jeton_particulier:
show:
configure_token: "Configurer le jeton API Particulier"
- api_particulier_description_html: "%{app_name} utilise API Particulier qui permet d'accéder aux données familiales (CAF), aux données fiscales (DGFiP) et au statut pôle-emploi d'un citoyen.
Renseignez ici le jeton API Particulier propre à votre démarche."
+ api_particulier_description_html: "%{app_name} utilise API Particulier qui permet d'accéder aux données familiales (CAF), aux données fiscales (DGFiP), au statut pôle-emploi et au statut étudiant d'un citoyen.
Renseignez ici le jeton API Particulier propre à votre démarche."
token_description: "Il doit contenir au minimum 15 caractères."
update:
token_ok: "Le jeton a bien été mis à jour"
@@ -435,7 +435,7 @@ fr:
show:
title: "Définir les sources de données"
data_sources: "Sources de données"
- explication_html: "
API Particulier facilite l’accès des administrations aux données familiales (CAF), aux données fiscales (DGFiP) et au statut pôle-emploi d'un citoyen pour simplifier les démarches administratives mises en œuvre par les collectivités et les administrations.
Cela permet aux administrations d’accéder à des informations certifiées à la source et ainsi :
Important : les disposition de l'article L144-8 n’autorisent que l’échange des informations strictement nécessaires pour traiter une démarche.
En conséquence, ne sélectionnez ici que les données auxquelles vous aurez accès d’un point de vue légal.
API Particulier facilite l’accès des administrations aux données familiales (CAF), aux données fiscales (DGFiP), au statut pôle-emploi et au statut étudiant d'un citoyen pour simplifier les démarches administratives mises en œuvre par les collectivités et les administrations.
Cela permet aux administrations d’accéder à des informations certifiées à la source et ainsi :
Important : les disposition de l'article L144-8 n’autorisent que l’échange des informations strictement nécessaires pour traiter une démarche.
En conséquence, ne sélectionnez ici que les données auxquelles vous aurez accès d’un point de vue légal.