From b8e6aab6c158aeeef96b282d37b4816aeb20180c Mon Sep 17 00:00:00 2001 From: Kat Date: Wed, 10 May 2023 08:42:57 +0100 Subject: [PATCH] Deduplicate 2022 sales logs --- .../bulk_upload/sales/year2022/row_parser.rb | 36 ++++++++++ .../sales/year2022/row_parser_spec.rb | 65 +++++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/app/services/bulk_upload/sales/year2022/row_parser.rb b/app/services/bulk_upload/sales/year2022/row_parser.rb index 851ed4bfd..b7ecd63bd 100644 --- a/app/services/bulk_upload/sales/year2022/row_parser.rb +++ b/app/services/bulk_upload/sales/year2022/row_parser.rb @@ -285,6 +285,7 @@ class BulkUpload::Sales::Year2022::RowParser validate :validate_created_by_related, on: :after_log validate :validate_relevant_collection_window, on: :after_log validate :validate_incomplete_soft_validations, on: :after_log + validate :validate_if_log_already_exists, on: :after_log def self.question_for_field(field) QUESTIONS[field] @@ -848,6 +849,24 @@ private @questions ||= log.form.subsections.flat_map { |ss| ss.applicable_questions(log) } end + def duplicate_check_fields + %w[ + saledate + age1 + sex1 + ecstat1 + owning_organisation + postcode_full + purchid + ] + end + + def log_already_exists? + @log_already_exists ||= SalesLog + .where(status: %w[not_started in_progress completed]) + .exists?(duplicate_check_fields.index_with { |field| log.public_send(field) }) + end + def validate_owning_org_data_given if field_92.blank? block_log_creation! @@ -985,4 +1004,21 @@ private end end end + + def validate_if_log_already_exists + if log_already_exists? + error_message = "This is a duplicate log" + + errors.add(:field_92, error_message) # Owning org + errors.add(:field_2, error_message) # Sale completion date + errors.add(:field_3, error_message) # Sale completion date + errors.add(:field_4, error_message) # Sale completion date + errors.add(:field_41, error_message) # Postcode + errors.add(:field_42, error_message) # Postcode + errors.add(:field_7, error_message) # Buyer 1 age + errors.add(:field_13, error_message) # Buyer 1 gender + errors.add(:field_24, error_message) # Buyer 1 working situation + errors.add(:field_1, error_message) # Purchaser code + end + end end diff --git a/spec/services/bulk_upload/sales/year2022/row_parser_spec.rb b/spec/services/bulk_upload/sales/year2022/row_parser_spec.rb index 4d37280dc..1fc85ebb5 100644 --- a/spec/services/bulk_upload/sales/year2022/row_parser_spec.rb +++ b/spec/services/bulk_upload/sales/year2022/row_parser_spec.rb @@ -539,6 +539,71 @@ RSpec.describe BulkUpload::Sales::Year2022::RowParser do end end end + + context "when the log already exists in the db" do + let(:attributes) { valid_attributes } + + before do + parser.log.save! + parser.instance_variable_set(:@valid, nil) + end + + it "is not a valid row" do + expect(parser).not_to be_valid + end + + it "adds an error to all (and only) the fields used to determine duplicates" do + parser.valid? + + error_message = "This is a duplicate log" + + [ + :field_92, # Owning org + :field_2, # Sale completion date + :field_3, # Sale completion date + :field_4, # Sale completion date + :field_41, # Postcode + :field_42, # Postcode + :field_7, # Buyer 1 age + :field_13, # Buyer 1 gender + :field_24, # Buyer 1 working situation + :field_1, # Purchaser code + ].each do |field| + expect(parser.errors[field]).to include(error_message) + end + end + end + + context "when a hidden log already exists in db" do + before do + parser.log.status = "pending" + parser.log.skip_update_status = true + parser.log.save! + end + + it "is a valid row" do + expect(parser).to be_valid + end + + it "does not add duplicate errors" do + parser.valid? + + [ + :field_92, # Owning org + :field_2, # Sale completion date + :field_3, # Sale completion date + :field_4, # Sale completion date + :field_41, # Postcode + :field_42, # Postcode + :field_7, # Buyer 1 age + :field_13, # Buyer 1 gender + :field_24, # Buyer 1 working situation + :field_1, # Purchaser code + ].each do |field| + expect(parser.errors[field]).to be_blank + end + end + end end describe "inferences" do