Merge pull request #6113 from betagouv/main

2021-04-19-01
This commit is contained in:
Kara Diaby 2021-04-19 11:21:38 +02:00 committed by GitHub
commit 5b301353f0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 128 additions and 104 deletions

View file

@ -60,7 +60,7 @@ module Instructeurs
def avis def avis
@avis_seen_at = current_instructeur.follows.find_by(dossier: dossier)&.avis_seen_at @avis_seen_at = current_instructeur.follows.find_by(dossier: dossier)&.avis_seen_at
@avis = Avis.new @avis = Avis.new
if @dossier.procedure.feature_enabled?(:admin_affect_experts_to_avis) if @dossier.procedure.experts_require_administrateur_invitation?
@experts_emails = dossier.procedure.experts_procedures.where(revoked_at: nil).map(&:expert).map(&:email).sort @experts_emails = dossier.procedure.experts_procedures.where(revoked_at: nil).map(&:expert).map(&:email).sort
end end
end end

View file

@ -1,6 +1,6 @@
module NewAdministrateur module NewAdministrateur
class ProceduresController < AdministrateurController class ProceduresController < AdministrateurController
before_action :retrieve_procedure, only: [:champs, :annotations, :edit, :monavis, :update_monavis, :jeton, :update_jeton, :publication, :publish, :transfert, :allow_expert_review] before_action :retrieve_procedure, only: [:champs, :annotations, :edit, :monavis, :update_monavis, :jeton, :update_jeton, :publication, :publish, :transfert, :allow_expert_review, :experts_require_administrateur_invitation]
before_action :procedure_locked?, only: [:champs, :annotations] before_action :procedure_locked?, only: [:champs, :annotations]
ITEMS_PER_PAGE = 25 ITEMS_PER_PAGE = 25
@ -169,7 +169,7 @@ module NewAdministrateur
def allow_expert_review def allow_expert_review
@procedure.update!(allow_expert_review: !@procedure.allow_expert_review) @procedure.update!(allow_expert_review: !@procedure.allow_expert_review)
flash.notice = @procedure.allow_expert_review? ? "Avis externes activés" : "Avis externes désactivés" flash.notice = @procedure.allow_expert_review? ? "Avis externes activés" : "Avis externes désactivés"
redirect_to admin_procedure_path(@procedure) redirect_to admin_procedure_experts_path(@procedure)
end end
def transfer def transfer
@ -185,6 +185,12 @@ module NewAdministrateur
end end
end end
def experts_require_administrateur_invitation
@procedure.update!(experts_require_administrateur_invitation: !@procedure.experts_require_administrateur_invitation)
flash.notice = @procedure.experts_require_administrateur_invitation? ? "Les experts sont gérés par les administrateurs de la démarche" : "Les experts sont gérés par les instructeurs"
redirect_to admin_procedure_experts_path(@procedure)
end
private private
def apercu_tab def apercu_tab

View file

@ -20,6 +20,7 @@
# durees_conservation_required :boolean default(TRUE) # durees_conservation_required :boolean default(TRUE)
# euro_flag :boolean default(FALSE) # euro_flag :boolean default(FALSE)
# for_individual :boolean default(FALSE) # for_individual :boolean default(FALSE)
# experts_require_administrateur_invitation :boolean default(FALSE)
# hidden_at :datetime # hidden_at :datetime
# juridique_required :boolean default(TRUE) # juridique_required :boolean default(TRUE)
# libelle :string # libelle :string

View file

@ -1,4 +1,4 @@
- if @dossier.procedure.feature_enabled?(:admin_affect_experts_to_avis).blank? - if !@dossier.procedure.experts_require_administrateur_invitation?
%section.ask-avis %section.ask-avis
%h1.tab-title Inviter des personnes à donner leur avis %h1.tab-title Inviter des personnes à donner leur avis
%p.avis-notice Les invités pourront consulter le dossier, donner un avis et contribuer au fil de messagerie. Ils ne pourront pas modifier le dossier. %p.avis-notice Les invités pourront consulter le dossier, donner un avis et contribuer au fil de messagerie. Ils ne pourront pas modifier le dossier.

View file

