6328011f60
- Make `champ.dossier` a requirement; - Move the dossier_id assignation to `before_validation` (otherwise the record is invalid, and never gets saved); - Allow specs to only build the champ (instead of saving it to the database), which bypasses the requirement to have a dossier.
221 lines
7.2 KiB
Ruby
221 lines
7.2 KiB
Ruby
FactoryBot.define do
|
||
factory :dossier do
|
||
autorisation_donnees { true }
|
||
state { Dossier.states.fetch(:brouillon) }
|
||
association :user
|
||
|
||
transient do
|
||
procedure { nil }
|
||
end
|
||
|
||
after(:build) do |dossier, evaluator|
|
||
if evaluator.procedure.present?
|
||
procedure = evaluator.procedure
|
||
else
|
||
procedure = create(:procedure, :published, :with_type_de_champ, :with_type_de_champ_private)
|
||
end
|
||
|
||
# Assign the procedure to the dossier through the groupe_instructeur
|
||
if dossier.groupe_instructeur.nil?
|
||
dossier.groupe_instructeur = procedure.defaut_groupe_instructeur
|
||
end
|
||
|
||
dossier.build_default_individual
|
||
end
|
||
|
||
trait :with_entreprise do
|
||
after(:build) do |dossier, _evaluator|
|
||
if dossier.procedure.for_individual?
|
||
raise 'Inconsistent factory: attempting to create a dossier :with_entreprise on a procedure that is `for_individual?`'
|
||
end
|
||
etablissement = create(:etablissement, :with_exercices, :with_effectif_mensuel)
|
||
dossier.etablissement = etablissement
|
||
end
|
||
end
|
||
|
||
trait :with_service do
|
||
after(:create) do |dossier, _evaluator|
|
||
dossier.procedure.service = create(:service)
|
||
end
|
||
end
|
||
|
||
trait :with_individual do
|
||
after(:build) do |dossier, evaluator|
|
||
# If the procedure was implicitely created by the factory,
|
||
# mark it automatically as for_individual.
|
||
if evaluator.procedure.nil?
|
||
dossier.procedure.update(for_individual: true)
|
||
end
|
||
if !dossier.procedure.for_individual?
|
||
raise 'Inconsistent factory: attempting to create a dossier :with_individual on a procedure that is not `for_individual?`'
|
||
end
|
||
dossier.individual = build(:individual, dossier: dossier)
|
||
end
|
||
end
|
||
|
||
trait :archived do
|
||
archived { true }
|
||
end
|
||
|
||
trait :not_archived do
|
||
archived { false }
|
||
end
|
||
|
||
trait :discarded do
|
||
hidden_at { Time.zone.now }
|
||
end
|
||
|
||
trait :with_dossier_link do
|
||
after(:create) do |dossier, _evaluator|
|
||
# create linked dossier
|
||
linked_dossier = create(:dossier, :en_construction)
|
||
|
||
# find first type de champ dossier_link
|
||
type_de_champ = dossier.procedure.types_de_champ.find do |t|
|
||
t.type_champ == TypeDeChamp.type_champs.fetch(:dossier_link)
|
||
end
|
||
|
||
# if type de champ does not exist create it
|
||
if !type_de_champ
|
||
type_de_champ = create(:type_de_champ_dossier_link, procedure: dossier.procedure)
|
||
end
|
||
|
||
# find champ with the type de champ
|
||
champ = dossier.reload.champs.find do |c|
|
||
c.type_de_champ == type_de_champ
|
||
end
|
||
|
||
# if champ does not exist create it
|
||
if !champ
|
||
champ = create(:champ_dossier_link, dossier: dossier, type_de_champ: type_de_champ)
|
||
end
|
||
|
||
# set champ value with linked dossier
|
||
champ.value = linked_dossier.id
|
||
champ.save!
|
||
end
|
||
end
|
||
|
||
trait :with_commentaires do
|
||
after(:create) do |dossier, _evaluator|
|
||
dossier.commentaires += create_list(:commentaire, 2)
|
||
end
|
||
end
|
||
|
||
trait :followed do
|
||
after(:create) do |dossier, _evaluator|
|
||
g = create(:instructeur)
|
||
g.followed_dossiers << dossier
|
||
end
|
||
end
|
||
|
||
trait :en_construction do
|
||
after(:create) do |dossier, _evaluator|
|
||
dossier.state = Dossier.states.fetch(:en_construction)
|
||
dossier.en_construction_at ||= dossier.created_at + 1.minute
|
||
dossier.save!
|
||
end
|
||
end
|
||
|
||
trait :en_instruction do
|
||
after(:create) do |dossier, _evaluator|
|
||
dossier.state = Dossier.states.fetch(:en_instruction)
|
||
dossier.en_construction_at ||= dossier.created_at + 1.minute
|
||
dossier.en_instruction_at ||= dossier.en_construction_at + 1.minute
|
||
dossier.save!
|
||
end
|
||
end
|
||
|
||
trait :accepte do
|
||
transient do
|
||
motivation { nil }
|
||
processed_at { nil }
|
||
end
|
||
|
||
after(:create) do |dossier, evaluator|
|
||
dossier.state = Dossier.states.fetch(:accepte)
|
||
processed_at = evaluator.processed_at
|
||
if processed_at.present?
|
||
dossier.en_construction_at ||= processed_at - 2.minutes
|
||
dossier.en_instruction_at ||= processed_at - 1.minute
|
||
dossier.traitements.build(state: Dossier.states.fetch(:accepte), processed_at: processed_at, motivation: evaluator.motivation)
|
||
else
|
||
dossier.en_construction_at ||= dossier.created_at + 1.minute
|
||
dossier.en_instruction_at ||= dossier.en_construction_at + 1.minute
|
||
dossier.traitements.build(state: Dossier.states.fetch(:accepte), processed_at: dossier.en_instruction_at + 1.minute, motivation: evaluator.motivation)
|
||
end
|
||
dossier.save!
|
||
end
|
||
end
|
||
|
||
trait :refuse do
|
||
after(:create) do |dossier, _evaluator|
|
||
dossier.state = Dossier.states.fetch(:refuse)
|
||
dossier.en_construction_at ||= dossier.created_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.save!
|
||
end
|
||
end
|
||
|
||
trait :sans_suite do
|
||
after(:create) do |dossier, _evaluator|
|
||
dossier.state = Dossier.states.fetch(:sans_suite)
|
||
dossier.en_construction_at ||= dossier.created_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.save!
|
||
end
|
||
end
|
||
|
||
trait :with_motivation do
|
||
after(:create) do |dossier, _evaluator|
|
||
motivation = case dossier.state
|
||
when Dossier.states.fetch(:refuse)
|
||
'L’entreprise concernée n’est pas agréée.'
|
||
when Dossier.states.fetch(:sans_suite)
|
||
'Le département n’est pas éligible. Veuillez remplir un nouveau dossier auprès de la DDT du 93.'
|
||
else
|
||
'Vous avez validé les conditions.'
|
||
end
|
||
dossier.traitements.last.update!(motivation: motivation)
|
||
end
|
||
end
|
||
|
||
trait :with_attestation do
|
||
after(:build) do |dossier, _evaluator|
|
||
if dossier.procedure.attestation_template.blank?
|
||
dossier.procedure.attestation_template = build(:attestation_template)
|
||
end
|
||
dossier.attestation = dossier.build_attestation
|
||
end
|
||
end
|
||
|
||
trait :with_justificatif do
|
||
after(:create) do |dossier, _evaluator|
|
||
dossier.justificatif_motivation.attach(
|
||
io: StringIO.new('Hello World'),
|
||
filename: 'hello.txt'
|
||
)
|
||
end
|
||
end
|
||
|
||
trait :with_all_champs do
|
||
after(:create) do |dossier, _evaluator|
|
||
dossier.champs = dossier.procedure.types_de_champ.map do |type_de_champ|
|
||
build(:"champ_#{type_de_champ.type_champ}", dossier: dossier, type_de_champ: type_de_champ)
|
||
end
|
||
dossier.save!
|
||
end
|
||
end
|
||
|
||
trait :with_all_annotations do
|
||
after(:create) do |dossier, _evaluator|
|
||
dossier.champs = dossier.procedure.types_de_champ.map do |type_de_champ|
|
||
build(:"champ_#{type_de_champ.type_champ}", dossier: dossier, type_de_champ: type_de_champ)
|
||
end
|
||
dossier.save!
|
||
end
|
||
end
|
||
end
|
||
end
|