Browse Source

CLDC-4179: Amend sales duplicate log check (#3207)

* CLDC-4179: Add sexrab & postcode to frontend duplicate log checks

* CLDC-4179: Add sexrab & postcode to BU duplicate log checks

* CLDC-4179: Update tests
pull/3228/head
Samuel Young 6 days ago committed by GitHub
parent
commit
c085cbb572
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 21
      app/models/sales_log.rb
  2. 6
      app/services/bulk_upload/sales/year2025/row_parser.rb
  3. 6
      app/services/bulk_upload/sales/year2026/row_parser.rb
  4. 1
      spec/factories/sales_log.rb
  5. 10
      spec/features/sales_log_spec.rb
  6. 18
      spec/requests/duplicate_logs_controller_spec.rb
  7. 2
      spec/services/bulk_upload/sales/validator_spec.rb
  8. 4
      spec/services/bulk_upload/sales/year2025/row_parser_spec.rb
  9. 4
      spec/services/bulk_upload/sales/year2026/row_parser_spec.rb

21
app/models/sales_log.rb

@ -18,6 +18,7 @@ class SalesLog < Log
include Validations::Sales::SoftValidations include Validations::Sales::SoftValidations
include Validations::SoftValidations include Validations::SoftValidations
include MoneyFormattingHelper include MoneyFormattingHelper
include CollectionTimeHelper
self.inheritance_column = :_type_disabled self.inheritance_column = :_type_disabled
@ -37,6 +38,8 @@ class SalesLog < Log
belongs_to :managing_organisation, class_name: "Organisation", optional: true belongs_to :managing_organisation, class_name: "Organisation", optional: true
scope :filter_by_year, ->(year) { where(saledate: Time.zone.local(year.to_i, 4, 1)...Time.zone.local(year.to_i + 1, 4, 1)) } scope :filter_by_year, ->(year) { where(saledate: Time.zone.local(year.to_i, 4, 1)...Time.zone.local(year.to_i + 1, 4, 1)) }
scope :filter_by_year_or_later, ->(year) { where("sales_logs.saledate >= ?", Time.zone.local(year.to_i, 4, 1)) }
scope :filter_by_year_or_earlier, ->(year) { where("sales_logs.saledate < ?", Time.zone.local(year.to_i + 1, 4, 1)) }
scope :filter_by_years_or_nil, lambda { |years, _user = nil| scope :filter_by_years_or_nil, lambda { |years, _user = nil|
first_year = years.shift first_year = years.shift
query = filter_by_year(first_year) query = filter_by_year(first_year)
@ -69,12 +72,14 @@ class SalesLog < Log
} }
scope :age1_answered, -> { where.not(age1: nil).or(where(age1_known: [1, 2])) } scope :age1_answered, -> { where.not(age1: nil).or(where(age1_known: [1, 2])) }
scope :ecstat1_answered, -> { where.not(ecstat1: nil).or(where("saledate >= ?", Time.zone.local(2025, 4, 1))) } scope :ecstat1_answered, -> { where.not(ecstat1: nil).or(where("saledate >= ?", Time.zone.local(2025, 4, 1))) }
scope :sex1_answered, -> { where.not(sex1: nil).filter_by_year_or_earlier(2025).or(where.not(sexrab1: nil).filter_by_year_or_later(2026)) }
scope :address_answered, -> { where.not(postcode_full: nil).where.not(address_line1: nil).or(where.not(uprn: nil)) }
scope :duplicate_logs, lambda { |log| scope :duplicate_logs, lambda { |log|
visible.where(log.slice(*DUPLICATE_LOG_ATTRIBUTES)) visible.where(log.slice(*DUPLICATE_LOG_ATTRIBUTES))
.where.not(id: log.id) .where.not(id: log.id)
.where.not(saledate: nil) .where.not(saledate: nil)
.where.not(sex1: nil) .sex1_answered
.where.not(postcode_full: nil) .address_answered
.ecstat1_answered .ecstat1_answered
.age1_answered .age1_answered
} }
@ -84,8 +89,8 @@ class SalesLog < Log
scope = visible scope = visible
.group(*DUPLICATE_LOG_ATTRIBUTES) .group(*DUPLICATE_LOG_ATTRIBUTES)
.where.not(saledate: nil) .where.not(saledate: nil)
.where.not(sex1: nil) .sex1_answered
.where.not(postcode_full: nil) .address_answered
.age1_answered .age1_answered
.ecstat1_answered .ecstat1_answered
.having("COUNT(*) > 1") .having("COUNT(*) > 1")
@ -98,7 +103,7 @@ class SalesLog < Log
} }
OPTIONAL_FIELDS = %w[purchid othtype buyers_organisations].freeze OPTIONAL_FIELDS = %w[purchid othtype buyers_organisations].freeze
DUPLICATE_LOG_ATTRIBUTES = %w[owning_organisation_id purchid saledate age1_known age1 sex1 ecstat1 postcode_full].freeze DUPLICATE_LOG_ATTRIBUTES = %w[owning_organisation_id purchid saledate age1_known age1 sex1 sexrab1 ecstat1 postcode_full uprn address_line1].freeze
def lettings? def lettings?
false false
@ -538,10 +543,12 @@ class SalesLog < Log
["owning_organisation_id", ["owning_organisation_id",
"saledate", "saledate",
"purchid", "purchid",
"address_line1",
"postcode_full",
"uprn",
"age1", "age1",
"sex1",
"ecstat1", "ecstat1",
uprn.blank? ? "postcode_full" : "uprn"].compact form.start_year_2026_or_later? ? "sexrab1" : "sex1"].compact
end end
def soctenant_is_inferred? def soctenant_is_inferred?

