From e7d39ca65078a55b268961b498e6d452d8dd08a9 Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Fri, 12 May 2017 15:47:05 +0200 Subject: [PATCH] ProcedureOverview: add object to contain overview logic --- app/models/procedure.rb | 3 + app/models/procedure_overview.rb | 82 ++++++++++++++++++++++++ spec/models/procedure_overview_spec.rb | 87 ++++++++++++++++++++++++++ 3 files changed, 172 insertions(+) create mode 100644 app/models/procedure_overview.rb create mode 100644 spec/models/procedure_overview_spec.rb 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