@ -1,7 +1,7 @@
%section.ask-avis %section.ask-avis
%h1.tab-title Inviter des personnes à donner leur avis %h1.tab-title Inviter des personnes à donner leur avis
%p.avis-notice Les invités pourront consulter le dossier, donner un avis et contribuer au fil de messagerie. Ils ne pourront pas modifier le dossier. %p.avis-notice Les invités pourront consulter le dossier, donner un avis et contribuer au fil de messagerie. Ils ne pourront pas modifier le dossier.
- if @dossier.procedure.feature_enabled?(:admin_affect_experts_to_avis) - if @dossier.procedure.experts_require_administrateur_invitation
%p.avis-notice Choisissez des experts à qui vous souhaitez demander un avis parmi la liste prédéfinie par les administrateurs de la démarche %p.avis-notice Choisissez des experts à qui vous souhaitez demander un avis parmi la liste prédéfinie par les administrateurs de la démarche
- else - else
%p.avis-notice Entrez les adresses email des experts à qui vous souhaitez demander un avis %p.avis-notice Entrez les adresses email des experts à qui vous souhaitez demander un avis
@ -10,13 +10,13 @@
- hidden_field_id = SecureRandom.uuid - hidden_field_id = SecureRandom.uuid
= hidden_field_tag 'avis[emails]', nil, data: { uuid: hidden_field_id } = hidden_field_tag 'avis[emails]', nil, data: { uuid: hidden_field_id }
= react_component("ComboMultipleDropdownList", = react_component("ComboMultipleDropdownList",
options: @dossier.procedure.feature_enabled?(:admin_affect_experts_to_avis) ? @experts_emails : [], options: @dossier.procedure.experts_require_administrateur_invitation ? @experts_emails : [],
selected: [], selected: [],
disabled: [], disabled: [],
hiddenFieldId: hidden_field_id, hiddenFieldId: hidden_field_id,
label: 'avis_emails', label: 'avis_emails',
id: 'avis_emails', id: 'avis_emails',
acceptNewValues: @dossier.procedure.feature_enabled?(:admin_affect_experts_to_avis).blank?) acceptNewValues: !@dossier.procedure.experts_require_administrateur_invitation)
= f.text_area :introduction, rows: 3, value: avis.introduction || 'Bonjour, merci de me donner votre avis sur ce dossier.', required: true = f.text_area :introduction, rows: 3, value: avis.introduction || 'Bonjour, merci de me donner votre avis sur ce dossier.', required: true
%p.tab-title Ajouter une pièce jointe %p.tab-title Ajouter une pièce jointe
.form-group .form-group

View file