6
app/services/bulk_upload/sales/year2025/row_parser.rb

@ -533,6 +533,8 @@ class BulkUpload::Sales::Year2025::RowParser
"field_2", # saledate "field_2", # saledate
"field_3", # saledate "field_3", # saledate
"field_7", # purchaser_code "field_7", # purchaser_code
"field_16", # uprn
"field_17", # address_line1
"field_21", # postcode "field_21", # postcode
"field_22", # postcode "field_22", # postcode
"field_28", # age1 "field_28", # age1
@ -1287,6 +1289,8 @@ private
ecstat1 ecstat1
owning_organisation owning_organisation
postcode_full postcode_full
uprn
address_line1
purchid purchid
] ]
end end
@ -1457,6 +1461,8 @@ private
errors.add(:field_1, error_message) # Sale completion date errors.add(:field_1, error_message) # Sale completion date
errors.add(:field_2, error_message) # Sale completion date errors.add(:field_2, error_message) # Sale completion date
errors.add(:field_3, error_message) # Sale completion date errors.add(:field_3, error_message) # Sale completion date
errors.add(:field_16, error_message) # UPRN
errors.add(:field_17, error_message) # Address line 1
errors.add(:field_21, error_message) # Postcode errors.add(:field_21, error_message) # Postcode
errors.add(:field_22, error_message) # Postcode errors.add(:field_22, error_message) # Postcode
errors.add(:field_28, error_message) # Buyer 1 age errors.add(:field_28, error_message) # Buyer 1 age

6
app/services/bulk_upload/sales/year2026/row_parser.rb

@ -586,6 +586,8 @@ class BulkUpload::Sales::Year2026::RowParser
"field_2", # saledate "field_2", # saledate
"field_3", # saledate "field_3", # saledate
"field_7", # purchaser_code "field_7", # purchaser_code
"field_16", # uprn
"field_17", # address_line1
"field_21", # postcode "field_21", # postcode
"field_22", # postcode "field_22", # postcode
"field_28", # age1 "field_28", # age1
@ -1390,6 +1392,8 @@ private
ecstat1 ecstat1
owning_organisation owning_organisation
postcode_full postcode_full
uprn
address_line1
purchid purchid
] ]
end end
@ -1560,6 +1564,8 @@ private
errors.add(:field_1, error_message) # Sale completion date errors.add(:field_1, error_message) # Sale completion date
errors.add(:field_2, error_message) # Sale completion date errors.add(:field_2, error_message) # Sale completion date
errors.add(:field_3, error_message) # Sale completion date errors.add(:field_3, error_message) # Sale completion date
errors.add(:field_16, error_message) # UPRN
errors.add(:field_17, error_message) # Address line 1
errors.add(:field_21, error_message) # Postcode errors.add(:field_21, error_message) # Postcode
errors.add(:field_22, error_message) # Postcode errors.add(:field_22, error_message) # Postcode
errors.add(:field_28, error_message) # Buyer 1 age errors.add(:field_28, error_message) # Buyer 1 age

