diff --git a/app/assets/stylesheets/sources_particulier_form.scss b/app/assets/stylesheets/sources_particulier_form.scss new file mode 100644 index 000000000..650c6bfdf --- /dev/null +++ b/app/assets/stylesheets/sources_particulier_form.scss @@ -0,0 +1,26 @@ +@import "constants"; + +#sources-particulier-form { + h2 { + margin-bottom: 0; + } + + h3 { + margin-top: 2 * $default-padding; + } + + .explication { + padding: $default-padding; + + ul { + list-style-type: circle; + list-style-position: inside; + padding-left: $default-padding; + margin-bottom: $default-padding; + } + } + + .form input[type="checkbox"] { + margin-bottom: 0; + } +} diff --git a/app/controllers/new_administrateur/sources_particulier_controller.rb b/app/controllers/new_administrateur/sources_particulier_controller.rb new file mode 100644 index 000000000..25014ace5 --- /dev/null +++ b/app/controllers/new_administrateur/sources_particulier_controller.rb @@ -0,0 +1,13 @@ +module NewAdministrateur + class SourcesParticulierController < AdministrateurController + before_action :retrieve_procedure + + def show + sources_service = APIParticulier::Services::SourcesService.new(@procedure) + @available_sources = sources_service.available_sources + end + + def update + end + end +end diff --git a/app/views/new_administrateur/sources_particulier/show.html.haml b/app/views/new_administrateur/sources_particulier/show.html.haml new file mode 100644 index 000000000..cd06d96c6 --- /dev/null +++ b/app/views/new_administrateur/sources_particulier/show.html.haml @@ -0,0 +1,28 @@ += render partial: 'new_administrateur/breadcrumbs', + locals: { steps: [link_to('Démarches', admin_procedures_path), + link_to(@procedure.libelle, admin_procedure_path(@procedure)), + link_to(Procedure.human_attribute_name(:jeton_api_particulier), admin_procedure_api_particulier_path(@procedure)), + t('.data_sources')] } + +.container + %h1.page-title= t('.title') + +.container#sources-particulier-form.mb-2 + = form_with model: @procedure, url: admin_procedure_api_particulier_sources_path, local: true, html: { class: 'form' } do |f| + .explication= t('.explication_html') + + - @available_sources.each do |provider_key, scopes| + %h2.header-section= t("api_particulier.providers.#{provider_key}.libelle") + + - scopes.each do |scope_key, sources| + %h3.explication-libelle= t("api_particulier.providers.#{provider_key}.scopes.#{scope_key}.libelle") + %ul.procedure-admin-api-particulier-sources + - sources.each do |source_key, enabled_hash| + - enabled = (@procedure.api_particulier_sources.dig(provider_key, scope_key)&.include?(source_key)).present? + %li + %label + = check_box_tag "api_particulier_sources[#{provider_key}][#{scope_key}][]", "#{source_key}", enabled + #{t("api_particulier.providers.#{provider_key}.scopes.#{scope_key}.#{source_key}")} + + .text-right + = f.button t('views.shared.actions.save'), class: 'button primary send' diff --git a/config/locales/api_particulier.fr.yml b/config/locales/api_particulier.fr.yml new file mode 100644 index 000000000..2c5a484b9 --- /dev/null +++ b/config/locales/api_particulier.fr.yml @@ -0,0 +1,30 @@ +fr: + api_particulier: + providers: + cnaf: + libelle: Caisse d’allocations familiales (CAF) + scopes: + personne: &personne + noms_prenoms: noms et prénoms + date_de_naissance: date de naissance + sexe: genre + allocataires: + libelle: allocataires + <<: *personne + enfants: + libelle: enfants + <<: *personne + adresse: + libelle: adresse + identite: identité + complement_d_identite: complément d’identité + complement_d_identite_geo: complément d’identité géographique + numero_et_rue: numéro et rue + lieu_dit: lieu-dit + code_postal_et_ville: code postal et ville + pays: pays + quotient_familial: + libelle: quotient familial + quotient_familial: quotient familial + mois: mois + annee: année diff --git a/config/locales/fr.yml b/config/locales/fr.yml index f793cd37a..a74388d3f 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -395,3 +395,13 @@ fr: api_particulier: already_configured: "Déjà rempli" needs_configuration: "À remplir" + sources_particulier: + 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) 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.

" + procedures: + show: + ready: "Validé" + needs_configuration: "À configurer" + configure_api_particulier_token: "Configurer le jeton API particulier" diff --git a/config/routes.rb b/config/routes.rb index 8066f15e1..9278e5c80 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -401,6 +401,7 @@ Rails.application.routes.draw do resource 'api_particulier', only: [] do resource 'jeton', only: [:show, :update], controller: 'jeton_particulier' + resource 'sources', only: [:show, :update], controller: 'sources_particulier' end put 'clone' diff --git a/spec/controllers/new_administrateur/sources_particulier_controller_spec.rb b/spec/controllers/new_administrateur/sources_particulier_controller_spec.rb new file mode 100644 index 000000000..4e21ceddd --- /dev/null +++ b/spec/controllers/new_administrateur/sources_particulier_controller_spec.rb @@ -0,0 +1,21 @@ +describe NewAdministrateur::SourcesParticulierController, type: :controller do + let(:admin) { create(:administrateur) } + + before { sign_in(admin.user) } + + describe "#show" do + let(:procedure) { create(:procedure, administrateur: admin, api_particulier_scopes: ['cnaf_enfants'], api_particulier_sources: { cnaf: { enfants: ['noms_prenoms'] } }) } + + render_views + + subject { get :show, params: { procedure_id: procedure.id } } + + it 'renders the sources form' do + expect(subject.body).to include(I18n.t('api_particulier.providers.cnaf.scopes.enfants.date_de_naissance')) + expect(subject.body).to have_selector("input#api_particulier_sources_cnaf_enfants_[value=noms_prenoms][checked=checked]") + + expect(subject.body).to have_selector("input#api_particulier_sources_cnaf_enfants_[value=date_de_naissance]") + expect(subject.body).not_to have_selector("input#api_particulier_sources_cnaf_enfants_[value=date_de_naissance][checked=checked]") + end + end +end