Skip to content

Commit

Permalink
Merge pull request #9425 from demarches-simplifiees/9356-service-gi
Browse files Browse the repository at this point in the history
ETQ Usager, je veux voir dans mon dossier les informations de contact de mon groupe instructeur
  • Loading branch information
krichtof authored Sep 11, 2023
2 parents 8bbd104 + 5b9fbf4 commit 5aabce4
Show file tree
Hide file tree
Showing 20 changed files with 429 additions and 5 deletions.
60 changes: 60 additions & 0 deletions app/controllers/instructeurs/contact_informations_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
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_groupe_instructeur("Les informations de contact ont bien été ajoutées")
else
flash[:alert] = @contact_information.errors.full_messages
render :new
end
end

def edit
assign_procedure_and_groupe_instructeur
@contact_information = @groupe_instructeur.contact_information
end

def update
assign_procedure_and_groupe_instructeur
@contact_information = @groupe_instructeur.contact_information
if @contact_information.update(contact_information_params)
redirect_to_groupe_instructeur("Les informations de contact ont bien été modifiées")
else
flash[:alert] = @contact_information.errors.full_messages
render :edit
end
end

def destroy
assign_procedure_and_groupe_instructeur
@groupe_instructeur.contact_information.destroy
redirect_to_groupe_instructeur("Les informations de contact ont bien été supprimées")
end

private

def redirect_to_groupe_instructeur(notice)
if params[:from_admin] == "true"
redirect_to admin_procedure_groupe_instructeur_path(@procedure, @groupe_instructeur), notice: notice
else
redirect_to instructeur_groupe_path(@procedure, @groupe_instructeur), notice: notice
end
end

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
17 changes: 17 additions & 0 deletions app/models/contact_information.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
class ContactInformation < ApplicationRecord
belongs_to :groupe_instructeur

validates :nom, presence: { message: 'doit être renseigné' }, allow_nil: false
validates :nom, uniqueness: { scope: :groupe_instructeur, message: 'existe déjà' }
validates :email, format: { with: Devise.email_regexp, message: "n'est pas valide" }, presence: { message: 'doit être renseigné' }, allow_nil: false
validates :telephone, phone: { possible: true, allow_blank: false }
validates :horaires, presence: { message: 'doivent être renseignés' }, allow_nil: false
validates :adresse, presence: { message: 'doit être renseignée' }, allow_nil: false
validates :groupe_instructeur, presence: { message: 'doit être renseigné' }, allow_nil: false

def telephone_url
if telephone.present?
"tel:#{telephone.gsub(/[[:blank:]]/, '')}"
end
end
end
4 changes: 4 additions & 0 deletions app/models/dossier.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1304,6 +1304,10 @@ def create_assignment(mode, previous_groupe_instructeur, groupe_instructeur, ins
)
end

def service
groupe_instructeur&.contact_information || procedure.service
end

private

def create_missing_traitemets
Expand Down
1 change: 1 addition & 0 deletions app/models/groupe_instructeur.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class GroupeInstructeur < ApplicationRecord
has_and_belongs_to_many :bulk_messages, dependent: :destroy

has_one :defaut_procedure, -> { with_discarded }, class_name: 'Procedure', foreign_key: :defaut_groupe_instructeur_id, dependent: :nullify, inverse_of: :defaut_groupe_instructeur
has_one :contact_information

validates :label, presence: true, allow_nil: false
validates :label, uniqueness: { scope: :procedure }
Expand Down
2 changes: 1 addition & 1 deletion app/models/procedure.rb
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,7 @@ def clone(admin, from_library)
dossier_submitted_message: []
}
}
include_list[:groupe_instructeurs] = :instructeurs if !is_different_admin
include_list[:groupe_instructeurs] = [:instructeurs, :contact_information] if !is_different_admin
procedure = self.deep_clone(include: include_list) do |original, kopy|
PiecesJustificativesService.clone_attachments(original, kopy)
end
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
.card.mt-2
.card-title Informations de contact
- service = groupe_instructeur.contact_information
- if service.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
- if groupe_instructeur.instructeurs.include?(current_administrateur.user.instructeur)
= link_to "+ Ajouter des informations de contact", new_instructeur_groupe_contact_information_path(procedure_id: procedure.id, groupe_id: groupe_instructeur.id, from_admin: true), class: "fr-btn"
- else
Si vous souhaitez créer un service pour ce groupe, vous devez faire partie du groupe instructeur
- else
%p.mt-3
- if groupe_instructeur.instructeurs.include?(current_administrateur.user.instructeur)
= link_to "Modifier les informations de contact", edit_instructeur_groupe_contact_information_path(procedure_id: procedure.id, groupe_id: groupe_instructeur.id, from_admin: true), class: "fr-btn"
- else
Si vous souhaitez modifier ce service, vous devez faire partie du groupe instructeur
%p.mt-3= service.nom
= render SimpleFormatComponent.new(service.adresse, class_names_map: {paragraph: 'fr-footer__content-desc'})
= service.email
- if service.telephone.present?
%p= service.telephone
- if service.horaires.present?
%p= service.horaires
3 changes: 3 additions & 0 deletions app/views/administrateurs/groupe_instructeurs/show.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,6 @@
instructeurs: @instructeurs,
available_instructeur_emails: @available_instructeur_emails,
disabled_as_super_admin: administrateur_as_manager? }
= render partial: 'administrateurs/groupe_instructeurs/contact_information',
locals: { procedure: @procedure,
groupe_instructeur: @groupe_instructeur }
39 changes: 39 additions & 0 deletions app/views/instructeurs/contact_informations/_form.html.haml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
= form_with url: instructeur_groupe_contact_information_path, model: @contact_information, local: true do |f|
= hidden_field_tag :from_admin, params[:from_admin]