1
spec/factories/sales_log.rb

@ -67,6 +67,7 @@ FactoryBot.define do
sexrab1 { "F" } sexrab1 { "F" }
sex1 { "F" } sex1 { "F" }
ecstat1 { 1 } ecstat1 { 1 }
address_line1 { "same address line 1" }
postcode_full { "A1 1AA" } postcode_full { "A1 1AA" }
noint { 2 } noint { 2 }
uprn_known { 0 } uprn_known { 0 }

10
spec/features/sales_log_spec.rb

@ -352,16 +352,6 @@ RSpec.describe "Sales Log Features" do
end end
context "when a log becomes a duplicate" do context "when a log becomes a duplicate" do
before do
Timecop.freeze(Time.zone.local(2024, 3, 3))
Singleton.__init__(FormHandler)
end
after do
Timecop.return
Singleton.__init__(FormHandler)
end
context "and updating duplicate log" do context "and updating duplicate log" do
let(:user) { create(:user, :data_coordinator) } let(:user) { create(:user, :data_coordinator) }
let(:sales_log) { create(:sales_log, :duplicate, assigned_to: user) } let(:sales_log) { create(:sales_log, :duplicate, assigned_to: user) }

18
spec/requests/duplicate_logs_controller_spec.rb

@ -170,7 +170,8 @@ RSpec.describe DuplicateLogsController, type: :request do
expect(page).to have_content("- Buyer 1’s gender identity", count: 3) expect(page).to have_content("- Buyer 1’s gender identity", count: 3)
expect(page).to have_content("- Buyer 1’s working situation", count: 3) expect(page).to have_content("- Buyer 1’s working situation", count: 3)
expect(page).to have_content("- Postcode", count: 3) expect(page).to have_content("- Postcode", count: 3)
expect(page).to have_link("Change", count: 21) expect(page).to have_content("- Address line 1", count: 3)
expect(page).to have_link("Change", count: 24)
expect(page).to have_link("Change", href: "/sales-logs/#{sales_log.id}/purchaser-code?first_remaining_duplicate_id=#{duplicate_logs[0].id}&organisation_id=#{sales_log.owning_organisation_id}&original_log_id=#{sales_log.id}&referrer=duplicate_logs") expect(page).to have_link("Change", href: "/sales-logs/#{sales_log.id}/purchaser-code?first_remaining_duplicate_id=#{duplicate_logs[0].id}&organisation_id=#{sales_log.owning_organisation_id}&original_log_id=#{sales_log.id}&referrer=duplicate_logs")
expect(page).to have_link("Change", href: "/sales-logs/#{duplicate_logs[0].id}/purchaser-code?first_remaining_duplicate_id=#{sales_log.id}&organisation_id=#{sales_log.owning_organisation_id}&original_log_id=#{sales_log.id}&referrer=duplicate_logs") expect(page).to have_link("Change", href: "/sales-logs/#{duplicate_logs[0].id}/purchaser-code?first_remaining_duplicate_id=#{sales_log.id}&organisation_id=#{sales_log.owning_organisation_id}&original_log_id=#{sales_log.id}&referrer=duplicate_logs")
expect(page).to have_link("Change", href: "/sales-logs/#{duplicate_logs[1].id}/purchaser-code?first_remaining_duplicate_id=#{sales_log.id}&organisation_id=#{sales_log.owning_organisation_id}&original_log_id=#{sales_log.id}&referrer=duplicate_logs") expect(page).to have_link("Change", href: "/sales-logs/#{duplicate_logs[1].id}/purchaser-code?first_remaining_duplicate_id=#{sales_log.id}&organisation_id=#{sales_log.owning_organisation_id}&original_log_id=#{sales_log.id}&referrer=duplicate_logs")
@ -216,7 +217,8 @@ RSpec.describe DuplicateLogsController, type: :request do
expect(page).to have_content("- Buyer 1’s gender identity", count: 1) expect(page).to have_content("- Buyer 1’s gender identity", count: 1)
expect(page).to have_content("- Buyer 1’s working situation", count: 1) expect(page).to have_content("- Buyer 1’s working situation", count: 1)
expect(page).to have_content("- Postcode", count: 1) expect(page).to have_content("- Postcode", count: 1)
expect(page).to have_link("Change", count: 7) expect(page).to have_content("- Address line 1", count: 1)
expect(page).to have_link("Change", count: 8)
expect(page).to have_link("Change", href: "/sales-logs/#{sales_log.id}/purchaser-code?original_log_id=#{sales_log.id}&referrer=interruption_screen") expect(page).to have_link("Change", href: "/sales-logs/#{sales_log.id}/purchaser-code?original_log_id=#{sales_log.id}&referrer=interruption_screen")
end end
@ -242,7 +244,8 @@ RSpec.describe DuplicateLogsController, type: :request do
expect(page).to have_content("- Buyer 1’s gender identity", count: 1) expect(page).to have_content("- Buyer 1’s gender identity", count: 1)
expect(page).to have_content("- Buyer 1’s working situation", count: 1) expect(page).to have_content("- Buyer 1’s working situation", count: 1)
expect(page).to have_content("- Postcode", count: 1) expect(page).to have_content("- Postcode", count: 1)
expect(page).to have_link("Change", count: 7) expect(page).to have_content("- Address line 1", count: 1)
expect(page).to have_link("Change", count: 8)
expect(page).to have_link("Change", href: "/sales-logs/#{sales_log.id}/purchaser-code?original_log_id=#{sales_log.id}&referrer=interruption_screen") expect(page).to have_link("Change", href: "/sales-logs/#{sales_log.id}/purchaser-code?original_log_id=#{sales_log.id}&referrer=interruption_screen")
end end
@ -377,7 +380,8 @@ RSpec.describe DuplicateLogsController, type: :request do
expect(page).to have_content("- Buyer 1’s gender identity", count: 3) expect(page).to have_content("- Buyer 1’s gender identity", count: 3)
expect(page).to have_content("- Buyer 1’s working situation", count: 3) expect(page).to have_content("- Buyer 1’s working situation", count: 3)
expect(page).to have_content("- Postcode", count: 3) expect(page).to have_content("- Postcode", count: 3)
expect(page).to have_link("Change", count: 18) expect(page).to have_content("- Address line 1", count: 3)
expect(page).to have_link("Change", count: 21)
expect(page).to have_link("Change", href: "/sales-logs/#{sales_log.id}/purchaser-code?first_remaining_duplicate_id=#{duplicate_logs[0].id}&original_log_id=#{sales_log.id}&referrer=duplicate_logs") expect(page).to have_link("Change", href: "/sales-logs/#{sales_log.id}/purchaser-code?first_remaining_duplicate_id=#{duplicate_logs[0].id}&original_log_id=#{sales_log.id}&referrer=duplicate_logs")
expect(page).to have_link("Change", href: "/sales-logs/#{duplicate_logs[0].id}/purchaser-code?first_remaining_duplicate_id=#{sales_log.id}&original_log_id=#{sales_log.id}&referrer=duplicate_logs") expect(page).to have_link("Change", href: "/sales-logs/#{duplicate_logs[0].id}/purchaser-code?first_remaining_duplicate_id=#{sales_log.id}&original_log_id=#{sales_log.id}&referrer=duplicate_logs")
expect(page).to have_link("Change", href: "/sales-logs/#{duplicate_logs[1].id}/purchaser-code?first_remaining_duplicate_id=#{sales_log.id}&original_log_id=#{sales_log.id}&referrer=duplicate_logs") expect(page).to have_link("Change", href: "/sales-logs/#{duplicate_logs[1].id}/purchaser-code?first_remaining_duplicate_id=#{sales_log.id}&original_log_id=#{sales_log.id}&referrer=duplicate_logs")
@ -405,7 +409,8 @@ RSpec.describe DuplicateLogsController, type: :request do
expect(page).to have_content("- Buyer 1’s gender identity", count: 1) expect(page).to have_content("- Buyer 1’s gender identity", count: 1)
expect(page).to have_content("- Buyer 1’s working situation", count: 1) expect(page).to have_content("- Buyer 1’s working situation", count: 1)
expect(page).to have_content("- Postcode", count: 1) expect(page).to have_content("- Postcode", count: 1)
expect(page).to have_link("Change", count: 6) expect(page).to have_content("- Address line 1", count: 1)
expect(page).to have_link("Change", count: 7)
expect(page).to have_link("Change", href: "/sales-logs/#{sales_log.id}/purchaser-code?original_log_id=#{sales_log.id}&referrer=interruption_screen") expect(page).to have_link("Change", href: "/sales-logs/#{sales_log.id}/purchaser-code?original_log_id=#{sales_log.id}&referrer=interruption_screen")
end end
@ -431,7 +436,8 @@ RSpec.describe DuplicateLogsController, type: :request do
expect(page).to have_content("- Buyer 1’s gender identity", count: 1) expect(page).to have_content("- Buyer 1’s gender identity", count: 1)
expect(page).to have_content("- Buyer 1’s working situation", count: 1) expect(page).to have_content("- Buyer 1’s working situation", count: 1)
expect(page).to have_content("- Postcode", count: 1) expect(page).to have_content("- Postcode", count: 1)
expect(page).to have_link("Change", count: 6) expect(page).to have_content("- Address line 1", count: 1)
expect(page).to have_link("Change", count: 7)
expect(page).to have_link("Change", href: "/sales-logs/#{sales_log.id}/purchaser-code?original_log_id=#{sales_log.id}&referrer=interruption_screen") expect(page).to have_link("Change", href: "/sales-logs/#{sales_log.id}/purchaser-code?original_log_id=#{sales_log.id}&referrer=interruption_screen")
end end

