data(conditional): add a maintenance task to update conditions based on commune or epci champ
This commit is contained in:
parent
e4632214fb
commit
882d72d139
2 changed files with 111 additions and 0 deletions
|
@ -0,0 +1,63 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Maintenance
|
||||||
|
class UpdateConditionsBasedOnCommuneOrEpciChampTask < MaintenanceTasks::Task
|
||||||
|
include Logic
|
||||||
|
|
||||||
|
def collection
|
||||||
|
ProcedureRevision.all
|
||||||
|
end
|
||||||
|
|
||||||
|
def process(revision)
|
||||||
|
tdc_to_update_ids = []
|
||||||
|
|
||||||
|
tdcs = revision.types_de_champ_public
|
||||||
|
|
||||||
|
tdcs.where.not(condition: nil).pluck(:condition, :id).each do |condition, id|
|
||||||
|
if tdcs.where(stable_id: condition.sources, type_champ: ["communes", "epci"]).present?
|
||||||
|
tdc_to_update_ids << id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
tdc_to_update_ids.each do |id|
|
||||||
|
tdc = tdcs.find_by(id:)
|
||||||
|
|
||||||
|
condition = tdc.condition
|
||||||
|
|
||||||
|
if condition.is_a?(And)
|
||||||
|
new_operands = new_operands_from(tdcs, condition)
|
||||||
|
tdc.update!(condition: ds_and(new_operands))
|
||||||
|
elsif condition.is_a?(Or)
|
||||||
|
new_operands = new_operands_from(tdcs, condition)
|
||||||
|
tdc.update!(condition: ds_or(new_operands))
|
||||||
|
elsif condition.is_a?(NotEq)
|
||||||
|
tdc.update!(condition: ds_not_in_departement(condition.left, condition.right))
|
||||||
|
elsif condition.is_a?(Eq)
|
||||||
|
tdc.update!(condition: ds_in_departement(condition.left, condition.right))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def count
|
||||||
|
collection.count
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def new_operands_from(tdcs, condition)
|
||||||
|
condition.operands.map do |sub_condition|
|
||||||
|
if tdcs.where(stable_id: sub_condition.sources, type_champ: ["communes", "epci"]).present?
|
||||||
|
if sub_condition.is_a?(NotEq)
|
||||||
|
ds_not_in_departement(sub_condition.left, sub_condition.right)
|
||||||
|
elsif sub_condition.is_a?(Eq)
|
||||||
|
ds_in_departement(sub_condition.left, sub_condition.right)
|
||||||
|
else
|
||||||
|
sub_condition
|
||||||
|
end
|
||||||
|
else
|
||||||
|
sub_condition
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,48 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "rails_helper"
|
||||||
|
|
||||||
|
module Maintenance
|
||||||
|
describe UpdateConditionsBasedOnCommuneOrEpciChampTask do
|
||||||
|
include Logic
|
||||||
|
describe "#process" do
|
||||||
|
subject(:process) { described_class.process(revision) }
|
||||||
|
|
||||||
|
let(:procedure) { create(:procedure, :published, types_de_champ_public: [{ type: :communes }, { type: :epci }, { type: :drop_down_list, libelle: 'Votre choix', options: ['Choix 1', 'Choix 2', 'Choix 3'] }, { type: :text }]) }
|
||||||
|
let(:revision) { procedure.active_revision }
|
||||||
|
|
||||||
|
let(:text_tdc) { revision.types_de_champ_public.where(type_champ: 'text').first }
|
||||||
|
let(:commune_tdc) { revision.types_de_champ_public.where(type_champ: 'communes').first }
|
||||||
|
let(:epci_tdc) { revision.types_de_champ_public.where(type_champ: 'epci').first }
|
||||||
|
let(:drop_down_list_tdc) { revision.types_de_champ_public.where(type_champ: 'drop_down_list').first }
|
||||||
|
|
||||||
|
context "with a condition based on commune and epci" do
|
||||||
|
before { text_tdc.update(condition: ds_and([ds_eq(champ_value(commune_tdc.stable_id), constant('11')), ds_not_eq(champ_value(epci_tdc.stable_id), constant('84'))])) }
|
||||||
|
|
||||||
|
it "updates condition" do
|
||||||
|
expect(text_tdc.condition).to eq ds_and([ds_eq(champ_value(commune_tdc.stable_id), constant('11')), ds_not_eq(champ_value(epci_tdc.stable_id), constant('84'))])
|
||||||
|
|
||||||
|
subject
|
||||||
|
|
||||||
|
text_tdc.reload
|
||||||
|
|
||||||
|
expect(text_tdc.condition).to eq ds_and([ds_in_departement(champ_value(commune_tdc.stable_id), constant('11')), ds_not_in_departement(champ_value(epci_tdc.stable_id), constant('84'))])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with a condition based on a dropdown list" do
|
||||||
|
before { text_tdc.update(condition: ds_eq(champ_value(drop_down_list_tdc.stable_id), constant('Choix 2'))) }
|
||||||
|
|
||||||
|
it "does not update condition" do
|
||||||
|
expect(text_tdc.condition).to eq ds_eq(champ_value(drop_down_list_tdc.stable_id), constant('Choix 2'))
|
||||||
|
|
||||||
|
subject
|
||||||
|
|
||||||
|
text_tdc.reload
|
||||||
|
|
||||||
|
expect(text_tdc.condition).to eq ds_eq(champ_value(drop_down_list_tdc.stable_id), constant('Choix 2'))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue