diff --git a/app/models/validations/sales/sale_information_validations.rb b/app/models/validations/sales/sale_information_validations.rb index fb8a76216..b02ea7370 100644 --- a/app/models/validations/sales/sale_information_validations.rb +++ b/app/models/validations/sales/sale_information_validations.rb @@ -147,13 +147,13 @@ module Validations::Sales::SaleInformationValidations if record.mortgage_deposit_and_discount_total != record.expected_shared_ownership_deposit_value %i[mortgage value deposit cashdis equity type].each do |field| - record.errors.add field, I18n.t("validations.sale_information.non_staircasing_mortgage.mortgage_used_socialhomebuy", mortgage_deposit_and_discount_total: record.field_formatted_as_currency("mortgage_deposit_and_discount_total"), expected_shared_ownership_deposit_value: record.field_formatted_as_currency("expected_shared_ownership_deposit_value")) + record.errors.add field, :skip_bu_setup_error, message: I18n.t("validations.sale_information.non_staircasing_mortgage.mortgage_used_socialhomebuy", mortgage_deposit_and_discount_total: record.field_formatted_as_currency("mortgage_deposit_and_discount_total"), expected_shared_ownership_deposit_value: record.field_formatted_as_currency("expected_shared_ownership_deposit_value")) end end elsif record.mortgage_not_used? if record.deposit_and_discount_total != record.expected_shared_ownership_deposit_value %i[mortgageused value deposit cashdis equity type].each do |field| - record.errors.add field, I18n.t("validations.sale_information.non_staircasing_mortgage.mortgage_not_used_socialhomebuy", deposit_and_discount_total: record.field_formatted_as_currency("deposit_and_discount_total"), expected_shared_ownership_deposit_value: record.field_formatted_as_currency("expected_shared_ownership_deposit_value")) + record.errors.add field, :skip_bu_setup_error, message: I18n.t("validations.sale_information.non_staircasing_mortgage.mortgage_not_used_socialhomebuy", deposit_and_discount_total: record.field_formatted_as_currency("deposit_and_discount_total"), expected_shared_ownership_deposit_value: record.field_formatted_as_currency("expected_shared_ownership_deposit_value")) end end end @@ -165,13 +165,13 @@ module Validations::Sales::SaleInformationValidations if record.mortgage_and_deposit_total != record.expected_shared_ownership_deposit_value %i[mortgage value deposit equity type].each do |field| - record.errors.add field, I18n.t("validations.sale_information.non_staircasing_mortgage.mortgage_used", mortgage_and_deposit_total: record.field_formatted_as_currency("mortgage_and_deposit_total"), expected_shared_ownership_deposit_value: record.field_formatted_as_currency("expected_shared_ownership_deposit_value")) + record.errors.add field, :skip_bu_setup_error, message: I18n.t("validations.sale_information.non_staircasing_mortgage.mortgage_used", mortgage_and_deposit_total: record.field_formatted_as_currency("mortgage_and_deposit_total"), expected_shared_ownership_deposit_value: record.field_formatted_as_currency("expected_shared_ownership_deposit_value")) end end elsif record.mortgage_not_used? if record.deposit != record.expected_shared_ownership_deposit_value %i[mortgageused value deposit equity type].each do |field| - record.errors.add field, I18n.t("validations.sale_information.non_staircasing_mortgage.mortgage_not_used", deposit: record.field_formatted_as_currency("deposit"), expected_shared_ownership_deposit_value: record.field_formatted_as_currency("expected_shared_ownership_deposit_value")) + record.errors.add field, :skip_bu_setup_error, message: I18n.t("validations.sale_information.non_staircasing_mortgage.mortgage_not_used", deposit: record.field_formatted_as_currency("deposit"), expected_shared_ownership_deposit_value: record.field_formatted_as_currency("expected_shared_ownership_deposit_value")) end end end @@ -185,12 +185,12 @@ module Validations::Sales::SaleInformationValidations if record.mortgage_deposit_and_discount_total != record.stairbought_part_of_value %i[mortgage value deposit cashdis stairbought type].each do |field| - record.errors.add field, I18n.t("validations.sale_information.staircasing_mortgage.mortgage_used_socialhomebuy", mortgage_deposit_and_discount_total: record.field_formatted_as_currency("mortgage_deposit_and_discount_total"), stairbought_part_of_value: record.field_formatted_as_currency("stairbought_part_of_value")) + record.errors.add field, :skip_bu_setup_error, message: I18n.t("validations.sale_information.staircasing_mortgage.mortgage_used_socialhomebuy", mortgage_deposit_and_discount_total: record.field_formatted_as_currency("mortgage_deposit_and_discount_total"), stairbought_part_of_value: record.field_formatted_as_currency("stairbought_part_of_value")) end end elsif record.deposit_and_discount_total != record.stairbought_part_of_value %i[mortgageused value deposit cashdis stairbought type].each do |field| - record.errors.add field, I18n.t("validations.sale_information.staircasing_mortgage.mortgage_not_used_socialhomebuy", deposit_and_discount_total: record.field_formatted_as_currency("deposit_and_discount_total"), stairbought_part_of_value: record.field_formatted_as_currency("stairbought_part_of_value")) + record.errors.add field, :skip_bu_setup_error, message: I18n.t("validations.sale_information.staircasing_mortgage.mortgage_not_used_socialhomebuy", deposit_and_discount_total: record.field_formatted_as_currency("deposit_and_discount_total"), stairbought_part_of_value: record.field_formatted_as_currency("stairbought_part_of_value")) end end end @@ -201,12 +201,12 @@ module Validations::Sales::SaleInformationValidations if record.mortgage_and_deposit_total != record.stairbought_part_of_value %i[mortgage value deposit stairbought type].each do |field| - record.errors.add field, I18n.t("validations.sale_information.staircasing_mortgage.mortgage_used", mortgage_and_deposit_total: record.field_formatted_as_currency("mortgage_and_deposit_total"), stairbought_part_of_value: record.field_formatted_as_currency("stairbought_part_of_value")) + record.errors.add field, :skip_bu_setup_error, message: I18n.t("validations.sale_information.staircasing_mortgage.mortgage_used", mortgage_and_deposit_total: record.field_formatted_as_currency("mortgage_and_deposit_total"), stairbought_part_of_value: record.field_formatted_as_currency("stairbought_part_of_value")) end end elsif record.deposit != record.stairbought_part_of_value %i[mortgageused value deposit stairbought type].each do |field| - record.errors.add field, I18n.t("validations.sale_information.staircasing_mortgage.mortgage_not_used", deposit: record.field_formatted_as_currency("deposit"), stairbought_part_of_value: record.field_formatted_as_currency("stairbought_part_of_value")) + record.errors.add field, :skip_bu_setup_error, message: I18n.t("validations.sale_information.staircasing_mortgage.mortgage_not_used", deposit: record.field_formatted_as_currency("deposit"), stairbought_part_of_value: record.field_formatted_as_currency("stairbought_part_of_value")) end end end diff --git a/app/services/bulk_upload/sales/year2024/row_parser.rb b/app/services/bulk_upload/sales/year2024/row_parser.rb index 928060dfa..cb249778e 100644 --- a/app/services/bulk_upload/sales/year2024/row_parser.rb +++ b/app/services/bulk_upload/sales/year2024/row_parser.rb @@ -506,7 +506,7 @@ class BulkUpload::Sales::Year2024::RowParser question = log.form.get_question(error.attribute, log) - if question.present? && setup_question?(question) + if question.present? && setup_question?(question) && error.type != :skip_bu_setup_error errors.add(field, error.message, category: :setup) else errors.add(field, error.message) @@ -711,16 +711,16 @@ private lanomagr: %i[field_97], frombeds: %i[field_98], fromprop: %i[field_99], - value: %i[field_101 field_114 field_125], + value: value_fields, equity: %i[field_102], - mortgage: %i[field_104 field_118 field_127], - extrabor: %i[field_108 field_122 field_129], - deposit: %i[field_109 field_123 field_130], + mortgage: mortgage_fields, + extrabor: extrabor_fields, + deposit: deposit_fields, cashdis: %i[field_110], mrent: %i[field_111], - has_mscharge: %i[field_112 field_124 field_131], - mscharge: %i[field_112 field_124 field_131], + has_mscharge: mscharge_fields, + mscharge: mscharge_fields, grant: %i[field_115], discount: %i[field_116], othtype: %i[field_12], @@ -731,12 +731,12 @@ private hhregresstill: %i[field_73], armedforcesspouse: %i[field_74], - mortgagelender: %i[field_105 field_119], - mortgagelenderother: %i[field_106 field_120], + mortgagelender: mortgagelender_fields, + mortgagelenderother: mortgagelenderother_fields, hb: %i[field_81], - mortlen: %i[field_107 field_121 field_128], - proplen: %i[field_113 field_85], + mortlen: mortlen_fields, + proplen: proplen_fields, jointmore: %i[field_16], staircase: %i[field_86], @@ -752,7 +752,7 @@ private stairbought: %i[field_87], stairowned: %i[field_88], socprevten: %i[field_100], - mortgageused: [mortgageused_field], + mortgageused: mortgageused_fields, uprn: %i[field_22], address_line1: %i[field_23], @@ -1108,10 +1108,81 @@ private return field_126 if outright_sale? end - def mortgageused_field - return :field_103 if shared_ownership? - return :field_117 if discounted_ownership? - return :field_126 if outright_sale? + def value_fields + return [:field_101] if shared_ownership? + return [:field_114] if discounted_ownership? + return [:field_125] if outright_sale? + + %i[field_101 field_114 field_125] + end + + def mortgage_fields + return [:field_104] if shared_ownership? + return [:field_118] if discounted_ownership? + return [:field_127] if outright_sale? + + %i[field_104 field_118 field_127] + end + + def extrabor_fields + return [:field_108] if shared_ownership? + return [:field_122] if discounted_ownership? + return [:field_129] if outright_sale? + + %i[field_108 field_122 field_129] + end + + def deposit_fields + return [:field_109] if shared_ownership? + return [:field_123] if discounted_ownership? + return [:field_130] if outright_sale? + + %i[field_109 field_123 field_130] + end + + def mscharge_fields + return [:field_112] if shared_ownership? + return [:field_124] if discounted_ownership? + return [:field_131] if outright_sale? + + %i[field_112 field_124 field_131] + end + + def mortgagelender_fields + return [:field_105] if shared_ownership? + return [:field_119] if discounted_ownership? + + %i[field_105 field_119] + end + + def mortgagelenderother_fields + return [:field_106] if shared_ownership? + return [:field_120] if discounted_ownership? + + %i[field_106 field_120] + end + + def mortlen_fields + return [:field_107] if shared_ownership? + return [:field_121] if discounted_ownership? + return [:field_128] if outright_sale? + + %i[field_107 field_121 field_128] + end + + def proplen_fields + return [:field_85] if shared_ownership? + return [:field_113] if discounted_ownership? + + %i[field_85 field_113] + end + + def mortgageused_fields + return [:field_103] if shared_ownership? + return [:field_117] if discounted_ownership? + return [:field_126] if outright_sale? + + %i[field_103 field_117 field_126] end def owning_organisation 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 ea0ea386e..31ee831f5 100644 --- a/spec/services/bulk_upload/sales/year2024/row_parser_spec.rb +++ b/spec/services/bulk_upload/sales/year2024/row_parser_spec.rb @@ -1059,6 +1059,33 @@ RSpec.describe BulkUpload::Sales::Year2024::RowParser do expect(parser.errors[:field_109]).to be_empty end end + + context "with non staircasing mortgage error" do + let(:attributes) { setup_section_params.merge(field_9: "30", field_103: "1", field_104: "10000", field_109: "5000", field_101: "30000", field_102: "28", field_86: "2") } + + it "does not add a BU error on type (because it's a setup field and would block log creation)" do + setup_errors = parser.errors.select { |e| e.options[:category] == :setup } + expect(setup_errors).to be_empty + end + + it "includes errors on other related fields" do + expect(parser.errors[:field_104]).to include("The mortgage and deposit added together is £15,000.00 and the purchase price times by the equity is £8,400.00. These figures should be the same.") + expect(parser.errors[:field_109]).to include("The mortgage and deposit added together is £15,000.00 and the purchase price times by the equity is £8,400.00. These figures should be the same.") + expect(parser.errors[:field_101]).to include("The mortgage and deposit added together is £15,000.00 and the purchase price times by the equity is £8,400.00. These figures should be the same.") + expect(parser.errors[:field_102]).to include("The mortgage and deposit added together is £15,000.00 and the purchase price times by the equity is £8,400.00. These figures should be the same.") + end + + it "does not add errors to other ownership type fields" do + expect(parser.errors[:field_117]).to be_empty + expect(parser.errors[:field_126]).to be_empty + expect(parser.errors[:field_118]).to be_empty + expect(parser.errors[:field_127]).to be_empty + expect(parser.errors[:field_123]).to be_empty + expect(parser.errors[:field_130]).to be_empty + expect(parser.errors[:field_114]).to be_empty + expect(parser.errors[:field_125]).to be_empty + end + end end describe "#field_117" do