commit
5b301353f0
12 changed files with 128 additions and 104 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
class AddExpertsRequireAdministrateurInvitationToProcedures < ActiveRecord::Migration[6.1]
|
||||||
|
def change
|
||||||
|
add_column :procedures, :experts_require_administrateur_invitation, :boolean, default: false
|
||||||
|
end
|
||||||
|
end
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue