data(conditional): add a maintenance task to update routing rules based on commune or epci champ
This commit is contained in:
parent
954facdaff
commit
e4632214fb
2 changed files with 95 additions and 0 deletions
|
@ -0,0 +1,57 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Maintenance
|
||||
class UpdateRoutingRulesBasedOnCommuneOrEpciChampTask < MaintenanceTasks::Task
|
||||
include Logic
|
||||
|
||||
def collection
|
||||
GroupeInstructeur
|
||||
.joins(:procedure)
|
||||
.where(procedures: { routing_enabled: true })
|
||||
end
|
||||
|
||||
def process(gi)
|
||||
routing_rule = gi.routing_rule
|
||||
|
||||
if routing_rule.present?
|
||||
tdcs = gi.procedure.active_revision.types_de_champ_public
|
||||
|
||||
if tdcs.where(stable_id: routing_rule.sources, type_champ: ["communes", "epci"]).present?
|
||||
if routing_rule.is_a?(And)
|
||||
new_operands = new_operands_from(tdcs, routing_rule)
|
||||
gi.update!(routing_rule: ds_and(new_operands))
|
||||
elsif routing_rule.is_a?(Or)
|
||||
new_operands = new_operands_from(tdcs, routing_rule)
|
||||
gi.update!(routing_rule: ds_or(new_operands))
|
||||
elsif routing_rule.is_a?(NotEq)
|
||||
gi.update!(routing_rule: ds_not_in_departement(routing_rule.left, routing_rule.right))
|
||||
elsif routing_rule.is_a?(Eq)
|
||||
gi.update!(routing_rule: ds_in_departement(routing_rule.left, routing_rule.right))
|
||||
end
|
||||
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,38 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "rails_helper"
|
||||
|
||||
module Maintenance
|
||||
describe UpdateRoutingRulesBasedOnCommuneOrEpciChampTask do
|
||||
include Logic
|
||||
describe "#process" do
|
||||
subject(:process) { described_class.process(groupe_defaut) }
|
||||
|
||||
let(:procedure) { create(:procedure, :published, :routee, 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(:commune_tdc) { procedure.active_revision.types_de_champ_public.where(type_champ: 'communes').first }
|
||||
let(:epci_tdc) { procedure.active_revision.types_de_champ_public.where(type_champ: 'epci').first }
|
||||
let(:drop_down_list_tdc) { procedure.active_revision.types_de_champ_public.where(type_champ: 'drop_down_list').first }
|
||||
|
||||
let(:groupe_defaut) { procedure.defaut_groupe_instructeur }
|
||||
|
||||
context "with a routing rule based on commune and epci" do
|
||||
before { groupe_defaut.update(routing_rule: 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 routing rule" do
|
||||
subject
|
||||
expect(groupe_defaut.routing_rule).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 routing rule based on a dropdown list" do
|
||||
before { groupe_defaut.update(routing_rule: ds_eq(champ_value(drop_down_list_tdc.stable_id), constant('Choix 2'))) }
|
||||
|
||||
it "does not update routing rule" do
|
||||
subject
|
||||
expect(groupe_defaut.routing_rule).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