@ -9,59 +9,88 @@
.container.groupe-instructeur .container.groupe-instructeur
.card .card
.card-title Affecter des experts à la démarche .card-title Autoriser les instructeurs à solliciter des experts invités
= form_for :experts_procedure, %p.notice Si cette fonctionnalité est désactivée, les instructeurs ne pourront plus solliciter d'experts
url: admin_procedure_experts_path(@procedure), = form_for @procedure,
html: { class: 'form' } do |f| method: :put,
url: allow_expert_review_admin_procedure_path(@procedure),
html: { class: 'form procedure-form__column--form no-background' } do |f|
%label.toggle-switch
= f.check_box :allow_expert_review, class: 'toggle-switch-checkbox', onchange: 'this.form.submit()'
%span.toggle-switch-control.round
%span.toggle-switch-label.on
%span.toggle-switch-label.off
.instructeur-wrapper - if @procedure.allow_expert_review?
%p.notice Pendant l'instruction d'un dossier, les instructeurs peuvent demander leur avis à un ou plusieurs experts. .card
%p.notice Entrez les adresses email des experts que vous souhaitez affecter à cette démarche .card-title Gérer les experts invités de la démarche
- hidden_field_id = SecureRandom.uuid %p.notice Si cette fonctionnalité est activée, les instructeurs pourront uniquement inviter les experts de votre liste
= hidden_field_tag :emails, nil, data: { uuid: hidden_field_id } = form_for @procedure,
= react_component("ComboMultipleDropdownList", method: :put,
options: [], url: experts_require_administrateur_invitation_admin_procedure_path(@procedure),
selected: [], disabled: [], html: { class: 'form procedure-form__column--form no-background' } do |f|
hiddenFieldId: hidden_field_id, %label.toggle-switch
label: 'email expert', = f.check_box :experts_require_administrateur_invitation, class: 'toggle-switch-checkbox', onchange: 'this.form.submit()'
acceptNewValues: true) %span.toggle-switch-control.round
%span.toggle-switch-label.on
%span.toggle-switch-label.off
= f.submit 'Affecter à la démarche', class: 'button primary send' - if @procedure.experts_require_administrateur_invitation?
- if @experts_procedure.present? .card
%table.table.mt-2 .card-title Affecter des experts à la démarche
%thead = form_for :experts_procedure,
%tr url: admin_procedure_experts_path(@procedure),
%th Liste des experts html: { class: 'form' } do |f|
%th Nombre d'avis
- if @procedure.feature_enabled?(:admin_affect_experts_to_avis) .instructeur-wrapper
%th Notifier des décisions sur les dossiers %p.notice Pendant l'instruction d'un dossier, les instructeurs peuvent demander leur avis à un ou plusieurs experts.
%tbody %p.notice Entrez les adresses email des experts que vous souhaitez affecter à cette démarche
- @experts_procedure.each do |expert_procedure| - hidden_field_id = SecureRandom.uuid
%tr = hidden_field_tag :emails, nil, data: { uuid: hidden_field_id }
%td = react_component("ComboMultipleDropdownList",
%span.icon.person options: [],
= expert_procedure.expert.email selected: [], disabled: [],
%td.text-center hiddenFieldId: hidden_field_id,
= expert_procedure.avis.count label: 'email expert',
- if @procedure.feature_enabled?(:admin_affect_experts_to_avis) acceptNewValues: true)
%td.text-center
= form_for expert_procedure, = f.submit 'Affecter à la démarche', class: 'button primary send'
url: admin_procedure_expert_path(id: expert_procedure), - if @experts_procedure.present?
remote: true, %table.table.mt-2
method: :put, %thead
authenticity_token: true, %tr
html: { class: 'form procedure-form__column--form no-background' } do |f| %th Liste des experts
%label.toggle-switch %th Nombre d'avis
= f.check_box :allow_decision_access, class: 'toggle-switch-checkbox', onchange: 'this.form.submit()' - if @procedure.experts_require_administrateur_invitation
%span.toggle-switch-control.round %th Notifier des décisions sur les dossiers
%span.toggle-switch-label.on %tbody
%span.toggle-switch-label.off - @experts_procedure.each do |expert_procedure|
%td.actions= button_to 'retirer', %tr
admin_procedure_expert_path(id: expert_procedure, procedure: @procedure), %td
method: :delete, %span.icon.person
data: { confirm: "Êtes-vous sûr de vouloir révoquer l'expert « #{expert_procedure.expert.email} » de la démarche #{expert_procedure.procedure.libelle} ? Les instructeurs ne pourront plus lui demander d'avis" }, = expert_procedure.expert.email
class: 'button' %td.text-center
- else = expert_procedure.avis.count
.blank-tab - if @procedure.experts_require_administrateur_invitation
%h2.empty-text Aucun expert invité pour le moment. %td.text-center
%p.empty-text-details Les instructeurs de cette démarche n'ont pas encore fait appel aux experts. = form_for expert_procedure,
url: admin_procedure_expert_path(id: expert_procedure),
remote: true,
method: :put,
authenticity_token: true,
html: { class: 'form procedure-form__column--form no-background' } do |f|
%label.toggle-switch
= f.check_box :allow_decision_access, class: 'toggle-switch-checkbox', onchange: 'this.form.submit()'
%span.toggle-switch-control.round
%span.toggle-switch-label.on
%span.toggle-switch-label.off
- if @procedure.experts_require_administrateur_invitation
%td.actions= button_to 'retirer',
admin_procedure_expert_path(id: expert_procedure, procedure: @procedure),
method: :delete,
data: { confirm: "Êtes-vous sûr de vouloir révoquer l'expert « #{expert_procedure.expert.email} » de la démarche #{expert_procedure.procedure.libelle} ? Les instructeurs ne pourront plus lui demander d'avis" },
class: 'button'
- else
.blank-tab
%h2.empty-text Aucun expert invité pour le moment.
%p.empty-text-details Les instructeurs de cette démarche n'ont pas encore fait appel aux experts.

View file

