diff --git a/app/models/sales_log.rb b/app/models/sales_log.rb index a76460e87..4d6e152a2 100644 --- a/app/models/sales_log.rb +++ b/app/models/sales_log.rb @@ -18,6 +18,7 @@ class SalesLog < Log include Validations::Sales::SoftValidations include Validations::SoftValidations include MoneyFormattingHelper + include CollectionTimeHelper self.inheritance_column = :_type_disabled @@ -37,6 +38,8 @@ class SalesLog < Log 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_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| first_year = years.shift 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 :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| visible.where(log.slice(*DUPLICATE_LOG_ATTRIBUTES)) .where.not(id: log.id) .where.not(saledate: nil) - .where.not(sex1: nil) - .where.not(postcode_full: nil) + .sex1_answered + .address_answered .ecstat1_answered .age1_answered } @@ -84,8 +89,8 @@ class SalesLog < Log scope = visible .group(*DUPLICATE_LOG_ATTRIBUTES) .where.not(saledate: nil) - .where.not(sex1: nil) - .where.not(postcode_full: nil) + .sex1_answered + .address_answered .age1_answered .ecstat1_answered .having("COUNT(*) > 1") @@ -98,7 +103,7 @@ class SalesLog < Log } 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? false @@ -268,6 +273,22 @@ class SalesLog < Log value * equity / 100 end + def expected_shared_ownership_deposit_value_tolerance + return 1 unless value && equity + + # we found that a fixed tolerance was not quite what we wanted here. + # CORE wants it so if a user say, has a 66.666% equity they can enter either 66.6% or 66.7% (or 66.5%) + # so in 2026 we base our tolerance off of a discount 0.1% higher or lower + if form.start_year_2026_or_later? + lower_bound = value * ((equity - 0.1) / 100) + upper_bound = value * ((equity + 0.1) / 100) + + (upper_bound - lower_bound) / 2 + else + 1 + end + end + def stairbought_part_of_value return unless value && stairbought @@ -468,6 +489,22 @@ class SalesLog < Log value - discount_amount end + def value_with_discount_tolerance + return 1 if value.blank? || discount.nil? + + # we found that a simple tolerance was not quite what we wanted here. + # CORE wants it so if a user say, has a 66.6% discount then can enter either 66.6% or 66.7% + # so in 2026 we base our tolerance off of a discount 0.1% higher or lower + if form.start_year_2026_or_later? + discount_amount_lower_bound = value * (discount - 0.1) / 100 + discount_amount_upper_bound = value * (discount + 0.1) / 100 + + (discount_amount_upper_bound - discount_amount_lower_bound) / 2 + else + discount ? value * 0.05 / 100 : 1 + end + end + def mortgage_deposit_and_grant_total return if deposit.blank? @@ -506,10 +543,12 @@ class SalesLog < Log ["owning_organisation_id", "saledate", "purchid", + "address_line1", + "postcode_full", + "uprn", "age1", - "sex1", "ecstat1", - uprn.blank? ? "postcode_full" : "uprn"].compact + form.start_year_2026_or_later? ? "sexrab1" : "sex1"].compact end def soctenant_is_inferred? diff --git a/app/models/validations/sales/sale_information_validations.rb b/app/models/validations/sales/sale_information_validations.rb index 063c16599..df6b90a4a 100644 --- a/app/models/validations/sales/sale_information_validations.rb +++ b/app/models/validations/sales/sale_information_validations.rb @@ -80,10 +80,9 @@ module Validations::Sales::SaleInformationValidations return unless record.mortgage || record.mortgageused == 2 || record.mortgageused == 3 return unless record.discount || record.grant || record.type == 29 - # When a percentage discount is used, a percentage tolerance is needed to account for rounding errors - tolerance = record.discount ? record.value * 0.05 / 100 : 1 + tolerance = record.value_with_discount_tolerance - if over_tolerance?(record.mortgage_deposit_and_grant_total, record.value_with_discount, tolerance, strict: !record.discount.nil?) && record.discounted_ownership_sale? + if over_tolerance?(record.mortgage_deposit_and_grant_total, record.value_with_discount, tolerance, strict: !record.discount.nil? || record.form.start_year_2026_or_later?) && record.discounted_ownership_sale? deposit_and_grant_sentence = record.grant.present? ? ", cash deposit (#{record.field_formatted_as_currency('deposit')}), and grant (#{record.field_formatted_as_currency('grant')})" : " and cash deposit (#{record.field_formatted_as_currency('deposit')})" discount_sentence = record.discount.present? ? " (#{record.field_formatted_as_currency('value')}) subtracted by the sum of the full purchase price (#{record.field_formatted_as_currency('value')}) multiplied by the percentage discount (#{record.discount}%)" : "" %i[mortgageused mortgage value deposit discount grant].each do |field| @@ -204,10 +203,12 @@ module Validations::Sales::SaleInformationValidations def check_non_staircasing_socialhomebuy_mortgage(record) return unless record.cashdis + tolerance = record.expected_shared_ownership_deposit_value_tolerance + if record.mortgage_used? return unless record.mortgage - if over_tolerance?(record.mortgage_deposit_and_discount_total, record.expected_shared_ownership_deposit_value, 1) + if over_tolerance?(record.mortgage_deposit_and_discount_total, record.expected_shared_ownership_deposit_value, tolerance, strict: record.form.start_year_2026_or_later?) %i[mortgage value deposit cashdis equity].each do |field| record.errors.add field, I18n.t("validations.sales.sale_information.#{field}.non_staircasing_mortgage.mortgage_used_socialhomebuy", mortgage: record.field_formatted_as_currency("mortgage"), @@ -228,7 +229,7 @@ module Validations::Sales::SaleInformationValidations expected_shared_ownership_deposit_value: record.field_formatted_as_currency("expected_shared_ownership_deposit_value")).html_safe end elsif record.mortgage_not_used? - if over_tolerance?(record.deposit_and_discount_total, record.expected_shared_ownership_deposit_value, 1) + if over_tolerance?(record.deposit_and_discount_total, record.expected_shared_ownership_deposit_value, tolerance, strict: record.form.start_year_2026_or_later?) %i[mortgageused value deposit cashdis equity].each do |field| record.errors.add field, I18n.t("validations.sales.sale_information.#{field}.non_staircasing_mortgage.mortgage_not_used_socialhomebuy", deposit_and_discount_total: record.field_formatted_as_currency("deposit_and_discount_total"), @@ -250,10 +251,12 @@ module Validations::Sales::SaleInformationValidations end def check_non_staircasing_non_socialhomebuy_mortgage(record) + tolerance = record.expected_shared_ownership_deposit_value_tolerance + if record.mortgage_used? return unless record.mortgage - if over_tolerance?(record.mortgage_and_deposit_total, record.expected_shared_ownership_deposit_value, 1) + if over_tolerance?(record.mortgage_and_deposit_total, record.expected_shared_ownership_deposit_value, tolerance, strict: record.form.start_year_2026_or_later?) %i[mortgage value deposit equity].each do |field| record.errors.add field, I18n.t("validations.sales.sale_information.#{field}.non_staircasing_mortgage.mortgage_used", mortgage: record.field_formatted_as_currency("mortgage"), @@ -272,7 +275,7 @@ module Validations::Sales::SaleInformationValidations expected_shared_ownership_deposit_value: record.field_formatted_as_currency("expected_shared_ownership_deposit_value")).html_safe end elsif record.mortgage_not_used? - if over_tolerance?(record.deposit, record.expected_shared_ownership_deposit_value, 1) + if over_tolerance?(record.deposit, record.expected_shared_ownership_deposit_value, tolerance, strict: record.form.start_year_2026_or_later?) %i[mortgageused value deposit equity].each do |field| record.errors.add field, I18n.t("validations.sales.sale_information.#{field}.non_staircasing_mortgage.mortgage_not_used", deposit: record.field_formatted_as_currency("deposit"), diff --git a/app/models/validations/sales/soft_validations.rb b/app/models/validations/sales/soft_validations.rb index 3569c379f..ce7a812d2 100644 --- a/app/models/validations/sales/soft_validations.rb +++ b/app/models/validations/sales/soft_validations.rb @@ -117,6 +117,7 @@ module Validations::Sales::SoftValidations def mortgage_plus_deposit_less_than_discounted_value? return unless mortgage && deposit && value && discount + return if form.start_year_2026_or_later? discounted_value = value * (100 - discount) / 100 mortgage + deposit < discounted_value diff --git a/app/services/bulk_upload/sales/year2025/row_parser.rb b/app/services/bulk_upload/sales/year2025/row_parser.rb index 19ad2cb1b..6f5e2470e 100644 --- a/app/services/bulk_upload/sales/year2025/row_parser.rb +++ b/app/services/bulk_upload/sales/year2025/row_parser.rb @@ -533,6 +533,8 @@ class BulkUpload::Sales::Year2025::RowParser "field_2", # saledate "field_3", # saledate "field_7", # purchaser_code + "field_16", # uprn + "field_17", # address_line1 "field_21", # postcode "field_22", # postcode "field_28", # age1 @@ -1287,6 +1289,8 @@ private ecstat1 owning_organisation postcode_full + uprn + address_line1 purchid ] end @@ -1457,6 +1461,8 @@ private errors.add(:field_1, 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_16, error_message) # UPRN + errors.add(:field_17, error_message) # Address line 1 errors.add(:field_21, error_message) # Postcode errors.add(:field_22, error_message) # Postcode errors.add(:field_28, error_message) # Buyer 1 age diff --git a/app/services/bulk_upload/sales/year2026/row_parser.rb b/app/services/bulk_upload/sales/year2026/row_parser.rb index 94f1a9ae6..873860cb0 100644 --- a/app/services/bulk_upload/sales/year2026/row_parser.rb +++ b/app/services/bulk_upload/sales/year2026/row_parser.rb @@ -586,6 +586,8 @@ class BulkUpload::Sales::Year2026::RowParser "field_2", # saledate "field_3", # saledate "field_7", # purchaser_code + "field_16", # uprn + "field_17", # address_line1 "field_21", # postcode "field_22", # postcode "field_28", # age1 @@ -1390,6 +1392,8 @@ private ecstat1 owning_organisation postcode_full + uprn + address_line1 purchid ] end @@ -1560,6 +1564,8 @@ private errors.add(:field_1, 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_16, error_message) # UPRN + errors.add(:field_17, error_message) # Address line 1 errors.add(:field_21, error_message) # Postcode errors.add(:field_22, error_message) # Postcode errors.add(:field_28, error_message) # Buyer 1 age diff --git a/spec/factories/sales_log.rb b/spec/factories/sales_log.rb index 51bca33b8..ddc47bb53 100644 --- a/spec/factories/sales_log.rb +++ b/spec/factories/sales_log.rb @@ -67,6 +67,7 @@ FactoryBot.define do sexrab1 { "F" } sex1 { "F" } ecstat1 { 1 } + address_line1 { "same address line 1" } postcode_full { "A1 1AA" } noint { 2 } uprn_known { 0 } diff --git a/spec/features/sales_log_spec.rb b/spec/features/sales_log_spec.rb index 97e6549d0..d576e7601 100644 --- a/spec/features/sales_log_spec.rb +++ b/spec/features/sales_log_spec.rb @@ -352,16 +352,6 @@ RSpec.describe "Sales Log Features" do end 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 let(:user) { create(:user, :data_coordinator) } let(:sales_log) { create(:sales_log, :duplicate, assigned_to: user) } diff --git a/spec/models/validations/sales/sale_information_validations_spec.rb b/spec/models/validations/sales/sale_information_validations_spec.rb index 1731f19ac..1c36ee5e1 100644 --- a/spec/models/validations/sales/sale_information_validations_spec.rb +++ b/spec/models/validations/sales/sale_information_validations_spec.rb @@ -663,6 +663,46 @@ RSpec.describe Validations::Sales::SaleInformationValidations do expect(record.errors["grant"]).to be_empty end end + + context "with year 2026", :aggregate_failures do + let(:saledate) { Time.zone.local(2026, 4, 1) } + + context "when mortgage and deposit is exact" do + let(:record) { FactoryBot.build(:sales_log, saledate:, mortgage: 85_000, deposit: 5_000, value: 100_000, discount: 10, ownershipsch: 2, type: 9) } + + it "does not add an error" do + sale_information_validator.validate_discounted_ownership_value(record) + expect(record.errors["mortgage"]).to be_empty + expect(record.errors["value"]).to be_empty + expect(record.errors["deposit"]).to be_empty + expect(record.errors["discount"]).to be_empty + end + end + + context "when mortgage and deposit is within 0.1% discount tolerance" do + let(:record) { FactoryBot.build(:sales_log, saledate:, mortgage: 85_000, deposit: 5_000, value: 100_000, discount: 10.1, ownershipsch: 2, type: 9) } + + it "does not add an error" do + sale_information_validator.validate_discounted_ownership_value(record) + expect(record.errors["mortgage"]).to be_empty + expect(record.errors["value"]).to be_empty + expect(record.errors["deposit"]).to be_empty + expect(record.errors["discount"]).to be_empty + end + end + + context "when mortgage and deposit is outside 0.1% discount tolerance" do + let(:record) { FactoryBot.build(:sales_log, saledate:, mortgage: 85_000, deposit: 5_000, value: 100_000, discount: 10.2, ownershipsch: 2, type: 9) } + + it "adds an error" do + sale_information_validator.validate_discounted_ownership_value(record) + expect(record.errors["mortgage"]).not_to be_empty + expect(record.errors["value"]).not_to be_empty + expect(record.errors["deposit"]).not_to be_empty + expect(record.errors["discount"]).not_to be_empty + end + end + end end describe "#validate_outright_sale_value_matches_mortgage_plus_deposit" do @@ -1171,6 +1211,82 @@ RSpec.describe Validations::Sales::SaleInformationValidations do end end end + + context "with year 2026", :aggregate_failures do + let(:saledate) { Time.zone.local(2026, 4, 1) } + + context "when mortgage and deposit is exact" do + let(:record) { FactoryBot.build(:sales_log, mortgageused: 1, mortgage: 10_000, staircase: 2, deposit: 5_000, value: 100_000, equity: 15, ownershipsch: 1, type: 30, saledate:) } + + it "does not add an error" do + sale_information_validator.validate_non_staircasing_mortgage(record) + expect(record.errors["mortgage"]).to be_empty + expect(record.errors["value"]).to be_empty + expect(record.errors["deposit"]).to be_empty + expect(record.errors["equity"]).to be_empty + end + end + + context "when mortgage and deposit is within 0.1% equity tolerance" do + let(:record) { FactoryBot.build(:sales_log, mortgageused: 1, mortgage: 10_000, staircase: 2, deposit: 5_000, value: 100_000, equity: 15.1, ownershipsch: 1, type: 30, saledate:) } + + it "does not add an error" do + sale_information_validator.validate_non_staircasing_mortgage(record) + expect(record.errors["mortgage"]).to be_empty + expect(record.errors["value"]).to be_empty + expect(record.errors["deposit"]).to be_empty + expect(record.errors["equity"]).to be_empty + end + end + + context "when mortgage and deposit is outside 0.1% equity tolerance" do + let(:record) { FactoryBot.build(:sales_log, mortgageused: 1, mortgage: 10_000, staircase: 2, deposit: 5_000, value: 100_000, equity: 15.2, ownershipsch: 1, type: 30, saledate:) } + + it "adds an error" do + sale_information_validator.validate_non_staircasing_mortgage(record) + expect(record.errors["mortgage"]).not_to be_empty + expect(record.errors["value"]).not_to be_empty + expect(record.errors["deposit"]).not_to be_empty + expect(record.errors["equity"]).not_to be_empty + end + end + + context "when deposit (no mortgage) is exact" do + let(:record) { FactoryBot.build(:sales_log, mortgageused: 2, staircase: 2, deposit: 15_000, value: 100_000, equity: 15, ownershipsch: 1, type: 30, saledate:) } + + it "does not add an error" do + sale_information_validator.validate_non_staircasing_mortgage(record) + expect(record.errors["mortgageused"]).to be_empty + expect(record.errors["value"]).to be_empty + expect(record.errors["deposit"]).to be_empty + expect(record.errors["equity"]).to be_empty + end + end + + context "when deposit (no mortgage) is within 0.1% equity tolerance" do + let(:record) { FactoryBot.build(:sales_log, mortgageused: 2, staircase: 2, deposit: 15_000, value: 100_000, equity: 15.1, ownershipsch: 1, type: 30, saledate:) } + + it "does not add an error" do + sale_information_validator.validate_non_staircasing_mortgage(record) + expect(record.errors["mortgageused"]).to be_empty + expect(record.errors["value"]).to be_empty + expect(record.errors["deposit"]).to be_empty + expect(record.errors["equity"]).to be_empty + end + end + + context "when deposit (no mortgage) is outside 0.1% equity tolerance" do + let(:record) { FactoryBot.build(:sales_log, mortgageused: 2, staircase: 2, deposit: 15_000, value: 100_000, equity: 15.2, ownershipsch: 1, type: 30, saledate:) } + + it "adds an error" do + sale_information_validator.validate_non_staircasing_mortgage(record) + expect(record.errors["mortgageused"]).not_to be_empty + expect(record.errors["value"]).not_to be_empty + expect(record.errors["deposit"]).not_to be_empty + expect(record.errors["equity"]).not_to be_empty + end + end + end end describe "#validate_staircasing_mortgage" do diff --git a/spec/requests/duplicate_logs_controller_spec.rb b/spec/requests/duplicate_logs_controller_spec.rb index b254dcb15..69140f1e9 100644 --- a/spec/requests/duplicate_logs_controller_spec.rb +++ b/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 working situation", 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/#{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") @@ -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 working situation", 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") 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 working situation", 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") 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 working situation", 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/#{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") @@ -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 working situation", 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") 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 working situation", 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") end diff --git a/spec/services/bulk_upload/sales/validator_spec.rb b/spec/services/bulk_upload/sales/validator_spec.rb index 263bb92f8..9d4458a95 100644 --- a/spec/services/bulk_upload/sales/validator_spec.rb +++ b/spec/services/bulk_upload/sales/validator_spec.rb @@ -225,7 +225,7 @@ RSpec.describe BulkUpload::Sales::Validator do end 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 diff --git a/spec/services/bulk_upload/sales/year2025/row_parser_spec.rb b/spec/services/bulk_upload/sales/year2025/row_parser_spec.rb index ebebc38b8..a1df099ad 100644 --- a/spec/services/bulk_upload/sales/year2025/row_parser_spec.rb +++ b/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_2, # Sale completion date :field_3, # Sale completion date + :field_16, # UPRN + :field_17, # Address line 1 :field_21, # Postcode :field_22, # Postcode :field_28, # Buyer 1 age @@ -814,6 +816,8 @@ RSpec.describe BulkUpload::Sales::Year2025::RowParser do :field_1, # Sale completion date :field_2, # Sale completion date :field_3, # Sale completion date + :field_16, # UPRN + :field_17, # Address line 1 :field_21, # Postcode :field_22, # Postcode :field_28, # Buyer 1 age diff --git a/spec/services/bulk_upload/sales/year2026/row_parser_spec.rb b/spec/services/bulk_upload/sales/year2026/row_parser_spec.rb index 092e86b58..ba0e04c91 100644 --- a/spec/services/bulk_upload/sales/year2026/row_parser_spec.rb +++ b/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_2, # Sale completion date :field_3, # Sale completion date + :field_16, # UPRN + :field_17, # Address line 1 :field_21, # Postcode :field_22, # Postcode :field_28, # Buyer 1 age @@ -820,6 +822,8 @@ RSpec.describe BulkUpload::Sales::Year2026::RowParser do :field_1, # Sale completion date :field_2, # Sale completion date :field_3, # Sale completion date + :field_16, # UPRN + :field_17, # Address line 1 :field_21, # Postcode :field_22, # Postcode :field_28, # Buyer 1 age