diff --git a/app/models/procedure.rb b/app/models/procedure.rb
index 2e910acd3..8c863697c 100644
--- a/app/models/procedure.rb
+++ b/app/models/procedure.rb
@@ -141,4 +141,7 @@ class Procedure < ActiveRecord::Base
}
end
+ def procedure_overview(start_date, notifications_count)
+ ProcedureOverview.new(self, start_date, notifications_count)
+ end
end
diff --git a/app/models/procedure_overview.rb b/app/models/procedure_overview.rb
new file mode 100644
index 000000000..5bce9e5b5
--- /dev/null
+++ b/app/models/procedure_overview.rb
@@ -0,0 +1,82 @@
+class ProcedureOverview
+ include Rails.application.routes.url_helpers
+ attr_accessor :libelle, :notifications_count, :received_dossiers_count, :created_dossiers_count, :processed_dossiers_count, :date
+
+ def initialize(procedure, start_date, notifications_count)
+ @libelle = procedure.libelle
+ @procedure_url = backoffice_dossiers_procedure_path(procedure)
+ @notifications_count = notifications_count
+
+ @received_dossiers_count = procedure.dossiers.where(state: :received).count
+ @created_dossiers_count = procedure.dossiers
+ .where(created_at: start_date..DateTime.now)
+ .where.not(state: :draft)
+ .count
+ @processed_dossiers_count = procedure.dossiers.where(processed_at: start_date..DateTime.now).count
+ end
+
+ def had_some_activities?
+ [received_dossiers_count,
+ created_dossiers_count,
+ processed_dossiers_count,
+ notifications_count].reduce(:+) > 0
+ end
+
+ def to_html
+ [libelle_description,
+ dossiers_en_instruction_description,
+ created_dossier_description,
+ processed_dossier_description,
+ notifications_description].compact.join('
')
+ end
+
+ private
+
+ def libelle_description
+ "#{libelle}"
+ end
+
+ def dossiers_en_instruction_description
+ case received_dossiers_count
+ when 0
+ nil
+ when 1
+ "1 dossier est en cours d'instruction"
+ else
+ "#{received_dossiers_count} dossiers sont en cours d'instruction"
+ end
+ end
+
+ def created_dossier_description
+ case created_dossiers_count
+ when 0
+ nil
+ when 1
+ '1 nouveau dossier a été déposé'
+ else
+ "#{created_dossiers_count} nouveaux dossiers ont été déposés"
+ end
+ end
+
+ def processed_dossier_description
+ case processed_dossiers_count
+ when 0
+ nil
+ when 1
+ '1 dossier a été instruit'
+ else
+ "#{processed_dossiers_count} dossiers ont été instruits"
+ end
+ end
+
+ def notifications_description
+ case notifications_count
+ when 0
+ nil
+ when 1
+ '1 notification en attente sur les dossiers que vous suivez'
+ else
+ "#{notifications_count} notifications en attente sur les dossiers que vous suivez"
+ end
+ end
+end
diff --git a/spec/models/procedure_overview_spec.rb b/spec/models/procedure_overview_spec.rb
new file mode 100644
index 000000000..c6670d730
--- /dev/null
+++ b/spec/models/procedure_overview_spec.rb
@@ -0,0 +1,87 @@
+require 'spec_helper'
+
+describe ProcedureOverview, type: :model do
+ let(:procedure) { create(:procedure, libelle: 'libelle') }
+ let(:friday) { DateTime.new(2017, 5, 12) } # vendredi 12 mai 2017, de la semaine du 8 mai
+ let(:monday) { DateTime.new(2017, 5, 8) }
+
+ before :each do
+ Timecop.freeze(friday)
+ end
+
+ let(:procedure_overview) { ProcedureOverview.new(procedure, monday, 0) }
+
+ describe 'received_dossiers_count' do
+ let!(:received_dossier) do
+ dossier = create(:dossier, procedure: procedure, state: :received, created_at: monday)
+ end
+
+ it { expect(procedure_overview.received_dossiers_count).to eq(1) }
+ end
+
+ describe 'created_dossiers_count' do
+ let!(:created_dossier_during_the_week) do
+ create(:dossier, procedure: procedure, created_at: monday, state: :received)
+ end
+
+ let!(:created_dossier_during_the_week_but_in_draft) do
+ create(:dossier, procedure: procedure, created_at: monday, state: :draft)
+ end
+
+ let!(:created_dossier_before_the_week) do
+ create(:dossier, procedure: procedure, created_at: (monday - 1.week), state: :received)
+ end
+
+ it { expect(procedure_overview.created_dossiers_count).to eq(1) }
+ end
+
+ describe 'processed_dossiers_count' do
+ let!(:processed_dossier_during_the_week) do
+ create(:dossier, procedure: procedure, created_at: monday, processed_at: monday)
+ end
+
+ let!(:processed_dossier_before_the_week) do
+ create(:dossier, procedure: procedure, created_at: (monday - 1.week), processed_at: (monday - 1.week))
+ end
+
+ it { expect(procedure_overview.processed_dossiers_count).to eq(1) }
+ end
+
+ describe 'to_html' do
+ subject { procedure_overview.to_html }
+
+ context 'when the different count are equal to 0' do
+ it { is_expected.to match(/^libelle<\/strong><\/a>$/) }
+ end
+
+ context 'when the different counts are equal to 1' do
+ before :each do
+ procedure_overview.notifications_count = 1
+ procedure_overview.received_dossiers_count = 1
+ procedure_overview.created_dossiers_count = 1
+ procedure_overview.processed_dossiers_count = 1
+ end
+
+ it { is_expected.to match(/^libelle<\/strong><\/a>/) }
+ it { is_expected.to include("1 dossier est en cours d'instruction") }
+ it { is_expected.to include('1 nouveau dossier a été déposé') }
+ it { is_expected.to include('1 dossier a été instruit') }
+ it { is_expected.to include('1 notification en attente sur les dossiers que vous suivez') }
+ end
+
+ context 'when the different counts are equal to 2' do
+ before :each do
+ procedure_overview.notifications_count = 2
+ procedure_overview.received_dossiers_count = 3
+ procedure_overview.created_dossiers_count = 4
+ procedure_overview.processed_dossiers_count = 5
+ end
+
+ it { is_expected.to match(/^libelle<\/strong><\/a>/) }
+ it { is_expected.to include("3 dossiers sont en cours d'instruction") }
+ it { is_expected.to include('4 nouveaux dossiers ont été déposés') }
+ it { is_expected.to include('5 dossiers ont été instruits') }
+ it { is_expected.to include('2 notifications en attente sur les dossiers que vous suivez') }
+ end
+ end
+end