diff --git a/app/services/bulk_upload/lettings/year2025/row_parser.rb b/app/services/bulk_upload/lettings/year2025/row_parser.rb index f3b6e7edd..e407e9fe6 100644 --- a/app/services/bulk_upload/lettings/year2025/row_parser.rb +++ b/app/services/bulk_upload/lettings/year2025/row_parser.rb @@ -1035,6 +1035,14 @@ private def add_errors_for_invalid_fields invalid_fields.each do |field| + # ensure questions not routed to are not included in error report + error_questions_ids = field_mapping_for_errors + .select { |_k, fields| fields.map(&:to_s).include?(field.to_s) } + .keys + .map(&:to_s) + error_questions = questions.select { |question| error_questions_ids.include?(question.id) } + next if error_questions.none? { |question| question.page.routed_to?(log, nil) } + errors.delete(field) # take precedence over any other errors as this is a BU format issue errors.add(field, I18n.t("#{ERROR_BASE_KEY}.invalid_option", question: QUESTIONS[field.to_sym])) end diff --git a/app/services/bulk_upload/lettings/year2026/row_parser.rb b/app/services/bulk_upload/lettings/year2026/row_parser.rb index 98a38d6e7..ac366dc57 100644 --- a/app/services/bulk_upload/lettings/year2026/row_parser.rb +++ b/app/services/bulk_upload/lettings/year2026/row_parser.rb @@ -1113,6 +1113,14 @@ private def add_errors_for_invalid_fields invalid_fields.each do |field| + # ensure questions not routed to are not included in error report + error_questions_ids = field_mapping_for_errors + .select { |_k, fields| fields.map(&:to_s).include?(field.to_s) } + .keys + .map(&:to_s) + error_questions = questions.select { |question| error_questions_ids.include?(question.id) } + next if error_questions.none? { |question| question.page.routed_to?(log, nil) } + errors.delete(field) # take precedence over any other errors as this is a BU format issue errors.add(field, I18n.t("#{ERROR_BASE_KEY}.invalid_option", question: QUESTIONS[field.to_sym])) end diff --git a/app/services/bulk_upload/sales/year2025/row_parser.rb b/app/services/bulk_upload/sales/year2025/row_parser.rb index fac377138..2962205c4 100644 --- a/app/services/bulk_upload/sales/year2025/row_parser.rb +++ b/app/services/bulk_upload/sales/year2025/row_parser.rb @@ -689,6 +689,14 @@ private def add_errors_for_invalid_fields invalid_fields.each do |field| + # ensure questions not routed to are not included in error report + error_questions_ids = field_mapping_for_errors + .select { |_k, fields| fields.map(&:to_s).include?(field.to_s) } + .keys + .map(&:to_s) + error_questions = questions.select { |question| error_questions_ids.include?(question.id) } + next if error_questions.none? { |question| question.page.routed_to?(log, nil) } + errors.delete(field) # take precedence over any other errors as this is a BU format issue errors.add(field, I18n.t("#{ERROR_BASE_KEY}.invalid_option", question: QUESTIONS[field.to_sym])) end diff --git a/app/services/bulk_upload/sales/year2026/row_parser.rb b/app/services/bulk_upload/sales/year2026/row_parser.rb index 08668d278..bd0b12c92 100644 --- a/app/services/bulk_upload/sales/year2026/row_parser.rb +++ b/app/services/bulk_upload/sales/year2026/row_parser.rb @@ -750,6 +750,14 @@ private def add_errors_for_invalid_fields invalid_fields.each do |field| + # ensure questions not routed to are not included in error report + error_questions_ids = field_mapping_for_errors + .select { |_k, fields| fields.map(&:to_s).include?(field.to_s) } + .keys + .map(&:to_s) + error_questions = questions.select { |question| error_questions_ids.include?(question.id) } + next if error_questions.none? { |question| question.page.routed_to?(log, nil) } + errors.delete(field) # take precedence over any other errors as this is a BU format issue errors.add(field, I18n.t("#{ERROR_BASE_KEY}.invalid_option", question: QUESTIONS[field.to_sym])) 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 a62685970..113490c78 100644 --- a/spec/services/bulk_upload/lettings/year2025/row_parser_spec.rb +++ b/spec/services/bulk_upload/lettings/year2025/row_parser_spec.rb @@ -646,9 +646,9 @@ RSpec.describe BulkUpload::Lettings::Year2025::RowParser do end describe "invalid fields" do - let(:attributes) { setup_section_params.merge({ field_45: 0 }) } - context "when a field has been marked as invalid" do + let(:attributes) { setup_section_params.merge({ field_45: 0 }) } + before do parser.add_invalid_field("field_45") end @@ -659,6 +659,19 @@ RSpec.describe BulkUpload::Lettings::Year2025::RowParser do expect(parser.errors[:field_45]).to include(I18n.t("validations.lettings.2025.bulk_upload.invalid_option", question: "What is the lead tenant’s nationality?")) end end + + context "when a field has been marked as invalid but it is not routed to" do + let(:attributes) { setup_section_params.merge({ field_117: 2 }) } + + before do + parser.add_invalid_field("field_118") + end + + it "does not set an error on that field" do + parser.valid? + expect(parser.errors[:field_118].size).to eq(0) + end + end end end end diff --git a/spec/services/bulk_upload/lettings/year2026/row_parser_spec.rb b/spec/services/bulk_upload/lettings/year2026/row_parser_spec.rb index b312f0b5e..665e3d683 100644 --- a/spec/services/bulk_upload/lettings/year2026/row_parser_spec.rb +++ b/spec/services/bulk_upload/lettings/year2026/row_parser_spec.rb @@ -538,9 +538,9 @@ RSpec.describe BulkUpload::Lettings::Year2026::RowParser do end describe "invalid fields" do - let(:attributes) { setup_section_params.merge({ field_46: 0 }) } - context "when a field has been marked as invalid" do + let(:attributes) { setup_section_params.merge({ field_46: 0 }) } + before do parser.add_invalid_field("field_46") end @@ -551,6 +551,19 @@ RSpec.describe BulkUpload::Lettings::Year2026::RowParser do expect(parser.errors[:field_46]).to include(match(I18n.t("validations.lettings.2026.bulk_upload.invalid_option", question: "What is the lead tenant’s nationality?"))) end end + + context "when a field has been marked as invalid but it is not routed to" do + let(:attributes) { setup_section_params.merge({ field_135: 2 }) } + + before do + parser.add_invalid_field("field_136") + end + + it "does not set an error on that field" do + parser.valid? + expect(parser.errors[:field_136].size).to eq(0) + 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 67f5c6116..99f0774fc 100644 --- a/spec/services/bulk_upload/sales/year2025/row_parser_spec.rb +++ b/spec/services/bulk_upload/sales/year2025/row_parser_spec.rb @@ -338,9 +338,10 @@ RSpec.describe BulkUpload::Sales::Year2025::RowParser do end describe "invalid fields" do - let(:attributes) { setup_section_params.merge({ field_31: 0 }) } - context "when a field has been marked as invalid" do + # field_34 nationality is only shown if field_10 staircasing is no + let(:attributes) { setup_section_params.merge({ field_10: 2, field_31: 0 }) } + before do parser.add_invalid_field("field_31") end @@ -351,6 +352,19 @@ RSpec.describe BulkUpload::Sales::Year2025::RowParser do expect(parser.errors[:field_31]).to include(match(I18n.t("validations.sales.2025.bulk_upload.invalid_option", question: "What is buyer 1’s nationality?"))) end end + + context "when a field has been marked as invalid but it is not routed to" do + let(:attributes) { setup_section_params.merge({ field_10: 1, field_31: 0 }) } + + before do + parser.add_invalid_field("field_31") + end + + it "does not set an error on that field" do + parser.valid? + expect(parser.errors[:field_31].size).to eq(0) + end + end end end end 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 91edf5c5e..f38ed5580 100644 --- a/spec/services/bulk_upload/sales/year2026/row_parser_spec.rb +++ b/spec/services/bulk_upload/sales/year2026/row_parser_spec.rb @@ -344,9 +344,10 @@ RSpec.describe BulkUpload::Sales::Year2026::RowParser do end describe "invalid fields" do - let(:attributes) { setup_section_params.merge({ field_34: 0 }) } - context "when a field has been marked as invalid" do + # field_34 nationality is only shown if field_10 staircasing is no + let(:attributes) { setup_section_params.merge({ field_10: 2, field_34: 0 }) } + before do parser.add_invalid_field("field_34") end @@ -357,6 +358,19 @@ RSpec.describe BulkUpload::Sales::Year2026::RowParser do expect(parser.errors[:field_34]).to include(match(I18n.t("validations.sales.2026.bulk_upload.invalid_option", question: "What is buyer 1's nationality?"))) end end + + context "when a field has been marked as invalid but it is not routed to" do + let(:attributes) { setup_section_params.merge({ field_10: 1, field_34: 0 }) } + + before do + parser.add_invalid_field("field_34") + end + + it "does not set an error on that field" do + parser.valid? + expect(parser.errors[:field_34].size).to eq(0) + end + end end end end