instructeur can create contact information for groupe instructeur

This commit is contained in:
Christophe Robillard 2023-08-12 11:13:08 +02:00
parent 46dec40543
commit ba0d3fa678
7 changed files with 140 additions and 1 deletions

View file

@ -0,0 +1,30 @@
module Instructeurs
class ContactInformationsController < InstructeurController
def new
assign_procedure_and_groupe_instructeur
@contact_information = @groupe_instructeur.build_contact_information
end
def create
assign_procedure_and_groupe_instructeur
@contact_information = @groupe_instructeur.build_contact_information(contact_information_params)
if @contact_information.save
redirect_to instructeur_groupe_path(@groupe_instructeur, procedure_id: @procedure.id), notice: "Les informations de contact ont bien été ajoutées"
else
flash[:alert] = @contact_information.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 contact_information_params
params.require(:contact_information).permit(:nom, :email, :telephone, :horaires, :adresse)
end
end
end

View file

@ -0,0 +1,32 @@
= form_with url: instructeur_groupe_contact_information_path, model: @contact_information, local: true do |f|
= render Dsfr::CalloutComponent.new(title: "Informations de contact") do |c|
- c.body do
Votre démarche est 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 posent 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 sils 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 quen pied de page lors du dépôt dun dossier.
%br
%br
⚠️ En cas dinformations invalides, #{APPLICATION_NAME} se réserve le droit de suspendre la publication de la démarche.
= render Dsfr::InputComponent.new(form: f, attribute: :nom, input_type: :text_field) do |c|
- c.with_hint do
Indiquez le nom à utiliser pour contacter le groupe instructeur
(Exemple: Secrétariat de la Mairie)
= 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"

View file

@ -0,0 +1,10 @@
= render partial: 'administrateurs/breadcrumbs',
locals: { steps: [[@procedure.libelle.truncate_words(10), instructeur_procedure_path(@procedure)],
['Groupes dinstructeurs', instructeur_groupes_path(@procedure)],
[@groupe_instructeur.label, instructeur_groupe_path(@groupe_instructeur, procedure_id: @procedure.id) ],
['Service']]}
.container
%h1 Informations de contact
= render partial: 'form',
locals: { contact_information: @contact_information, procedure_id: @procedure.id }

View file

@ -48,3 +48,9 @@
class: 'button' }
= paginate @instructeurs, views_prefix: 'shared'
.card.mt-2
.card-title Informations de contact
- if @groupe_instructeur.contact_information.nil?
= "Le groupe #{@groupe_instructeur.label} n'a pas d'informations de contact. Les informations de contact affichées à l'usager seront celles du service de la procédure"
%p.mt-3
= link_to "+ Ajouter des informations de contact", new_instructeur_groupe_contact_information_path(procedure_id: @procedure.id, groupe_id: @groupe_instructeur.id), class: "fr-btn"

View file

@ -5,7 +5,7 @@ fr:
one: 'Service'
other: 'Services'
attributes:
service:
service: &service
adresse: 'Adresse postale'
email: 'Email de contact'
telephone: 'Téléphone'
@ -27,6 +27,7 @@ fr:
Exemple : Du lundi au vendredi de 9h30 à 17h30, le samedi de 9h30 à 12h.
adresse: |
Indiquez ladresse à laquelle un usager peut vous contacter, par exemple sil nest pas en capacité de compléter son formulaire en ligne.
contact_information: *service
errors:
models:

View file

@ -394,6 +394,7 @@ Rails.application.routes.draw do
resources :archives, only: [:index, :create]
resources :groupes, only: [:index, :show], controller: 'groupe_instructeurs' do
resource :contact_information
member do
post 'add_instructeur'
delete 'remove_instructeur'

View file

@ -0,0 +1,59 @@
describe Instructeurs::ContactInformationsController, 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 contact_information' do
let(:params) do
{
contact_information: {
nom: 'super service',
email: 'email@toto.com',
telephone: '1234',
horaires: 'horaires',
adresse: 'adresse'
},
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('Les informations de contact ont bien été ajoutées')
expect(ContactInformation.last.nom).to eq('super service')
expect(ContactInformation.last.email).to eq('email@toto.com')
expect(ContactInformation.last.telephone).to eq('1234')
expect(ContactInformation.last.horaires).to eq('horaires')
expect(ContactInformation.last.adresse).to eq('adresse')
end
end
context 'when submitting an invalid contact_information' do
before do
post :create, params: params
end
let(:params) {
{
contact_information: {
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(:contact_information).nom).to eq('super service') }
end
end
end