task(routing): reroute dossiers en construction
This commit is contained in:
parent
f592fe4865
commit
51312b178e
4 changed files with 77 additions and 3 deletions
|
@ -6,8 +6,10 @@ class DossierAssignment < ApplicationRecord
|
||||||
|
|
||||||
enum mode: {
|
enum mode: {
|
||||||
auto: 'auto',
|
auto: 'auto',
|
||||||
manual: 'manual'
|
manual: 'manual',
|
||||||
|
tech: 'tech'
|
||||||
}
|
}
|
||||||
|
|
||||||
scope :manual, -> { where(mode: :manual) }
|
scope :manual, -> { where(mode: :manual) }
|
||||||
|
|
||||||
def groupe_instructeur_label
|
def groupe_instructeur_label
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module RoutingEngine
|
module RoutingEngine
|
||||||
def self.compute(dossier)
|
def self.compute(dossier, assignment_mode: DossierAssignment.modes.fetch(:auto))
|
||||||
return if dossier.forced_groupe_instructeur
|
return if dossier.forced_groupe_instructeur
|
||||||
|
|
||||||
matching_groupe = dossier.procedure.groupe_instructeurs.active.reject(&:invalid_rule?).find do |gi|
|
matching_groupe = dossier.procedure.groupe_instructeurs.active.reject(&:invalid_rule?).find do |gi|
|
||||||
|
@ -8,6 +8,6 @@ module RoutingEngine
|
||||||
|
|
||||||
matching_groupe ||= dossier.procedure.defaut_groupe_instructeur
|
matching_groupe ||= dossier.procedure.defaut_groupe_instructeur
|
||||||
|
|
||||||
dossier.assign_to_groupe_instructeur(matching_groupe, DossierAssignment.modes.fetch(:auto))
|
dossier.assign_to_groupe_instructeur(matching_groupe, assignment_mode)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
27
lib/tasks/re_routing_dossiers.rake
Normal file
27
lib/tasks/re_routing_dossiers.rake
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
require Rails.root.join("lib", "tasks", "task_helper")
|
||||||
|
|
||||||
|
namespace :re_routing_dossiers do
|
||||||
|
desc <<~EOD
|
||||||
|
Given an procedure id in argument, run the RoutingEngine again for all "en construction" dossiers of the procedure
|
||||||
|
ex: rails re_routing_dossiers:run\[85869\]
|
||||||
|
EOD
|
||||||
|
|
||||||
|
task :run, [:procedure_id] => :environment do |_t, args|
|
||||||
|
procedure = Procedure.find_by(id: args[:procedure_id])
|
||||||
|
|
||||||
|
dossiers = procedure.dossiers.state_en_construction
|
||||||
|
|
||||||
|
progress = ProgressReport.new(dossiers.count)
|
||||||
|
|
||||||
|
assignment_mode = DossierAssignment.modes.fetch(:tech)
|
||||||
|
|
||||||
|
dossiers.each do |dossier|
|
||||||
|
RoutingEngine.compute(dossier, assignment_mode:)
|
||||||
|
|
||||||
|
rake_puts "Dossier #{args[:dossier_id]} routed to groupe instructeur #{dossier.groupe_instructeur.label}"
|
||||||
|
|
||||||
|
progress.inc
|
||||||
|
end
|
||||||
|
progress.finish
|
||||||
|
end
|
||||||
|
end
|
45
spec/lib/tasks/re_routing_dossiers_spec.rb
Normal file
45
spec/lib/tasks/re_routing_dossiers_spec.rb
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
describe 're_routing_dossiers' do
|
||||||
|
describe 'run' do
|
||||||
|
include Logic
|
||||||
|
|
||||||
|
let(:admin) { create(:administrateur) }
|
||||||
|
let(:procedure) { create(:procedure, types_de_champ_public: [{ type: :departements, libelle: 'Votre département' }], administrateurs: [admin]) }
|
||||||
|
let(:dossier1) { create(:dossier, :en_construction, :with_populated_champs, procedure: procedure) }
|
||||||
|
let!(:dossier2) { create(:dossier, :en_construction, :with_populated_champs, procedure: procedure) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
dossier1.champs.last.update(value: 'Aisne')
|
||||||
|
|
||||||
|
dossier2.champs.last.update(value: 'Allier')
|
||||||
|
|
||||||
|
tdc = procedure.active_revision.routable_types_de_champ.first
|
||||||
|
|
||||||
|
tdc_options = APIGeoService.departements.map { ["#{_1[:code]} – #{_1[:name]}", _1[:code]] }
|
||||||
|
|
||||||
|
rule_operator = :ds_eq
|
||||||
|
|
||||||
|
create_groups_from_territorial_tdc(tdc_options, tdc.stable_id, rule_operator, admin)
|
||||||
|
|
||||||
|
Rake.application.invoke_task "re_routing_dossiers:run\[#{procedure.id}\]"
|
||||||
|
|
||||||
|
dossier1.reload
|
||||||
|
dossier2.reload
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'runs' do
|
||||||
|
expect(dossier1.groupe_instructeur.label).to eq('02 – Aisne')
|
||||||
|
expect(dossier2.groupe_instructeur.label).to eq('03 – Allier')
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_groups_from_territorial_tdc(tdc_options, stable_id, rule_operator, administrateur)
|
||||||
|
tdc_options.each do |label, code|
|
||||||
|
routing_rule = send(rule_operator, champ_value(stable_id), constant(code))
|
||||||
|
|
||||||
|
procedure
|
||||||
|
.groupe_instructeurs
|
||||||
|
.find_or_create_by(label: label)
|
||||||
|
.update(instructeurs: [administrateur.instructeur], routing_rule:)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue