Merge pull request #9244 from demarches-simplifiees/refactor-routing-update

Tech : mise à jour du routage sans callback
This commit is contained in:
Eric Leroy-Terquem 2023-07-04 09:39:00 +00:00 committed by GitHub
commit f959450477
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 79 additions and 44 deletions

View file

@ -43,11 +43,12 @@ module Administrateurs
tdc_options = tdc.options["drop_down_options"].reject(&:empty?)
tdc_options.each do |option_label|
gi = procedure.groupe_instructeurs.find_by({ label: option_label }) || procedure.groupe_instructeurs
gi = @procedure.groupe_instructeurs.find_by({ label: option_label }) || @procedure.groupe_instructeurs
.create({ label: option_label, instructeurs: [current_administrateur.instructeur] })
gi.update(routing_rule: ds_eq(champ_value(stable_id), constant(gi.label)))
end
@procedure.toggle_routing
defaut = @procedure.defaut_groupe_instructeur
if !tdc_options.include?(defaut.label)
@ -59,7 +60,7 @@ module Administrateurs
end
flash.notice = 'Les groupes instructeurs ont été ajoutés'
redirect_to admin_procedure_groupe_instructeurs_path(procedure)
redirect_to admin_procedure_groupe_instructeurs_path(@procedure)
end
def wizard
@ -68,6 +69,8 @@ module Administrateurs
procedure.groupe_instructeurs
.create({ label: new_label, instructeurs: [current_administrateur.instructeur] })
procedure.toggle_routing
redirect_to admin_procedure_groupe_instructeurs_path(procedure)
elsif params[:choice][:state] == 'routage_simple'
redirect_to simple_routing_admin_procedure_groupe_instructeurs_path
@ -77,7 +80,7 @@ module Administrateurs
def destroy_all_groups_but_defaut
reaffecter_all_dossiers_to_defaut_groupe
procedure.groupe_instructeurs_but_defaut.each(&:destroy!)
procedure.update!(routing_enabled: false, instructeurs_self_management_enabled: false)
procedure.update!(routing_enabled: false)
procedure.defaut_groupe_instructeur.update!(
routing_rule: nil,
label: GroupeInstructeur::DEFAUT_LABEL,
@ -100,6 +103,7 @@ module Administrateurs
.new({ instructeurs: [current_administrateur.instructeur] }.merge(groupe_instructeur_params))
if @groupe_instructeur.save
procedure.toggle_routing
routing_notice = " et le routage a été activé" if procedure.groupe_instructeurs.active.size == 2
redirect_to admin_procedure_groupe_instructeur_path(procedure, @groupe_instructeur),
notice: "Le groupe dinstructeurs « #{@groupe_instructeur.label} » a été créé#{routing_notice}."
@ -117,6 +121,7 @@ module Administrateurs
@groupe_instructeur = groupe_instructeur
if @groupe_instructeur.update(groupe_instructeur_params)
procedure.toggle_routing
redirect_to admin_procedure_groupe_instructeur_path(procedure, groupe_instructeur),
notice: "Le nom est à présent « #{@groupe_instructeur.label} »."
else
@ -161,10 +166,7 @@ module Administrateurs
else
@groupe_instructeur.destroy!
if procedure.groupe_instructeurs.active.one?
procedure.update!(
routing_enabled: false,
instructeurs_self_management_enabled: false
)
procedure.toggle_routing
procedure.defaut_groupe_instructeur.update!(
routing_rule: nil,
label: GroupeInstructeur::DEFAUT_LABEL,

View file

@ -26,6 +26,7 @@ module Mutations
.build(label: groupe_instructeur.label, closed: groupe_instructeur.closed, instructeurs: [current_administrateur.instructeur].compact)
if groupe_instructeur.save
groupe_instructeur.procedure.toggle_routing
# ugly hack to keep retro compatibility
# do not judge

View file

@ -11,6 +11,7 @@ module Mutations
def resolve(groupe_instructeur:, label: nil, closed: nil)
if groupe_instructeur.update({ label:, closed: }.compact)
groupe_instructeur.procedure.toggle_routing
# ugly hack to keep retro compatibility
# do not judge

View file

@ -35,7 +35,6 @@ class GroupeInstructeur < ApplicationRecord
end
before_validation -> { label&.strip! }
after_save :toggle_routing
scope :without_group, -> (group) { where.not(id: group) }
scope :for_api_v2, -> { includes(procedure: [:administrateurs]) }
@ -119,10 +118,5 @@ class GroupeInstructeur < ApplicationRecord
routing_rule.right.value.in?(routing_tdc.options['drop_down_options'])
end
def toggle_routing
procedure.update!(routing_enabled: procedure.groupe_instructeurs.active.many?)
procedure.update!(instructeurs_self_management_enabled: true) if procedure.routing_enabled?
end
serialize :routing_rule, LogicSerializer
end

View file

@ -720,6 +720,10 @@ class Procedure < ApplicationRecord
revisions.size - 2
end
def instructeurs_self_management?
routing_enabled? || instructeurs_self_management_enabled?
end
def defaut_groupe_instructeur_for_new_dossier
if !routing_enabled? || feature_enabled?(:procedure_routage_api)
defaut_groupe_instructeur
@ -968,6 +972,10 @@ class Procedure < ApplicationRecord
active_revision.types_de_champ_public.where.not(condition: nil).filter(&:piece_justificative?)
end
def toggle_routing
update!(routing_enabled: self.groupe_instructeurs.active.many?)
end
private
def validate_auto_archive_on_in_the_future

View file

@ -16,6 +16,7 @@ class InstructeursImportService
if missing_labels.present?
created_at = Time.zone.now
GroupeInstructeur.create!(missing_labels.map { |label| { procedure_id: procedure.id, label:, created_at:, updated_at: created_at } })
procedure.toggle_routing
end
emails_in_groupe = groupes_emails

View file

@ -7,7 +7,7 @@
|
= link_to t('instructeurs.dossiers.header.banner.statistics'), stats_instructeur_procedure_path(procedure), class: 'header-link'
- if procedure.instructeurs_self_management_enabled?
- if procedure.instructeurs_self_management?
|
- if can_manage_groupe_instructeurs?(procedure)
= link_to t('instructeurs.dossiers.header.banner.instructeurs'), admin_procedure_groupe_instructeurs_path(procedure), class: 'header-link'

View file

@ -3,13 +3,13 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
include Logic
let(:admin) { create(:administrateur) }
let(:procedure) { create(:procedure, :published, :for_individual, administrateurs: [admin]) }
let(:procedure) { create(:procedure, :routee, :published, :for_individual, administrateurs: [admin]) }
let!(:gi_1_1) { procedure.defaut_groupe_instructeur }
let!(:gi_1_2) { procedure.groupe_instructeurs.create(label: 'groupe instructeur 2') }
let!(:gi_1_2) { procedure.defaut_groupe_instructeur.other_groupe_instructeurs.first }
let(:procedure2) { create(:procedure, :published) }
let!(:gi_2_2) { procedure2.groupe_instructeurs.create(label: 'groupe instructeur 2 2') }
let(:procedure2) { create(:procedure, :routee, :published) }
let!(:gi_2_2) { procedure2.defaut_groupe_instructeur.other_groupe_instructeurs.first }
before { sign_in(admin.user) }
@ -24,11 +24,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
expect(response).to have_http_status(:ok)
expect(response.body).to include(gi_1_1.label)
expect(response.body).to include(gi_1_2.label)
expect(response.body).not_to include(gi_2_2.label)
end
context 'when there is a search' do
let(:params) { { procedure_id: procedure.id, q: '2' } }
let(:params) { { procedure_id: procedure.id, q: 'deuxième' } }
it do
expect(assigns(:groupes_instructeurs)).to match_array([gi_1_2])
@ -150,7 +149,7 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
context 'with many groups' do
context 'of a group that can be deleted' do
before { delete_group gi_1_2 }
it { expect(flash.notice).to eq "le groupe « groupe instructeur 2 » a été supprimé et le routage a été désactivé." }
it { expect(flash.notice).to eq "le groupe « deuxième groupe » a été supprimé et le routage a été désactivé." }
it { expect(procedure.groupe_instructeurs.count).to eq(1) }
it { expect(procedure.reload.routing_enabled?).to eq(false) }
it { expect(response).to redirect_to(admin_procedure_groupe_instructeurs_path(procedure)) }
@ -168,7 +167,7 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
end
describe '#reaffecter_dossiers' do
let!(:gi_1_3) { procedure.groupe_instructeurs.create(label: 'groupe instructeur 3') }
let!(:gi_1_3) { create(:groupe_instructeur, label: 'groupe instructeur 3', procedure: procedure) }
before do
get :reaffecter_dossiers,
@ -189,7 +188,7 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
end
describe '#reaffecter' do
let!(:gi_1_3) { procedure.groupe_instructeurs.create(label: 'groupe instructeur 3') }
let!(:gi_1_3) { create(:groupe_instructeur, label: 'groupe instructeur 3', procedure: procedure) }
let!(:dossier12) { create(:dossier, :en_construction, :with_individual, procedure: procedure, groupe_instructeur: gi_1_1) }
let!(:instructeur) { create(:instructeur) }
let!(:bulk_message) { BulkMessage.create(dossier_count: 2, dossier_state: "brouillon", body: "hello", sent_at: Time.zone.now, groupe_instructeurs: [gi_1_1, gi_1_3], instructeur: instructeur) }
@ -255,7 +254,7 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
end
context 'when the name is already taken' do
let!(:gi_1_2) { procedure_non_routee.groupe_instructeurs.create(label: 'groupe instructeur 2') }
let!(:gi_1_2) { procedure_non_routee.groupe_instructeurs.create(label: 'deuxième groupe') }
let(:new_name) { gi_1_2.label }
it do
@ -269,7 +268,7 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
let(:closed_value) { '0' }
let!(:procedure_non_routee) { create(:procedure, :published, :for_individual, administrateurs: [admin]) }
let!(:gi_1_1) { procedure_non_routee.defaut_groupe_instructeur }
let!(:gi_1_2) { procedure_non_routee.groupe_instructeurs.create(label: 'groupe instructeur 2') }
let!(:gi_1_2) { procedure_non_routee.groupe_instructeurs.create(label: 'deuxième groupe') }
before do
patch :update_state,
@ -299,7 +298,7 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
it do
expect(subject).to redirect_to admin_procedure_groupe_instructeur_path(procedure_non_routee, gi_1_2)
expect(gi_1_2.closed).to eq(true)
expect(flash.notice).to eq('Le groupe groupe instructeur 2 est désactivé.')
expect(flash.notice).to eq('Le groupe deuxième groupe est désactivé.')
end
end
end
@ -524,7 +523,7 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
subject
end
it { expect(procedure.groupe_instructeurs.pluck(:label)).to match_array(["Auvergne-Rhône-Alpes", "Vendée", "défaut", "groupe instructeur 2"]) }
it { expect(procedure.groupe_instructeurs.pluck(:label)).to match_array(["Auvergne-Rhône-Alpes", "Vendée", "défaut", "deuxième groupe"]) }
it { expect(flash.notice).to be_present }
it { expect(flash.notice).to eq("La liste des instructeurs a été importée avec succès") }
it { expect(GroupeInstructeurMailer).to have_received(:notify_added_instructeurs).twice }
@ -685,7 +684,7 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
it 'generates a CSV file containing the instructeurs and groups' do
expect(subject.status).to eq(200)
expect(subject.stream.body.split("\n").size).to eq(3)
expect(subject.stream.body).to include("groupe instructeur 2")
expect(subject.stream.body).to include("deuxième groupe")
expect(subject.stream.body).to include(instructeur_assigned_1.email)
expect(subject.stream.body).to include(instructeur_assigned_2.email)
expect(subject.header["Content-Disposition"]).to include("#{procedure.id}-groupe-instructeurs-#{Date.today}.csv")
@ -711,6 +710,28 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
expect(flash.notice).to eq 'Les groupes instructeurs ont été ajoutés'
expect(procedure3.groupe_instructeurs.pluck(:label)).to match_array(['Paris', 'Lyon', 'Marseille'])
expect(procedure3.reload.defaut_groupe_instructeur.routing_rule).to eq(ds_eq(champ_value(drop_down_tdc.stable_id), constant('Lyon')))
expect(procedure3.routing_enabled).to be_truthy
end
end
describe '#wizard' do
let!(:procedure4) do
create(:procedure,
types_de_champ_public: [
{ type: :drop_down_list, libelle: 'Votre ville', options: ['Paris', 'Lyon', 'Marseille'] },
{ type: :text, libelle: 'Un champ texte' }
],
administrateurs: [admin])
end
let!(:drop_down_tdc) { procedure4.draft_revision.types_de_champ.first }
before { patch :wizard, params: { procedure_id: procedure4.id, choice: { state: 'routage_custom' } } }
it do
expect(response).to redirect_to(admin_procedure_groupe_instructeurs_path(procedure4))
expect(procedure4.groupe_instructeurs.pluck(:label)).to match_array(['défaut', 'défaut bis'])
expect(procedure4.reload.routing_enabled).to be_truthy
end
end
end

View file

@ -5,7 +5,7 @@ describe Administrateurs::RoutingController, type: :controller do
describe '#update targeted champ' do
let(:procedure) { create(:procedure, types_de_champ_public: [{ type: :drop_down_list, libelle: 'Votre ville', options: ['Paris', 'Lyon', 'Marseille'] }, { type: :text, libelle: 'Un champ texte' }]) }
let(:gi_2) { procedure.groupe_instructeurs.create(label: 'groupe 2') }
let(:gi_2) { create(:groupe_instructeur, label: 'groupe 2', procedure: procedure) }
let(:drop_down_tdc) { procedure.draft_revision.types_de_champ.first }
let(:params) do
{
@ -52,7 +52,7 @@ describe Administrateurs::RoutingController, type: :controller do
describe "#update_defaut_groupe_instructeur" do
let(:procedure) { create(:procedure) }
let(:gi_2) { procedure.groupe_instructeurs.create(label: 'groupe 2') }
let(:gi_2) { create(:groupe_instructeur, label: 'groupe 2', procedure: procedure) }
let(:params) do
{
procedure_id: procedure.id,

View file

@ -1193,7 +1193,8 @@ describe API::V2::GraphqlController do
end
context "should changer groupe instructeur" do
let!(:new_groupe_instructeur) { procedure.groupe_instructeurs.create(label: 'new groupe instructeur') }
let!(:new_groupe_instructeur) { create(:groupe_instructeur, label: 'new groupe instructeur', procedure: procedure) }
let(:query) do
"mutation {
dossierChangerGroupeInstructeur(input: {

View file

@ -4,10 +4,10 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do
let(:instructeur) { create(:instructeur) }
let(:procedure) { create(:procedure, :published) }
let!(:gi_1_1) { procedure.defaut_groupe_instructeur }
let!(:gi_1_2) { procedure.groupe_instructeurs.create(label: 'groupe instructeur 2') }
let!(:gi_1_2) { create(:groupe_instructeur, label: 'groupe instructeur 2', procedure: procedure) }
let(:procedure2) { create(:procedure, :published) }
let!(:gi_2_2) { procedure2.groupe_instructeurs.create(label: 'groupe instructeur 2 2') }
let!(:gi_2_2) { create(:groupe_instructeur, label: 'groupe instructeur 2 2', procedure: procedure2) }
before do
gi_1_2.instructeurs << instructeur

View file

@ -241,8 +241,9 @@ describe Instructeurs::ProceduresController, type: :controller do
describe "#show" do
let(:instructeur) { create(:instructeur) }
let!(:procedure) { create(:procedure, :expirable, instructeurs: [instructeur]) }
let!(:gi_2) { procedure.groupe_instructeurs.create(label: '2') }
let!(:gi_3) { procedure.groupe_instructeurs.create(label: '3') }
let!(:gi_2) { create(:groupe_instructeur, label: '2', procedure: procedure) }
let!(:gi_3) { create(:groupe_instructeur, label: '3', procedure: procedure) }
let(:statut) { nil }
subject do

View file

@ -5,6 +5,10 @@ FactoryBot.define do
label { generate(:groupe_label) }
association :procedure
after(:create) do |groupe_instructeur, _evaluator|
groupe_instructeur.procedure.toggle_routing
end
trait :default do
label { GroupeInstructeur::DEFAUT_LABEL }
end

View file

@ -129,7 +129,7 @@ FactoryBot.define do
trait :routee do
after(:create) do |procedure, _evaluator|
procedure.groupe_instructeurs.create(label: 'deuxième groupe')
create(:groupe_instructeur, label: 'deuxième groupe', procedure: procedure)
end
end

View file

@ -78,8 +78,9 @@ describe TagsSubstitutionConcern, type: :model do
let!(:dossier) { create(:dossier, procedure: procedure, individual: individual, etablissement: etablissement, state: state) }
context 'and the dossier has a groupe instructeur' do
label = 'Ville de Bordeaux'
let(:gi) { create(:groupe_instructeur, label: label, procedure: procedure) }
before do
gi = procedure.groupe_instructeurs.create(label: label)
gi.dossiers << dossier
dossier.update(groupe_instructeur: gi)
dossier.reload

View file

@ -573,8 +573,8 @@ describe Instructeur, type: :model do
let(:instructeur_3) { create(:instructeur) }
let(:procedure) { create(:procedure, instructeurs: [instructeur_2, instructeur_3], procedure_expires_when_termine_enabled: true) }
let(:gi_1) { procedure.defaut_groupe_instructeur }
let(:gi_2) { procedure.groupe_instructeurs.create(label: '2') }
let(:gi_3) { procedure.groupe_instructeurs.create(label: '3') }
let(:gi_2) { create(:groupe_instructeur, label: '2', procedure: procedure) }
let(:gi_3) { create(:groupe_instructeur, label: '3', procedure: procedure) }
subject do
instructeur_2.dossiers_count_summary([gi_1.id, gi_2.id])

View file

@ -62,8 +62,8 @@ describe ProcedureOverview, type: :model do
end
describe 'with a procedure routee' do
let!(:gi_2) { procedure.groupe_instructeurs.create(label: 'groupe instructeur 2') }
let!(:gi_3) { procedure.groupe_instructeurs.create(label: 'groupe instructeur 3') }
let!(:gi_2) { create(:groupe_instructeur, label: 'groupe instructeur 2', procedure: procedure) }
let!(:gi_3) { create(:groupe_instructeur, label: 'groupe instructeur 3', procedure: procedure) }
def create_dossier_in_group(g)
create(:dossier, procedure: procedure, created_at: monday, state: Dossier.states.fetch(:en_instruction), groupe_instructeur: g)

View file

@ -784,8 +784,8 @@ describe ProcedurePresentation do
context 'for groupe_instructeur table' do
let(:filter) { [{ 'table' => 'groupe_instructeur', 'column' => 'id', 'value' => procedure.defaut_groupe_instructeur.id.to_s }] }
let!(:gi_2) { procedure.groupe_instructeurs.create(label: 'gi2') }
let!(:gi_3) { procedure.groupe_instructeurs.create(label: 'gi3') }
let!(:gi_2) { create(:groupe_instructeur, label: 'gi2', procedure: procedure) }
let!(:gi_3) { create(:groupe_instructeur, label: 'gi3', procedure: procedure) }
let!(:kept_dossier) { create(:dossier, :en_construction, procedure: procedure) }
let!(:discarded_dossier) { create(:dossier, :en_construction, procedure: procedure, groupe_instructeur: gi_2) }

View file

@ -119,7 +119,7 @@ describe ProcedureExportService do
end
context 'with a procedure routee' do
before { procedure.groupe_instructeurs.create(label: '2') }
before { create(:groupe_instructeur, label: '2', procedure: procedure) }
let(:routee_headers) { nominal_headers.insert(nominal_headers.index('textarea'), 'Groupe instructeur') }