Merge pull request #4310 from betagouv/instructeur_index_stats_and_groupe
Instructeur index stats and groupe
This commit is contained in:
commit
a3a47b8959
4 changed files with 84 additions and 30 deletions
|
@ -12,19 +12,20 @@ module Instructeurs
|
||||||
.includes(:defaut_groupe_instructeur)
|
.includes(:defaut_groupe_instructeur)
|
||||||
.order(archived_at: :desc, published_at: :desc, created_at: :desc)
|
.order(archived_at: :desc, published_at: :desc, created_at: :desc)
|
||||||
|
|
||||||
groupe_instructeurs = current_instructeur.groupe_instructeurs.where(procedure: @procedures)
|
dossiers = current_instructeur.dossiers.joins(:groupe_instructeur)
|
||||||
|
@dossiers_count_per_procedure = dossiers.all_state.group('groupe_instructeurs.procedure_id').reorder(nil).count
|
||||||
|
@dossiers_a_suivre_count_per_procedure = dossiers.without_followers.en_cours.group('groupe_instructeurs.procedure_id').reorder(nil).count
|
||||||
|
@dossiers_archived_count_per_procedure = dossiers.archived.group('groupe_instructeurs.procedure_id').count
|
||||||
|
@dossiers_termines_count_per_procedure = dossiers.termine.group('groupe_instructeurs.procedure_id').reorder(nil).count
|
||||||
|
|
||||||
dossiers = current_instructeur.dossiers
|
groupe_ids = current_instructeur.groupe_instructeurs.pluck(:id)
|
||||||
@dossiers_count_per_groupe_instructeur = dossiers.all_state.group(:groupe_instructeur_id).reorder(nil).count
|
|
||||||
@dossiers_a_suivre_count_per_groupe_instructeur = dossiers.without_followers.en_cours.group(:groupe_instructeur_id).reorder(nil).count
|
|
||||||
@dossiers_archived_count_per_groupe_instructeur = dossiers.archived.group(:groupe_instructeur_id).count
|
|
||||||
@dossiers_termines_count_per_groupe_instructeur = dossiers.termine.group(:groupe_instructeur_id).reorder(nil).count
|
|
||||||
|
|
||||||
@followed_dossiers_count_per_groupe_instructeur = current_instructeur
|
@followed_dossiers_count_per_procedure = current_instructeur
|
||||||
.followed_dossiers
|
.followed_dossiers
|
||||||
|
.joins(:groupe_instructeur)
|
||||||
.en_cours
|
.en_cours
|
||||||
.where(groupe_instructeur: groupe_instructeurs)
|
.where(groupe_instructeur_id: groupe_ids)
|
||||||
.group(:groupe_instructeur_id)
|
.group('groupe_instructeurs.procedure_id')
|
||||||
.reorder(nil)
|
.reorder(nil)
|
||||||
.count
|
.count
|
||||||
end
|
end
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
%li
|
%li
|
||||||
%object
|
%object
|
||||||
= link_to(instructeur_procedure_path(p, statut: 'a-suivre')) do
|
= link_to(instructeur_procedure_path(p, statut: 'a-suivre')) do
|
||||||
- a_suivre_count = @dossiers_a_suivre_count_per_groupe_instructeur[p.defaut_groupe_instructeur.id] || 0
|
- a_suivre_count = @dossiers_a_suivre_count_per_procedure[p.id] || 0
|
||||||
.stats-number
|
.stats-number
|
||||||
= a_suivre_count
|
= a_suivre_count
|
||||||
.stats-legend
|
.stats-legend
|
||||||
|
@ -29,7 +29,7 @@
|
||||||
= link_to(instructeur_procedure_path(p, statut: 'suivis')) do
|
= link_to(instructeur_procedure_path(p, statut: 'suivis')) do
|
||||||
- if current_instructeur.notifications_per_procedure[p.id].present?
|
- if current_instructeur.notifications_per_procedure[p.id].present?
|
||||||
%span.notifications{ 'aria-label': "notifications" }
|
%span.notifications{ 'aria-label': "notifications" }
|
||||||
- followed_count = @followed_dossiers_count_per_groupe_instructeur[p.defaut_groupe_instructeur.id] || 0
|
- followed_count = @followed_dossiers_count_per_procedure[p.id] || 0
|
||||||
.stats-number
|
.stats-number
|
||||||
= followed_count
|
= followed_count
|
||||||
.stats-legend
|
.stats-legend
|
||||||
|
@ -39,7 +39,7 @@
|
||||||
= link_to(instructeur_procedure_path(p, statut: 'traites')) do
|
= link_to(instructeur_procedure_path(p, statut: 'traites')) do
|
||||||
- if current_instructeur.notifications_per_procedure(:termine)[p.id].present?
|
- if current_instructeur.notifications_per_procedure(:termine)[p.id].present?
|
||||||
%span.notifications{ 'aria-label': "notifications" }
|
%span.notifications{ 'aria-label': "notifications" }
|
||||||
- termines_count = @dossiers_termines_count_per_groupe_instructeur[p.defaut_groupe_instructeur.id] || 0
|
- termines_count = @dossiers_termines_count_per_procedure[p.id] || 0
|
||||||
.stats-number
|
.stats-number
|
||||||
= termines_count
|
= termines_count
|
||||||
.stats-legend
|
.stats-legend
|
||||||
|
@ -47,7 +47,7 @@
|
||||||
%li
|
%li
|
||||||
%object
|
%object
|
||||||
= link_to(instructeur_procedure_path(p, statut: 'tous')) do
|
= link_to(instructeur_procedure_path(p, statut: 'tous')) do
|
||||||
- dossier_count = @dossiers_count_per_groupe_instructeur[p.defaut_groupe_instructeur.id] || 0
|
- dossier_count = @dossiers_count_per_procedure[p.id] || 0
|
||||||
.stats-number
|
.stats-number
|
||||||
= dossier_count
|
= dossier_count
|
||||||
.stats-legend
|
.stats-legend
|
||||||
|
@ -55,7 +55,7 @@
|
||||||
%li
|
%li
|
||||||
%object
|
%object
|
||||||
= link_to(instructeur_procedure_path(p, statut: 'archives')) do
|
= link_to(instructeur_procedure_path(p, statut: 'archives')) do
|
||||||
- archived_count = @dossiers_archived_count_per_groupe_instructeur[p.defaut_groupe_instructeur.id] || 0
|
- archived_count = @dossiers_archived_count_per_procedure[p.id] || 0
|
||||||
.stats-number
|
.stats-number
|
||||||
= archived_count
|
= archived_count
|
||||||
.stats-legend
|
.stats-legend
|
||||||
|
|
|
@ -125,11 +125,11 @@ describe Instructeurs::ProceduresController, type: :controller do
|
||||||
let(:state) { Dossier.states.fetch(:brouillon) }
|
let(:state) { Dossier.states.fetch(:brouillon) }
|
||||||
before { subject }
|
before { subject }
|
||||||
|
|
||||||
it { expect(assigns(:dossiers_count_per_groupe_instructeur)[procedure.defaut_groupe_instructeur.id]).to eq(nil) }
|
it { expect(assigns(:dossiers_count_per_procedure)[procedure.id]).to eq(nil) }
|
||||||
it { expect(assigns(:dossiers_a_suivre_count_per_groupe_instructeur)[procedure.defaut_groupe_instructeur.id]).to eq(nil) }
|
it { expect(assigns(:dossiers_a_suivre_count_per_procedure)[procedure.id]).to eq(nil) }
|
||||||
it { expect(assigns(:dossiers_archived_count_per_groupe_instructeur)[procedure.defaut_groupe_instructeur.id]).to eq(nil) }
|
it { expect(assigns(:dossiers_archived_count_per_procedure)[procedure.id]).to eq(nil) }
|
||||||
it { expect(assigns(:followed_dossiers_count_per_groupe_instructeur)[procedure.defaut_groupe_instructeur.id]).to eq(nil) }
|
it { expect(assigns(:followed_dossiers_count_per_procedure)[procedure.id]).to eq(nil) }
|
||||||
it { expect(assigns(:dossiers_termines_count_per_groupe_instructeur)[procedure.defaut_groupe_instructeur.id]).to eq(nil) }
|
it { expect(assigns(:dossiers_termines_count_per_procedure)[procedure.id]).to eq(nil) }
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with not draft state on multiple procedures" do
|
context "with not draft state on multiple procedures" do
|
||||||
|
@ -149,17 +149,67 @@ describe Instructeurs::ProceduresController, type: :controller do
|
||||||
subject
|
subject
|
||||||
end
|
end
|
||||||
|
|
||||||
it { expect(assigns(:dossiers_count_per_groupe_instructeur)[procedure.defaut_groupe_instructeur.id]).to eq(3) }
|
it { expect(assigns(:dossiers_count_per_procedure)[procedure.id]).to eq(3) }
|
||||||
it { expect(assigns(:dossiers_a_suivre_count_per_groupe_instructeur)[procedure.defaut_groupe_instructeur.id]).to eq(3) }
|
it { expect(assigns(:dossiers_a_suivre_count_per_procedure)[procedure.id]).to eq(3) }
|
||||||
it { expect(assigns(:followed_dossiers_count_per_groupe_instructeur)[procedure.defaut_groupe_instructeur.id]).to eq(nil) }
|
it { expect(assigns(:followed_dossiers_count_per_procedure)[procedure.id]).to eq(nil) }
|
||||||
it { expect(assigns(:dossiers_archived_count_per_groupe_instructeur)[procedure.defaut_groupe_instructeur.id]).to eq(1) }
|
it { expect(assigns(:dossiers_archived_count_per_procedure)[procedure.id]).to eq(1) }
|
||||||
it { expect(assigns(:dossiers_termines_count_per_groupe_instructeur)[procedure.defaut_groupe_instructeur.id]).to eq(nil) }
|
it { expect(assigns(:dossiers_termines_count_per_procedure)[procedure.id]).to eq(nil) }
|
||||||
|
|
||||||
it { expect(assigns(:dossiers_count_per_groupe_instructeur)[procedure2.defaut_groupe_instructeur.id]).to eq(3) }
|
it { expect(assigns(:dossiers_count_per_procedure)[procedure2.id]).to eq(3) }
|
||||||
it { expect(assigns(:dossiers_a_suivre_count_per_groupe_instructeur)[procedure2.defaut_groupe_instructeur.id]).to eq(nil) }
|
it { expect(assigns(:dossiers_a_suivre_count_per_procedure)[procedure2.id]).to eq(nil) }
|
||||||
it { expect(assigns(:followed_dossiers_count_per_groupe_instructeur)[procedure2.defaut_groupe_instructeur.id]).to eq(1) }
|
it { expect(assigns(:followed_dossiers_count_per_procedure)[procedure2.id]).to eq(1) }
|
||||||
it { expect(assigns(:dossiers_archived_count_per_groupe_instructeur)[procedure2.defaut_groupe_instructeur.id]).to eq(nil) }
|
it { expect(assigns(:dossiers_archived_count_per_procedure)[procedure2.id]).to eq(nil) }
|
||||||
it { expect(assigns(:dossiers_termines_count_per_groupe_instructeur)[procedure2.defaut_groupe_instructeur.id]).to eq(1) }
|
it { expect(assigns(:dossiers_termines_count_per_procedure)[procedure2.id]).to eq(1) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with a routed procedure" do
|
||||||
|
let!(:procedure) { create(:procedure, :published) }
|
||||||
|
let!(:gi_p1_1) { procedure.defaut_groupe_instructeur }
|
||||||
|
let!(:gi_p1_2) { GroupeInstructeur.create(label: '2', procedure: procedure) }
|
||||||
|
|
||||||
|
context 'with multiple dossiers en construction on each group' do
|
||||||
|
before do
|
||||||
|
alternate_gis = 0.upto(20).map { |i| i.even? ? gi_p1_1 : gi_p1_2 }
|
||||||
|
|
||||||
|
alternate_gis.take(4).each { |gi| create(:dossier, procedure: procedure, state: Dossier.states.fetch(:en_construction), groupe_instructeur: gi) }
|
||||||
|
|
||||||
|
alternate_gis.take(6).each do |gi|
|
||||||
|
instructeur.followed_dossiers << create(:dossier, procedure: procedure, state: Dossier.states.fetch(:en_instruction), groupe_instructeur: gi)
|
||||||
|
end
|
||||||
|
|
||||||
|
alternate_gis.take(10).each { |gi| create(:dossier, procedure: procedure, state: Dossier.states.fetch(:sans_suite), groupe_instructeur: gi) }
|
||||||
|
alternate_gis.take(14).each { |gi| create(:dossier, procedure: procedure, state: Dossier.states.fetch(:sans_suite), archived: true, groupe_instructeur: gi) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when an instructeur belongs to the 2 gi' do
|
||||||
|
before do
|
||||||
|
instructeur.groupe_instructeurs << gi_p1_1 << gi_p1_2
|
||||||
|
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(assigns(:dossiers_a_suivre_count_per_procedure)[procedure.id]).to eq(4) }
|
||||||
|
it { expect(assigns(:followed_dossiers_count_per_procedure)[procedure.id]).to eq(6) }
|
||||||
|
it { expect(assigns(:dossiers_termines_count_per_procedure)[procedure.id]).to eq(10) }
|
||||||
|
it { expect(assigns(:dossiers_count_per_procedure)[procedure.id]).to eq(4 + 6 + 10) }
|
||||||
|
it { expect(assigns(:dossiers_archived_count_per_procedure)[procedure.id]).to eq(14) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when an instructeur only belongs to one of them gi' do
|
||||||
|
before do
|
||||||
|
instructeur.groupe_instructeurs << gi_p1_1
|
||||||
|
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(assigns(:dossiers_a_suivre_count_per_procedure)[procedure.id]).to eq(2) }
|
||||||
|
# An instructeur cannot follow a dossier which belongs to another groupe
|
||||||
|
it { expect(assigns(:followed_dossiers_count_per_procedure)[procedure.id]).to eq(3) }
|
||||||
|
it { expect(assigns(:dossiers_termines_count_per_procedure)[procedure.id]).to eq(5) }
|
||||||
|
it { expect(assigns(:dossiers_count_per_procedure)[procedure.id]).to eq(2 + 3 + 5) }
|
||||||
|
it { expect(assigns(:dossiers_archived_count_per_procedure)[procedure.id]).to eq(7) }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,8 +14,11 @@ FactoryBot.define do
|
||||||
else
|
else
|
||||||
procedure = create(:procedure, :published, :with_type_de_champ, :with_type_de_champ_private)
|
procedure = create(:procedure, :published, :with_type_de_champ, :with_type_de_champ_private)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if dossier.groupe_instructeur.nil?
|
||||||
dossier.groupe_instructeur = procedure.defaut_groupe_instructeur
|
dossier.groupe_instructeur = procedure.defaut_groupe_instructeur
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
trait :with_entreprise do
|
trait :with_entreprise do
|
||||||
after(:build) do |dossier, _evaluator|
|
after(:build) do |dossier, _evaluator|
|
||||||
|
|
Loading…
Add table
Reference in a new issue