From bffd9d61a9dcc8ddc167c7a6ff667f8a5bf9fc0b Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Wed, 24 Aug 2022 12:39:07 +0200 Subject: [PATCH 1/8] add habtm between procedures and zones --- app/models/procedure.rb | 1 + app/models/zone.rb | 2 +- .../20221006190110_create_procedures_and_zones.rb | 10 ++++++++++ db/schema.rb | 11 ++++++++++- 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20221006190110_create_procedures_and_zones.rb diff --git a/app/models/procedure.rb b/app/models/procedure.rb index 23f668b3c..9e8881e83 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -103,6 +103,7 @@ class Procedure < ApplicationRecord belongs_to :replaced_by_procedure, -> { with_discarded }, inverse_of: :replaced_procedures, class_name: "Procedure", optional: true belongs_to :service, optional: true belongs_to :zone, optional: true + has_and_belongs_to_many :zones def active_dossier_submitted_message published_dossier_submitted_message || draft_dossier_submitted_message diff --git a/app/models/zone.rb b/app/models/zone.rb index 524c51ce3..aa13a174b 100644 --- a/app/models/zone.rb +++ b/app/models/zone.rb @@ -11,7 +11,7 @@ class Zone < ApplicationRecord validates :acronym, presence: true, uniqueness: true has_many :labels, -> { order(designated_on: :desc) }, class_name: 'ZoneLabel', inverse_of: :zone - has_many :procedures, -> { order(published_at: :desc) }, inverse_of: :zone + has_and_belongs_to_many :procedures, -> { order(published_at: :desc) }, inverse_of: :zone def current_label labels.first.name diff --git a/db/migrate/20221006190110_create_procedures_and_zones.rb b/db/migrate/20221006190110_create_procedures_and_zones.rb new file mode 100644 index 000000000..51e4396af --- /dev/null +++ b/db/migrate/20221006190110_create_procedures_and_zones.rb @@ -0,0 +1,10 @@ +class CreateProceduresAndZones < ActiveRecord::Migration[6.1] + def change + create_table :procedures_zones, id: false do |t| + t.belongs_to :procedure + t.belongs_to :zone + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 708580577..c1f5852cc 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2022_10_05_145646) do +ActiveRecord::Schema.define(version: 2022_10_06_190110) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" @@ -685,6 +685,15 @@ ActiveRecord::Schema.define(version: 2022_10_05_145646) do t.index ["zone_id"], name: "index_procedures_on_zone_id" end + create_table "procedures_zones", id: false, force: :cascade do |t| + t.datetime "created_at", precision: 6, null: false + t.bigint "procedure_id" + t.datetime "updated_at", precision: 6, null: false + t.bigint "zone_id" + t.index ["procedure_id"], name: "index_procedures_zones_on_procedure_id" + t.index ["zone_id"], name: "index_procedures_zones_on_zone_id" + end + create_table "received_mails", id: :serial, force: :cascade do |t| t.text "body" t.datetime "created_at", null: false From 6d90f65159856f10baf3c4d7bb56a52db1270182 Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Wed, 24 Aug 2022 12:44:13 +0200 Subject: [PATCH 2/8] backfill procedures_zones --- .../20221006193737_backfill_procedures_zones.rb | 17 +++++++++++++++++ db/schema.rb | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20221006193737_backfill_procedures_zones.rb diff --git a/db/migrate/20221006193737_backfill_procedures_zones.rb b/db/migrate/20221006193737_backfill_procedures_zones.rb new file mode 100644 index 000000000..9564cb51b --- /dev/null +++ b/db/migrate/20221006193737_backfill_procedures_zones.rb @@ -0,0 +1,17 @@ +class BackfillProceduresZones < ActiveRecord::Migration[6.1] + def up + # rubocop:disable DS/Unscoped + Procedure.unscoped.each do |procedure| + procedure.zones << procedure.zone if procedure.zone + end + # rubocop:enable DS/Unscoped + end + + def down + # rubocop:disable DS/Unscoped + Procedure.unscoped.each do |procedure| + procedure.zones.destroy_all + end + # rubocop:enable DS/Unscoped + end +end diff --git a/db/schema.rb b/db/schema.rb index c1f5852cc..1374cdb79 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2022_10_06_190110) do +ActiveRecord::Schema.define(version: 2022_10_06_193737) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" From 94ca93e130e5a8b575fee7ebf533c0c56b321a9a Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Wed, 24 Aug 2022 15:16:58 +0200 Subject: [PATCH 3/8] can choose multiple zones --- .../administrateurs/procedures_controller.rb | 2 +- app/helpers/zone_helper.rb | 13 ------------- app/models/zone.rb | 3 +++ .../procedures/_informations.html.haml | 8 ++++---- spec/models/zone_spec.rb | 4 ++-- 5 files changed, 10 insertions(+), 20 deletions(-) delete mode 100644 app/helpers/zone_helper.rb diff --git a/app/controllers/administrateurs/procedures_controller.rb b/app/controllers/administrateurs/procedures_controller.rb index c8c59adbf..1e50c6130 100644 --- a/app/controllers/administrateurs/procedures_controller.rb +++ b/app/controllers/administrateurs/procedures_controller.rb @@ -351,7 +351,7 @@ module Administrateurs :monavis_embed, :api_entreprise_token, :duree_conservation_dossiers_dans_ds, - :zone_id, + { zone_ids: [] }, :lien_dpo, :opendata, :procedure_expires_when_termine_enabled diff --git a/app/helpers/zone_helper.rb b/app/helpers/zone_helper.rb deleted file mode 100644 index 5275c9899..000000000 --- a/app/helpers/zone_helper.rb +++ /dev/null @@ -1,13 +0,0 @@ -module ZoneHelper - def grouped_options_for_zone(date) - date ||= Time.zone.now - collectivite = Zone.find_by(acronym: "COLLECTIVITE") - { - "--" => [ - [I18n.t('i_dont_know', scope: 'utils'), nil], - [collectivite.label, collectivite.id] - ], - I18n.t('ministeres', scope: 'zones') => (Zone.available_at(date) - [collectivite]).map { |m| [m.label_at(date), m.id] } - } - end -end diff --git a/app/models/zone.rb b/app/models/zone.rb index aa13a174b..5d34310da 100644 --- a/app/models/zone.rb +++ b/app/models/zone.rb @@ -28,5 +28,8 @@ class Zone < ApplicationRecord def self.available_at(date) Zone.all.filter { |zone| zone.available_at?(date) }.sort_by { |zone| zone.label_at(date) } + .map do |zone| + OpenStruct.new(id: zone.id, label: zone.label_at(date)) + end end end diff --git a/app/views/administrateurs/procedures/_informations.html.haml b/app/views/administrateurs/procedures/_informations.html.haml index 695584dba..b3c8c8e5b 100644 --- a/app/views/administrateurs/procedures/_informations.html.haml +++ b/app/views/administrateurs/procedures/_informations.html.haml @@ -14,10 +14,10 @@ = f.text_area :description, rows: '6', placeholder: 'Description de la démarche, destinataires, etc. ', class: 'form-control' - if Flipper.enabled? :zonage - = f.label :zone do - = t('zone', scope: 'activerecord.attributes.procedure') - %span.mandatory * - = f.select :zone_id, grouped_options_for_zone(@procedure.published_or_created_at) + = f.collection_check_boxes :zone_ids, Zone.available_at(@procedure.published_or_created_at), :id, :label do |b| + .editable-champ.editable-champ-checkbox + = b.check_box + = b.label %h3.header-subsection Logo de la démarche = render Attachment::EditComponent.new(form: f, attached_file: @procedure.logo, direct_upload: true, user_can_destroy: true) diff --git a/spec/models/zone_spec.rb b/spec/models/zone_spec.rb index 0d31d7721..085c4bb2e 100644 --- a/spec/models/zone_spec.rb +++ b/spec/models/zone_spec.rb @@ -114,8 +114,8 @@ describe Zone do end it 'returns only available zones at specific date' do - expect(Zone.available_at(start_last_government + 1.day)).to eq [culture] - expect(Zone.available_at(start_previous_government + 1.day)).to eq [culture, om] + expect(Zone.available_at(start_last_government + 1.day).map(&:label)).to eq ["Ministère de la Culture"] + expect(Zone.available_at(start_previous_government + 1.day).map(&:label)).to eq ["Ministère de la Culture", "Ministère des Outre-mer"] end end end From 4d2c37ffdf4c41c0d2d91532b4437d4e823b6cff Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Mon, 26 Sep 2022 19:02:39 +0200 Subject: [PATCH 4/8] extract checkboxes zones to dedicated page --- .../administrateurs/procedures_controller.rb | 5 +- .../procedures/_informations.html.haml | 6 --- .../procedures/zones.html.haml | 27 +++++++++++ config/routes.rb | 1 + .../procedures_controller_spec.rb | 11 +++++ .../procedures/edit.html.haml_spec.rb | 45 ----------------- .../procedures/zones.html.haml_spec.rb | 48 +++++++++++++++++++ 7 files changed, 91 insertions(+), 52 deletions(-) create mode 100644 app/views/administrateurs/procedures/zones.html.haml create mode 100644 spec/views/administrateurs/procedures/zones.html.haml_spec.rb diff --git a/app/controllers/administrateurs/procedures_controller.rb b/app/controllers/administrateurs/procedures_controller.rb index 1e50c6130..f1038842a 100644 --- a/app/controllers/administrateurs/procedures_controller.rb +++ b/app/controllers/administrateurs/procedures_controller.rb @@ -1,6 +1,6 @@ module Administrateurs class ProceduresController < AdministrateurController - before_action :retrieve_procedure, only: [:champs, :annotations, :modifications, :edit, :monavis, :update_monavis, :jeton, :update_jeton, :publication, :publish, :transfert, :close, :allow_expert_review, :experts_require_administrateur_invitation, :reset_draft] + before_action :retrieve_procedure, only: [:champs, :annotations, :modifications, :edit, :zones, :monavis, :update_monavis, :jeton, :update_jeton, :publication, :publish, :transfert, :close, :allow_expert_review, :experts_require_administrateur_invitation, :reset_draft] before_action :procedure_revisable?, only: [:champs, :annotations, :modifications, :reset_draft] before_action :draft_valid?, only: [:apercu] @@ -108,6 +108,9 @@ module Administrateurs def edit end + def zones + end + def create @procedure = Procedure.new(procedure_params.merge(administrateurs: [current_administrateur])) @procedure.draft_revision = @procedure.revisions.build diff --git a/app/views/administrateurs/procedures/_informations.html.haml b/app/views/administrateurs/procedures/_informations.html.haml index b3c8c8e5b..dea314f0c 100644 --- a/app/views/administrateurs/procedures/_informations.html.haml +++ b/app/views/administrateurs/procedures/_informations.html.haml @@ -13,12 +13,6 @@ %span.mandatory * = f.text_area :description, rows: '6', placeholder: 'Description de la démarche, destinataires, etc. ', class: 'form-control' -- if Flipper.enabled? :zonage - = f.collection_check_boxes :zone_ids, Zone.available_at(@procedure.published_or_created_at), :id, :label do |b| - .editable-champ.editable-champ-checkbox - = b.check_box - = b.label - %h3.header-subsection Logo de la démarche = render Attachment::EditComponent.new(form: f, attached_file: @procedure.logo, direct_upload: true, user_can_destroy: true) diff --git a/app/views/administrateurs/procedures/zones.html.haml b/app/views/administrateurs/procedures/zones.html.haml new file mode 100644 index 000000000..393753149 --- /dev/null +++ b/app/views/administrateurs/procedures/zones.html.haml @@ -0,0 +1,27 @@ +- content_for(:root_class, 'scroll-margins-for-sticky-footer') + += render partial: 'administrateurs/breadcrumbs', + locals: { steps: [['Démarches', admin_procedures_path], + [@procedure.libelle.truncate_words(10), admin_procedure_path(@procedure)], + ['Description']] } +.container + = form_for @procedure, + url: url_for({ controller: 'administrateurs/procedures', action: :update, id: @procedure.id }), + multipart: true, + html: { class: 'form' } do |f| + + %h1.page-title Zones + + = f.label :zone do + = t('zone', scope: 'activerecord.attributes.procedure') + - if Flipper.enabled? :zonage + = f.collection_check_boxes :zone_ids, Zone.available_at(@procedure.published_or_created_at), :id, :label do |b| + .editable-champ.editable-champ-checkbox + = b.check_box + = b.label + + .procedure-form__actions.sticky--bottom + .actions-right + = link_to 'Annuler', admin_procedure_path(id: @procedure), class: 'button', data: { confirm: 'Êtes-vous sûr de vouloir annuler les modifications effectuées ?'} + = f.button 'Enregistrer', class: 'button primary send' + diff --git a/config/routes.rb b/config/routes.rb index 447a7b4ef..45d111feb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -431,6 +431,7 @@ Rails.application.routes.draw do member do get 'apercu' get 'champs' + get 'zones' get 'annotations' get 'modifications' get 'monavis' diff --git a/spec/controllers/administrateurs/procedures_controller_spec.rb b/spec/controllers/administrateurs/procedures_controller_spec.rb index d8debff14..7530ea0d0 100644 --- a/spec/controllers/administrateurs/procedures_controller_spec.rb +++ b/spec/controllers/administrateurs/procedures_controller_spec.rb @@ -12,6 +12,8 @@ describe Administrateurs::ProceduresController, type: :controller do let(:duree_conservation_dossiers_dans_ds) { 3 } let(:monavis_embed) { nil } let(:lien_site_web) { 'http://mon-site.gouv.fr' } + let(:zone) { create(:zone) } + let(:zone_ids) { [zone.id] } describe '#apercu' do render_views @@ -55,6 +57,7 @@ describe Administrateurs::ProceduresController, type: :controller do cadre_juridique: cadre_juridique, duree_conservation_dossiers_dans_ds: duree_conservation_dossiers_dans_ds, monavis_embed: monavis_embed, + zone_ids: zone_ids, lien_site_web: lien_site_web } } @@ -176,6 +179,14 @@ describe Administrateurs::ProceduresController, type: :controller do end end + describe 'GET #zones' do + let(:procedure) { create(:procedure, administrateur: admin) } + let(:procedure_id) { procedure.id } + + subject { get :zones, params: { id: procedure_id } } + it { is_expected.to have_http_status(:success) } + end + describe 'POST #create' do context 'when all attributs are filled' do describe 'new procedure in database' do diff --git a/spec/views/administrateurs/procedures/edit.html.haml_spec.rb b/spec/views/administrateurs/procedures/edit.html.haml_spec.rb index 02235dca6..5ceae402b 100644 --- a/spec/views/administrateurs/procedures/edit.html.haml_spec.rb +++ b/spec/views/administrateurs/procedures/edit.html.haml_spec.rb @@ -1,16 +1,6 @@ describe 'administrateurs/procedures/edit.html.haml' do let(:logo) { fixture_file_upload('spec/fixtures/files/logo_test_procedure.png', 'image/png') } let(:procedure) { create(:procedure, logo: logo, lien_site_web: 'http://some.website') } - let(:populate_zones_task) { Rake::Task['after_party:populate_zones'] } - - before do - Flipper.enable(:zonage) - populate_zones_task.invoke - end - - after do - populate_zones_task.reenable - end context 'when procedure logo is present' do it 'display on the page' do @@ -20,39 +10,4 @@ describe 'administrateurs/procedures/edit.html.haml' do expect(rendered).to have_selector('.procedure-logos') end end - - context 'when procedure has never been published' do - before { Timecop.freeze(now) } - after { Timecop.return } - - let(:procedure) { create(:procedure, zone: Zone.find_by(acronym: 'MTEI')) } - let(:now) { Time.zone.parse('18/05/2022') } - - it 'displays zones with label available at the creation date' do - assign(:procedure, procedure) - render - - expect(rendered).to have_content("Ministère du Travail") - expect(rendered).not_to have_content("Ministère du Travail, du Plein emploi et de l'Insertion") - end - end - - context 'when procedure has been published' do - before { Timecop.freeze(now) } - after { Timecop.return } - - let(:procedure) { create(:procedure, zone: Zone.find_by(acronym: 'MTEI')) } - let(:now) { Time.zone.parse('18/05/2022') } - - it 'displays zones with label available at the creation date' do - Timecop.freeze(Time.zone.parse('22/05/2022')) do - procedure.publish! - end - - assign(:procedure, procedure) - render - - expect(rendered).to have_content("Ministère du Travail, du Plein emploi et de l'Insertion") - end - end end diff --git a/spec/views/administrateurs/procedures/zones.html.haml_spec.rb b/spec/views/administrateurs/procedures/zones.html.haml_spec.rb new file mode 100644 index 000000000..9ab33d000 --- /dev/null +++ b/spec/views/administrateurs/procedures/zones.html.haml_spec.rb @@ -0,0 +1,48 @@ +describe 'administrateurs/procedures/zones.html.haml' do + let(:procedure) { create(:procedure) } + let(:populate_zones_task) { Rake::Task['after_party:populate_zones'] } + + before do + Flipper.enable(:zonage) + populate_zones_task.invoke + end + + after do + populate_zones_task.reenable + end + + context 'when procedure has never been published' do + before { Timecop.freeze(now) } + after { Timecop.return } + + let(:procedure) { create(:procedure, zones: [Zone.find_by(acronym: 'MTEI')]) } + let(:now) { Time.zone.parse('18/05/2022') } + + it 'displays zones with label available at the creation date' do + assign(:procedure, procedure) + render + + expect(rendered).to have_content("Ministère du Travail") + expect(rendered).not_to have_content("Ministère du Travail, du Plein emploi et de l'Insertion") + end + end + + context 'when procedure has been published' do + before { Timecop.freeze(now) } + after { Timecop.return } + + let(:procedure) { create(:procedure, zones: [Zone.find_by(acronym: 'MTEI')]) } + let(:now) { Time.zone.parse('18/05/2022') } + + it 'displays zones with label available at the creation date' do + Timecop.freeze(Time.zone.parse('22/05/2022')) do + procedure.publish! + end + + assign(:procedure, procedure) + render + + expect(rendered).to have_content("Ministère du Travail, du Plein emploi et de l'Insertion") + end + end +end From a6928e7ca2d60f5328ef1449da17e7be2837a0d9 Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Mon, 26 Sep 2022 19:03:40 +0200 Subject: [PATCH 5/8] add ZonesComponent --- app/components/procedure/card/zones_component.rb | 5 +++++ .../card/zones_component/zones_component.fr.yml | 4 ++++ .../card/zones_component/zones_component.html.haml | 13 +++++++++++++ app/views/administrateurs/procedures/show.html.haml | 1 + 4 files changed, 23 insertions(+) create mode 100644 app/components/procedure/card/zones_component.rb create mode 100644 app/components/procedure/card/zones_component/zones_component.fr.yml create mode 100644 app/components/procedure/card/zones_component/zones_component.html.haml diff --git a/app/components/procedure/card/zones_component.rb b/app/components/procedure/card/zones_component.rb new file mode 100644 index 000000000..dc41f8ea6 --- /dev/null +++ b/app/components/procedure/card/zones_component.rb @@ -0,0 +1,5 @@ +class Procedure::Card::ZonesComponent < ApplicationComponent + def initialize(procedure:) + @procedure = procedure + end +end diff --git a/app/components/procedure/card/zones_component/zones_component.fr.yml b/app/components/procedure/card/zones_component/zones_component.fr.yml new file mode 100644 index 000000000..c6d175347 --- /dev/null +++ b/app/components/procedure/card/zones_component/zones_component.fr.yml @@ -0,0 +1,4 @@ +--- +fr: + title: Zones + subtitle: Ministère(s) ou collectivité qui mettent en oeuvre la démarche diff --git a/app/components/procedure/card/zones_component/zones_component.html.haml b/app/components/procedure/card/zones_component/zones_component.html.haml new file mode 100644 index 000000000..6cb79e58f --- /dev/null +++ b/app/components/procedure/card/zones_component/zones_component.html.haml @@ -0,0 +1,13 @@ += link_to zones_admin_procedure_path(@procedure), id: 'zones', class: 'card-admin' do + - if @procedure.zones.size >= 1 + %div + %span.icon.accept + %p.card-admin-status-accept Validé + - else + %div + %span.icon.clock + %p.card-admin-status-todo À faire + %div + %p.card-admin-title= t('.title') + %p.card-admin-subtitle= t('.subtitle') + %p.button= t('views.shared.actions.edit') diff --git a/app/views/administrateurs/procedures/show.html.haml b/app/views/administrateurs/procedures/show.html.haml index db992ddcb..f742ce1ab 100644 --- a/app/views/administrateurs/procedures/show.html.haml +++ b/app/views/administrateurs/procedures/show.html.haml @@ -58,6 +58,7 @@ %h2.procedure-admin-explanation Indispensable avant publication .procedure-grid = render Procedure::Card::PresentationComponent.new(procedure: @procedure) + = render Procedure::Card::ZonesComponent.new(procedure: @procedure) if Flipper.enabled? :zonage = render Procedure::Card::ChampsComponent.new(procedure: @procedure) = render Procedure::Card::ServiceComponent.new(procedure: @procedure, administrateur: current_administrateur) = render Procedure::Card::AdministrateursComponent.new(procedure: @procedure) From 2985295a00a8c9289d610b1c7aab9eb505366ee9 Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Mon, 26 Sep 2022 19:04:32 +0200 Subject: [PATCH 6/8] use normal font weight for checkbox labels --- app/assets/stylesheets/forms.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/forms.scss b/app/assets/stylesheets/forms.scss index 188dcbc8a..8bba900c1 100644 --- a/app/assets/stylesheets/forms.scss +++ b/app/assets/stylesheets/forms.scss @@ -85,6 +85,7 @@ p, label { padding-left: 28px; + font-weight: normal; } input[type=checkbox] { From bdcb451d3c8bf8bb4b2d0efa62a5ddde0ad8464d Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Tue, 27 Sep 2022 19:22:42 +0200 Subject: [PATCH 7/8] procedure publiee must have one zone at least --- .../administrateurs/procedures_controller.rb | 6 +++++- app/models/procedure.rb | 1 + .../administrateurs/procedures_controller_spec.rb | 13 +++++++++++++ spec/factories/procedure.rb | 2 +- spec/models/dossier_spec.rb | 2 +- spec/models/procedure_spec.rb | 14 +++++++------- 6 files changed, 28 insertions(+), 10 deletions(-) diff --git a/app/controllers/administrateurs/procedures_controller.rb b/app/controllers/administrateurs/procedures_controller.rb index f1038842a..fc6692944 100644 --- a/app/controllers/administrateurs/procedures_controller.rb +++ b/app/controllers/administrateurs/procedures_controller.rb @@ -131,7 +131,11 @@ module Administrateurs if !@procedure.update(procedure_params) flash.now.alert = @procedure.errors.full_messages - render 'edit' + if @procedure.errors[:zones].present? + render 'zones' + else + render 'edit' + end elsif @procedure.brouillon? reset_procedure flash.notice = 'Démarche modifiée. Tous les dossiers de cette démarche ont été supprimés.' diff --git a/app/models/procedure.rb b/app/models/procedure.rb index 9e8881e83..f93f02614 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -289,6 +289,7 @@ class Procedure < ApplicationRecord validates :lien_dpo, email_or_link: true, allow_nil: true validates_with MonAvisEmbedValidator + validates :zones, presence: true, if: -> record { record.publiee? && Flipper.enabled?(:zonage) } FILE_MAX_SIZE = 20.megabytes validates :notice, content_type: [ diff --git a/spec/controllers/administrateurs/procedures_controller_spec.rb b/spec/controllers/administrateurs/procedures_controller_spec.rb index 7530ea0d0..4fb4c7160 100644 --- a/spec/controllers/administrateurs/procedures_controller_spec.rb +++ b/spec/controllers/administrateurs/procedures_controller_spec.rb @@ -334,6 +334,19 @@ describe Administrateurs::ProceduresController, type: :controller do it { expect(subject.for_individual).not_to eq procedure_params[:for_individual] } end + + context 'when zones are empty' do + before do + Flipper.enable(:zonage) + end + + after do + Flipper.disable(:zonage) + end + + let(:zone_ids) { [""] } + it { is_expected.to render_template :zones } + end end end end diff --git a/spec/factories/procedure.rb b/spec/factories/procedure.rb index 755c70abd..04acc4316 100644 --- a/spec/factories/procedure.rb +++ b/spec/factories/procedure.rb @@ -13,7 +13,6 @@ FactoryBot.define do ask_birthday { false } lien_site_web { "https://mon-site.gouv" } path { SecureRandom.uuid } - association :zone groupe_instructeurs { [association(:groupe_instructeur, :default, procedure: instance, strategy: :build)] } administrateurs { administrateur.present? ? [administrateur] : [association(:administrateur)] } @@ -282,6 +281,7 @@ FactoryBot.define do published_at { Time.zone.now } unpublished_at { nil } closed_at { nil } + zones { [association(:zone, strategy: :build)] } end trait :closed do diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb index 03f73d39b..06a48df62 100644 --- a/spec/models/dossier_spec.rb +++ b/spec/models/dossier_spec.rb @@ -1484,7 +1484,7 @@ describe Dossier do end describe "champs_for_export" do - let(:procedure) { create(:procedure, :with_type_de_champ, :with_datetime, :with_yes_no, :with_explication, :with_commune, :with_repetition) } + let(:procedure) { create(:procedure, :with_type_de_champ, :with_datetime, :with_yes_no, :with_explication, :with_commune, :with_repetition, zones: [create(:zone)]) } let(:text_type_de_champ) { procedure.types_de_champ.find { |type_de_champ| type_de_champ.type_champ == TypeDeChamp.type_champs.fetch(:text) } } let(:yes_no_type_de_champ) { procedure.types_de_champ.find { |type_de_champ| type_de_champ.type_champ == TypeDeChamp.type_champs.fetch(:yes_no) } } let(:datetime_type_de_champ) { procedure.types_de_champ.find { |type_de_champ| type_de_champ.type_champ == TypeDeChamp.type_champs.fetch(:datetime) } } diff --git a/spec/models/procedure_spec.rb b/spec/models/procedure_spec.rb index 5b1924c31..156ebb53b 100644 --- a/spec/models/procedure_spec.rb +++ b/spec/models/procedure_spec.rb @@ -704,7 +704,7 @@ describe Procedure do end describe '#publish!' do - let(:procedure) { create(:procedure, path: 'example-path') } + let(:procedure) { create(:procedure, path: 'example-path', zones: [create(:zone)]) } let(:now) { Time.zone.now.beginning_of_minute } context 'when publishing a new procedure' do @@ -757,7 +757,7 @@ describe Procedure do let(:canonical_procedure) { create(:procedure, :published) } let(:administrateur) { canonical_procedure.administrateurs.first } - let(:procedure) { create(:procedure, administrateurs: [administrateur]) } + let(:procedure) { create(:procedure, administrateurs: [administrateur], zones: [create(:zone)]) } let(:now) { Time.zone.now.beginning_of_minute } context 'when publishing over a previous canonical procedure' do @@ -1063,7 +1063,7 @@ describe Procedure do end describe 'suggested_path' do - let(:procedure) { create(:procedure, aasm_state: :publiee, libelle: 'Inscription au Collège') } + let(:procedure) { create(:procedure, aasm_state: :publiee, libelle: 'Inscription au Collège', zones: [create(:zone)]) } subject { procedure.suggested_path(procedure.administrateurs.first) } @@ -1079,7 +1079,7 @@ describe Procedure do context 'when the suggestion conflicts with one procedure' do before do - create(:procedure, aasm_state: :publiee, path: 'inscription-au-college') + create(:procedure, aasm_state: :publiee, path: 'inscription-au-college', zones: [create(:zone)]) end it { is_expected.to eq 'inscription-au-college-2' } @@ -1087,8 +1087,8 @@ describe Procedure do context 'when the suggestion conflicts with several procedures' do before do - create(:procedure, aasm_state: :publiee, path: 'inscription-au-college') - create(:procedure, aasm_state: :publiee, path: 'inscription-au-college-2') + create(:procedure, aasm_state: :publiee, path: 'inscription-au-college', zones: [create(:zone)]) + create(:procedure, aasm_state: :publiee, path: 'inscription-au-college-2', zones: [create(:zone)]) end it { is_expected.to eq 'inscription-au-college-3' } @@ -1096,7 +1096,7 @@ describe Procedure do context 'when the suggestion conflicts with another procedure of the same admin' do before do - create(:procedure, aasm_state: :publiee, path: 'inscription-au-college', administrateurs: procedure.administrateurs) + create(:procedure, aasm_state: :publiee, path: 'inscription-au-college', administrateurs: procedure.administrateurs, zones: [create(:zone)]) end it { is_expected.to eq 'inscription-au-college' } From 272c8cae09781d7d5c2c46189751d62cfc7a04ac Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Tue, 27 Sep 2022 19:46:50 +0200 Subject: [PATCH 8/8] cannot publish a procedure if no zones --- app/models/procedure.rb | 12 ++++ .../procedures/publication.html.haml | 11 ++-- spec/models/procedure_spec.rb | 60 +++++++++++++++++++ 3 files changed, 78 insertions(+), 5 deletions(-) diff --git a/app/models/procedure.rb b/app/models/procedure.rb index f93f02614..4f2db3b1f 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -629,6 +629,10 @@ class Procedure < ApplicationRecord result << :instructeurs end + if missing_zones? + result << :zones + end + result end @@ -661,6 +665,14 @@ class Procedure < ApplicationRecord !AssignTo.exists?(groupe_instructeur: groupe_instructeurs) end + def missing_zones? + if Flipper.enabled?(:zonage) + zones.empty? + else + false + end + end + def revised? feature_enabled?(:procedure_revisions) && revisions.size > 2 end diff --git a/app/views/administrateurs/procedures/publication.html.haml b/app/views/administrateurs/procedures/publication.html.haml index b9601f594..4e9435c79 100644 --- a/app/views/administrateurs/procedures/publication.html.haml +++ b/app/views/administrateurs/procedures/publication.html.haml @@ -74,13 +74,14 @@ - else .alert.alert-info - Pour pouvoir tester cette démarche, vous devez d’abord lui affecter + Pour pouvoir tester cette démarche, vous devez d’abord lui affecter : + %ul + - if @procedure.missing_zones? + %li= link_to("une ou plusieurs zones", zones_admin_procedure_path(id: @procedure.id)) - if @procedure.missing_instructeurs? - = link_to("des instructeurs", admin_procedure_groupe_instructeur_path(@procedure, @procedure.defaut_groupe_instructeur)) - - if @procedure.missing_instructeurs? && @procedure.service.nil? - et + %li= link_to("des instructeurs", admin_procedure_groupe_instructeur_path(@procedure, @procedure.defaut_groupe_instructeur)) - if @procedure.service.nil? - = link_to("un service", admin_services_path(procedure_id: @procedure)) + %li= link_to("un service", admin_services_path(procedure_id: @procedure)) \. - else - if @procedure.missing_steps.include?(:service) diff --git a/spec/models/procedure_spec.rb b/spec/models/procedure_spec.rb index 156ebb53b..69063f825 100644 --- a/spec/models/procedure_spec.rb +++ b/spec/models/procedure_spec.rb @@ -1231,6 +1231,66 @@ describe Procedure do end end + describe '.missing_zones?' do + before do + Flipper.enable :zonage + end + + after do + Flipper.disable :zonage + end + + let(:procedure) { create(:procedure, zones: []) } + + subject { procedure.missing_zones? } + + it { is_expected.to be true } + + context 'when a procedure has zones' do + let(:zone) { create(:zone) } + + before { procedure.zones << zone } + + it { is_expected.to be false } + end + end + + describe '.missing_steps' do + before do + Flipper.enable :zonage + end + + after do + Flipper.disable :zonage + end + + subject { procedure.missing_steps.include?(step) } + + context 'without zone' do + let(:procedure) { create(:procedure, zones: []) } + let(:step) { :zones } + it { is_expected.to be_truthy } + end + + context 'with zone' do + let(:procedure) { create(:procedure, zones: [create(:zone)]) } + let(:step) { :zones } + it { is_expected.to be_falsey } + end + + context 'without service' do + let(:procedure) { create(:procedure, service: nil) } + let(:step) { :service } + it { is_expected.to be_truthy } + end + + context 'with service' do + let(:procedure) { create(:procedure) } + let(:step) { :service } + it { is_expected.to be_truthy } + end + end + describe "#destroy" do let(:procedure) { create(:procedure, :closed, :with_type_de_champ, :with_bulk_message) }