From f9453b5ef79ffb82eac1869f733e661111b186cc Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Sat, 12 Aug 2023 11:13:08 +0200 Subject: [PATCH] instructeur can create groupe instructeur service --- .../groupe_instructeur_services_controller.rb | 30 +++++++++ .../_form.html.haml | 39 +++++++++++ .../groupe_instructeur_services/new.html.haml | 10 +++ .../groupe_instructeurs/show.html.haml | 6 ++ config/locales/models/service/en.yml | 3 +- config/locales/models/service/fr.yml | 3 +- config/routes.rb | 1 + ...pe_instructeur_services_controller_spec.rb | 65 +++++++++++++++++++ 8 files changed, 155 insertions(+), 2 deletions(-) create mode 100644 app/controllers/instructeurs/groupe_instructeur_services_controller.rb create mode 100644 app/views/instructeurs/groupe_instructeur_services/_form.html.haml create mode 100644 app/views/instructeurs/groupe_instructeur_services/new.html.haml create mode 100644 spec/controllers/instructeurs/groupe_instructeur_services_controller_spec.rb diff --git a/app/controllers/instructeurs/groupe_instructeur_services_controller.rb b/app/controllers/instructeurs/groupe_instructeur_services_controller.rb new file mode 100644 index 00000000000..600dfdcbc0a --- /dev/null +++ b/app/controllers/instructeurs/groupe_instructeur_services_controller.rb @@ -0,0 +1,30 @@ +module Instructeurs + class GroupeInstructeurServicesController < InstructeurController + def new + assign_procedure_and_groupe_instructeur + @service = @groupe_instructeur.build_groupe_instructeur_service + end + + def create + assign_procedure_and_groupe_instructeur + @service = @groupe_instructeur.build_groupe_instructeur_service(service_params) + if @service.save + redirect_to instructeur_groupe_path(@groupe_instructeur, procedure_id: @procedure.id), notice: "Le service #{@service.nom} a bien été créé" + else + flash[:alert] = @service.errors.full_messages + render :new + end + end + + private + + def assign_procedure_and_groupe_instructeur + @procedure = current_instructeur.procedures.find params[:procedure_id] + @groupe_instructeur = current_instructeur.groupe_instructeurs.find params[:groupe_id] + end + + def service_params + params.require(:groupe_instructeur_service).permit(:nom, :organisme, :type_organisme, :email, :telephone, :horaires, :adresse, :siret) + end + end +end diff --git a/app/views/instructeurs/groupe_instructeur_services/_form.html.haml b/app/views/instructeurs/groupe_instructeur_services/_form.html.haml new file mode 100644 index 00000000000..98352e46e07 --- /dev/null +++ b/app/views/instructeurs/groupe_instructeur_services/_form.html.haml @@ -0,0 +1,39 @@ += form_with url: instructeur_groupe_groupe_instructeur_service_path, model: @service, local: true do |f| + + = render Dsfr::InputComponent.new(form: f, attribute: :nom, input_type: :text_field) + + = render Dsfr::InputComponent.new(form: f, attribute: :organisme, input_type: :text_field) + + .fr-input-group + = f.label :type_organisme, class: "fr-label" do + Type d’organisme + + = f.select :type_organisme, Service.type_organismes.keys.map { |key| [ I18n.t("type_organisme.#{key}"), key] }, {}, class: 'fr-select' + + = render Dsfr::InputComponent.new(form: f, attribute: :siret, input_type: :text_field, opts: { placeholder: "14 chiffres, sans espace" }) do |c| + - c.with_hint do + = "Indiquez le numéro de SIRET de l’organisme dont ce service dépend. Rechercher le SIRET sur " + = link_to("annuaire-entreprises.data.gouv.fr", annuaire_link, **external_link_attributes) + + = render Dsfr::CalloutComponent.new(title: "Informations de contact") do |c| + - c.body do + Votre démarche sera hébergée par #{APPLICATION_NAME} – mais nous ne pouvons pas assurer le support des démarches. Et malgré la dématérialisation, les usagers se poseront parfois des questions légitimes sur le processus administratif. + %br + %br + %strong Il est donc indispensable que les usagers puissent vous contacter + par le moyen de leur choix s’ils ont des questions sur votre démarche. + %br + %br + Ces informations de contact seront visibles par les utilisateurs de la démarche, affichées dans le menu « Aide », ainsi qu’en pied de page lors du dépôt d’un dossier. En cas d’informations invalides, #{APPLICATION_NAME} se réserve le droit de suspendre la publication de la démarche. + + = render Dsfr::InputComponent.new(form: f, attribute: :email, input_type: :email_field) + = render Dsfr::InputComponent.new(form: f, attribute: :telephone, input_type: :telephone_field) + = render Dsfr::InputComponent.new(form: f, attribute: :horaires, input_type: :text_area) + = render Dsfr::InputComponent.new(form: f, attribute: :adresse, input_type: :text_area) + + - if procedure_id.present? + = hidden_field_tag :procedure_id, procedure_id + + .sticky-action-footer + = f.submit "Enregistrer", class: "fr-btn fr-mr-2w" + = link_to "Annuler", instructeur_groupe_path(@groupe_instructeur, procedure_id: procedure_id), class: "fr-btn fr-btn--secondary" diff --git a/app/views/instructeurs/groupe_instructeur_services/new.html.haml b/app/views/instructeurs/groupe_instructeur_services/new.html.haml new file mode 100644 index 00000000000..2d21a03e449 --- /dev/null +++ b/app/views/instructeurs/groupe_instructeur_services/new.html.haml @@ -0,0 +1,10 @@ += render partial: 'administrateurs/breadcrumbs', + locals: { steps: [[@procedure.libelle.truncate_words(10), instructeur_procedure_path(@procedure)], + ['Groupes d’instructeurs', instructeur_groupes_path(@procedure)], + [@groupe_instructeur.label, instructeur_groupe_path(@groupe_instructeur, procedure_id: @procedure.id) ], + ['Service']]} +.container + %h1 Nouveau Service + + = render partial: 'form', + locals: { service: @service, procedure_id: @procedure.id } diff --git a/app/views/instructeurs/groupe_instructeurs/show.html.haml b/app/views/instructeurs/groupe_instructeurs/show.html.haml index ef16232c24e..30eaec3fdfa 100644 --- a/app/views/instructeurs/groupe_instructeurs/show.html.haml +++ b/app/views/instructeurs/groupe_instructeurs/show.html.haml @@ -48,3 +48,9 @@ class: 'button' } = paginate @instructeurs, views_prefix: 'shared' + .card.mt-2 + .card-title Informations de contact + - if @groupe_instructeur.groupe_instructeur_service.nil? + = "Le groupe #{@groupe_instructeur.label} n'a pas de service associé. Les informations de contact affichées à l'usager seront celles du service de la procédure" + %p.mt-3 + = link_to "+ Nouveau service", new_instructeur_groupe_groupe_instructeur_service_path(procedure_id: @procedure.id, groupe_id: @groupe_instructeur.id), class: "fr-btn" diff --git a/config/locales/models/service/en.yml b/config/locales/models/service/en.yml index a28cd43a5e0..4f94208ac5c 100644 --- a/config/locales/models/service/en.yml +++ b/config/locales/models/service/en.yml @@ -11,9 +11,10 @@ en: telephone: 'Phone' errors: models: - service: + service: &service attributes: siret: format: "SIRET number %{message}" length: "must contain exactly 14 digits" checksum: "is invalid" + groupe_instructeur_service: *service diff --git a/config/locales/models/service/fr.yml b/config/locales/models/service/fr.yml index 40b6a2e0b41..7f6678f9826 100644 --- a/config/locales/models/service/fr.yml +++ b/config/locales/models/service/fr.yml @@ -30,12 +30,13 @@ fr: errors: models: - service: + service: &service attributes: siret: format: "Le numéro SIRET %{message}" length: "doit comporter exactement 14 chiffres" checksum: "est invalide" + groupe_instructeur_service: *service type_organisme: administration_centrale: 'Administration centrale' association: 'Association' diff --git a/config/routes.rb b/config/routes.rb index eb74b18a690..f2c38a5b986 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -394,6 +394,7 @@ resources :archives, only: [:index, :create] resources :groupes, only: [:index, :show], controller: 'groupe_instructeurs' do + resource :groupe_instructeur_service member do post 'add_instructeur' delete 'remove_instructeur' diff --git a/spec/controllers/instructeurs/groupe_instructeur_services_controller_spec.rb b/spec/controllers/instructeurs/groupe_instructeur_services_controller_spec.rb new file mode 100644 index 00000000000..e00bb50e4f6 --- /dev/null +++ b/spec/controllers/instructeurs/groupe_instructeur_services_controller_spec.rb @@ -0,0 +1,65 @@ +describe Instructeurs::GroupeInstructeurServicesController, type: :controller do + let(:instructeur) { create(:instructeur) } + let(:procedure) { create(:procedure) } + let(:assign_to) { create(:assign_to, instructeur: instructeur, groupe_instructeur: build(:groupe_instructeur, procedure: procedure)) } + let(:gi) { assign_to.groupe_instructeur } + + before do + sign_in(instructeur.user) + end + + describe '#create' do + context 'when submitting a new service' do + let(:params) do + { + groupe_instructeur_service: { + nom: 'super service', + organisme: 'organisme', + type_organisme: 'association', + email: 'email@toto.com', + telephone: '1234', + horaires: 'horaires', + adresse: 'adresse', + siret: "35600082800018" + }, + procedure_id: procedure.id, + groupe_id: gi.id + } + end + + it do + post :create, params: params + expect(flash.alert).to be_nil + expect(flash.notice).to eq('Le service super service a bien été créé') + expect(GroupeInstructeurService.last.nom).to eq('super service') + expect(GroupeInstructeurService.last.organisme).to eq('organisme') + expect(GroupeInstructeurService.last.type_organisme).to eq(Service.type_organismes.fetch(:association)) + expect(GroupeInstructeurService.last.email).to eq('email@toto.com') + expect(GroupeInstructeurService.last.telephone).to eq('1234') + expect(GroupeInstructeurService.last.horaires).to eq('horaires') + expect(GroupeInstructeurService.last.adresse).to eq('adresse') + expect(GroupeInstructeurService.last.siret).to eq('35600082800018') + end + end + + context 'when submitting an invalid service' do + before do + post :create, params: params + end + + let(:params) { + { + groupe_instructeur_service: { + nom: 'super service' + }, + procedure_id: procedure.id, + groupe_id: gi.id + } + } + + it { expect(flash.alert).not_to be_nil } + it { expect(response).to render_template(:new) } + it { expect(assigns(:service).nom).to eq('super service') } + end + end +end