From 27d7c4689fb3cc143dd2bdaa4454136c6a183a26 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Thu, 6 Mar 2025 12:33:47 +0000 Subject: [PATCH] CLDC-3845 Save manually entered address in BU (#2948) * Update BU addresses flow * Refactor --- .../derived_variables/sales_log_variables.rb | 2 - app/models/log.rb | 15 +++++- .../lettings/year2024/row_parser.rb | 17 ------- .../lettings/year2025/row_parser.rb | 17 ------- .../bulk_upload/sales/year2024/row_parser.rb | 17 ------- .../bulk_upload/sales/year2025/row_parser.rb | 15 ------ .../lettings/year2024/row_parser_spec.rb | 51 ++++++++++++++----- .../lettings/year2025/row_parser_spec.rb | 51 ++++++++++++++----- .../sales/year2024/row_parser_spec.rb | 50 +++++++++++++----- .../sales/year2025/row_parser_spec.rb | 35 ++++++++++--- 10 files changed, 157 insertions(+), 113 deletions(-) diff --git a/app/models/derived_variables/sales_log_variables.rb b/app/models/derived_variables/sales_log_variables.rb index 04658c222..a570abc35 100644 --- a/app/models/derived_variables/sales_log_variables.rb +++ b/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 diff --git a/app/models/log.rb b/app/models/log.rb index 1454aef65..4c4116a23 100644 --- a/app/models/log.rb +++ b/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 diff --git a/app/services/bulk_upload/lettings/year2024/row_parser.rb b/app/services/bulk_upload/lettings/year2024/row_parser.rb index 20eb4dccd..3d36e743e 100644 --- a/app/services/bulk_upload/lettings/year2024/row_parser.rb +++ b/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 diff --git a/app/services/bulk_upload/lettings/year2025/row_parser.rb b/app/services/bulk_upload/lettings/year2025/row_parser.rb index 1f4a80f9b..485446f0b 100644 --- a/app/services/bulk_upload/lettings/year2025/row_parser.rb +++ b/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 diff --git a/app/services/bulk_upload/sales/year2024/row_parser.rb b/app/services/bulk_upload/sales/year2024/row_parser.rb index 6bf1cc4be..5f066697c 100644 --- a/app/services/bulk_upload/sales/year2024/row_parser.rb +++ b/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 diff --git a/app/services/bulk_upload/sales/year2025/row_parser.rb b/app/services/bulk_upload/sales/year2025/row_parser.rb index f6a2a6e1a..f22910a29 100644 --- a/app/services/bulk_upload/sales/year2025/row_parser.rb +++ b/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 diff --git a/spec/services/bulk_upload/lettings/year2024/row_parser_spec.rb b/spec/services/bulk_upload/lettings/year2024/row_parser_spec.rb index e4b34ac36..fc3995766 100644 --- a/spec/services/bulk_upload/lettings/year2024/row_parser_spec.rb +++ b/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,13 +1803,21 @@ 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 end diff --git a/spec/services/bulk_upload/lettings/year2025/row_parser_spec.rb b/spec/services/bulk_upload/lettings/year2025/row_parser_spec.rb index 3f0ef35b9..fa57ec801 100644 --- a/spec/services/bulk_upload/lettings/year2025/row_parser_spec.rb +++ b/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,13 +1612,21 @@ 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 end diff --git a/spec/services/bulk_upload/sales/year2024/row_parser_spec.rb b/spec/services/bulk_upload/sales/year2024/row_parser_spec.rb index efdb53bb9..90bd87291 100644 --- a/spec/services/bulk_upload/sales/year2024/row_parser_spec.rb +++ b/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,13 +1143,20 @@ 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 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 a0b87cdc1..86f264401 100644 --- a/spec/services/bulk_upload/sales/year2025/row_parser_spec.rb +++ b/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