@ -142,32 +142,16 @@
= link_to 'Modifier', edit_admin_procedure_attestation_template_path(@procedure), class: 'button' = link_to 'Modifier', edit_admin_procedure_attestation_template_path(@procedure), class: 'button'
.card-admin .card-admin
- if @procedure.allow_expert_review? %div
%div %span.icon.preview
%span.icon.accept %p.card-admin-status-todo À configurer
%p.card-admin-status-accept Activé
- else
%div
%span.icon.clock
%p.card-admin-status-todo Désactivée
%div %div
%p.card-admin-title Avis externes %p.card-admin-title Avis externes
%p.card-admin-subtitle Demander des avis aux experts invités %p.card-admin-subtitle Gérer les avis des experts invités
.card-admin-action .card-admin-action
= link_to "#{@procedure.allow_expert_review? ? 'Désactiver' : 'Activer'}", allow_expert_review_admin_procedure_path(@procedure), method: :put, class: 'button' = link_to "Modifier", admin_procedure_experts_path(@procedure), class: 'button'
- if @procedure.allow_expert_review?
.card-admin
%div
%span.icon.preview
%p.card-admin-status-todo À voir
%div
%p.card-admin-title Liste des experts
%p.card-admin-subtitle Liste des experts invités par les instructeurs
.card-admin-action
= link_to "Voir", admin_procedure_experts_path(@procedure), class: 'button'
.card-admin .card-admin

View file

@ -402,6 +402,7 @@ Rails.application.routes.draw do
get 'jeton' get 'jeton'
patch 'update_jeton' patch 'update_jeton'
put :allow_expert_review put :allow_expert_review
put :experts_require_administrateur_invitation
end end
get 'publication' => 'procedures#publication', as: :publication get 'publication' => 'procedures#publication', as: :publication

View file

@ -0,0 +1,5 @@
class AddExpertsRequireAdministrateurInvitationToProcedures < ActiveRecord::Migration[6.1]
def change
add_column :procedures, :experts_require_administrateur_invitation, :boolean, default: false
end
end

View file

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2021_04_12_092710) do ActiveRecord::Schema.define(version: 2021_04_16_074049) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@ -551,6 +551,7 @@ ActiveRecord::Schema.define(version: 2021_04_12_092710) do
t.bigint "draft_revision_id" t.bigint "draft_revision_id"
t.bigint "published_revision_id" t.bigint "published_revision_id"
t.boolean "allow_expert_review", default: true, null: false t.boolean "allow_expert_review", default: true, null: false
t.boolean "experts_require_administrateur_invitation", default: false
t.index ["declarative_with_state"], name: "index_procedures_on_declarative_with_state" t.index ["declarative_with_state"], name: "index_procedures_on_declarative_with_state"
t.index ["draft_revision_id"], name: "index_procedures_on_draft_revision_id" t.index ["draft_revision_id"], name: "index_procedures_on_draft_revision_id"
t.index ["hidden_at"], name: "index_procedures_on_hidden_at" t.index ["hidden_at"], name: "index_procedures_on_hidden_at"

View file

@ -37,4 +37,20 @@ describe 'new_administrateur/experts_procedures/index.html.haml', type: :view do
expect(@invited_experts).to match_array([avis.experts_procedure, avis2.experts_procedure]) expect(@invited_experts).to match_array([avis.experts_procedure, avis2.experts_procedure])
end end
end end
context 'when the experts_require_administrateur_invitation is false' do
it 'authorize instructors to invite any expert' do
expect(rendered).not_to have_content "Affecter des experts à la démarche"
end
end
context 'when the experts_require_administrateur_invitation is true' do
let!(:procedure) { create(:procedure, :published, experts_require_administrateur_invitation: true) }
before do
subject
end
it 'does not authorize instructors to invite any expert but only those presents in admin list' do
expect(rendered).to have_content "Affecter des experts à la démarche"
end
end
end end

View file

@ -55,24 +55,5 @@ describe 'new_administrateur/procedures/show.html.haml', type: :view do
it { expect(rendered).to have_css('#publish-procedure-link') } it { expect(rendered).to have_css('#publish-procedure-link') }
it { expect(rendered).to have_content('Réactiver') } it { expect(rendered).to have_content('Réactiver') }
end end
describe 'When procedure.allow_expert_review is true, the expert list card must be visible' do
before do
render
end
it { expect(procedure.allow_expert_review).to be_truthy }
it { expect(rendered).to have_content('Liste des experts invités par les instructeurs') }
end
describe 'When procedure.allow_expert_review is false, the expert list card must not be visible' do
before do
procedure.update!(allow_expert_review: false)
procedure.reload
render
end
it { expect(procedure.allow_expert_review).to be_falsy }
it { expect(rendered).not_to have_content('Liste des experts invités par les instructeurs') }
end
end end
end end