diff --git a/app/components/dossiers/champs_rows_show_component.rb b/app/components/dossiers/champs_rows_show_component.rb index b4d5f9e27..b0f17d6cd 100644 --- a/app/components/dossiers/champs_rows_show_component.rb +++ b/app/components/dossiers/champs_rows_show_component.rb @@ -25,8 +25,8 @@ class Dossiers::ChampsRowsShowComponent < ApplicationComponent end def blank_key(champ) - key = ".blank_optional" - key += "_attachment" if champ.type_de_champ.piece_justificative_or_titre_identite? + key = champ.mandatory? ? ".blank" : ".blank_optional" + key += "_attachment" if champ.piece_justificative_or_titre_identite? key end diff --git a/app/components/dossiers/champs_rows_show_component/champs_rows_show_component.en.yml b/app/components/dossiers/champs_rows_show_component/champs_rows_show_component.en.yml index c18cd4dd0..4045f42c7 100644 --- a/app/components/dossiers/champs_rows_show_component/champs_rows_show_component.en.yml +++ b/app/components/dossiers/champs_rows_show_component/champs_rows_show_component.en.yml @@ -1,4 +1,6 @@ --- en: - blank_optional: "empty (optional)" - blank_optional_attachment: "document not supplied (optional)" + blank: 'empty' + blank_attachment: 'document not supplied' + blank_optional: 'empty (optional)' + blank_optional_attachment: 'document not supplied (optional)' diff --git a/app/components/dossiers/champs_rows_show_component/champs_rows_show_component.fr.yml b/app/components/dossiers/champs_rows_show_component/champs_rows_show_component.fr.yml index 01694f30f..a20313960 100644 --- a/app/components/dossiers/champs_rows_show_component/champs_rows_show_component.fr.yml +++ b/app/components/dossiers/champs_rows_show_component/champs_rows_show_component.fr.yml @@ -1,4 +1,6 @@ --- fr: - blank_optional: "non saisi (facultatif)" - blank_optional_attachment: "pièce justificative non saisie (facultative)" + blank: 'non saisi' + blank_attachment: 'pièce justificative non saisie' + blank_optional: 'non saisi (facultatif)' + blank_optional_attachment: 'pièce justificative non saisie (facultative)' diff --git a/app/components/procedure/revision_changes_component.rb b/app/components/procedure/revision_changes_component.rb index f011e3b0b..75ec06969 100644 --- a/app/components/procedure/revision_changes_component.rb +++ b/app/components/procedure/revision_changes_component.rb @@ -8,7 +8,6 @@ class Procedure::RevisionChangesComponent < ApplicationComponent @tdc_changes = previous_revision.compare_types_de_champ(new_revision) @public_move_changes, @private_move_changes = @tdc_changes.filter { _1.op == :move }.partition { !_1.private? } - @delete_champ_warning = !total_dossiers.zero? && !@tdc_changes.all?(&:can_rebase?) @ineligibilite_rules_changes = previous_revision.compare_ineligibilite_rules(new_revision) end @@ -18,11 +17,4 @@ class Procedure::RevisionChangesComponent < ApplicationComponent def used_by_routing_rules?(type_de_champ) @procedure.used_by_routing_rules?(type_de_champ) end - - def total_dossiers - @total_dossiers ||= @previous_revision.dossiers - .visible_by_administration - .state_en_construction_ou_instruction - .size - end end diff --git a/app/components/procedure/revision_changes_component/revision_changes_component.html.haml b/app/components/procedure/revision_changes_component/revision_changes_component.html.haml index 2cfed321b..7d4f2ce85 100644 --- a/app/components/procedure/revision_changes_component/revision_changes_component.html.haml +++ b/app/components/procedure/revision_changes_component/revision_changes_component.html.haml @@ -11,15 +11,9 @@ = t('.public.add_mandatory', label: change.label) - else = t(".#{prefix}.add", label: change.label) - - if !total_dossiers.zero? && !change.can_rebase? - .fr-alert.fr-alert--warning.fr-mt-1v - %p= t('.breaking_change', count: total_dossiers) - when :remove - list.with_item do = t(".#{prefix}.remove", label: change.label) - - if @delete_champ_warning - .fr-alert.fr-alert--warning.fr-mt-1v - %p= t('.delete_champ_html', count: total_dossiers) - when :update - case change.attribute - when :libelle @@ -28,9 +22,6 @@ - when :type_champ - list.with_item do = t(".#{prefix}.update_type_champ", label: change.label, to: t("activerecord.attributes.type_de_champ.type_champs.#{change.to}")) - - if !total_dossiers.zero? && !change.can_rebase? - .fr-alert.fr-alert--warning.fr-mt-1v - %p= t('.breaking_change', count: total_dossiers) - when :description - list.with_item do - if change.to.blank? @@ -47,15 +38,9 @@ - if change.from == false - list.with_item do = t(".public.enable_mandatory", label: change.label) - - if !total_dossiers.zero? && !change.can_rebase? - .fr-alert.fr-alert--warning.fr-mt-1v - %p= t('.breaking_change', count: total_dossiers) - else - list.with_item do = t(".public.disable_mandatory", label: change.label) - - if !total_dossiers.zero? && !change.can_rebase? - .fr-alert.fr-alert--warning.fr-mt-1v - %p= t('.breaking_change', count: total_dossiers) - when :piece_justificative_template - list.with_item do = t(".#{prefix}.update_piece_justificative_template", label: change.label) @@ -74,9 +59,6 @@ - if removed.present? - list.with_item do = t('.remove_option', items: removed.map{ |term| "« #{term.strip} »" }.join(", ")) - - if !total_dossiers.zero? && !change.can_rebase? - .fr-alert.fr-alert--warning.fr-mt-1v - %p= t('.breaking_change', count: total_dossiers) - if (removed.present? || added.present? ) && used_by_routing_rules?(change.type_de_champ) .fr-alert.fr-alert--warning.fr-mt-1v = t(".#{prefix}.update_drop_down_options_alert", label: change.label) @@ -84,15 +66,9 @@ - if change.from == false - list.with_item do = t(".#{prefix}.enable_drop_down_other", label: change.label) - - if !total_dossiers.zero? && !change.can_rebase? - .fr-alert.fr-alert--warning.fr-mt-1v - %p= t('.breaking_change', count: total_dossiers) - else - list.with_item do = t(".#{prefix}.disable_drop_down_other", label: change.label) - - if !total_dossiers.zero? && !change.can_rebase? - .fr-alert.fr-alert--warning.fr-mt-1v - %p= t('.breaking_change', count: total_dossiers) - when :carte_layers - added = change.to.sort - change.from.sort - removed = change.from.sort - change.to.sort @@ -122,21 +98,12 @@ - if change.from.nil? - list.with_item do = t(".#{prefix}.add_condition", label: change.label, to: change.to) - - if !total_dossiers.zero? && !change.can_rebase? - .fr-alert.fr-alert--warning.fr-mt-1v - %p= t('.breaking_change', count: total_dossiers) - elsif change.to.nil? - list.with_item do = t(".#{prefix}.remove_condition", label: change.label) - - if !total_dossiers.zero? && !change.can_rebase? - .fr-alert.fr-alert--warning.fr-mt-1v - %p= t('.breaking_change', count: total_dossiers) - else - list.with_item do = t(".#{prefix}.update_condition", label: change.label, to: change.to) - - if !total_dossiers.zero? && !change.can_rebase? - .fr-alert.fr-alert--warning.fr-mt-1v - %p= t('.breaking_change', count: total_dossiers) - when :character_limit - if change.to.blank? - list.with_item do diff --git a/app/models/champs/drop_down_list_champ.rb b/app/models/champs/drop_down_list_champ.rb index d5b08db9d..908ceda02 100644 --- a/app/models/champs/drop_down_list_champ.rb +++ b/app/models/champs/drop_down_list_champ.rb @@ -52,10 +52,6 @@ class Champs::DropDownListChamp < Champ other? ? value : "" end - def in?(options) - options.include?(value) - end - private def value_is_in_options diff --git a/app/models/champs/linked_drop_down_list_champ.rb b/app/models/champs/linked_drop_down_list_champ.rb index 9254cfca0..6e948c5a3 100644 --- a/app/models/champs/linked_drop_down_list_champ.rb +++ b/app/models/champs/linked_drop_down_list_champ.rb @@ -43,10 +43,6 @@ class Champs::LinkedDropDownListChamp < Champ primary_value.present? && secondary_options[primary_value]&.any?(&:present?) end - def in?(options) - options.include?(primary_value) || options.include?(secondary_value) - end - private def pack_value(primary, secondary) diff --git a/app/models/champs/multiple_drop_down_list_champ.rb b/app/models/champs/multiple_drop_down_list_champ.rb index 0e1ff8ff6..8825d4617 100644 --- a/app/models/champs/multiple_drop_down_list_champ.rb +++ b/app/models/champs/multiple_drop_down_list_champ.rb @@ -29,10 +29,6 @@ class Champs::MultipleDropDownListChamp < Champ render_as_checkboxes? end - def in?(options) - (selected_options - options).size != selected_options.size - end - def focusable_input_id render_as_checkboxes? ? checkbox_id(drop_down_options.first) : input_id end diff --git a/app/models/concerns/dossier_clone_concern.rb b/app/models/concerns/dossier_clone_concern.rb index 84e288146..8ddca734b 100644 --- a/app/models/concerns/dossier_clone_concern.rb +++ b/app/models/concerns/dossier_clone_concern.rb @@ -73,7 +73,7 @@ module DossierCloneConcern return false if revision_id > editing_fork.revision_id transaction do - rebase!(force: true) + rebase! diff = make_diff(editing_fork) apply_diff(diff) touch(:last_champ_updated_at) diff --git a/app/models/concerns/dossier_rebase_concern.rb b/app/models/concerns/dossier_rebase_concern.rb index 54d79f10f..a3ae84be1 100644 --- a/app/models/concerns/dossier_rebase_concern.rb +++ b/app/models/concerns/dossier_rebase_concern.rb @@ -3,15 +3,12 @@ module DossierRebaseConcern extend ActiveSupport::Concern - def rebase!(force: false) + def rebase! ProcedureRevisionPreloader.new([procedure.published_revision, revision].compact).all return if procedure.published_revision.blank? + return if !can_rebase? - if force || can_rebase? - transaction do - rebase - end - end + transaction { rebase } end def rebase_later @@ -19,32 +16,15 @@ module DossierRebaseConcern end def can_rebase? - procedure.published_revision.present? && revision != procedure.published_revision && - (brouillon? || accepted_en_construction_changes? || accepted_en_instruction_changes?) + procedure.published_revision.present? && revision != procedure.published_revision && !termine? end def pending_changes procedure.published_revision.present? ? revision.compare_types_de_champ(procedure.published_revision) : [] end - def can_rebase_mandatory_change?(stable_id) - !champs.filter { _1.stable_id == stable_id }.any?(&:blank?) - end - - def can_rebase_drop_down_options_change?(stable_id, options) - !champs.filter { _1.stable_id == stable_id }.any? { _1.in?(options) } - end - private - def accepted_en_construction_changes? - en_construction? && pending_changes.all? { _1.can_rebase?(self) } - end - - def accepted_en_instruction_changes? - en_instruction? && pending_changes.all? { _1.can_rebase?(self) } - end - def rebase # revision we are rebasing to target_revision = procedure.published_revision diff --git a/app/models/procedure_revision_change.rb b/app/models/procedure_revision_change.rb index ddd52a7d0..6f6984e84 100644 --- a/app/models/procedure_revision_change.rb +++ b/app/models/procedure_revision_change.rb @@ -22,7 +22,6 @@ class ProcedureRevisionChange def op = :add def mandatory? = @type_de_champ.mandatory? - def can_rebase?(dossier = nil) = !mandatory? def to_h = super.merge(mandatory: mandatory?) end @@ -33,7 +32,6 @@ class ProcedureRevisionChange end def op = :remove - def can_rebase?(dossier = nil) = true end class MoveChamp < TypeDeChange @@ -46,7 +44,6 @@ class ProcedureRevisionChange end def op = :move - def can_rebase?(dossier = nil) = true def to_h = super.merge(from:, to:) end @@ -62,22 +59,6 @@ class ProcedureRevisionChange def op = :update def to_h = super.merge(attribute:, from:, to:) - - def can_rebase?(dossier = nil) - return true if private? - case attribute - when :drop_down_options - (from - to).empty? || dossier&.can_rebase_drop_down_options_change?(stable_id, from - to) - when :drop_down_other - !from && to - when :mandatory - (from && !to) || dossier&.can_rebase_mandatory_change?(stable_id) - when :type_champ, :condition, :expression_reguliere - false - else - true - end - end end class EligibiliteRulesChange diff --git a/spec/models/concerns/dossier_rebase_concern_spec.rb b/spec/models/concerns/dossier_rebase_concern_spec.rb index 1f54fa997..83a2d9a13 100644 --- a/spec/models/concerns/dossier_rebase_concern_spec.rb +++ b/spec/models/concerns/dossier_rebase_concern_spec.rb @@ -28,12 +28,11 @@ describe DossierRebaseConcern do dossier end - context 'with added non mandatory type de champ' do + context 'with added type de champ' do before do procedure.draft_revision.add_type_de_champ({ type_champ: TypeDeChamp.type_champs.fetch(:text), - libelle: "Un champ text", - mandatory: false + libelle: "Un champ text" }) procedure.publish_revision! dossier.reload @@ -44,116 +43,6 @@ describe DossierRebaseConcern do expect(dossier.can_rebase?).to be_truthy end end - - context 'with added mandatory type de champ' do - before do - procedure.draft_revision.add_type_de_champ({ - type_champ: TypeDeChamp.type_champs.fetch(:text), - libelle: "Un champ text", - mandatory: true - }) - procedure.publish_revision! - dossier.reload - end - - it 'should be false' do - expect(dossier.pending_changes).not_to be_empty - expect(dossier.can_rebase?).to be_falsey - end - end - - context 'with type de champ made optional' do - before do - procedure.draft_revision.find_and_ensure_exclusive_use(mandatory_type_de_champ.stable_id).update(mandatory: false) - procedure.publish_revision! - dossier.reload - end - - it 'should be true' do - expect(dossier.pending_changes).not_to be_empty - expect(dossier.can_rebase?).to be_truthy - end - end - - context 'with type de champ made mandatory' do - before do - procedure.draft_revision.find_and_ensure_exclusive_use(type_de_champ.stable_id).update(mandatory: true) - procedure.publish_revision! - dossier.reload - end - - it 'should be false' do - expect(dossier.pending_changes).not_to be_empty - expect(dossier.can_rebase?).to be_falsey - end - - context 'with a value' do - before do - dossier.champs.find_by(stable_id: type_de_champ.stable_id).update(value: 'a value') - end - - it 'should be true' do - expect(dossier.pending_changes).not_to be_empty - expect(dossier.can_rebase?).to be_truthy - end - end - end - - context 'with type de champ change type' do - context 'type de champ public' do - before do - procedure.draft_revision.find_and_ensure_exclusive_use(type_de_champ.stable_id).update(type_champ: :checkbox) - procedure.publish_revision! - dossier.reload - end - - it 'should be false' do - expect(dossier.pending_changes).not_to be_empty - expect(dossier.can_rebase?).to be_falsey - end - end - - context 'type de champ private' do - before do - procedure.draft_revision.find_and_ensure_exclusive_use(private_type_de_champ.stable_id).update(type_champ: :checkbox) - procedure.publish_revision! - dossier.reload - end - - it 'should be true' do - expect(dossier.pending_changes).not_to be_empty - expect(dossier.can_rebase?).to be_truthy - end - end - end - - context 'with type de champ regexp and regexp change' do - let(:procedure) { create(:procedure, types_de_champ_public: [{ mandatory: true }, { type: :expression_reguliere, mandatory: false }], types_de_champ_private: [{}]) } - - before do - procedure.draft_revision.find_and_ensure_exclusive_use(type_de_champ.stable_id).update(expression_reguliere: /\d+/) - procedure.publish_revision! - dossier.reload - end - - it 'should be false' do - expect(dossier.pending_changes).not_to be_empty - expect(dossier.can_rebase?).to be_falsey - end - end - - context 'with removed type de champ' do - before do - procedure.draft_revision.remove_type_de_champ(type_de_champ.stable_id) - procedure.publish_revision! - dossier.reload - end - - it 'should be true' do - expect(dossier.pending_changes).not_to be_empty - expect(dossier.can_rebase?).to be_truthy - end - end end context 'en_instruction' do @@ -165,12 +54,11 @@ describe DossierRebaseConcern do dossier end - context 'with added non mandatory type de champ' do + context 'with added type de champ' do before do procedure.draft_revision.add_type_de_champ({ type_champ: TypeDeChamp.type_champs.fetch(:text), - libelle: "Un champ text", - mandatory: false + libelle: "Un champ text" }) procedure.publish_revision! dossier.reload @@ -181,90 +69,32 @@ describe DossierRebaseConcern do expect(dossier.can_rebase?).to be_truthy end end + end - context 'with added mandatory type de champ' do + context 'accepte' do + let(:dossier) { create(:dossier, :accepte, procedure: procedure) } + + before do + procedure.publish! + procedure.reload + dossier + end + + context 'with added type de champ' do before do procedure.draft_revision.add_type_de_champ({ type_champ: TypeDeChamp.type_champs.fetch(:text), - libelle: "Un champ text", - mandatory: true + libelle: "Un champ text" }) procedure.publish_revision! dossier.reload end - it 'should be false' do - expect(dossier.pending_changes).not_to be_empty - expect(dossier.can_rebase?).to be_falsey - end - end - - context 'with type de champ made optional' do - before do - procedure.draft_revision.find_and_ensure_exclusive_use(mandatory_type_de_champ.stable_id).update(mandatory: false) - procedure.publish_revision! - dossier.reload - end - it 'should be true' do - expect(dossier.pending_changes).not_to be_empty - expect(dossier.can_rebase?).to be_truthy - end - end - - context 'with type de champ made mandatory' do - before do - procedure.draft_revision.find_and_ensure_exclusive_use(type_de_champ.stable_id).update(mandatory: true) - procedure.publish_revision! - dossier.reload - end - - it 'should be false' do expect(dossier.pending_changes).not_to be_empty expect(dossier.can_rebase?).to be_falsey end end - - context 'with type de champ change type' do - context 'type de champ public' do - before do - procedure.draft_revision.find_and_ensure_exclusive_use(type_de_champ.stable_id).update(type_champ: :checkbox) - procedure.publish_revision! - dossier.reload - end - - it 'should be false' do - expect(dossier.pending_changes).not_to be_empty - expect(dossier.can_rebase?).to be_falsey - end - end - - context 'type de champ private' do - before do - procedure.draft_revision.find_and_ensure_exclusive_use(private_type_de_champ.stable_id).update(type_champ: :checkbox) - procedure.publish_revision! - dossier.reload - end - - it 'should be true' do - expect(dossier.pending_changes).not_to be_empty - expect(dossier.can_rebase?).to be_truthy - end - end - end - - context 'with removed type de champ' do - before do - procedure.draft_revision.remove_type_de_champ(type_de_champ.stable_id) - procedure.publish_revision! - dossier.reload - end - - it 'should be true' do - expect(dossier.pending_changes).not_to be_empty - expect(dossier.can_rebase?).to be_truthy - end - end end end @@ -396,8 +226,8 @@ describe DossierRebaseConcern do end end - context 'force rebase en construction' do - subject { dossier.rebase!(force: true) } + context 'rebase en construction' do + subject { dossier.rebase! } context 'procedure not published' do let(:procedure) { create(:procedure, :draft, types_de_champ_public:, types_de_champ_private:) } diff --git a/spec/views/shared/dossiers/_champs.html.haml_spec.rb b/spec/views/shared/dossiers/_champs.html.haml_spec.rb index 6d250ceaa..ad7e3424c 100644 --- a/spec/views/shared/dossiers/_champs.html.haml_spec.rb +++ b/spec/views/shared/dossiers/_champs.html.haml_spec.rb @@ -87,7 +87,7 @@ describe 'shared/dossiers/champs', type: :view do end context "with a dossier_link champ but without value" do - let(:types_de_champ_public) { [{ type: :dossier_link }] } + let(:types_de_champ_public) { [{ type: :dossier_link, mandatory: false }] } before do dossier.champs.first.update(value: nil) @@ -102,7 +102,7 @@ describe 'shared/dossiers/champs', type: :view do end context "with a piece justificative without value" do - let(:types_de_champ_public) { [{ type: :piece_justificative }] } + let(:types_de_champ_public) { [{ type: :piece_justificative, mandatory: false }] } before do dossier.champs.first.piece_justificative_file.purge