[Fix #11071] Fix wrong expert_procedure associated to avis in existing data

This commit is contained in:
Mathieu Magnin 2024-11-22 18:12:32 +01:00
parent b3672c5526
commit 4a8d7210d0
No known key found for this signature in database
GPG key ID: 8DCAFC82D7BA654E
2 changed files with 109 additions and 0 deletions

View file

@ -0,0 +1,26 @@
# frozen_string_literal: true
module Maintenance
class FixAvisExpertsProcedureMismatchTask < MaintenanceTasks::Task
# Some avis have incorrect experts_procedure associations where the procedure_id
# doesn't match the dossier's procedure_id. This task fixes those mismatches.
def collection
Avis
.joins(:experts_procedure, dossier: :procedure)
.where.not('experts_procedures.procedure_id = procedures.id')
end
def process(avis)
expert = avis.expert
correct_procedure = avis.dossier.procedure
correct_experts_procedure = ExpertsProcedure.find_or_create_by(
procedure: correct_procedure,
expert: expert
)
avis.update!(experts_procedure: correct_experts_procedure)
end
end
end

View file

@ -0,0 +1,83 @@
# frozen_string_literal: true
module Maintenance
RSpec.describe FixAvisExpertsProcedureMismatchTask do
describe "#collection" do
subject(:collection) { described_class.new.collection }
let!(:mismatched_avis) do
expert = create(:expert)
procedure1 = create(:procedure)
procedure2 = create(:procedure)
dossier = create(:dossier, procedure: procedure2)
wrong_experts_procedure = create(:experts_procedure, expert: expert, procedure: procedure1)
create(:avis,
dossier: dossier,
expert: expert,
experts_procedure: wrong_experts_procedure)
end
let!(:correct_avis) do
expert = create(:expert)
procedure = create(:procedure)
dossier = create(:dossier, procedure: procedure)
experts_procedure = create(:experts_procedure, expert: expert, procedure: procedure)
create(:avis,
dossier: dossier,
expert: expert,
experts_procedure: experts_procedure)
end
it "only returns avis with mismatched procedure ids" do
expect(collection).to include(mismatched_avis)
expect(collection).not_to include(correct_avis)
end
end
describe "#process" do
subject(:process) { described_class.process(avis) }
let(:expert) { create(:expert) }
let(:procedure1) { create(:procedure) }
let(:procedure2) { create(:procedure) }
let(:dossier) { create(:dossier, procedure: procedure2) }
let!(:wrong_experts_procedure) do
create(:experts_procedure, expert: expert, procedure: procedure1)
end
let(:avis) do
create(:avis,
dossier: dossier,
expert: expert,
experts_procedure: wrong_experts_procedure)
end
it "fixes the experts_procedure association" do
expect(avis.experts_procedure.procedure_id).to eq(procedure1.id)
expect(avis.dossier.procedure.id).to eq(procedure2.id)
process
avis.reload
expect(avis.experts_procedure.procedure_id).to eq(procedure2.id)
expect(avis.dossier.procedure.id).to eq(procedure2.id)
end
context "when the correct experts_procedure already exists" do
let!(:correct_experts_procedure) do
create(:experts_procedure, expert: expert, procedure: procedure2)
end
it "uses the existing experts_procedure" do
process
avis.reload
expect(avis.experts_procedure).to eq(correct_experts_procedure)
end
end
end
end
end