Browse Source

CLDC-3845 Save manually entered address in BU (#2948)

* Update BU addresses flow

* Refactor
CLDC-3867-update-lettings-export
kosiakkatrina 1 week ago committed by GitHub
parent
commit
27d7c4689f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      app/models/derived_variables/sales_log_variables.rb
  2. 15
      app/models/log.rb
  3. 17
      app/services/bulk_upload/lettings/year2024/row_parser.rb
  4. 17
      app/services/bulk_upload/lettings/year2025/row_parser.rb
  5. 17
      app/services/bulk_upload/sales/year2024/row_parser.rb
  6. 15
      app/services/bulk_upload/sales/year2025/row_parser.rb
  7. 51
      spec/services/bulk_upload/lettings/year2024/row_parser_spec.rb
  8. 51
      spec/services/bulk_upload/lettings/year2025/row_parser_spec.rb
  9. 50
      spec/services/bulk_upload/sales/year2024/row_parser_spec.rb
  10. 35
      spec/services/bulk_upload/sales/year2025/row_parser_spec.rb

2
app/models/derived_variables/sales_log_variables.rb

@ -261,8 +261,6 @@ private
self.pcode1 = nil
self.pcode2 = nil
self.pcodenk = nil
self.address_line1_input = nil
self.postcode_full_input = nil
self.postcode_full = nil
self.is_la_inferred = nil
self.la = nil

15
app/models/log.rb

@ -90,13 +90,17 @@ class Log < ApplicationRecord
if select_best_address_match
service = AddressClient.new(address_string)
service.call
return nil if service.result.blank? || service.error.present?
if service.result.blank? || service.error.present?
select_manual_address_entry!
return nil
end
presenter = AddressDataPresenter.new(service.result.first)
os_match_threshold_for_bulk_upload = 0.7
if presenter.match >= os_match_threshold_for_bulk_upload
self.uprn_selection = presenter.uprn
else
select_manual_address_entry!
return nil
end
end
@ -404,4 +408,13 @@ private
self[is_inferred_key] = false
self[postcode_key] = nil
end
def select_manual_address_entry!
self.postcode_full = postcode_full_as_entered
self.address_line1 = address_line1_as_entered
self.address_line2 = address_line2_as_entered
self.county = county_as_entered
self.town_or_city = town_or_city_as_entered
self.manual_address_entry_selected = true
end
end

17
app/services/bulk_upload/lettings/year2024/row_parser.rb

@ -439,7 +439,6 @@ class BulkUpload::Lettings::Year2024::RowParser
validate :validate_assigned_to_when_support, on: :after_log
validate :validate_all_charges_given, on: :after_log, if: proc { is_carehome.zero? }
validate :validate_address_option_found, on: :after_log, unless: -> { supported_housing? }
validate :validate_uprn_exists_if_any_key_address_fields_are_blank, on: :after_log, unless: -> { supported_housing? }
validate :validate_address_fields, on: :after_log, unless: -> { supported_housing? }
@ -616,21 +615,6 @@ private
end
end
def validate_address_option_found
if log.uprn.nil? && field_16.blank? && key_address_fields_provided?
error_message = if log.address_options_present? && log.address_options.size > 1
I18n.t("#{ERROR_BASE_KEY}.address.not_determined.multiple")
elsif log.address_options_present?
I18n.t("#{ERROR_BASE_KEY}.address.not_determined.one")
else
I18n.t("#{ERROR_BASE_KEY}.address.not_found")
end
%i[field_17 field_18 field_19 field_20 field_21 field_22].each do |field|
errors.add(field, error_message) if errors[field].blank?
end
end
end
def key_address_fields_provided?
field_17.present? && field_19.present? && postcode_full.present?
end
@ -1363,7 +1347,6 @@ private
attributes["address_line1_input"] = address_line1_input
attributes["postcode_full_input"] = postcode_full
attributes["select_best_address_match"] = true if field_16.blank?
attributes["manual_address_entry_selected"] = field_16.blank?
end
attributes

17
app/services/bulk_upload/lettings/year2025/row_parser.rb

@ -438,7 +438,6 @@ class BulkUpload::Lettings::Year2025::RowParser
validate :validate_assigned_to_when_support, on: :after_log
validate :validate_all_charges_given, on: :after_log
validate :validate_address_option_found, on: :after_log, unless: -> { supported_housing? }
validate :validate_uprn_exists_if_any_key_address_fields_are_blank, on: :after_log, unless: -> { supported_housing? }
validate :validate_address_fields, on: :after_log, unless: -> { supported_housing? }
@ -615,21 +614,6 @@ private
end
end
def validate_address_option_found
if log.uprn.nil? && field_18.blank? && key_address_fields_provided?
error_message = if log.address_options_present? && log.address_options.size > 1
I18n.t("#{ERROR_BASE_KEY}.address.not_determined.multiple")
elsif log.address_options_present?
I18n.t("#{ERROR_BASE_KEY}.address.not_determined.one")
else
I18n.t("#{ERROR_BASE_KEY}.address.not_found")
end
%i[field_19 field_20 field_21 field_22 field_23 field_24].each do |field|
errors.add(field, error_message) if errors[field].blank?
end
end
end
def key_address_fields_provided?
field_19.present? && field_21.present? && postcode_full.present?
end
@ -1360,7 +1344,6 @@ private
attributes["address_line1_input"] = address_line1_input
attributes["postcode_full_input"] = postcode_full
attributes["select_best_address_match"] = true if field_18.blank?
attributes["manual_address_entry_selected"] = field_18.blank?
end
attributes

17
app/services/bulk_upload/sales/year2024/row_parser.rb

@ -455,7 +455,6 @@ class BulkUpload::Sales::Year2024::RowParser
on: :after_log
validate :validate_buyer1_economic_status, on: :before_log
validate :validate_address_option_found, on: :after_log
validate :validate_buyer2_economic_status, on: :before_log
validate :validate_valid_radio_option, on: :before_log
@ -613,21 +612,6 @@ private
end
end
def validate_address_option_found
if log.uprn.nil? && field_22.blank? && key_address_fields_provided?
error_message = if log.address_options_present? && log.address_options.size > 1
I18n.t("#{ERROR_BASE_KEY}.address.not_determined.multiple")
elsif log.address_options_present?
I18n.t("#{ERROR_BASE_KEY}.address.not_determined.one")
else
I18n.t("#{ERROR_BASE_KEY}.address.not_found")
end
%i[field_23 field_24 field_25 field_26 field_27 field_28].each do |field|
errors.add(field, error_message) if errors[field].blank?
end
end
end
def key_address_fields_provided?
field_23.present? && field_25.present? && postcode_full.present?
end
@ -986,7 +970,6 @@ private
attributes["address_line1_input"] = address_line1_input
attributes["postcode_full_input"] = postcode_full
attributes["select_best_address_match"] = true if field_22.blank?
attributes["manual_address_entry_selected"] = field_22.blank?
attributes["ethnic_group2"] = infer_buyer2_ethnic_group_from_ethnic
attributes["ethnicbuy2"] = field_40

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

@ -394,7 +394,6 @@ class BulkUpload::Sales::Year2025::RowParser
on: :after_log
validate :validate_buyer1_economic_status, on: :before_log
validate :validate_address_option_found, on: :after_log
validate :validate_buyer2_economic_status, on: :before_log
validate :validate_valid_radio_option, on: :before_log
@ -552,19 +551,6 @@ private
end
end
def validate_address_option_found
if log.uprn.nil? && field_16.blank? && key_address_fields_provided?
error_message = if log.address_options_present?
I18n.t("#{ERROR_BASE_KEY}.address.not_determined")
else
I18n.t("#{ERROR_BASE_KEY}.address.not_found")
end
%i[field_17 field_18 field_19 field_20 field_21 field_22].each do |field|
errors.add(field, error_message) if errors[field].blank?
end
end
end
def key_address_fields_provided?
field_17.present? && field_19.present? && postcode_full.present?
end
@ -961,7 +947,6 @@ private
attributes["address_line1_input"] = address_line1_input
attributes["postcode_full_input"] = postcode_full
attributes["select_best_address_match"] = true if field_16.blank?
attributes["manual_address_entry_selected"] = field_16.blank?
attributes["ethnic_group2"] = infer_buyer2_ethnic_group_from_ethnic
attributes["ethnicbuy2"] = field_37

51
spec/services/bulk_upload/lettings/year2024/row_parser_spec.rb

@ -1746,6 +1746,11 @@ RSpec.describe BulkUpload::Lettings::Year2024::RowParser do
expect(parser.errors[field]).to be_empty
end
end
it "does not set manual address input" do
parser.valid?
expect(parser.log.manual_address_entry_selected).to be_falsey
end
end
context "when no address can be found" do
@ -1754,13 +1759,20 @@ RSpec.describe BulkUpload::Lettings::Year2024::RowParser do
.to_return(status: 200, body: { results: [] }.to_json, headers: {})
end
it "adds address not found errors to address fields only" do
it "does not add errors" do
parser.valid?
expect(parser.errors[:field_16]).to be_empty
%i[field_17 field_18 field_19 field_20 field_21 field_22].each do |field|
expect(parser.errors[field]).to eql([I18n.t("validations.lettings.2024.bulk_upload.address.not_found")])
%i[field_16 field_17 field_18 field_19 field_20 field_21 field_22].each do |field|
expect(parser.errors[field]).to be_empty
end
end
it "sets manual address input" do
parser.valid?
expect(parser.log.manual_address_entry_selected).to be_truthy
expect(parser.log.address_line1).to eq("address line 1")
expect(parser.log.town_or_city).to eq("town or city")
expect(parser.log.postcode_full).to eq("AA1 1AA")
end
end
context "when a single address with not a high enough match rating is returned" do
@ -1769,13 +1781,20 @@ RSpec.describe BulkUpload::Lettings::Year2024::RowParser do
.to_return(status: 200, body: { results: [{ DPA: { MATCH: 0.6, BUILDING_NAME: "", POST_TOWN: "", POSTCODE: "AA1 1AA", UPRN: "1" } }] }.to_json, headers: {})
end
it "adds address not found errors to address fields only" do
it "does not add errors" do
parser.valid?
expect(parser.errors[:field_16]).to be_empty
%i[field_17 field_18 field_19 field_20 field_21 field_22].each do |field|
expect(parser.errors[field]).to eql([I18n.t("validations.lettings.2024.bulk_upload.address.not_determined.one")])
%i[field_16 field_17 field_18 field_19 field_20 field_21 field_22].each do |field|
expect(parser.errors[field]).to be_empty
end
end
it "sets manual address input" do
parser.valid?
expect(parser.log.manual_address_entry_selected).to be_truthy
expect(parser.log.address_line1).to eq("address line 1")
expect(parser.log.town_or_city).to eq("town or city")
expect(parser.log.postcode_full).to eq("AA1 1AA")
end
end
context "when no addresses have a high enough match rating" do
@ -1784,12 +1803,20 @@ RSpec.describe BulkUpload::Lettings::Year2024::RowParser do
.to_return(status: 200, body: { results: [{ DPA: { MATCH: 0.6, BUILDING_NAME: "", POST_TOWN: "", POSTCODE: "AA1 1AA", UPRN: "1" } }, { DPA: { MATCH: 0.8, BUILDING_NAME: "", POST_TOWN: "", POSTCODE: "BB2 2BB", UPRN: "2" } }] }.to_json, headers: {})
end
it "adds address not found errors to address fields only" do
it "does not add errors" do
parser.valid?
expect(parser.errors[:field_16]).to be_empty
%i[field_17 field_18 field_19 field_20 field_21 field_22].each do |field|
expect(parser.errors[field]).to eql([I18n.t("validations.lettings.2024.bulk_upload.address.not_determined.multiple")])
%i[field_16 field_17 field_18 field_19 field_20 field_21 field_22].each do |field|
expect(parser.errors[field]).to be_empty
end
end
it "sets manual address input" do
parser.valid?
expect(parser.log.manual_address_entry_selected).to be_truthy
expect(parser.log.manual_address_entry_selected).to be_truthy
expect(parser.log.address_line1).to eq("address line 1")
expect(parser.log.town_or_city).to eq("town or city")
expect(parser.log.postcode_full).to eq("AA1 1AA")
end
end
end

51
spec/services/bulk_upload/lettings/year2025/row_parser_spec.rb

@ -1555,6 +1555,11 @@ RSpec.describe BulkUpload::Lettings::Year2025::RowParser do
expect(parser.errors[field]).to be_empty
end
end
it "does not set manual address input" do
parser.valid?
expect(parser.log.manual_address_entry_selected).to be_falsey
end
end
context "when no address can be found" do
@ -1563,13 +1568,20 @@ RSpec.describe BulkUpload::Lettings::Year2025::RowParser do
.to_return(status: 200, body: { results: [] }.to_json, headers: {})
end
it "adds address not found errors to address fields only" do
it "does not add errors" do
parser.valid?
expect(parser.errors[:field_18]).to be_empty
%i[field_19 field_20 field_21 field_22 field_23 field_24].each do |field|
expect(parser.errors[field]).to eql([I18n.t("validations.lettings.2025.bulk_upload.address.not_found")])
%i[field_18 field_19 field_20 field_21 field_22 field_23 field_24].each do |field|
expect(parser.errors[field]).to be_empty
end
end
it "sets manual address input" do
parser.valid?
expect(parser.log.manual_address_entry_selected).to be_truthy
expect(parser.log.address_line1).to eq("address line 1")
expect(parser.log.town_or_city).to eq("town or city")
expect(parser.log.postcode_full).to eq("AA1 1AA")
end
end
context "when a single address with not a high enough match rating is returned" do
@ -1578,13 +1590,20 @@ RSpec.describe BulkUpload::Lettings::Year2025::RowParser do
.to_return(status: 200, body: { results: [{ DPA: { MATCH: 0.6, BUILDING_NAME: "", POST_TOWN: "", POSTCODE: "AA1 1AA", UPRN: "1" } }] }.to_json, headers: {})
end
it "adds address not found errors to address fields only" do
it "does not add errors" do
parser.valid?
expect(parser.errors[:field_18]).to be_empty
%i[field_19 field_20 field_21 field_22 field_23 field_24].each do |field|
expect(parser.errors[field]).to eql([I18n.t("validations.lettings.2025.bulk_upload.address.not_determined.one")])
%i[field_18 field_19 field_20 field_21 field_22 field_23 field_24].each do |field|
expect(parser.errors[field]).to be_empty
end
end
it "sets manual address input" do
parser.valid?
expect(parser.log.manual_address_entry_selected).to be_truthy
expect(parser.log.address_line1).to eq("address line 1")
expect(parser.log.town_or_city).to eq("town or city")
expect(parser.log.postcode_full).to eq("AA1 1AA")
end
end
context "when no addresses have a high enough match rating" do
@ -1593,12 +1612,20 @@ RSpec.describe BulkUpload::Lettings::Year2025::RowParser do
.to_return(status: 200, body: { results: [{ DPA: { MATCH: 0.6, BUILDING_NAME: "", POST_TOWN: "", POSTCODE: "AA1 1AA", UPRN: "1" } }, { DPA: { MATCH: 0.8, BUILDING_NAME: "", POST_TOWN: "", POSTCODE: "BB2 2BB", UPRN: "2" } }] }.to_json, headers: {})
end
it "adds address not found errors to address fields only" do
it "does not add errors" do
parser.valid?
expect(parser.errors[:field_18]).to be_empty
%i[field_19 field_20 field_21 field_22 field_23 field_24].each do |field|
expect(parser.errors[field]).to eql([I18n.t("validations.lettings.2025.bulk_upload.address.not_determined.multiple")])
%i[field_18 field_19 field_20 field_21 field_22 field_23 field_24].each do |field|
expect(parser.errors[field]).to be_empty
end
end
it "sets manual address input" do
parser.valid?
expect(parser.log.manual_address_entry_selected).to be_truthy
expect(parser.log.manual_address_entry_selected).to be_truthy
expect(parser.log.address_line1).to eq("address line 1")
expect(parser.log.town_or_city).to eq("town or city")
expect(parser.log.postcode_full).to eq("AA1 1AA")
end
end
end

50
spec/services/bulk_upload/sales/year2024/row_parser_spec.rb

@ -1077,6 +1077,11 @@ RSpec.describe BulkUpload::Sales::Year2024::RowParser do
expect(parser.errors[field]).to be_empty
end
end
it "does not set manual address input" do
parser.valid?
expect(parser.log.manual_address_entry_selected).to be_falsey
end
end
context "when no address can be found" do
@ -1085,13 +1090,20 @@ RSpec.describe BulkUpload::Sales::Year2024::RowParser do
.to_return(status: 200, body: { results: [] }.to_json, headers: {})
end
it "adds address not found errors to address fields only" do
it "does not add errors" do
parser.valid?
expect(parser.errors[:field_22]).to be_empty
%i[field_23 field_24 field_25 field_26 field_27 field_28].each do |field|
expect(parser.errors[field]).to eql([I18n.t("validations.sales.2024.bulk_upload.address.not_found")])
%i[field_22 field_23 field_24 field_25 field_26 field_27 field_28].each do |field|
expect(parser.errors[field]).to be_empty
end
end
it "sets manual address input" do
parser.valid?
expect(parser.log.manual_address_entry_selected).to be_truthy
expect(parser.log.address_line1).to eq("address line 1")
expect(parser.log.town_or_city).to eq("town or city")
expect(parser.log.postcode_full).to eq("AA1 1AA")
end
end
context "when a single address with not a high enough match rating is returned" do
@ -1100,13 +1112,20 @@ RSpec.describe BulkUpload::Sales::Year2024::RowParser do
.to_return(status: 200, body: { results: [{ DPA: { MATCH: 0.6, BUILDING_NAME: "", POST_TOWN: "", POSTCODE: "AA1 1AA", UPRN: "1" } }] }.to_json, headers: {})
end
it "adds address not found errors to address fields only" do
it "does not add errors" do
parser.valid?
expect(parser.errors[:field_22]).to be_empty
%i[field_23 field_24 field_25 field_26 field_27 field_28].each do |field|
expect(parser.errors[field]).to eql([I18n.t("validations.sales.2024.bulk_upload.address.not_determined.one")])
%i[field_22 field_23 field_24 field_25 field_26 field_27 field_28].each do |field|
expect(parser.errors[field]).to be_empty
end
end
it "sets manual address input" do
parser.valid?
expect(parser.log.manual_address_entry_selected).to be_truthy
expect(parser.log.address_line1).to eq("address line 1")
expect(parser.log.town_or_city).to eq("town or city")
expect(parser.log.postcode_full).to eq("AA1 1AA")
end
end
context "when no addresses have a high enough match rating" do
@ -1124,12 +1143,19 @@ RSpec.describe BulkUpload::Sales::Year2024::RowParser do
)
end
it "adds address not found errors to address fields only" do
it "does not add errors" do
parser.valid?
expect(parser.errors[:field_22]).to be_empty
%i[field_23 field_24 field_25 field_26 field_27 field_28].each do |field|
expect(parser.errors[field]).to eql([I18n.t("validations.sales.2024.bulk_upload.address.not_determined.multiple")])
%i[field_22 field_23 field_24 field_25 field_26 field_27 field_28].each do |field|
expect(parser.errors[field]).to be_empty
end
end
it "sets manual address input" do
parser.valid?
expect(parser.log.manual_address_entry_selected).to be_truthy
expect(parser.log.address_line1).to eq("address line 1")
expect(parser.log.town_or_city).to eq("town or city")
expect(parser.log.postcode_full).to eq("AA1 1AA")
end
end
end

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

