From 6c2a3bafa489cbcfa5ee2c057b84eedf8c211f94 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Wed, 18 May 2022 10:52:00 +0200 Subject: [PATCH 1/2] refactor(dossier): champs order by coordinate --- app/models/champ.rb | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/app/models/champ.rb b/app/models/champ.rb index 505bfaa97..03e20fc22 100644 --- a/app/models/champ.rb +++ b/app/models/champ.rb @@ -55,19 +55,14 @@ class Champ < ApplicationRecord scope :updated_since?, -> (date) { where('champs.updated_at > ?', date) } scope :public_only, -> { where(private: false) } scope :private_only, -> { where(private: true) } - scope :ordered, -> { includes(:type_de_champ).order(:row, 'types_de_champ.order_place') } - scope :public_ordered, -> { public_only.joins(dossier: { revision: :revision_types_de_champ_public }).where('procedure_revision_types_de_champ.type_de_champ_id = champs.type_de_champ_id').order(:position) } - # we need to do private champs order as manual join to avoid conflicting join names - scope :private_ordered, -> do - private_only.joins(' - INNER JOIN dossiers dossiers_private on dossiers_private.id = champs.dossier_id - INNER JOIN types_de_champ types_de_champ_private on types_de_champ_private.id = champs.type_de_champ_id - INNER JOIN procedure_revision_types_de_champ procedure_revision_types_de_champ_private - ON procedure_revision_types_de_champ_private.revision_id = dossiers_private.revision_id') - .where('procedure_revision_types_de_champ_private.type_de_champ_id = champs.type_de_champ_id') - .order(:position) + scope :ordered, -> do + includes(:type_de_champ) + .joins(dossier: { revision: :revision_types_de_champ }) + .where('procedure_revision_types_de_champ.type_de_champ_id = champs.type_de_champ_id') + .order(:row, :position) end - + scope :public_ordered, -> { public_only.ordered } + scope :private_ordered, -> { private_only.ordered } scope :root, -> { where(parent_id: nil) } before_create :set_dossier_id, if: :needs_dossier_id? From cdd597db191cf5b3cea6a91330a40fa63ee69c73 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Wed, 18 May 2022 10:52:25 +0200 Subject: [PATCH 2/2] refactor(dossier): fix champ repetition factories --- spec/factories/champ.rb | 48 ++++++++++++++++++++++----------- spec/factories/type_de_champ.rb | 35 ++++++++++++++++-------- spec/models/champ_spec.rb | 11 +++++--- 3 files changed, 63 insertions(+), 31 deletions(-) diff --git a/spec/factories/champ.rb b/spec/factories/champ.rb index 384f90a72..77310c872 100644 --- a/spec/factories/champ.rb +++ b/spec/factories/champ.rb @@ -215,24 +215,40 @@ FactoryBot.define do end after(:build) do |champ_repetition, evaluator| - types_de_champ = champ_repetition.type_de_champ.types_de_champ - existing_type_de_champ_text = types_de_champ.find { |tdc| tdc.libelle == 'Nom' } - type_de_champ_text = existing_type_de_champ_text || build( - :type_de_champ_text, - position: 0, - parent: champ_repetition.type_de_champ, - libelle: 'Nom' - ) + revision = champ_repetition.type_de_champ.procedure&.active_revision || build(:procedure_revision) + parent = revision.revision_types_de_champ.find { |rtdc| rtdc.type_de_champ == champ_repetition.type_de_champ } + types_de_champ = revision.revision_types_de_champ.filter { |rtdc| rtdc.parent == parent }.map(&:type_de_champ) - existing_type_de_champ_number = types_de_champ.find { |tdc| tdc.libelle == 'Age' } - type_de_champ_number = existing_type_de_champ_number || build( - :type_de_champ_number, - position: 1, - parent: champ_repetition.type_de_champ, - libelle: 'Age' - ) + type_de_champ_text = types_de_champ.find { |tdc| tdc.libelle == 'Nom' } + if !type_de_champ_text + type_de_champ_text = build(:type_de_champ_text, + position: 0, + parent: champ_repetition.type_de_champ, + libelle: 'Nom') + revision.revision_types_de_champ << build(:procedure_revision_type_de_champ, + revision: revision, + type_de_champ: type_de_champ_text, + parent: parent, + position: 0) + + champ_repetition.type_de_champ.types_de_champ << type_de_champ_text + end + + type_de_champ_number = types_de_champ.find { |tdc| tdc.libelle == 'Age' } + if !type_de_champ_number + type_de_champ_number = build(:type_de_champ_number, + position: 1, + parent: champ_repetition.type_de_champ, + libelle: 'Age') + revision.revision_types_de_champ << build(:procedure_revision_type_de_champ, + revision: revision, + type_de_champ: type_de_champ_number, + parent: parent, + position: 1) + + champ_repetition.type_de_champ.types_de_champ << type_de_champ_number + end - champ_repetition.type_de_champ.types_de_champ << [type_de_champ_text, type_de_champ_number] evaluator.rows.times do |row| champ_repetition.champs << [ build(:champ_text, dossier: champ_repetition.dossier, row: row, type_de_champ: type_de_champ_text, parent: champ_repetition), diff --git a/spec/factories/type_de_champ.rb b/spec/factories/type_de_champ.rb index 03e45405e..57a4c053d 100644 --- a/spec/factories/type_de_champ.rb +++ b/spec/factories/type_de_champ.rb @@ -176,24 +176,37 @@ FactoryBot.define do end after(:build) do |type_de_champ_repetition, evaluator| + evaluator.procedure&.save! evaluator.types_de_champ.each do |type_de_champ| - type_de_champ.order_place = type_de_champ_repetition.types_de_champ.size + revision = evaluator.procedure&.active_revision || build(:procedure_revision) + parent = revision.revision_types_de_champ.find { |rtdc| rtdc.type_de_champ == type_de_champ_repetition } + types_de_champ = revision.revision_types_de_champ.filter { |rtdc| rtdc.parent == parent } + position = types_de_champ.size + + revision.revision_types_de_champ << build(:procedure_revision_type_de_champ, + revision: revision, + type_de_champ: type_de_champ, + parent: parent, + position: position) + + # old system + type_de_champ.order_place = position type_de_champ_repetition.types_de_champ << type_de_champ end end trait :with_types_de_champ do - after(:build) do |type_de_champ, evaluator| - tdc = build(:type_de_champ, libelle: 'sub type de champ', parent: type_de_champ) + after(:build) do |type_de_champ_repetition, evaluator| + type_de_champ = build(:type_de_champ, libelle: 'sub type de champ', parent: type_de_champ_repetition) + revision = evaluator.procedure.active_revision + parent = revision.revision_types_de_champ.find { |rtdc| rtdc.type_de_champ == type_de_champ_repetition } - evaluator.procedure.save - - ProcedureRevisionTypeDeChamp.create!( - revision_id: evaluator.procedure.active_revision.id, - type_de_champ_id: tdc.id, - parent_id: tdc.parent.revision_type_de_champ.id, - position: 0 - ) + evaluator.procedure.save! + revision.revision_types_de_champ << build(:procedure_revision_type_de_champ, + revision: revision, + type_de_champ: type_de_champ, + parent: parent, + position: 0) end end end diff --git a/spec/models/champ_spec.rb b/spec/models/champ_spec.rb index 3391ec4f0..17390abc9 100644 --- a/spec/models/champ_spec.rb +++ b/spec/models/champ_spec.rb @@ -509,6 +509,8 @@ describe Champ do describe 'repetition' do let(:procedure) { create(:procedure, :published, :with_type_de_champ, :with_type_de_champ_private, types_de_champ: [build(:type_de_champ_repetition, types_de_champ: [tdc_text, tdc_integer])]) } + let(:revision) { procedure.published_revision } + let(:rtdc_repetition) { revision.revision_types_de_champ.find { |rtdc| rtdc.type_de_champ.repetition? } } let(:tdc_text) { build(:type_de_champ_text) } let(:tdc_integer) { build(:type_de_champ_integer_number) } @@ -518,6 +520,11 @@ describe Champ do let(:champ_integer) { champ.champs.find { |c| c.type_champ == 'integer_number' } } let(:champ_text_attrs) { attributes_for(:champ_text, type_de_champ: tdc_text, row: 1) } + before do + create(:procedure_revision_type_de_champ, revision: revision, type_de_champ: tdc_text, parent: rtdc_repetition, position: 1) + create(:procedure_revision_type_de_champ, revision: revision, type_de_champ: tdc_integer, parent: rtdc_repetition, position: 0) + end + context 'when creating the model directly' do let(:champ_text_row_1) { create(:champ_text, type_de_champ: tdc_text, row: 2, parent: champ, dossier: nil) } @@ -547,10 +554,6 @@ describe Champ do expect(second_row.size).to eq(1) expect(second_row.first.dossier).to eq(dossier) - # Make champs ordered - champ_integer.type_de_champ.update(order_place: 0) - champ_text.type_de_champ.update(order_place: 1) - champ.champs << champ_integer first_row = champ.reload.rows.first expect(first_row.size).to eq(2)