Merge pull request #3304 from betagouv/task_to_fixup_autoreceive_data
[#3268] Rake task to correct bad follows and logs
This commit is contained in:
commit
bd77f82df0
2 changed files with 143 additions and 0 deletions
61
lib/tasks/2019_01_16_fix_automatic_dossier_logs.rake
Normal file
61
lib/tasks/2019_01_16_fix_automatic_dossier_logs.rake
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
class FixAutomaticDossierLogs_2019_01_16
|
||||||
|
def find_handlers
|
||||||
|
# rubocop:disable Security/YAMLLoad
|
||||||
|
Delayed::Job.where(queue: 'cron')
|
||||||
|
.map { |job| YAML.load(job.handler) }
|
||||||
|
.select { |handler| handler.job_data['job_class'] == 'AutoReceiveDossiersForProcedureJob' }
|
||||||
|
# rubocop:enable Security/YAMLLoad
|
||||||
|
end
|
||||||
|
|
||||||
|
def run
|
||||||
|
handlers = find_handlers
|
||||||
|
|
||||||
|
handlers
|
||||||
|
.map { |handler| handler.job_data['arguments'] }
|
||||||
|
.each do |(procedure_id, state)|
|
||||||
|
|
||||||
|
procedure = Procedure
|
||||||
|
.includes(:administrateur, dossiers: [:dossier_operation_logs, :follows])
|
||||||
|
.find(procedure_id)
|
||||||
|
|
||||||
|
rake_puts "working on procedure #{procedure_id}, #{procedure.libelle} whose admin is #{procedure.administrateur.email}"
|
||||||
|
|
||||||
|
case state
|
||||||
|
when Dossier.states.fetch(:en_instruction)
|
||||||
|
dossiers = procedure.dossiers.state_en_instruction
|
||||||
|
operation = 'passer_en_instruction'
|
||||||
|
when Dossier.states.fetch(:accepte)
|
||||||
|
dossiers = procedure.dossiers.accepte
|
||||||
|
operation = 'accepter'
|
||||||
|
end
|
||||||
|
|
||||||
|
dossier_operation_logs = DossierOperationLog
|
||||||
|
.where(dossier: dossiers, operation: operation)
|
||||||
|
|
||||||
|
rake_puts "affecting #{dossier_operation_logs.count} dossier_operation_logs"
|
||||||
|
|
||||||
|
dossier_operation_logs
|
||||||
|
.update_all(gestionnaire_id: nil, automatic_operation: true)
|
||||||
|
|
||||||
|
# if the dossier is only followed by the procedure administrateur
|
||||||
|
# unfollow
|
||||||
|
if state == Dossier.states.fetch(:en_instruction)
|
||||||
|
dossier_to_unfollows = dossiers
|
||||||
|
.select { |d| d.follows.count == 1 && d.follows.first.gestionnaire.email == procedure.administrateur.email }
|
||||||
|
|
||||||
|
rake_puts "affecting #{dossier_to_unfollows.count} dossiers"
|
||||||
|
|
||||||
|
dossier_to_unfollows
|
||||||
|
.each { |d| d.follows.destroy_all }
|
||||||
|
end
|
||||||
|
|
||||||
|
rake_puts ""
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
namespace :'2019_01_16_fix_automatic_dossier_logs' do
|
||||||
|
task run: :environment do
|
||||||
|
FixAutomaticDossierLogs_2019_01_16.new.run
|
||||||
|
end
|
||||||
|
end
|
82
spec/lib/tasks/2019_01_16_fix_automatic_dossier_logs_spec.rb
Normal file
82
spec/lib/tasks/2019_01_16_fix_automatic_dossier_logs_spec.rb
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
load Rails.root.join('lib', 'tasks', '2019_01_16_fix_automatic_dossier_logs.rake')
|
||||||
|
|
||||||
|
describe '2019_01_16_fix_automatic_dossier_logs' do
|
||||||
|
let!(:rake_task) { Rake::Task['2019_01_16_fix_automatic_dossier_logs:run'] }
|
||||||
|
let!(:administrateur) { create(:administrateur) }
|
||||||
|
let!(:another_gestionnaire) { create(:gestionnaire) }
|
||||||
|
let!(:procedure) { create(:procedure, administrateur: administrateur) }
|
||||||
|
let!(:dossier) { create(:dossier, procedure: procedure) }
|
||||||
|
let!(:fix_automatic_dossier_logs) { FixAutomaticDossierLogs_2019_01_16.new }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(fix_automatic_dossier_logs).to receive(:find_handlers)
|
||||||
|
.and_return([double(job_data: { 'arguments' => [procedure.id, final_state] })])
|
||||||
|
end
|
||||||
|
|
||||||
|
subject do
|
||||||
|
fix_automatic_dossier_logs.run
|
||||||
|
dossier.reload
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the dossiers are automatically moved to en_instruction' do
|
||||||
|
let(:final_state) { 'en_instruction' }
|
||||||
|
|
||||||
|
context 'and a dossier has been accidentally affected to an administrateur' do
|
||||||
|
before do
|
||||||
|
dossier.passer_en_instruction!(administrateur.gestionnaire)
|
||||||
|
|
||||||
|
control = DossierOperationLog.create(
|
||||||
|
gestionnaire: another_gestionnaire,
|
||||||
|
operation: 'refuser',
|
||||||
|
automatic_operation: false
|
||||||
|
)
|
||||||
|
|
||||||
|
dossier.dossier_operation_logs << control
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(dossier.follows.count).to eq(0) }
|
||||||
|
|
||||||
|
it do
|
||||||
|
expect(dossier_logs).to match_array([
|
||||||
|
[nil, 'passer_en_instruction', true],
|
||||||
|
[another_gestionnaire.id, "refuser", false]
|
||||||
|
])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context ', followed anyway by another person and accidentally ...' do
|
||||||
|
before do
|
||||||
|
another_gestionnaire.follow(dossier)
|
||||||
|
dossier.passer_en_instruction!(administrateur.gestionnaire)
|
||||||
|
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(dossier.follows.count).to eq(2) }
|
||||||
|
it { expect(dossier_logs).to match([[nil, 'passer_en_instruction', true]]) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the dossiers are automatically moved to accepte' do
|
||||||
|
let(:final_state) { 'accepte' }
|
||||||
|
|
||||||
|
context 'and a dossier has been accidentally affected to an administrateur' do
|
||||||
|
before do
|
||||||
|
dossier.accepter!(administrateur.gestionnaire, '')
|
||||||
|
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(dossier_logs).to match([[nil, 'accepter', true]]) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def dossier_logs
|
||||||
|
dossier.dossier_operation_logs.pluck(:gestionnaire_id, :operation, :automatic_operation)
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue