From 4a8d7210d0a1703358a69f3aec946d868e451840 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Fri, 22 Nov 2024 18:12:32 +0100 Subject: [PATCH] [Fix #11071] Fix wrong expert_procedure associated to avis in existing data --- ...ix_avis_experts_procedure_mismatch_task.rb | 26 ++++++ ...is_experts_procedure_mismatch_task_spec.rb | 83 +++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 app/tasks/maintenance/fix_avis_experts_procedure_mismatch_task.rb create mode 100644 spec/tasks/maintenance/fix_avis_experts_procedure_mismatch_task_spec.rb diff --git a/app/tasks/maintenance/fix_avis_experts_procedure_mismatch_task.rb b/app/tasks/maintenance/fix_avis_experts_procedure_mismatch_task.rb new file mode 100644 index 000000000..a86f5d47d --- /dev/null +++ b/app/tasks/maintenance/fix_avis_experts_procedure_mismatch_task.rb @@ -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 diff --git a/spec/tasks/maintenance/fix_avis_experts_procedure_mismatch_task_spec.rb b/spec/tasks/maintenance/fix_avis_experts_procedure_mismatch_task_spec.rb new file mode 100644 index 000000000..247c2e4c4 --- /dev/null +++ b/spec/tasks/maintenance/fix_avis_experts_procedure_mismatch_task_spec.rb @@ -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