= 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 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.
%br
%br
⚠️ 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: :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"
- if [ "edit", "update"].include? params[:action]
= link_to 'Supprimer',
instructeur_groupe_contact_information_path(procedure_id: @procedure.id, groupe_id: @groupe_instructeur.id),
method: :delete,
data: { confirm: "Confirmez vous la suppression de ces informations de contact ?" },
class: 'fr-btn fr-btn--secondary'
10 changes: 10 additions & 0 deletions app/views/instructeurs/contact_informations/edit.html.haml
Original file line number Diff line number Diff line change
@@ -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 Modifier les informations de contact

= render partial: 'form',
locals: { contact_information: @contact_information, procedure_id: @procedure.id }
10 changes: 10 additions & 0 deletions app/views/instructeurs/contact_informations/new.html.haml
Original file line number Diff line number Diff line change
@@ -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 Informations de contact

= render partial: 'form',
locals: { contact_information: @contact_information, procedure_id: @procedure.id }
17 changes: 17 additions & 0 deletions app/views/instructeurs/groupe_instructeurs/show.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,20 @@
class: 'button' }

= paginate @instructeurs, views_prefix: 'shared'
.card.mt-2
.card-title Informations de contact
- service = @groupe_instructeur.contact_information
- if service.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"
- else
%p.mt-3
= link_to "Modifier les informations de contact", edit_instructeur_groupe_contact_information_path(procedure_id: @procedure.id, groupe_id: @groupe_instructeur.id), class: "fr-btn"
%p.mt-3= service.nom
= render SimpleFormatComponent.new(service.adresse, class_names_map: {paragraph: 'fr-footer__content-desc'})
= service.email
- if service.telephone.present?
%p= service.telephone
- if service.horaires.present?
%p= service.horaires
3 changes: 2 additions & 1 deletion app/views/users/_procedure_footer.html.haml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
%footer.fr-footer.footer-procedure#footer{ role: "contentinfo" }
- service = procedure.service
- service = dossier&.service || procedure.service
.fr-footer__top.fr-mb-0
.fr-container
.fr-grid-row.fr-grid-row--start.fr-grid-row--gutters
Expand All @@ -21,6 +21,7 @@
= I18n.t('users.procedure_footer.contact.email.link')
= link_to service.email, "mailto:#{service.email}", class: "fr-footer__top-link"

- if service.present?
- if service.telephone.present? || service.horaires.present?
%li
- horaires = "#{I18n.t('users.procedure_footer.contact.schedule.prefix')}#{formatted_horaires(service.horaires)}"
Expand Down
3 changes: 2 additions & 1 deletion config/locales/models/service/fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ fr:
one: 'Service'
other: 'Services'
attributes:
service:
service: &service
adresse: 'Adresse postale'
email: 'Email de contact'
telephone: 'Téléphone'
Expand All @@ -27,6 +27,7 @@ fr:
Exemple : Du lundi au vendredi de 9h30 à 17h30, le samedi de 9h30 à 12h.
adresse: |
Indiquez l’adresse à laquelle un usager peut vous contacter, par exemple s’il n’est pas en capacité de compléter son formulaire en ligne.
contact_information: *service

errors:
models:
Expand Down
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,7 @@
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'
Expand Down
15 changes: 15 additions & 0 deletions db/migrate/20230809151357_create_contact_informations.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class CreateContactInformations < ActiveRecord::Migration[7.0]
def change
create_table :contact_informations do |t|
t.belongs_to :groupe_instructeur, null: false, foreign_key: true
t.text :adresse, null: false
t.string :email, null: false
t.text :horaires, null: false
t.string :nom, null: false
t.string :telephone, null: false

t.timestamps
end
add_index :contact_informations, [:groupe_instructeur_id, :nom], unique: true, name: 'index_contact_informations_on_gi_and_nom'
end
end
16 changes: 15 additions & 1 deletion db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema[7.0].define(version: 2023_08_02_161011) do
ActiveRecord::Schema[7.0].define(version: 2023_08_09_151357) do
# These are extensions that must be enabled in order to support this database
enable_extension "pgcrypto"
enable_extension "plpgsql"
Expand Down Expand Up @@ -612,6 +612,19 @@
t.index ["source"], name: "index_geo_areas_on_source"
end

create_table "contact_informations", force: :cascade do |t|
t.text "adresse", null: false
t.datetime "created_at", null: false
t.string "email", null: false
t.bigint "groupe_instructeur_id", null: false
t.text "horaires", null: false
t.string "nom", null: false
t.string "telephone", null: false
t.datetime "updated_at", null: false
t.index ["groupe_instructeur_id", "nom"], name: "index_contact_informations_on_gi_and_nom", unique: true
t.index ["groupe_instructeur_id"], name: "index_contact_informations_on_groupe_instructeur_id"
end

create_table "groupe_instructeurs", force: :cascade do |t|
t.boolean "closed", default: false
t.datetime "created_at", precision: 6, null: false
Expand Down Expand Up @@ -1044,6 +1057,7 @@
add_foreign_key "commentaires", "dossiers"
add_foreign_key "commentaires", "experts"
add_foreign_key "commentaires", "instructeurs"
add_foreign_key "contact_informations", "groupe_instructeurs"
add_foreign_key "dossier_assignments", "dossiers"
add_foreign_key "dossier_batch_operations", "batch_operations"
add_foreign_key "dossier_batch_operations", "dossiers"
Expand Down
Loading

0 comments on commit 5aabce4

Please sign in to comment.