diff --git a/app/controllers/delete_logs_controller.rb b/app/controllers/delete_logs_controller.rb index 23579ed6b..561fe7346 100644 --- a/app/controllers/delete_logs_controller.rb +++ b/app/controllers/delete_logs_controller.rb @@ -25,6 +25,7 @@ class DeleteLogsController < ApplicationController def discard_lettings_logs logs = LettingsLog.find(params.require(:ids)) + remove_lettings_duplicate_set_ids(logs) discard logs if request.referer&.include?("delete-duplicates") logs.each do |log| @@ -59,6 +60,7 @@ class DeleteLogsController < ApplicationController def discard_sales_logs logs = SalesLog.find(params.require(:ids)) + remove_sales_duplicate_set_ids(logs) discard logs if request.referer&.include?("delete-duplicates") logs.each do |log| @@ -213,4 +215,30 @@ private def duplicate_log_ids(logs) logs.map { |log| "Log #{log.id}" }.to_sentence(last_word_connector: " and ") end + + def remove_lettings_duplicate_set_ids(logs) + duplicate_set_ids = [] + logs.each do |log| + if log.duplicate_set_id.present? + duplicate_set_ids << log.duplicate_set_id + log.update!(duplicate_set_id: nil) + end + end + duplicate_set_ids.uniq.each do |duplicate_set_id| + LettingsLog.where(duplicate_set_id:).update!(duplicate_set_id: nil) if LettingsLog.where(duplicate_set_id:).count == 1 + end + end + + def remove_sales_duplicate_set_ids(logs) + duplicate_set_ids = [] + logs.each do |log| + if log.duplicate_set_id.present? + duplicate_set_ids << log.duplicate_set_id + log.update!(duplicate_set_id: nil) + end + end + duplicate_set_ids.uniq.each do |duplicate_set_id| + SalesLog.where(duplicate_set_id:).update!(duplicate_set_id: nil) if SalesLog.where(duplicate_set_id:).count == 1 + end + end end diff --git a/spec/requests/delete_logs_controller_spec.rb b/spec/requests/delete_logs_controller_spec.rb index cfb8bb069..58ccae200 100644 --- a/spec/requests/delete_logs_controller_spec.rb +++ b/spec/requests/delete_logs_controller_spec.rb @@ -247,6 +247,53 @@ RSpec.describe "DeleteLogs", type: :request do expect(log_2.discarded_at).to be nil end end + + context "when an authorized user deletes a log that had duplicates" do + context "and only 1 log remains in the duplicate set" do + let!(:log_1) { create(:lettings_log, :duplicate, duplicate_set_id: 5, created_by: user) } + let!(:log_2) { create(:lettings_log, :duplicate, duplicate_set_id: 5, created_by: user) } + let!(:log_3) { create(:lettings_log, :duplicate, duplicate_set_id: 5, created_by: user) } + + it "deletes the log and marks related logs deduplicated" do + delete delete_logs_lettings_logs_path, params: params + log_1.reload + expect(log_1.status).to eq "deleted" + expect(log_1.discarded_at).not_to be nil + expect(log_1.duplicates.count).to eq(0) + expect(log_1.duplicate_set_id).to be nil + log_2.reload + expect(log_2.status).to eq "deleted" + expect(log_2.discarded_at).not_to be nil + expect(log_2.duplicates.count).to eq(0) + expect(log_2.duplicate_set_id).to be nil + log_3.reload + expect(log_3.duplicates.count).to eq(0) + expect(log_3.duplicate_set_id).to be nil + end + end + + context "and multiple logs remains in the duplicate set" do + let!(:log_1) { create(:lettings_log, :duplicate, duplicate_set_id: 5, created_by: user) } + let!(:log_2) { create(:lettings_log, :duplicate, duplicate_set_id: 5, created_by: user) } + let!(:log_3) { create(:lettings_log, :duplicate, duplicate_set_id: 5, created_by: user) } + let(:params) { { ids: [log_1.id] } } + + it "deletes the log and marks related logs deduplicated" do + delete delete_logs_lettings_logs_path, params: params + log_1.reload + expect(log_1.status).to eq "deleted" + expect(log_1.discarded_at).not_to be nil + expect(log_1.duplicates.count).to eq(0) + expect(log_1.duplicate_set_id).to be nil + log_2.reload + log_3.reload + expect(log_2.duplicates.count).to eq(1) + expect(log_3.duplicates.count).to eq(1) + expect(log_3.duplicate_set_id).not_to be nil + expect(log_3.duplicate_set_id).to eq(log_2.duplicate_set_id) + end + end + end end describe "GET sales-logs/delete-logs" do @@ -487,6 +534,53 @@ RSpec.describe "DeleteLogs", type: :request do expect(log_2.discarded_at).to be nil end end + + context "when an authorized user deletes a log that had duplicates" do + context "and only 1 log remains in the duplicate set" do + let!(:log_1) { create(:sales_log, :duplicate, duplicate_set_id: 5, created_by: user) } + let!(:log_2) { create(:sales_log, :duplicate, duplicate_set_id: 5, created_by: user) } + let!(:log_3) { create(:sales_log, :duplicate, duplicate_set_id: 5, created_by: user) } + + it "deletes the log and marks related logs deduplicated" do + delete delete_logs_sales_logs_path, params: params + log_1.reload + expect(log_1.status).to eq "deleted" + expect(log_1.discarded_at).not_to be nil + expect(log_1.duplicates.count).to eq(0) + expect(log_1.duplicate_set_id).to be nil + log_2.reload + expect(log_2.status).to eq "deleted" + expect(log_2.discarded_at).not_to be nil + expect(log_2.duplicates.count).to eq(0) + expect(log_2.duplicate_set_id).to be nil + log_3.reload + expect(log_3.duplicates.count).to eq(0) + expect(log_3.duplicate_set_id).to be nil + end + end + + context "and multiple logs remains in the duplicate set" do + let!(:log_1) { create(:sales_log, :duplicate, duplicate_set_id: 5, created_by: user) } + let!(:log_2) { create(:sales_log, :duplicate, duplicate_set_id: 5, created_by: user) } + let!(:log_3) { create(:sales_log, :duplicate, duplicate_set_id: 5, created_by: user) } + let(:params) { { ids: [log_1.id] } } + + it "deletes the log and marks related logs deduplicated" do + delete delete_logs_sales_logs_path, params: params + log_1.reload + expect(log_1.status).to eq "deleted" + expect(log_1.discarded_at).not_to be nil + expect(log_1.duplicates.count).to eq(0) + expect(log_1.duplicate_set_id).to be nil + log_2.reload + log_3.reload + expect(log_2.duplicates.count).to eq(1) + expect(log_3.duplicates.count).to eq(1) + expect(log_3.duplicate_set_id).not_to be nil + expect(log_3.duplicate_set_id).to eq(log_2.duplicate_set_id) + end + end + end end context "when a support user navigates to the organisations tab" do