feat(instructeur#dossiers_count_summary): add counter for expirants. ignore brouillon

This commit is contained in:
Martin 2021-12-01 14:39:03 +01:00
parent ce87878ff0
commit 2dfbc70d41
3 changed files with 47 additions and 4 deletions

View file

@ -53,7 +53,7 @@ module Instructeurs
@a_suivre_count, @suivis_count, @traites_count, @tous_count, @archives_count = current_instructeur @a_suivre_count, @suivis_count, @traites_count, @tous_count, @archives_count = current_instructeur
.dossiers_count_summary(groupe_instructeur_ids) .dossiers_count_summary(groupe_instructeur_ids)
.fetch_values('a_suivre', 'suivis', 'traites', 'tous', 'archives') .fetch_values('a_suivre', 'suivis', 'traites', 'tous', 'archives', 'expirant')
dossiers_visibles = Dossier dossiers_visibles = Dossier
.where(groupe_instructeur_id: groupe_instructeur_ids) .where(groupe_instructeur_id: groupe_instructeur_ids)
@ -72,6 +72,7 @@ module Instructeurs
@termines_dossiers = dossiers_visibles.termine @termines_dossiers = dossiers_visibles.termine
@all_state_dossiers = dossiers_visibles.all_state @all_state_dossiers = dossiers_visibles.all_state
@archived_dossiers = dossiers_visibles.archived @archived_dossiers = dossiers_visibles.archived
@expirant_dossiers = dossiers_visibles.close_to_expiration
@dossiers = case statut @dossiers = case statut
when 'a-suivre' when 'a-suivre'
@ -89,6 +90,9 @@ module Instructeurs
when 'archives' when 'archives'
dossiers_count = @archives_count dossiers_count = @archives_count
@archived_dossiers @archived_dossiers
when 'expirant'
dossiers_count = @archives_count
@expirant_dossiers
end end
notifications = current_instructeur.notifications_for_groupe_instructeurs(groupe_instructeur_ids) notifications = current_instructeur.notifications_for_groupe_instructeurs(groupe_instructeur_ids)

View file

@ -237,8 +237,22 @@ class Instructeur < ApplicationRecord
COUNT(DISTINCT dossiers.id) FILTER (where not archived AND dossiers.state in ('en_construction', 'en_instruction') AND follows.instructeur_id = :instructeur_id) AS suivis, COUNT(DISTINCT dossiers.id) FILTER (where not archived AND dossiers.state in ('en_construction', 'en_instruction') AND follows.instructeur_id = :instructeur_id) AS suivis,
COUNT(DISTINCT dossiers.id) FILTER (where not archived AND dossiers.state in ('accepte', 'refuse', 'sans_suite')) AS traites, COUNT(DISTINCT dossiers.id) FILTER (where not archived AND dossiers.state in ('accepte', 'refuse', 'sans_suite')) AS traites,
COUNT(DISTINCT dossiers.id) FILTER (where not archived) AS tous, COUNT(DISTINCT dossiers.id) FILTER (where not archived) AS tous,
COUNT(DISTINCT dossiers.id) FILTER (where archived) AS archives COUNT(DISTINCT dossiers.id) FILTER (where archived) AS archives,
COUNT(DISTINCT dossiers.id) FILTER (where
procedures.procedure_expires_when_termine_enabled
AND (
dossiers.state in ('accepte', 'refuse', 'sans_suite')
AND dossiers.processed_at + dossiers.conservation_extension + (procedures.duree_conservation_dossiers_dans_ds * INTERVAL '1 month') - INTERVAL :expires_in < :now
) OR (
dossiers.state in ('en_construction')
AND dossiers.en_construction_at + dossiers.conservation_extension + (duree_conservation_dossiers_dans_ds * INTERVAL '1 month') - INTERVAL :expires_in < :now
)
) AS expirant
FROM "dossiers" FROM "dossiers"
INNER JOIN "procedure_revisions"
ON "procedure_revisions"."id" = "dossiers"."revision_id"
INNER JOIN "procedures"
ON "procedures"."id" = "procedure_revisions"."procedure_id"
LEFT OUTER JOIN follows LEFT OUTER JOIN follows
ON follows.dossier_id = dossiers.id ON follows.dossier_id = dossiers.id
AND follows.unfollowed_at IS NULL AND follows.unfollowed_at IS NULL
@ -250,7 +264,9 @@ class Instructeur < ApplicationRecord
sanitized_query = ActiveRecord::Base.sanitize_sql([ sanitized_query = ActiveRecord::Base.sanitize_sql([
query, query,
instructeur_id: id, instructeur_id: id,
groupe_instructeur_ids: groupe_instructeur_ids groupe_instructeur_ids: groupe_instructeur_ids,
now: Time.zone.now,
expires_in: Dossier::INTERVAL_BEFORE_EXPIRATION
]) ])
Dossier.connection.select_all(sanitized_query).first Dossier.connection.select_all(sanitized_query).first

View file

@ -594,7 +594,7 @@ describe Instructeur, type: :model do
describe "#dossiers_count_summary" do describe "#dossiers_count_summary" do
let(:instructeur_2) { create(:instructeur) } let(:instructeur_2) { create(:instructeur) }
let(:instructeur_3) { create(:instructeur) } let(:instructeur_3) { create(:instructeur) }
let(:procedure) { create(:procedure, instructeurs: [instructeur_2, instructeur_3]) } let(:procedure) { create(:procedure, instructeurs: [instructeur_2, instructeur_3], procedure_expires_when_termine_enabled: true) }
let(:gi_1) { procedure.groupe_instructeurs.first } let(:gi_1) { procedure.groupe_instructeurs.first }
let(:gi_2) { procedure.groupe_instructeurs.create(label: '2') } let(:gi_2) { procedure.groupe_instructeurs.create(label: '2') }
let(:gi_3) { procedure.groupe_instructeurs.create(label: '3') } let(:gi_3) { procedure.groupe_instructeurs.create(label: '3') }
@ -614,6 +614,7 @@ describe Instructeur, type: :model do
it { expect(subject['traites']).to eq(0) } it { expect(subject['traites']).to eq(0) }
it { expect(subject['tous']).to eq(0) } it { expect(subject['tous']).to eq(0) }
it { expect(subject['archives']).to eq(0) } it { expect(subject['archives']).to eq(0) }
it { expect(subject['expirant']).to eq(0) }
end end
context 'with a new brouillon dossier' do context 'with a new brouillon dossier' do
@ -624,6 +625,7 @@ describe Instructeur, type: :model do
it { expect(subject['traites']).to eq(0) } it { expect(subject['traites']).to eq(0) }
it { expect(subject['tous']).to eq(0) } it { expect(subject['tous']).to eq(0) }
it { expect(subject['archives']).to eq(0) } it { expect(subject['archives']).to eq(0) }
it { expect(subject['expirant']).to eq(0) }
end end
context 'with a new dossier without follower' do context 'with a new dossier without follower' do
@ -634,6 +636,7 @@ describe Instructeur, type: :model do
it { expect(subject['traites']).to eq(0) } it { expect(subject['traites']).to eq(0) }
it { expect(subject['tous']).to eq(1) } it { expect(subject['tous']).to eq(1) }
it { expect(subject['archives']).to eq(0) } it { expect(subject['archives']).to eq(0) }
it { expect(subject['expirant']).to eq(0) }
context 'and dossiers without follower on each of the others groups' do context 'and dossiers without follower on each of the others groups' do
let!(:new_unfollow_dossier_on_gi_2) { create(:dossier, :en_instruction, groupe_instructeur: gi_2) } let!(:new_unfollow_dossier_on_gi_2) { create(:dossier, :en_instruction, groupe_instructeur: gi_2) }
@ -658,6 +661,7 @@ describe Instructeur, type: :model do
it { expect(subject['traites']).to eq(0) } it { expect(subject['traites']).to eq(0) }
it { expect(subject['tous']).to eq(1) } it { expect(subject['tous']).to eq(1) }
it { expect(subject['archives']).to eq(0) } it { expect(subject['archives']).to eq(0) }
it { expect(subject['expirant']).to eq(0) }
context 'and another one follows the same dossier' do context 'and another one follows the same dossier' do
before do before do
@ -669,6 +673,7 @@ describe Instructeur, type: :model do
it { expect(subject['traites']).to eq(0) } it { expect(subject['traites']).to eq(0) }
it { expect(subject['tous']).to eq(1) } it { expect(subject['tous']).to eq(1) }
it { expect(subject['archives']).to eq(0) } it { expect(subject['archives']).to eq(0) }
it { expect(subject['expirant']).to eq(0) }
end end
context 'and dossier with a follower on each of the others groups' do context 'and dossier with a follower on each of the others groups' do
@ -692,6 +697,7 @@ describe Instructeur, type: :model do
it { expect(subject['a_suivre']).to eq(1) } it { expect(subject['a_suivre']).to eq(1) }
it { expect(subject['suivis']).to eq(0) } it { expect(subject['suivis']).to eq(0) }
it { expect(subject['tous']).to eq(1) } it { expect(subject['tous']).to eq(1) }
it { expect(subject['expirant']).to eq(0) }
end end
end end
@ -703,6 +709,7 @@ describe Instructeur, type: :model do
it { expect(subject['traites']).to eq(1) } it { expect(subject['traites']).to eq(1) }
it { expect(subject['tous']).to eq(1) } it { expect(subject['tous']).to eq(1) }
it { expect(subject['archives']).to eq(0) } it { expect(subject['archives']).to eq(0) }
it { expect(subject['expirant']).to eq(0) }
context 'and terminer dossiers on each of the others groups' do context 'and terminer dossiers on each of the others groups' do
let!(:termine_dossier_on_gi_2) { create(:dossier, :accepte, groupe_instructeur: gi_2) } let!(:termine_dossier_on_gi_2) { create(:dossier, :accepte, groupe_instructeur: gi_2) }
@ -715,6 +722,7 @@ describe Instructeur, type: :model do
it { expect(subject['traites']).to eq(2) } it { expect(subject['traites']).to eq(2) }
it { expect(subject['tous']).to eq(2) } it { expect(subject['tous']).to eq(2) }
it { expect(subject['archives']).to eq(0) } it { expect(subject['archives']).to eq(0) }
it { expect(subject['expirant']).to eq(0) }
end end
end end
@ -726,6 +734,7 @@ describe Instructeur, type: :model do
it { expect(subject['traites']).to eq(0) } it { expect(subject['traites']).to eq(0) }
it { expect(subject['tous']).to eq(0) } it { expect(subject['tous']).to eq(0) }
it { expect(subject['archives']).to eq(1) } it { expect(subject['archives']).to eq(1) }
it { expect(subject['expirant']).to eq(0) }
context 'and terminer dossiers on each of the others groups' do context 'and terminer dossiers on each of the others groups' do
let!(:archives_dossier_on_gi_2) { create(:dossier, :en_instruction, groupe_instructeur: gi_2, archived: true) } let!(:archives_dossier_on_gi_2) { create(:dossier, :en_instruction, groupe_instructeur: gi_2, archived: true) }
@ -734,6 +743,20 @@ describe Instructeur, type: :model do
it { expect(subject['archives']).to eq(2) } it { expect(subject['archives']).to eq(2) }
end end
end end
context 'with an expirants dossier' do
let!(:expiring_dossier_termine) { create(:dossier, :accepte, procedure: procedure, processed_at: 175.days.ago) }
let!(:expiring_dossier_en_construction) { create(:dossier, :en_construction, en_construction_at: 175.days.ago, procedure: procedure) }
before { subject }
it { expect(subject['a_suivre']).to eq(1) }
it { expect(subject['suivis']).to eq(0) }
it { expect(subject['traites']).to eq(1) }
it { expect(subject['tous']).to eq(2) }
it { expect(subject['archives']).to eq(0) }
it { expect(subject['expirant']).to eq(2) }
end
end end
end end