Merge pull request #5934 from tchak/blank-default-groupe-instructeur
Le sélecteur du groupe instructeur est vide par défaut
This commit is contained in:
commit
6b52390324
16 changed files with 145 additions and 92 deletions
|
@ -12,13 +12,13 @@ module Instructeurs
|
||||||
DONNES_STATUS = 'donnes'
|
DONNES_STATUS = 'donnes'
|
||||||
|
|
||||||
def index
|
def index
|
||||||
avis = current_instructeur.avis.includes(dossier: [groupe_instructeur: :procedure])
|
avis = current_instructeur.avis.includes(:procedure)
|
||||||
@avis_by_procedure = avis.to_a.group_by(&:procedure)
|
@avis_by_procedure = avis.to_a.group_by(&:procedure)
|
||||||
end
|
end
|
||||||
|
|
||||||
def procedure
|
def procedure
|
||||||
@procedure = Procedure.find(params[:procedure_id])
|
@procedure = Procedure.find(params[:procedure_id])
|
||||||
instructeur_avis = current_instructeur.avis.includes(:dossier).where(dossiers: { groupe_instructeur: GroupeInstructeur.where(procedure: @procedure.id) })
|
instructeur_avis = current_instructeur.avis.includes(:dossier).where(dossiers: { revision: @procedure.revisions })
|
||||||
@avis_a_donner = instructeur_avis.without_answer
|
@avis_a_donner = instructeur_avis.without_answer
|
||||||
@avis_donnes = instructeur_avis.with_answer
|
@avis_donnes = instructeur_avis.with_answer
|
||||||
|
|
||||||
|
|
|
@ -254,7 +254,7 @@ module Users
|
||||||
|
|
||||||
dossier = Dossier.new(
|
dossier = Dossier.new(
|
||||||
revision: procedure.active_revision,
|
revision: procedure.active_revision,
|
||||||
groupe_instructeur: procedure.defaut_groupe_instructeur,
|
groupe_instructeur: procedure.defaut_groupe_instructeur_for_new_dossier,
|
||||||
user: current_user,
|
user: current_user,
|
||||||
state: Dossier.states.fetch(:brouillon)
|
state: Dossier.states.fetch(:brouillon)
|
||||||
)
|
)
|
||||||
|
@ -338,7 +338,21 @@ module Users
|
||||||
end
|
end
|
||||||
|
|
||||||
def change_groupe_instructeur?
|
def change_groupe_instructeur?
|
||||||
params[:dossier][:groupe_instructeur_id].present? && @dossier.groupe_instructeur_id != params[:dossier][:groupe_instructeur_id].to_i
|
if params[:dossier].key?(:groupe_instructeur_id)
|
||||||
|
groupe_instructeur_id = params[:dossier][:groupe_instructeur_id]
|
||||||
|
if groupe_instructeur_id.nil?
|
||||||
|
@dossier.groupe_instructeur_id.present?
|
||||||
|
else
|
||||||
|
@dossier.groupe_instructeur_id != groupe_instructeur_id.to_i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def groupe_instructeur_from_params
|
||||||
|
groupe_instructeur_id = params[:dossier][:groupe_instructeur_id]
|
||||||
|
if groupe_instructeur_id.present?
|
||||||
|
@dossier.procedure.groupe_instructeurs.find(groupe_instructeur_id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_dossier_and_compute_errors
|
def update_dossier_and_compute_errors
|
||||||
|
@ -357,13 +371,16 @@ module Users
|
||||||
if !@dossier.save
|
if !@dossier.save
|
||||||
errors += @dossier.errors.full_messages
|
errors += @dossier.errors.full_messages
|
||||||
elsif change_groupe_instructeur?
|
elsif change_groupe_instructeur?
|
||||||
groupe_instructeur = @dossier.procedure.groupe_instructeurs.find(params[:dossier][:groupe_instructeur_id])
|
@dossier.assign_to_groupe_instructeur(groupe_instructeur_from_params)
|
||||||
@dossier.assign_to_groupe_instructeur(groupe_instructeur)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if !save_draft?
|
if !save_draft?
|
||||||
errors += @dossier.check_mandatory_champs
|
errors += @dossier.check_mandatory_champs
|
||||||
|
|
||||||
|
if @dossier.groupe_instructeur.nil?
|
||||||
|
errors << "Le champ « #{@dossier.procedure.routing_criteria_name} » doit être rempli"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
errors
|
errors
|
||||||
|
|
|
@ -19,7 +19,7 @@ module Mutations
|
||||||
def authorized?(dossier:, groupe_instructeur:)
|
def authorized?(dossier:, groupe_instructeur:)
|
||||||
if dossier.groupe_instructeur == groupe_instructeur
|
if dossier.groupe_instructeur == groupe_instructeur
|
||||||
return false, { errors: ["Le dossier est déjà avec le grope instructeur: '#{groupe_instructeur.label}'"] }
|
return false, { errors: ["Le dossier est déjà avec le grope instructeur: '#{groupe_instructeur.label}'"] }
|
||||||
elsif dossier.groupe_instructeur.procedure != groupe_instructeur.procedure
|
elsif dossier.procedure != groupe_instructeur.procedure
|
||||||
return false, { errors: ["Le groupe instructeur '#{groupe_instructeur.label}' n’appartient pas à la même démarche que le dossier"] }
|
return false, { errors: ["Le groupe instructeur '#{groupe_instructeur.label}' n’appartient pas à la même démarche que le dossier"] }
|
||||||
else
|
else
|
||||||
true
|
true
|
||||||
|
|
|
@ -22,6 +22,7 @@ class Avis < ApplicationRecord
|
||||||
belongs_to :instructeur, optional: true
|
belongs_to :instructeur, optional: true
|
||||||
belongs_to :experts_procedure, optional: true
|
belongs_to :experts_procedure, optional: true
|
||||||
belongs_to :claimant, class_name: 'Instructeur', optional: false
|
belongs_to :claimant, class_name: 'Instructeur', optional: false
|
||||||
|
has_one :procedure, through: :dossier
|
||||||
|
|
||||||
has_one_attached :piece_justificative_file
|
has_one_attached :piece_justificative_file
|
||||||
has_one_attached :introduction_file
|
has_one_attached :introduction_file
|
||||||
|
@ -79,10 +80,6 @@ class Avis < ApplicationRecord
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
def procedure
|
|
||||||
dossier.procedure
|
|
||||||
end
|
|
||||||
|
|
||||||
def revoked?
|
def revoked?
|
||||||
revoked_at.present?
|
revoked_at.present?
|
||||||
end
|
end
|
||||||
|
|
|
@ -77,7 +77,7 @@ class Dossier < ApplicationRecord
|
||||||
|
|
||||||
has_many :dossier_operation_logs, -> { order(:created_at) }, inverse_of: :dossier
|
has_many :dossier_operation_logs, -> { order(:created_at) }, inverse_of: :dossier
|
||||||
|
|
||||||
belongs_to :groupe_instructeur, optional: false
|
belongs_to :groupe_instructeur, optional: true
|
||||||
belongs_to :revision, class_name: 'ProcedureRevision', optional: false
|
belongs_to :revision, class_name: 'ProcedureRevision', optional: false
|
||||||
belongs_to :user, optional: false
|
belongs_to :user, optional: false
|
||||||
|
|
||||||
|
@ -293,8 +293,8 @@ class Dossier < ApplicationRecord
|
||||||
# select users who have submitted dossier for the given 'procedures.id'
|
# select users who have submitted dossier for the given 'procedures.id'
|
||||||
users_who_submitted =
|
users_who_submitted =
|
||||||
state_not_brouillon
|
state_not_brouillon
|
||||||
.joins(:groupe_instructeur)
|
.joins(:revision)
|
||||||
.where("groupe_instructeurs.procedure_id = procedures.id")
|
.where("procedure_revisions.procedure_id = procedures.id")
|
||||||
.select(:user_id)
|
.select(:user_id)
|
||||||
# select dossier in brouillon where procedure closes in two days and for which the user has not submitted a Dossier
|
# select dossier in brouillon where procedure closes in two days and for which the user has not submitted a Dossier
|
||||||
state_brouillon
|
state_brouillon
|
||||||
|
@ -321,7 +321,7 @@ class Dossier < ApplicationRecord
|
||||||
delegate :siret, :siren, to: :etablissement, allow_nil: true
|
delegate :siret, :siren, to: :etablissement, allow_nil: true
|
||||||
delegate :france_connect_information, to: :user
|
delegate :france_connect_information, to: :user
|
||||||
|
|
||||||
before_save :build_default_champs, if: Proc.new { groupe_instructeur_id_was.nil? }
|
before_save :build_default_champs, if: Proc.new { revision_id_was.nil? }
|
||||||
before_save :update_search_terms
|
before_save :update_search_terms
|
||||||
|
|
||||||
after_save :send_dossier_received
|
after_save :send_dossier_received
|
||||||
|
@ -330,7 +330,7 @@ class Dossier < ApplicationRecord
|
||||||
|
|
||||||
validates :user, presence: true
|
validates :user, presence: true
|
||||||
validates :individual, presence: true, if: -> { revision.procedure.for_individual? }
|
validates :individual, presence: true, if: -> { revision.procedure.for_individual? }
|
||||||
validates :groupe_instructeur, presence: true
|
validates :groupe_instructeur, presence: true, if: -> { !brouillon? }
|
||||||
|
|
||||||
def motivation
|
def motivation
|
||||||
return nil if !termine?
|
return nil if !termine?
|
||||||
|
@ -419,7 +419,7 @@ class Dossier < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def show_groupe_instructeur_details?
|
def show_groupe_instructeur_details?
|
||||||
procedure.routee? && (!procedure.feature_enabled?(:procedure_routage_api) || !defaut_groupe_instructeur?)
|
procedure.routee? && groupe_instructeur.present? && (!procedure.feature_enabled?(:procedure_routage_api) || !defaut_groupe_instructeur?)
|
||||||
end
|
end
|
||||||
|
|
||||||
def show_groupe_instructeur_selector?
|
def show_groupe_instructeur_selector?
|
||||||
|
@ -427,7 +427,7 @@ class Dossier < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def assign_to_groupe_instructeur(groupe_instructeur, author = nil)
|
def assign_to_groupe_instructeur(groupe_instructeur, author = nil)
|
||||||
if groupe_instructeur.procedure == procedure && groupe_instructeur != self.groupe_instructeur
|
if (groupe_instructeur.nil? || groupe_instructeur.procedure == procedure) && self.groupe_instructeur != groupe_instructeur
|
||||||
if update(groupe_instructeur: groupe_instructeur, groupe_instructeur_updated_at: Time.zone.now)
|
if update(groupe_instructeur: groupe_instructeur, groupe_instructeur_updated_at: Time.zone.now)
|
||||||
unfollow_stale_instructeurs
|
unfollow_stale_instructeurs
|
||||||
|
|
||||||
|
|
|
@ -599,6 +599,12 @@ class Procedure < ApplicationRecord
|
||||||
groupe_instructeurs.count > 1
|
groupe_instructeurs.count > 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def defaut_groupe_instructeur_for_new_dossier
|
||||||
|
if !routee? || feature_enabled?(:procedure_routage_api)
|
||||||
|
defaut_groupe_instructeur
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def can_be_deleted_by_administrateur?
|
def can_be_deleted_by_administrateur?
|
||||||
brouillon? || dossiers.state_instruction_commencee.empty?
|
brouillon? || dossiers.state_instruction_commencee.empty?
|
||||||
end
|
end
|
||||||
|
|
|
@ -125,10 +125,10 @@ class AdministrateurUsageStatisticsService
|
||||||
result = {}
|
result = {}
|
||||||
|
|
||||||
Dossier
|
Dossier
|
||||||
.joins(groupe_instructeur: { procedure: [:administrateurs] })
|
.joins(revision: { procedure: [:administrateurs] })
|
||||||
.group(
|
.group(
|
||||||
'administrateurs.id',
|
'administrateurs.id',
|
||||||
'groupe_instructeurs.procedure_id',
|
'procedure_revisions.procedure_id',
|
||||||
<<~EOSQL
|
<<~EOSQL
|
||||||
CASE
|
CASE
|
||||||
WHEN state IN('accepte', 'refuse', 'sans_suite') THEN 'termine'
|
WHEN state IN('accepte', 'refuse', 'sans_suite') THEN 'termine'
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
= link_to 'J’ai déjà un compte', commencer_sign_in_path(path: @procedure.path), class: ['button large expand']
|
= link_to 'J’ai déjà un compte', commencer_sign_in_path(path: @procedure.path), class: ['button large expand']
|
||||||
|
|
||||||
- else
|
- else
|
||||||
- dossiers = current_user.dossiers.where(groupe_instructeur: @procedure.groupe_instructeurs)
|
- dossiers = current_user.dossiers.where(revision: @procedure.revisions)
|
||||||
- drafts = dossiers.merge(Dossier.state_brouillon)
|
- drafts = dossiers.merge(Dossier.state_brouillon)
|
||||||
- not_drafts = dossiers.merge(Dossier.state_not_brouillon)
|
- not_drafts = dossiers.merge(Dossier.state_not_brouillon)
|
||||||
|
|
||||||
|
|
|
@ -34,19 +34,9 @@
|
||||||
= f.label :groupe_instructeur_id do
|
= f.label :groupe_instructeur_id do
|
||||||
= dossier.procedure.routing_criteria_name
|
= dossier.procedure.routing_criteria_name
|
||||||
%span.mandatory *
|
%span.mandatory *
|
||||||
-# The routing dropdown has 'include_blank: false', because otherwise a blank
|
|
||||||
-# value may nullify the groupe_instructeur – and thus the link between the dossier
|
|
||||||
-# and its procedure.
|
|
||||||
-#
|
|
||||||
-# If, one day, we need to make clearer to the user that they must actually choose an
|
|
||||||
-# option, THINK TWICE before adding a blank option, and what would happen if the form is
|
|
||||||
-# saved when the blank option is selected.
|
|
||||||
-# Instead please consider other possibilities; like using CSS to gray out the default option,
|
|
||||||
-# or adding some "(please select an option)" wording aside the label of the default group.
|
|
||||||
-# CSS
|
|
||||||
= f.select :groupe_instructeur_id,
|
= f.select :groupe_instructeur_id,
|
||||||
dossier.procedure.groupe_instructeurs.order(:label).map { |gi| [gi.label, gi.id] },
|
dossier.procedure.groupe_instructeurs.order(:label).map { |gi| [gi.label, gi.id] },
|
||||||
{ include_blank: false }
|
{ include_blank: dossier.brouillon? }
|
||||||
|
|
||||||
= f.fields_for :champs, dossier.champs do |champ_form|
|
= f.fields_for :champs, dossier.champs do |champ_form|
|
||||||
- champ = champ_form.object
|
- champ = champ_form.object
|
||||||
|
|
|
@ -275,20 +275,8 @@ describe Instructeurs::ProceduresController, type: :controller do
|
||||||
it { expect(assigns(:procedure)).to eq(procedure) }
|
it { expect(assigns(:procedure)).to eq(procedure) }
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with a new brouillon dossier' do
|
|
||||||
let!(:brouillon_dossier) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:brouillon)) }
|
|
||||||
|
|
||||||
before { subject }
|
|
||||||
|
|
||||||
it { expect(assigns(:a_suivre_dossiers)).to be_empty }
|
|
||||||
it { expect(assigns(:followed_dossiers)).to be_empty }
|
|
||||||
it { expect(assigns(:termines_dossiers)).to be_empty }
|
|
||||||
it { expect(assigns(:all_state_dossiers)).to be_empty }
|
|
||||||
it { expect(assigns(:archived_dossiers)).to be_empty }
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with a new dossier without follower' do
|
context 'with a new dossier without follower' do
|
||||||
let!(:new_unfollow_dossier) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:en_instruction)) }
|
let!(:new_unfollow_dossier) { create(:dossier, :en_instruction, procedure: procedure) }
|
||||||
|
|
||||||
before { subject }
|
before { subject }
|
||||||
|
|
||||||
|
@ -310,7 +298,7 @@ describe Instructeurs::ProceduresController, type: :controller do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with a new dossier with a follower' do
|
context 'with a new dossier with a follower' do
|
||||||
let!(:new_followed_dossier) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:en_instruction)) }
|
let!(:new_followed_dossier) { create(:dossier, :en_instruction, procedure: procedure) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
instructeur.followed_dossiers << new_followed_dossier
|
instructeur.followed_dossiers << new_followed_dossier
|
||||||
|
@ -339,7 +327,7 @@ describe Instructeurs::ProceduresController, type: :controller do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with a termine dossier with a follower' do
|
context 'with a termine dossier with a follower' do
|
||||||
let!(:termine_dossier) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:accepte)) }
|
let!(:termine_dossier) { create(:dossier, :accepte, procedure: procedure) }
|
||||||
|
|
||||||
before { subject }
|
before { subject }
|
||||||
|
|
||||||
|
@ -361,7 +349,7 @@ describe Instructeurs::ProceduresController, type: :controller do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with an archived dossier' do
|
context 'with an archived dossier' do
|
||||||
let!(:archived_dossier) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:en_instruction), archived: true) }
|
let!(:archived_dossier) { create(:dossier, :en_instruction, procedure: procedure, archived: true) }
|
||||||
|
|
||||||
before { subject }
|
before { subject }
|
||||||
|
|
||||||
|
@ -372,8 +360,8 @@ describe Instructeurs::ProceduresController, type: :controller do
|
||||||
it { expect(assigns(:archived_dossiers)).to match_array([archived_dossier]) }
|
it { expect(assigns(:archived_dossiers)).to match_array([archived_dossier]) }
|
||||||
|
|
||||||
context 'and terminer dossiers on each of the others groups' do
|
context 'and terminer dossiers on each of the others groups' do
|
||||||
let!(:archived_dossier_on_gi_2) { create(:dossier, groupe_instructeur: gi_2, state: Dossier.states.fetch(:en_instruction), archived: true) }
|
let!(:archived_dossier_on_gi_2) { create(:dossier, :en_instruction, groupe_instructeur: gi_2, archived: true) }
|
||||||
let!(:archived_dossier_on_gi_3) { create(:dossier, groupe_instructeur: gi_3, state: Dossier.states.fetch(:en_instruction), archived: true) }
|
let!(:archived_dossier_on_gi_3) { create(:dossier, :en_instruction, groupe_instructeur: gi_3, archived: true) }
|
||||||
|
|
||||||
before { subject }
|
before { subject }
|
||||||
|
|
||||||
|
@ -382,10 +370,10 @@ describe Instructeurs::ProceduresController, type: :controller do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'statut' do
|
describe 'statut' do
|
||||||
let!(:a_suivre__dossier) { Timecop.freeze(1.day.ago) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:en_instruction)) } }
|
let!(:a_suivre__dossier) { Timecop.freeze(1.day.ago) { create(:dossier, :en_instruction, procedure: procedure) } }
|
||||||
let!(:new_followed_dossier) { Timecop.freeze(2.days.ago) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:en_instruction)) } }
|
let!(:new_followed_dossier) { Timecop.freeze(2.days.ago) { create(:dossier, :en_instruction, procedure: procedure) } }
|
||||||
let!(:termine_dossier) { Timecop.freeze(3.days.ago) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:accepte)) } }
|
let!(:termine_dossier) { Timecop.freeze(3.days.ago) { create(:dossier, :accepte, procedure: procedure) } }
|
||||||
let!(:archived_dossier) { Timecop.freeze(4.days.ago) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:en_instruction), archived: true) } }
|
let!(:archived_dossier) { Timecop.freeze(4.days.ago) { create(:dossier, :en_instruction, procedure: procedure, archived: true) } }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
instructeur.followed_dossiers << new_followed_dossier
|
instructeur.followed_dossiers << new_followed_dossier
|
||||||
|
|
|
@ -342,6 +342,7 @@ describe Users::DossiersController, type: :controller do
|
||||||
{
|
{
|
||||||
id: dossier.id,
|
id: dossier.id,
|
||||||
dossier: {
|
dossier: {
|
||||||
|
groupe_instructeur_id: dossier.groupe_instructeur_id,
|
||||||
champs_attributes: {
|
champs_attributes: {
|
||||||
id: first_champ.id,
|
id: first_champ.id,
|
||||||
value: value
|
value: value
|
||||||
|
@ -418,6 +419,8 @@ describe Users::DossiersController, type: :controller do
|
||||||
let(:another_group) { create(:groupe_instructeur, procedure: procedure) }
|
let(:another_group) { create(:groupe_instructeur, procedure: procedure) }
|
||||||
let(:instructeur_of_dossier) { create(:instructeur) }
|
let(:instructeur_of_dossier) { create(:instructeur) }
|
||||||
let(:instructeur_in_another_group) { create(:instructeur) }
|
let(:instructeur_in_another_group) { create(:instructeur) }
|
||||||
|
|
||||||
|
context "and grope instructeur is set" do
|
||||||
let!(:dossier) { create(:dossier, groupe_instructeur: dossier_group, user: user) }
|
let!(:dossier) { create(:dossier, groupe_instructeur: dossier_group, user: user) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
@ -434,6 +437,29 @@ describe Users::DossiersController, type: :controller do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "and groupe instructeur is not set" do
|
||||||
|
let(:dossier) { create(:dossier, procedure: procedure, user: user) }
|
||||||
|
let(:submit_payload) do
|
||||||
|
{
|
||||||
|
id: dossier.id,
|
||||||
|
dossier: {
|
||||||
|
champs_attributes: {
|
||||||
|
id: first_champ.id,
|
||||||
|
value: value
|
||||||
|
}
|
||||||
|
},
|
||||||
|
submit_draft: false
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it "can not submit" do
|
||||||
|
subject
|
||||||
|
|
||||||
|
expect(flash.alert).to eq(['Le champ « Votre ville » doit être rempli'])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context "on an closed procedure" do
|
context "on an closed procedure" do
|
||||||
before { dossier.procedure.close! }
|
before { dossier.procedure.close! }
|
||||||
|
|
||||||
|
@ -557,6 +583,7 @@ describe Users::DossiersController, type: :controller do
|
||||||
{
|
{
|
||||||
id: dossier.id,
|
id: dossier.id,
|
||||||
dossier: {
|
dossier: {
|
||||||
|
groupe_instructeur_id: dossier.groupe_instructeur_id,
|
||||||
champs_attributes: [
|
champs_attributes: [
|
||||||
{
|
{
|
||||||
id: first_champ.id,
|
id: first_champ.id,
|
||||||
|
@ -826,7 +853,7 @@ describe Users::DossiersController, type: :controller do
|
||||||
|
|
||||||
context "with PDF output" do
|
context "with PDF output" do
|
||||||
let(:procedure) { create(:procedure) }
|
let(:procedure) { create(:procedure) }
|
||||||
let(:dossier) {
|
let(:dossier) do
|
||||||
create(:dossier,
|
create(:dossier,
|
||||||
:accepte,
|
:accepte,
|
||||||
:with_all_champs,
|
:with_all_champs,
|
||||||
|
@ -834,7 +861,8 @@ describe Users::DossiersController, type: :controller do
|
||||||
:with_commentaires,
|
:with_commentaires,
|
||||||
procedure: procedure,
|
procedure: procedure,
|
||||||
user: user)
|
user: user)
|
||||||
}
|
end
|
||||||
|
|
||||||
subject! { get(:show, params: { id: dossier.id, format: :pdf }) }
|
subject! { get(:show, params: { id: dossier.id, format: :pdf }) }
|
||||||
|
|
||||||
context 'when the dossier is a brouillon' do
|
context 'when the dossier is a brouillon' do
|
||||||
|
|
|
@ -19,7 +19,7 @@ FactoryBot.define do
|
||||||
|
|
||||||
# Assign the procedure to the dossier through the groupe_instructeur
|
# Assign the procedure to the dossier through the groupe_instructeur
|
||||||
if dossier.groupe_instructeur.nil?
|
if dossier.groupe_instructeur.nil?
|
||||||
dossier.groupe_instructeur = procedure.defaut_groupe_instructeur
|
dossier.groupe_instructeur = procedure.routee? ? nil : procedure.defaut_groupe_instructeur
|
||||||
end
|
end
|
||||||
|
|
||||||
dossier.build_default_individual
|
dossier.build_default_individual
|
||||||
|
@ -117,6 +117,7 @@ FactoryBot.define do
|
||||||
trait :en_construction do
|
trait :en_construction do
|
||||||
after(:create) do |dossier, _evaluator|
|
after(:create) do |dossier, _evaluator|
|
||||||
dossier.state = Dossier.states.fetch(:en_construction)
|
dossier.state = Dossier.states.fetch(:en_construction)
|
||||||
|
dossier.groupe_instructeur ||= dossier.procedure&.defaut_groupe_instructeur
|
||||||
dossier.en_construction_at ||= dossier.created_at + 1.minute
|
dossier.en_construction_at ||= dossier.created_at + 1.minute
|
||||||
dossier.save!
|
dossier.save!
|
||||||
end
|
end
|
||||||
|
@ -125,6 +126,7 @@ FactoryBot.define do
|
||||||
trait :en_instruction do
|
trait :en_instruction do
|
||||||
after(:create) do |dossier, _evaluator|
|
after(:create) do |dossier, _evaluator|
|
||||||
dossier.state = Dossier.states.fetch(:en_instruction)
|
dossier.state = Dossier.states.fetch(:en_instruction)
|
||||||
|
dossier.groupe_instructeur ||= dossier.procedure&.defaut_groupe_instructeur
|
||||||
dossier.en_construction_at ||= dossier.created_at + 1.minute
|
dossier.en_construction_at ||= dossier.created_at + 1.minute
|
||||||
dossier.en_instruction_at ||= dossier.en_construction_at + 1.minute
|
dossier.en_instruction_at ||= dossier.en_construction_at + 1.minute
|
||||||
dossier.save!
|
dossier.save!
|
||||||
|
@ -139,6 +141,7 @@ FactoryBot.define do
|
||||||
|
|
||||||
after(:create) do |dossier, evaluator|
|
after(:create) do |dossier, evaluator|
|
||||||
dossier.state = Dossier.states.fetch(:accepte)
|
dossier.state = Dossier.states.fetch(:accepte)
|
||||||
|
dossier.groupe_instructeur ||= dossier.procedure&.defaut_groupe_instructeur
|
||||||
processed_at = evaluator.processed_at
|
processed_at = evaluator.processed_at
|
||||||
if processed_at.present?
|
if processed_at.present?
|
||||||
dossier.en_construction_at ||= processed_at - 2.minutes
|
dossier.en_construction_at ||= processed_at - 2.minutes
|
||||||
|
@ -156,6 +159,7 @@ FactoryBot.define do
|
||||||
trait :refuse do
|
trait :refuse do
|
||||||
after(:create) do |dossier, _evaluator|
|
after(:create) do |dossier, _evaluator|
|
||||||
dossier.state = Dossier.states.fetch(:refuse)
|
dossier.state = Dossier.states.fetch(:refuse)
|
||||||
|
dossier.groupe_instructeur ||= dossier.procedure&.defaut_groupe_instructeur
|
||||||
dossier.en_construction_at ||= dossier.created_at + 1.minute
|
dossier.en_construction_at ||= dossier.created_at + 1.minute
|
||||||
dossier.en_instruction_at ||= dossier.en_construction_at + 1.minute
|
dossier.en_instruction_at ||= dossier.en_construction_at + 1.minute
|
||||||
dossier.traitements.build(state: Dossier.states.fetch(:refuse), processed_at: dossier.en_instruction_at + 1.minute)
|
dossier.traitements.build(state: Dossier.states.fetch(:refuse), processed_at: dossier.en_instruction_at + 1.minute)
|
||||||
|
@ -166,6 +170,7 @@ FactoryBot.define do
|
||||||
trait :sans_suite do
|
trait :sans_suite do
|
||||||
after(:create) do |dossier, _evaluator|
|
after(:create) do |dossier, _evaluator|
|
||||||
dossier.state = Dossier.states.fetch(:sans_suite)
|
dossier.state = Dossier.states.fetch(:sans_suite)
|
||||||
|
dossier.groupe_instructeur ||= dossier.procedure&.defaut_groupe_instructeur
|
||||||
dossier.en_construction_at ||= dossier.created_at + 1.minute
|
dossier.en_construction_at ||= dossier.created_at + 1.minute
|
||||||
dossier.en_instruction_at ||= dossier.en_construction_at + 1.minute
|
dossier.en_instruction_at ||= dossier.en_construction_at + 1.minute
|
||||||
dossier.traitements.build(state: Dossier.states.fetch(:sans_suite), processed_at: dossier.en_instruction_at + 1.minute)
|
dossier.traitements.build(state: Dossier.states.fetch(:sans_suite), processed_at: dossier.en_instruction_at + 1.minute)
|
||||||
|
|
|
@ -733,8 +733,8 @@ describe ProcedurePresentation do
|
||||||
let!(:gi_2) { procedure.groupe_instructeurs.create(label: 'gi2') }
|
let!(:gi_2) { procedure.groupe_instructeurs.create(label: 'gi2') }
|
||||||
let!(:gi_3) { procedure.groupe_instructeurs.create(label: 'gi3') }
|
let!(:gi_3) { procedure.groupe_instructeurs.create(label: 'gi3') }
|
||||||
|
|
||||||
let!(:kept_dossier) { create(:dossier, procedure: procedure) }
|
let!(:kept_dossier) { create(:dossier, :en_construction, procedure: procedure) }
|
||||||
let!(:discarded_dossier) { create(:dossier, procedure: procedure, groupe_instructeur: gi_2) }
|
let!(:discarded_dossier) { create(:dossier, :en_construction, procedure: procedure, groupe_instructeur: gi_2) }
|
||||||
|
|
||||||
it { is_expected.to contain_exactly(kept_dossier.id) }
|
it { is_expected.to contain_exactly(kept_dossier.id) }
|
||||||
|
|
||||||
|
|
|
@ -603,6 +603,7 @@ describe Procedure do
|
||||||
Timecop.freeze(now) do
|
Timecop.freeze(now) do
|
||||||
procedure.publish_or_reopen!(administrateur)
|
procedure.publish_or_reopen!(administrateur)
|
||||||
end
|
end
|
||||||
|
procedure.reload
|
||||||
canonical_procedure.reload
|
canonical_procedure.reload
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1054,7 +1055,7 @@ describe Procedure do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with a new brouillon dossier' do
|
context 'with a new brouillon dossier' do
|
||||||
let!(:brouillon_dossier) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:brouillon)) }
|
let!(:brouillon_dossier) { create(:dossier, procedure: procedure) }
|
||||||
|
|
||||||
it { expect(subject['a_suivre']).to eq(0) }
|
it { expect(subject['a_suivre']).to eq(0) }
|
||||||
it { expect(subject['suivis']).to eq(0) }
|
it { expect(subject['suivis']).to eq(0) }
|
||||||
|
@ -1064,7 +1065,7 @@ describe Procedure do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with a new dossier without follower' do
|
context 'with a new dossier without follower' do
|
||||||
let!(:new_unfollow_dossier) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:en_instruction)) }
|
let!(:new_unfollow_dossier) { create(:dossier, :en_instruction, procedure: procedure) }
|
||||||
|
|
||||||
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) }
|
||||||
|
@ -1073,8 +1074,8 @@ describe Procedure do
|
||||||
it { expect(subject['archived']).to eq(0) }
|
it { expect(subject['archived']).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, groupe_instructeur: gi_2, state: Dossier.states.fetch(:en_instruction)) }
|
let!(:new_unfollow_dossier_on_gi_2) { create(:dossier, :en_instruction, groupe_instructeur: gi_2) }
|
||||||
let!(:new_unfollow_dossier_on_gi_3) { create(:dossier, groupe_instructeur: gi_3, state: Dossier.states.fetch(:en_instruction)) }
|
let!(:new_unfollow_dossier_on_gi_3) { create(:dossier, :en_instruction, groupe_instructeur: gi_3) }
|
||||||
|
|
||||||
before { subject }
|
before { subject }
|
||||||
|
|
||||||
|
@ -1084,7 +1085,7 @@ describe Procedure do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with a new dossier with a follower' do
|
context 'with a new dossier with a follower' do
|
||||||
let!(:new_followed_dossier) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:en_instruction)) }
|
let!(:new_followed_dossier) { create(:dossier, :en_instruction, procedure: procedure) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
instructeur.followed_dossiers << new_followed_dossier
|
instructeur.followed_dossiers << new_followed_dossier
|
||||||
|
@ -1097,8 +1098,8 @@ describe Procedure do
|
||||||
it { expect(subject['archived']).to eq(0) }
|
it { expect(subject['archived']).to eq(0) }
|
||||||
|
|
||||||
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
|
||||||
let!(:new_follow_dossier_on_gi_2) { create(:dossier, groupe_instructeur: gi_2, state: Dossier.states.fetch(:en_instruction)) }
|
let!(:new_follow_dossier_on_gi_2) { create(:dossier, :en_instruction, groupe_instructeur: gi_2) }
|
||||||
let!(:new_follow_dossier_on_gi_3) { create(:dossier, groupe_instructeur: gi_3, state: Dossier.states.fetch(:en_instruction)) }
|
let!(:new_follow_dossier_on_gi_3) { create(:dossier, :en_instruction, groupe_instructeur: gi_3) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
instructeur.followed_dossiers << new_follow_dossier_on_gi_2 << new_follow_dossier_on_gi_3
|
instructeur.followed_dossiers << new_follow_dossier_on_gi_2 << new_follow_dossier_on_gi_3
|
||||||
|
@ -1121,7 +1122,7 @@ describe Procedure do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with a termine dossier' do
|
context 'with a termine dossier' do
|
||||||
let!(:termine_dossier) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:accepte)) }
|
let!(:termine_dossier) { create(:dossier, :accepte, procedure: procedure) }
|
||||||
|
|
||||||
it { expect(subject['a_suivre']).to eq(0) }
|
it { expect(subject['a_suivre']).to eq(0) }
|
||||||
it { expect(subject['suivis']).to eq(0) }
|
it { expect(subject['suivis']).to eq(0) }
|
||||||
|
@ -1130,8 +1131,8 @@ describe Procedure do
|
||||||
it { expect(subject['archived']).to eq(0) }
|
it { expect(subject['archived']).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, groupe_instructeur: gi_2, state: Dossier.states.fetch(:accepte)) }
|
let!(:termine_dossier_on_gi_2) { create(:dossier, :accepte, groupe_instructeur: gi_2) }
|
||||||
let!(:termine_dossier_on_gi_3) { create(:dossier, groupe_instructeur: gi_3, state: Dossier.states.fetch(:accepte)) }
|
let!(:termine_dossier_on_gi_3) { create(:dossier, :accepte, groupe_instructeur: gi_3) }
|
||||||
|
|
||||||
before { subject }
|
before { subject }
|
||||||
|
|
||||||
|
@ -1144,7 +1145,7 @@ describe Procedure do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with an archived dossier' do
|
context 'with an archived dossier' do
|
||||||
let!(:archived_dossier) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:en_instruction), archived: true) }
|
let!(:archived_dossier) { create(:dossier, :en_instruction, procedure: procedure, archived: true) }
|
||||||
|
|
||||||
it { expect(subject['a_suivre']).to eq(0) }
|
it { expect(subject['a_suivre']).to eq(0) }
|
||||||
it { expect(subject['suivis']).to eq(0) }
|
it { expect(subject['suivis']).to eq(0) }
|
||||||
|
@ -1153,8 +1154,8 @@ describe Procedure do
|
||||||
it { expect(subject['archived']).to eq(1) }
|
it { expect(subject['archived']).to eq(1) }
|
||||||
|
|
||||||
context 'and terminer dossiers on each of the others groups' do
|
context 'and terminer dossiers on each of the others groups' do
|
||||||
let!(:archived_dossier_on_gi_2) { create(:dossier, groupe_instructeur: gi_2, state: Dossier.states.fetch(:en_instruction), archived: true) }
|
let!(:archived_dossier_on_gi_2) { create(:dossier, :en_instruction, groupe_instructeur: gi_2, archived: true) }
|
||||||
let!(:archived_dossier_on_gi_3) { create(:dossier, groupe_instructeur: gi_3, state: Dossier.states.fetch(:en_instruction), archived: true) }
|
let!(:archived_dossier_on_gi_3) { create(:dossier, :en_instruction, groupe_instructeur: gi_3, archived: true) }
|
||||||
|
|
||||||
it { expect(subject['archived']).to eq(2) }
|
it { expect(subject['archived']).to eq(2) }
|
||||||
end
|
end
|
||||||
|
|
|
@ -63,10 +63,21 @@ describe 'shared/dossiers/champs.html.haml', type: :view do
|
||||||
let(:dossier) { create(:dossier, procedure: procedure) }
|
let(:dossier) { create(:dossier, procedure: procedure) }
|
||||||
let(:champs) { [] }
|
let(:champs) { [] }
|
||||||
|
|
||||||
|
it "does not render the routing criteria name and its value" do
|
||||||
|
expect(subject).not_to include(procedure.routing_criteria_name)
|
||||||
|
expect(subject).not_to include(dossier.procedure.defaut_groupe_instructeur.label)
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with selected groupe instructeur" do
|
||||||
|
before do
|
||||||
|
dossier.groupe_instructeur = dossier.procedure.defaut_groupe_instructeur
|
||||||
|
end
|
||||||
|
|
||||||
it "renders the routing criteria name and its value" do
|
it "renders the routing criteria name and its value" do
|
||||||
expect(subject).to include(procedure.routing_criteria_name)
|
expect(subject).to include(procedure.routing_criteria_name)
|
||||||
expect(subject).to include(dossier.groupe_instructeur.label)
|
expect(subject).to include(dossier.groupe_instructeur.label)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context "with seen_at" do
|
context "with seen_at" do
|
||||||
let(:dossier) { create(:dossier) }
|
let(:dossier) { create(:dossier) }
|
||||||
|
|
|
@ -96,9 +96,19 @@ describe 'shared/dossiers/edit.html.haml', type: :view do
|
||||||
let(:dossier) { create(:dossier, procedure: procedure) }
|
let(:dossier) { create(:dossier, procedure: procedure) }
|
||||||
let(:champs) { [] }
|
let(:champs) { [] }
|
||||||
|
|
||||||
|
it 'renders the routing criteria name and its value' do
|
||||||
|
expect(subject).to have_field(procedure.routing_criteria_name)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when groupe instructeur is selected' do
|
||||||
|
before do
|
||||||
|
dossier.groupe_instructeur = dossier.procedure.defaut_groupe_instructeur
|
||||||
|
end
|
||||||
|
|
||||||
it 'renders the routing criteria name and its value' do
|
it 'renders the routing criteria name and its value' do
|
||||||
expect(subject).to have_field(procedure.routing_criteria_name)
|
expect(subject).to have_field(procedure.routing_criteria_name)
|
||||||
expect(subject).to include(dossier.groupe_instructeur.label)
|
expect(subject).to include(dossier.groupe_instructeur.label)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in a new issue