2
spec/services/bulk_upload/sales/validator_spec.rb

@ -225,7 +225,7 @@ RSpec.describe BulkUpload::Sales::Validator do
end end
it "creates errors" do it "creates errors" do
expect { validator.call }.to change(BulkUploadError.where(category: :setup, error: "This is a duplicate of a log in your file."), :count).by(20) expect { validator.call }.to change(BulkUploadError.where(category: :setup, error: "This is a duplicate of a log in your file."), :count).by(24)
end end
end end
end end

4
spec/services/bulk_upload/sales/year2025/row_parser_spec.rb

@ -784,6 +784,8 @@ RSpec.describe BulkUpload::Sales::Year2025::RowParser do
:field_1, # Sale completion date :field_1, # Sale completion date
:field_2, # Sale completion date :field_2, # Sale completion date
:field_3, # Sale completion date :field_3, # Sale completion date
:field_16, # UPRN
:field_17, # Address line 1
:field_21, # Postcode :field_21, # Postcode
:field_22, # Postcode :field_22, # Postcode
:field_28, # Buyer 1 age :field_28, # Buyer 1 age
@ -814,6 +816,8 @@ RSpec.describe BulkUpload::Sales::Year2025::RowParser do
:field_1, # Sale completion date :field_1, # Sale completion date
:field_2, # Sale completion date :field_2, # Sale completion date
:field_3, # Sale completion date :field_3, # Sale completion date
:field_16, # UPRN
:field_17, # Address line 1
:field_21, # Postcode :field_21, # Postcode
:field_22, # Postcode :field_22, # Postcode
:field_28, # Buyer 1 age :field_28, # Buyer 1 age

4
spec/services/bulk_upload/sales/year2026/row_parser_spec.rb

@ -790,6 +790,8 @@ RSpec.describe BulkUpload::Sales::Year2026::RowParser do
:field_1, # Sale completion date :field_1, # Sale completion date
:field_2, # Sale completion date :field_2, # Sale completion date
:field_3, # Sale completion date :field_3, # Sale completion date
:field_16, # UPRN
:field_17, # Address line 1
:field_21, # Postcode :field_21, # Postcode
:field_22, # Postcode :field_22, # Postcode
:field_28, # Buyer 1 age :field_28, # Buyer 1 age
@ -820,6 +822,8 @@ RSpec.describe BulkUpload::Sales::Year2026::RowParser do
:field_1, # Sale completion date :field_1, # Sale completion date
:field_2, # Sale completion date :field_2, # Sale completion date
:field_3, # Sale completion date :field_3, # Sale completion date
:field_16, # UPRN
:field_17, # Address line 1
:field_21, # Postcode :field_21, # Postcode
:field_22, # Postcode :field_22, # Postcode
:field_28, # Buyer 1 age :field_28, # Buyer 1 age

Loading…
Cancel
Save