@ -992,6 +992,11 @@ RSpec.describe BulkUpload::Sales::Year2025::RowParser do
expect(parser.errors[field]).to be_empty
end
end
it "does not set manual address input" do
parser.valid?
expect(parser.log.manual_address_entry_selected).to be_falsey
end
end
context "when no address can be found" do
@ -1000,13 +1005,20 @@ RSpec.describe BulkUpload::Sales::Year2025::RowParser do
.to_return(status: 200, body: { results: [] }.to_json, headers: {})
end
it "adds address not found errors to address fields only" do
it "does not add errors" do
parser.valid?
expect(parser.errors[:field_16]).to be_empty
%i[field_17 field_18 field_19 field_20 field_21 field_22].each do |field|
expect(parser.errors[field]).to eql([I18n.t("validations.sales.2025.bulk_upload.address.not_found")])
%i[field_16 field_17 field_18 field_19 field_20 field_21 field_22].each do |field|
expect(parser.errors[field]).to be_empty
end
end
it "sets manual address input" do
parser.valid?
expect(parser.log.manual_address_entry_selected).to be_truthy
expect(parser.log.address_line1).to eq("address line 1")
expect(parser.log.town_or_city).to eq("town or city")
expect(parser.log.postcode_full).to eq("AA1 1AA")
end
end
context "when no address has a high enough match rating" do
@ -1015,13 +1027,20 @@ RSpec.describe BulkUpload::Sales::Year2025::RowParser do
.to_return(status: 200, body: { results: [{ DPA: { MATCH: 0.6, BUILDING_NAME: "", POST_TOWN: "", POSTCODE: "AA1 1AA", UPRN: "1" } }] }.to_json, headers: {})
end
it "adds address not found errors to address fields only" do
it "does not add errors" do
parser.valid?
expect(parser.errors[:field_16]).to be_empty
%i[field_17 field_18 field_19 field_20 field_21 field_22].each do |field|
expect(parser.errors[field]).to eql([I18n.t("validations.sales.2025.bulk_upload.address.not_determined")])
%i[field_16 field_17 field_18 field_19 field_20 field_21 field_22].each do |field|
expect(parser.errors[field]).to be_empty
end
end
it "sets manual address input" do
parser.valid?
expect(parser.log.manual_address_entry_selected).to be_truthy
expect(parser.log.address_line1).to eq("address line 1")
expect(parser.log.town_or_city).to eq("town or city")
expect(parser.log.postcode_full).to eq("AA1 1AA")
end
end
end
end

Loading…
Cancel
Save