diff --git a/app/models/procedure.rb b/app/models/procedure.rb index 05c3e3346..90344edc9 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -71,10 +71,11 @@ class Procedure < ApplicationRecord brouillon? ? draft_revision : published_revision end - def all_revisions_types_de_champ(parent: nil) + def all_revisions_types_de_champ(parent: nil, with_header_section: false) + types_de_champ_scope = with_header_section ? TypeDeChamp.with_header_section : TypeDeChamp.fillable if brouillon? if parent.nil? - TypeDeChamp.fillable + types_de_champ_scope .joins(:revision_types_de_champ) .where(revision_types_de_champ: { revision_id: draft_revision_id, parent_id: nil }) .order(:private, :position) @@ -82,8 +83,8 @@ class Procedure < ApplicationRecord draft_revision.children_of(parent) end else - cache_key = ['all_revisions_types_de_champ', published_revision, parent].compact - Rails.cache.fetch(cache_key, expires_in: 1.month) { published_revisions_types_de_champ(parent) } + cache_key = ['all_revisions_types_de_champ', published_revision, parent, with_header_section].compact + Rails.cache.fetch(cache_key, expires_in: 1.month) { published_revisions_types_de_champ(parent:, with_header_section:) } end end @@ -875,7 +876,7 @@ class Procedure < ApplicationRecord @stable_ids_used_by_routing_rules ||= groupe_instructeurs.flat_map { _1.routing_rule&.sources }.compact.uniq end - def published_revisions_types_de_champ(parent = nil) + def published_revisions_types_de_champ(parent: nil, with_header_section: false) # all published revisions revision_ids = revisions.ids - [draft_revision_id] # fetch all parent types de champ @@ -889,8 +890,8 @@ class Procedure < ApplicationRecord # fetch all type_de_champ.stable_id for all the revisions expect draft # and for each stable_id take the bigger (more recent) type_de_champ.id - recent_ids = TypeDeChamp - .fillable + types_de_champ_scope = with_header_section ? TypeDeChamp.with_header_section : TypeDeChamp.fillable + recent_ids = types_de_champ_scope .joins(:revision_types_de_champ) .where(revision_types_de_champ: { revision_id: revision_ids, parent_id: parent_ids }) .group(:stable_id).select('MAX(types_de_champ.id)') diff --git a/app/models/type_de_champ.rb b/app/models/type_de_champ.rb index 9a4b32d99..729f23955 100644 --- a/app/models/type_de_champ.rb +++ b/app/models/type_de_champ.rb @@ -171,6 +171,7 @@ class TypeDeChamp < ApplicationRecord scope :not_repetition, -> { where.not(type_champ: type_champs.fetch(:repetition)) } scope :not_condition, -> { where(condition: nil) } scope :fillable, -> { where.not(type_champ: [type_champs.fetch(:header_section), type_champs.fetch(:explication)]) } + scope :with_header_section, -> { where.not(type_champ: TypeDeChamp.type_champs[:explication]) } scope :dubious, -> { where("unaccent(types_de_champ.libelle) ~* unaccent(?)", DubiousProcedure.forbidden_regexp) diff --git a/spec/models/procedure_spec.rb b/spec/models/procedure_spec.rb index b8724a106..50db50eb1 100644 --- a/spec/models/procedure_spec.rb +++ b/spec/models/procedure_spec.rb @@ -1885,6 +1885,49 @@ describe Procedure do end end + describe '#all_revisions_types_de_champ' do + let(:types_de_champ_public) do + [ + { type: :text }, + { type: :header_section } + ] + end + + context 'when procedure brouillon' do + let(:procedure) { create(:procedure, types_de_champ_public:) } + + it 'returns one type de champ' do + expect(procedure.all_revisions_types_de_champ.size).to eq 1 + end + + it 'returns also section type de champ' do + expect(procedure.all_revisions_types_de_champ(with_header_section: true).size).to eq 2 + end + + it "returns types de champ on draft revision" do + procedure.draft_revision.add_type_de_champ(type_champ: :text, libelle: 'onemorechamp') + expect(procedure.reload.all_revisions_types_de_champ.size).to eq 2 + end + end + + context 'when procedure is published' do + let(:procedure) { create(:procedure, :published, types_de_champ_public:) } + + it 'returns one type de champ' do + expect(procedure.all_revisions_types_de_champ.size).to eq 1 + end + + it 'returns also section type de champ' do + expect(procedure.all_revisions_types_de_champ(with_header_section: true).size).to eq 2 + end + + it "doesn't return types de champ on draft revision" do + procedure.draft_revision.add_type_de_champ(type_champ: :text, libelle: 'onemorechamp') + expect(procedure.reload.all_revisions_types_de_champ.size).to eq 1 + end + end + end + private def create_dossier_with_pj_of_size(size, procedure)