diff --git a/app/models/dossier.rb b/app/models/dossier.rb index e9bc7da9b..165209d1d 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -152,6 +152,16 @@ class Dossier < ApplicationRecord scope :updated_since, -> (since) { where('dossiers.updated_at >= ?', since) } scope :created_since, -> (since) { where('dossiers.en_construction_at >= ?', since) } + scope :with_type_de_champ, -> (stable_id) { + joins('INNER JOIN champs ON champs.dossier_id = dossiers.id INNER JOIN types_de_champ ON types_de_champ.id = champs.type_de_champ_id') + .where('types_de_champ.private = FALSE AND types_de_champ.stable_id = ?', stable_id) + } + + scope :with_type_de_champ_private, -> (stable_id) { + joins('INNER JOIN champs ON champs.dossier_id = dossiers.id INNER JOIN types_de_champ ON types_de_champ.id = champs.type_de_champ_id') + .where('types_de_champ.private = TRUE AND types_de_champ.stable_id = ?', stable_id) + } + scope :all_state, -> { not_archived.state_not_brouillon } scope :en_construction, -> { not_archived.state_en_construction } scope :en_instruction, -> { not_archived.state_en_instruction } diff --git a/app/models/procedure_presentation.rb b/app/models/procedure_presentation.rb index 2a7d84549..0a80c44d9 100644 --- a/app/models/procedure_presentation.rb +++ b/app/models/procedure_presentation.rb @@ -65,12 +65,12 @@ class ProcedurePresentation < ApplicationRecord fields.concat procedure.types_de_champ .where.not(type_champ: explanatory_types_de_champ) .order(:id) - .map { |type_de_champ| field_hash(type_de_champ.libelle, 'type_de_champ', type_de_champ.id.to_s) } + .map { |type_de_champ| field_hash(type_de_champ.libelle, 'type_de_champ', type_de_champ.stable_id.to_s) } fields.concat procedure.types_de_champ_private .where.not(type_champ: explanatory_types_de_champ) .order(:id) - .map { |type_de_champ| field_hash(type_de_champ.libelle, 'type_de_champ_private', type_de_champ.id.to_s) } + .map { |type_de_champ| field_hash(type_de_champ.libelle, 'type_de_champ_private', type_de_champ.stable_id.to_s) } fields end @@ -99,12 +99,16 @@ class ProcedurePresentation < ApplicationRecord (dossiers.order('dossiers.updated_at asc').ids - dossiers_id_with_notification) + dossiers_id_with_notification end - when 'type_de_champ', 'type_de_champ_private' - return dossiers - .includes(table == 'type_de_champ' ? :champs : :champs_private) - .where("champs.type_de_champ_id = #{column.to_i}") - .order("champs.value #{order}") - .pluck(:id) + when 'type_de_champ' + dossiers + .with_type_de_champ(column) + .order("champs.value #{order}") + .pluck(:id) + when 'type_de_champ_private' + dossiers + .with_type_de_champ_private(column) + .order("champs.value #{order}") + .pluck(:id) when 'followers_instructeurs' assert_supported_column(table, column) # LEFT OUTER JOIN allows to keep dossiers without assignated instructeurs yet @@ -129,12 +133,12 @@ class ProcedurePresentation < ApplicationRecord .map { |v| Time.zone.parse(v).beginning_of_day rescue nil } .compact dossiers.filter_by_datetimes(column, dates) - when 'type_de_champ', 'type_de_champ_private' - relation = table == 'type_de_champ' ? :champs : :champs_private - dossiers - .includes(relation) - .where("champs.type_de_champ_id = ?", column.to_i) - .filter_ilike(relation, :value, values) + when 'type_de_champ' + dossiers.with_type_de_champ(column) + .filter_ilike(:champs, :value, values) + when 'type_de_champ_private' + dossiers.with_type_de_champ_private(column) + .filter_ilike(:champs_private, :value, values) when 'etablissement' if column == 'entreprise_date_creation' dates = values @@ -307,9 +311,9 @@ class ProcedurePresentation < ApplicationRecord when 'followers_instructeurs' dossier.send(table)&.map { |g| g.send(column) }&.join(', ') when 'type_de_champ' - dossier.champs.find { |c| c.type_de_champ_id == column.to_i }.value + dossier.champs.find { |c| c.stable_id == column.to_i }.to_s when 'type_de_champ_private' - dossier.champs_private.find { |c| c.type_de_champ_id == column.to_i }.value + dossier.champs_private.find { |c| c.stable_id == column.to_i }.to_s when 'groupe_instructeur' dossier.groupe_instructeur.label end diff --git a/spec/models/procedure_presentation_spec.rb b/spec/models/procedure_presentation_spec.rb index 0f237d925..3a0c62924 100644 --- a/spec/models/procedure_presentation_spec.rb +++ b/spec/models/procedure_presentation_spec.rb @@ -3,7 +3,7 @@ describe ProcedurePresentation do let(:instructeur) { create(:instructeur) } let(:assign_to) { create(:assign_to, procedure: procedure, instructeur: instructeur) } let(:first_type_de_champ) { assign_to.procedure.types_de_champ.first } - let(:first_type_de_champ_id) { first_type_de_champ.id.to_s } + let(:first_type_de_champ_id) { first_type_de_champ.stable_id.to_s } let(:procedure_presentation) { create(:procedure_presentation, assign_to: assign_to, @@ -72,10 +72,10 @@ describe ProcedurePresentation do { "label" => 'SIRET', "table" => 'etablissement', "column" => 'siret' }, { "label" => 'Libellé NAF', "table" => 'etablissement', "column" => 'libelle_naf' }, { "label" => 'Code postal', "table" => 'etablissement', "column" => 'code_postal' }, - { "label" => tdc_1.libelle, "table" => 'type_de_champ', "column" => tdc_1.id.to_s }, - { "label" => tdc_2.libelle, "table" => 'type_de_champ', "column" => tdc_2.id.to_s }, - { "label" => tdc_private_1.libelle, "table" => 'type_de_champ_private', "column" => tdc_private_1.id.to_s }, - { "label" => tdc_private_2.libelle, "table" => 'type_de_champ_private', "column" => tdc_private_2.id.to_s } + { "label" => tdc_1.libelle, "table" => 'type_de_champ', "column" => tdc_1.stable_id.to_s }, + { "label" => tdc_2.libelle, "table" => 'type_de_champ', "column" => tdc_2.stable_id.to_s }, + { "label" => tdc_private_1.libelle, "table" => 'type_de_champ_private', "column" => tdc_private_1.stable_id.to_s }, + { "label" => tdc_private_2.libelle, "table" => 'type_de_champ_private', "column" => tdc_private_2.stable_id.to_s } ] } @@ -224,7 +224,7 @@ describe ProcedurePresentation do context 'for type_de_champ table' do let(:table) { 'type_de_champ' } - let(:column) { procedure.types_de_champ.first.id.to_s } + let(:column) { procedure.types_de_champ.first.stable_id.to_s } let(:dossier) { create(:dossier, procedure: procedure) } @@ -235,7 +235,7 @@ describe ProcedurePresentation do context 'for type_de_champ_private table' do let(:table) { 'type_de_champ_private' } - let(:column) { procedure.types_de_champ_private.first.id.to_s } + let(:column) { procedure.types_de_champ_private.first.stable_id.to_s } let(:dossier) { create(:dossier, procedure: procedure) } @@ -325,7 +325,7 @@ describe ProcedurePresentation do context 'for type_de_champ table' do let(:table) { 'type_de_champ' } - let(:column) { procedure.types_de_champ.first.id.to_s } + let(:column) { procedure.types_de_champ.first.stable_id.to_s } let(:order) { 'desc' } # Asc works the same, no extra test required let(:beurre_dossier) { create(:dossier, procedure: procedure) } @@ -341,7 +341,7 @@ describe ProcedurePresentation do context 'for type_de_champ_private table' do let(:table) { 'type_de_champ_private' } - let(:column) { procedure.types_de_champ_private.first.id.to_s } + let(:column) { procedure.types_de_champ_private.first.stable_id.to_s } let(:order) { 'asc' } # Desc works the same, no extra test required let(:biere_dossier) { create(:dossier, procedure: procedure) } @@ -496,7 +496,7 @@ describe ProcedurePresentation do end context 'for type_de_champ table' do - let(:filter) { [{ 'table' => 'type_de_champ', 'column' => type_de_champ.id.to_s, 'value' => 'keep' }] } + let(:filter) { [{ 'table' => 'type_de_champ', 'column' => type_de_champ.stable_id.to_s, 'value' => 'keep' }] } let(:kept_dossier) { create(:dossier, procedure: procedure) } let(:discarded_dossier) { create(:dossier, procedure: procedure) } @@ -514,8 +514,8 @@ describe ProcedurePresentation do context 'with multiple search values' do let(:filter) do [ - { 'table' => 'type_de_champ', 'column' => type_de_champ.id.to_s, 'value' => 'keep' }, - { 'table' => 'type_de_champ', 'column' => type_de_champ.id.to_s, 'value' => 'and' } + { 'table' => 'type_de_champ', 'column' => type_de_champ.stable_id.to_s, 'value' => 'keep' }, + { 'table' => 'type_de_champ', 'column' => type_de_champ.stable_id.to_s, 'value' => 'and' } ] end @@ -533,7 +533,7 @@ describe ProcedurePresentation do end context 'with yes_no type_de_champ' do - let(:filter) { [{ 'table' => 'type_de_champ', 'column' => type_de_champ.id.to_s, 'value' => 'true' }] } + let(:filter) { [{ 'table' => 'type_de_champ', 'column' => type_de_champ.stable_id.to_s, 'value' => 'true' }] } let(:procedure) { create(:procedure, :with_yes_no) } before do @@ -546,7 +546,7 @@ describe ProcedurePresentation do end context 'for type_de_champ_private table' do - let(:filter) { [{ 'table' => 'type_de_champ_private', 'column' => type_de_champ_private.id.to_s, 'value' => 'keep' }] } + let(:filter) { [{ 'table' => 'type_de_champ_private', 'column' => type_de_champ_private.stable_id.to_s, 'value' => 'keep' }] } let(:kept_dossier) { create(:dossier, procedure: procedure) } let(:discarded_dossier) { create(:dossier, procedure: procedure) } @@ -562,8 +562,8 @@ describe ProcedurePresentation do context 'with multiple search values' do let(:filter) do [ - { 'table' => 'type_de_champ_private', 'column' => type_de_champ_private.id.to_s, 'value' => 'keep' }, - { 'table' => 'type_de_champ_private', 'column' => type_de_champ_private.id.to_s, 'value' => 'and' } + { 'table' => 'type_de_champ_private', 'column' => type_de_champ_private.stable_id.to_s, 'value' => 'keep' }, + { 'table' => 'type_de_champ_private', 'column' => type_de_champ_private.stable_id.to_s, 'value' => 'and' } ] end @@ -762,7 +762,7 @@ describe ProcedurePresentation do context 'for type de champ' do let(:table) { 'type_de_champ' } - let(:column) { procedure.types_de_champ.first.id.to_s } + let(:column) { procedure.types_de_champ.first.stable_id.to_s } it 'preloads the champs relation' do # Ideally, we would only preload the champs for the matching column @@ -779,7 +779,7 @@ describe ProcedurePresentation do context 'for type de champ private' do let(:table) { 'type_de_champ_private' } - let(:column) { procedure.types_de_champ_private.first.id.to_s } + let(:column) { procedure.types_de_champ_private.first.stable_id.to_s } it 'preloads the champs relation' do # Ideally, we would only preload the champs for the matching column