Browse Source

Remove duplicates when deleting logs

pull/2141/head
Kat 2 years ago
parent
commit
6fbbce09f8
  1. 28
      app/controllers/delete_logs_controller.rb
  2. 94
      spec/requests/delete_logs_controller_spec.rb

28
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

94
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

Loading…
Cancel
Save