From d398002e5299d27cf04983887d9c4c0c23b5a208 Mon Sep 17 00:00:00 2001 From: Kat Date: Wed, 10 Jan 2024 14:49:07 +0000 Subject: [PATCH] Set and clear duplicate log references --- app/controllers/delete_logs_controller.rb | 5 +++++ app/controllers/form_controller.rb | 27 ++++++++++++++++++++--- spec/features/lettings_log_spec.rb | 26 ++++++++++++++++++++++ 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/app/controllers/delete_logs_controller.rb b/app/controllers/delete_logs_controller.rb index a0fa962ad..2a56944dc 100644 --- a/app/controllers/delete_logs_controller.rb +++ b/app/controllers/delete_logs_controller.rb @@ -27,6 +27,11 @@ class DeleteLogsController < ApplicationController logs = LettingsLog.find(params.require(:ids)) discard logs if request.referer&.include?("delete-duplicates") + logs.each do |log| + log.duplicate_log_references.destroy_all + end + LettingsLog.find(params["remaining_log_id"]).duplicate_log_references.destroy_all + redirect_to lettings_log_duplicate_logs_path(lettings_log_id: params["remaining_log_id"], original_log_id: params["original_log_id"], referrer: params[:referrer], organisation_id: params[:organisation_id]), notice: I18n.t("notification.duplicate_logs_deleted", count: logs.count, log_ids: duplicate_log_ids(logs)) else redirect_to lettings_logs_path, notice: I18n.t("notification.logs_deleted", count: logs.count) diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb index 2f6ce6483..078eecc61 100644 --- a/app/controllers/form_controller.rb +++ b/app/controllers/form_controller.rb @@ -171,8 +171,18 @@ private return correcting_duplicate_logs_redirect_path end - if @log.lettings? && current_user.lettings_logs.duplicate_logs(@log).count.positive? - return send("lettings_log_duplicate_logs_path", @log, original_log_id: @log.id) + if @log.lettings? + dynamic_duplicates = current_user.lettings_logs.duplicate_logs(@log) + if dynamic_duplicates.count.positive? + saved_duplicates = @log.duplicates + unless saved_duplicates == dynamic_duplicates + duplicate_log_reference = DuplicateLogReference.find_or_create_by!(log_id: @log.id, log_type: "LettingsLog") + dynamic_duplicates.each do |duplicate| + DuplicateLogReference.find_or_create_by!(log_id: duplicate.id, log_type: "LettingsLog", duplicate_log_reference_id: duplicate_log_reference.duplicate_log_reference_id) + end + return send("lettings_log_duplicate_logs_path", @log, original_log_id: @log.id) + end + end end if @log.sales? && current_user.sales_logs.duplicate_logs(@log).count.positive? @@ -252,9 +262,13 @@ private original_log = current_user.send(class_name.pluralize).find_by(id: from_referrer_query("original_log_id")) if original_log.present? && current_user.send(class_name.pluralize).duplicate_logs(original_log).count.positive? - flash[:notice] = deduplication_success_banner unless current_user.send(class_name.pluralize).duplicate_logs(@log).count.positive? + unless current_user.send(class_name.pluralize).duplicate_logs(@log).count.positive? + remove_fixed_duplicate_log_references(@log) + flash[:notice] = deduplication_success_banner + end send("#{class_name}_duplicate_logs_path", original_log, original_log_id: original_log.id, referrer: params[:referrer], organisation_id: params[:organisation_id]) else + remove_fixed_duplicate_log_references(original_log) flash[:notice] = deduplication_success_banner send("#{class_name}_duplicate_logs_path", "#{class_name}_id".to_sym => from_referrer_query("first_remaining_duplicate_id"), original_log_id: from_referrer_query("original_log_id"), referrer: params[:referrer], organisation_id: params[:organisation_id]) end @@ -275,4 +289,11 @@ private I18n.t("notification.duplicate_logs.deduplication_success_banner", log_link: deduplicated_log_link, changed_question_label:).html_safe end + + def remove_fixed_duplicate_log_references(log) + duplicate_log_reference = DuplicateLogReference.find_by(log_id: log.id, log_type: log.class.name) + duplicate_log_reference_id = duplicate_log_reference.duplicate_log_reference_id + duplicate_log_reference.destroy! if duplicate_log_reference.present? + DuplicateLogReference.find_by(duplicate_log_reference_id:).destroy! if DuplicateLogReference.where(duplicate_log_reference_id:).count == 1 + end end diff --git a/spec/features/lettings_log_spec.rb b/spec/features/lettings_log_spec.rb index 7dabd3efa..cb3e74449 100644 --- a/spec/features/lettings_log_spec.rb +++ b/spec/features/lettings_log_spec.rb @@ -459,6 +459,11 @@ RSpec.describe "Lettings Log Features" do end it "allows keeping the original log and deleting duplicates" do + expect(DuplicateLogReference.count).to eq(2) + lettings_log.reload + expect(lettings_log.duplicates.count).to eq(1) + expect(lettings_log.duplicates).to include(duplicate_log) + expect(page).to have_current_path("/lettings-logs/#{lettings_log.id}/duplicate-logs?original_log_id=#{lettings_log.id}") click_link("Keep this log and delete duplicates", href: "/lettings-logs/#{lettings_log.id}/delete-duplicates?original_log_id=#{lettings_log.id}") expect(page).to have_current_path("/lettings-logs/#{lettings_log.id}/delete-duplicates?original_log_id=#{lettings_log.id}") @@ -471,6 +476,9 @@ RSpec.describe "Lettings Log Features" do expect(page).not_to have_content("These logs are duplicates") expect(page).not_to have_link("Keep this log and delete duplicates") expect(page).to have_link("Back to Log #{lettings_log.id}", href: "/lettings-logs/#{lettings_log.id}") + + expect(DuplicateLogReference.count).to eq(0) + expect(lettings_log.duplicates.count).to eq(0) end it "allows changing answers on remaining original log" do @@ -483,6 +491,11 @@ RSpec.describe "Lettings Log Features" do end it "allows keeping the duplicate log and deleting the original one" do + expect(DuplicateLogReference.count).to eq(2) + duplicate_log.reload + expect(duplicate_log.duplicates.count).to eq(1) + expect(duplicate_log.duplicates).to include(lettings_log) + expect(page).to have_current_path("/lettings-logs/#{lettings_log.id}/duplicate-logs?original_log_id=#{lettings_log.id}") click_link("Keep this log and delete duplicates", href: "/lettings-logs/#{duplicate_log.id}/delete-duplicates?original_log_id=#{lettings_log.id}") expect(page).to have_current_path("/lettings-logs/#{duplicate_log.id}/delete-duplicates?original_log_id=#{lettings_log.id}") @@ -495,6 +508,9 @@ RSpec.describe "Lettings Log Features" do expect(page).not_to have_content("These logs are duplicates") expect(page).not_to have_link("Keep this log and delete duplicates") expect(page).to have_link("Back to lettings logs", href: "/lettings-logs") + + expect(DuplicateLogReference.count).to eq(0) + expect(duplicate_log.duplicates.count).to eq(0) end it "allows changing answers to remaining duplicate log" do @@ -507,6 +523,11 @@ RSpec.describe "Lettings Log Features" do end it "allows deduplicating logs by changing the answers on the duplicate log" do + expect(DuplicateLogReference.count).to eq(2) + lettings_log.reload + expect(lettings_log.duplicates.count).to eq(1) + expect(lettings_log.duplicates).to include(duplicate_log) + expect(page).to have_current_path("/lettings-logs/#{lettings_log.id}/duplicate-logs?original_log_id=#{lettings_log.id}") click_link("Change", href: "/lettings-logs/#{duplicate_log.id}/tenant-code?first_remaining_duplicate_id=#{lettings_log.id}&original_log_id=#{lettings_log.id}&referrer=duplicate_logs") fill_in("lettings-log-tenancycode-field", with: "something else") @@ -516,6 +537,9 @@ RSpec.describe "Lettings Log Features" do expect(page).to have_css(".govuk-notification-banner.govuk-notification-banner--success") expect(page).to have_content("Log #{duplicate_log.id} is no longer a duplicate and has been removed from the list") expect(page).to have_content("You changed the tenant code.") + + expect(DuplicateLogReference.count).to eq(0) + expect(duplicate_log.duplicates.count).to eq(0) end it "allows deduplicating logs by changing the answers on the original log" do @@ -527,6 +551,8 @@ RSpec.describe "Lettings Log Features" do expect(page).to have_css(".govuk-notification-banner.govuk-notification-banner--success") expect(page).to have_content("Log #{lettings_log.id} is no longer a duplicate and has been removed from the list") expect(page).to have_content("You changed the tenant code.") + expect(DuplicateLogReference.count).to eq(0) + expect(duplicate_log.duplicates.count).to eq(0) end end end