From baba6b76d8c56ab36861c16cebc06bdc1800ac14 Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Fri, 9 Jan 2026 14:37:04 +0000 Subject: [PATCH 01/20] CLDC-4177: Create new sex-at-birth question --- .../questions/sex_registered_at_birth1.rb | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 app/models/form/sales/questions/sex_registered_at_birth1.rb diff --git a/app/models/form/sales/questions/sex_registered_at_birth1.rb b/app/models/form/sales/questions/sex_registered_at_birth1.rb new file mode 100644 index 000000000..fb00fa65e --- /dev/null +++ b/app/models/form/sales/questions/sex_registered_at_birth1.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class Form::Sales::Questions::SexRegisteredAtBirth1 < Form::Question + def initialize(id, hsh, page) + super + @id = "sexRAB1" + @type = "radio" + @check_answers_card_number = 1 + @answer_options = ANSWER_OPTIONS + @question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] + end + + ANSWER_OPTIONS = { + "F" => { "value" => "Female" }, + "M" => { "value" => "Male" }, + "divider" => { "value" => true }, + "R" => { "value" => "Tenant prefers not to say" }, + }.freeze + + QUESTION_NUMBER_FROM_YEAR = { 2026 => 32 }.freeze +end From facbd450608148ab3ae9c9690265b14be462a863 Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Tue, 13 Jan 2026 15:56:38 +0000 Subject: [PATCH 02/20] CLDC-4177: Update database --- ...3404_add_sex_registered_at_birth_to_sales_logs.rb | 12 ++++++++++++ db/schema.rb | 8 +++++++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20260113143404_add_sex_registered_at_birth_to_sales_logs.rb diff --git a/db/migrate/20260113143404_add_sex_registered_at_birth_to_sales_logs.rb b/db/migrate/20260113143404_add_sex_registered_at_birth_to_sales_logs.rb new file mode 100644 index 000000000..c245d1d51 --- /dev/null +++ b/db/migrate/20260113143404_add_sex_registered_at_birth_to_sales_logs.rb @@ -0,0 +1,12 @@ +class AddSexRegisteredAtBirthToSalesLogs < ActiveRecord::Migration[7.2] + def change + change_table :sales_logs, bulk: true do |t| + t.column :sexRAB1, :string + t.column :sexRAB2, :string + t.column :sexRAB3, :string + t.column :sexRAB4, :string + t.column :sexRAB5, :string + t.column :sexRAB6, :string + end + end +end diff --git a/db/schema.rb b/db/schema.rb index f781ed899..99b47a365 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.2].define(version: 2025_04_16_111741) do +ActiveRecord::Schema[7.2].define(version: 2026_01_13_143404) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -787,6 +787,12 @@ ActiveRecord::Schema[7.2].define(version: 2025_04_16_111741) do t.datetime "lasttransaction" t.datetime "initialpurchase" t.boolean "manual_address_entry_selected", default: false + t.string "sexRAB1" + t.string "sexRAB2" + t.string "sexRAB3" + t.string "sexRAB4" + t.string "sexRAB5" + t.string "sexRAB6" t.index ["assigned_to_id"], name: "index_sales_logs_on_assigned_to_id" t.index ["bulk_upload_id"], name: "index_sales_logs_on_bulk_upload_id" t.index ["created_by_id"], name: "index_sales_logs_on_created_by_id" From 2c6fe07593ed88b80a08e4fa1f286c9eb05e7fa3 Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Wed, 14 Jan 2026 10:24:09 +0000 Subject: [PATCH 03/20] CLDC-4177: Adds SAB form for the primary buyer. --- .../sales/pages/sex_registered_at_birth1.rb | 22 +++++++++++++++++++ .../questions/sex_registered_at_birth1.rb | 2 +- .../subsections/household_characteristics.rb | 1 + .../sales/household_characteristics.en.yml | 7 ++++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 app/models/form/sales/pages/sex_registered_at_birth1.rb diff --git a/app/models/form/sales/pages/sex_registered_at_birth1.rb b/app/models/form/sales/pages/sex_registered_at_birth1.rb new file mode 100644 index 000000000..0990f3932 --- /dev/null +++ b/app/models/form/sales/pages/sex_registered_at_birth1.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class Form::Sales::Pages::SexRegisteredAtBirth1 < ::Form::Page + def initialize(id, hsh, subsection) + super + @id = "buyer_1_sex_registered_at_birth" + @depends_on = [ + { + "buyer_has_seen_privacy_notice?" => true, + }, + { + "buyer_not_interviewed?" => true, + }, + ] + end + + def questions + @questions ||= [ + Form::Sales::Questions::SexRegisteredAtBirth1.new(nil, nil, self), + ] + end +end diff --git a/app/models/form/sales/questions/sex_registered_at_birth1.rb b/app/models/form/sales/questions/sex_registered_at_birth1.rb index fb00fa65e..633a9dc13 100644 --- a/app/models/form/sales/questions/sex_registered_at_birth1.rb +++ b/app/models/form/sales/questions/sex_registered_at_birth1.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class Form::Sales::Questions::SexRegisteredAtBirth1 < Form::Question +class Form::Sales::Questions::SexRegisteredAtBirth1 < ::Form::Question def initialize(id, hsh, page) super @id = "sexRAB1" diff --git a/app/models/form/sales/subsections/household_characteristics.rb b/app/models/form/sales/subsections/household_characteristics.rb index a1f21ae8e..b18f7919f 100644 --- a/app/models/form/sales/subsections/household_characteristics.rb +++ b/app/models/form/sales/subsections/household_characteristics.rb @@ -24,6 +24,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection (Form::Sales::Pages::NotRetiredValueCheck.new("age_1_not_retired_value_check", nil, self, person_index: 1) if form.start_year_2024_or_later?), Form::Sales::Pages::OldPersonsSharedOwnershipValueCheck.new("age_1_old_persons_shared_ownership_joint_purchase_value_check", nil, self, joint_purchase: true), Form::Sales::Pages::OldPersonsSharedOwnershipValueCheck.new("age_1_old_persons_shared_ownership_value_check", nil, self, joint_purchase: false), + Form::Sales::Pages::SexRegisteredAtBirth1.new(nil, nil, self), Form::Sales::Pages::GenderIdentity1.new(nil, nil, self), Form::Sales::Pages::Buyer1EthnicGroup.new(nil, nil, self), Form::Sales::Pages::Buyer1EthnicBackgroundBlack.new(nil, nil, self), diff --git a/config/locales/forms/2026/sales/household_characteristics.en.yml b/config/locales/forms/2026/sales/household_characteristics.en.yml index 3ca9da212..07cc860a9 100644 --- a/config/locales/forms/2026/sales/household_characteristics.en.yml +++ b/config/locales/forms/2026/sales/household_characteristics.en.yml @@ -16,6 +16,13 @@ en: hint_text: "" question_text: "Age" + sexRAB1: + page_header: "" + check_answer_label: "Buyer 1’s sex registered at birth" + check_answer_prompt: "" + hint_text: "This is your sex that was registered at birth. The next question will ask about your gender identity." + question_text: "What is your sex?" + sex1: page_header: "" check_answer_label: "Buyer 1’s gender identity" From 8094ab563005060421652961f220e825d06d3923 Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Thu, 15 Jan 2026 11:48:36 +0000 Subject: [PATCH 04/20] CLDC-4177: Adds sex-at-birth question for other household members --- .../pages/person_sex_registered_at_birth.rb | 18 ++++++++ .../sales/pages/sex_registered_at_birth2.rb | 25 ++++++++++ .../person_sex_registered_at_birth.rb | 27 +++++++++++ .../questions/sex_registered_at_birth1.rb | 4 +- .../questions/sex_registered_at_birth2.rb | 28 +++++++++++ .../subsections/household_characteristics.rb | 6 +++ .../sales/household_characteristics.en.yml | 46 ++++++++++++++++++- 7 files changed, 150 insertions(+), 4 deletions(-) create mode 100644 app/models/form/sales/pages/person_sex_registered_at_birth.rb create mode 100644 app/models/form/sales/pages/sex_registered_at_birth2.rb create mode 100644 app/models/form/sales/questions/person_sex_registered_at_birth.rb create mode 100644 app/models/form/sales/questions/sex_registered_at_birth2.rb diff --git a/app/models/form/sales/pages/person_sex_registered_at_birth.rb b/app/models/form/sales/pages/person_sex_registered_at_birth.rb new file mode 100644 index 000000000..d77e8d98d --- /dev/null +++ b/app/models/form/sales/pages/person_sex_registered_at_birth.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class Form::Sales::Pages::PersonSexRegisteredAtBirth < ::Form::Page + def initialize(id, hsh, subsection, person_index:) + super(id, hsh, subsection) + @copy_key = "sales.household_characteristics.sex2.person" if person_index == 2 + @person_index = person_index + @depends_on = [ + { "details_known_#{person_index}" => 1 }, + ] + end + + def questions + @questions ||= [ + Form::Sales::Questions::PersonSexRegisteredAtBirth.new("sexRAB#{@person_index}", nil, self, person_index:@person_index), + ] + end +end diff --git a/app/models/form/sales/pages/sex_registered_at_birth2.rb b/app/models/form/sales/pages/sex_registered_at_birth2.rb new file mode 100644 index 000000000..55031b92a --- /dev/null +++ b/app/models/form/sales/pages/sex_registered_at_birth2.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +class Form::Sales::Pages::SexRegisteredAtBirth2 < ::Form::Page + def initialize(id, hsh, subsection) + super + @id = "buyer_2_sex_registered_at_birth" + @copy_key = "sales.household_characteristics.sex2.buyer" + @depends_on = [ + { + "joint_purchase?" => true, + "buyer_has_seen_privacy_notice?" => true, + }, + { + "joint_purchase?" => true, + "buyer_not_interviewed?" => true, + }, + ] + end + + def questions + @questions ||= [ + Form::Sales::Questions::SexRegisteredAtBirth2.new(nil, nil, self), + ] + end +end diff --git a/app/models/form/sales/questions/person_sex_registered_at_birth.rb b/app/models/form/sales/questions/person_sex_registered_at_birth.rb new file mode 100644 index 000000000..fe1f14fa0 --- /dev/null +++ b/app/models/form/sales/questions/person_sex_registered_at_birth.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +class Form::Sales::Questions::PersonSexRegisteredAtBirth < ::Form::Question + def initialize(id, hsh, page, person_index:) + super(id, hsh, page) + @type = "radio" + @copy_key = "sales.household_characteristics.sexRAB2.person" if person_index == 2 + @check_answers_card_number = person_index + @inferred_check_answers_value = [{ + "condition" => { + id => "R", + }, + "value" => "Prefers not to say", + }] + @answer_options = ANSWER_OPTIONS + @question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] + end + + ANSWER_OPTIONS = { + "F" => { "value" => "Female" }, + "M" => { "value" => "Male" }, + "divider" => { "value" => true }, + "R" => { "value" => "Person prefers not to say" }, + }.freeze + + QUESTION_NUMBER_FROM_YEAR = { 2026 => 0 }.freeze +end diff --git a/app/models/form/sales/questions/sex_registered_at_birth1.rb b/app/models/form/sales/questions/sex_registered_at_birth1.rb index 633a9dc13..f6b219d74 100644 --- a/app/models/form/sales/questions/sex_registered_at_birth1.rb +++ b/app/models/form/sales/questions/sex_registered_at_birth1.rb @@ -14,8 +14,8 @@ class Form::Sales::Questions::SexRegisteredAtBirth1 < ::Form::Question "F" => { "value" => "Female" }, "M" => { "value" => "Male" }, "divider" => { "value" => true }, - "R" => { "value" => "Tenant prefers not to say" }, + "R" => { "value" => "Buyer prefers not to say" }, }.freeze - QUESTION_NUMBER_FROM_YEAR = { 2026 => 32 }.freeze + QUESTION_NUMBER_FROM_YEAR = { 2026 => 0 }.freeze end diff --git a/app/models/form/sales/questions/sex_registered_at_birth2.rb b/app/models/form/sales/questions/sex_registered_at_birth2.rb new file mode 100644 index 000000000..073be25a2 --- /dev/null +++ b/app/models/form/sales/questions/sex_registered_at_birth2.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +class Form::Sales::Questions::SexRegisteredAtBirth2 < ::Form::Question + def initialize(id, hsh, page) + super + @id = "sexRAB2" + @type = "radio" + @copy_key = "sales.household_characteristics.sexRAB2.buyer" + @check_answers_card_number = 2 + @inferred_check_answers_value = [{ + "condition" => { + "sex2" => "R", + }, + "value" => "Prefers not to say", + }] + @answer_options = ANSWER_OPTIONS + @question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] + end + + ANSWER_OPTIONS = { + "F" => { "value" => "Female" }, + "M" => { "value" => "Male" }, + "divider" => { "value" => true }, + "R" => { "value" => "Buyer prefers not to say" }, + }.freeze + + QUESTION_NUMBER_FROM_YEAR = { 2026 => 0 }.freeze +end diff --git a/app/models/form/sales/subsections/household_characteristics.rb b/app/models/form/sales/subsections/household_characteristics.rb index b18f7919f..4542ad49d 100644 --- a/app/models/form/sales/subsections/household_characteristics.rb +++ b/app/models/form/sales/subsections/household_characteristics.rb @@ -47,6 +47,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection Form::Sales::Pages::RetirementValueCheck.new("age_2_buyer_retirement_value_check", nil, self, person_index: 2), (Form::Sales::Pages::NotRetiredValueCheck.new("age_2_buyer_not_retired_value_check", nil, self, person_index: 2) if form.start_year_2024_or_later?), (Form::Sales::Pages::PersonStudentNotChildValueCheck.new("buyer_2_age_student_not_child_value_check", nil, self, person_index: 2) unless form.start_year_2025_or_later?), + Form::Sales::Pages::SexRegisteredAtBirth2.new(nil, nil, self), Form::Sales::Pages::GenderIdentity2.new(nil, nil, self), buyer_2_ethnicity_nationality_pages, Form::Sales::Pages::Buyer2WorkingSituation.new(nil, nil, self), @@ -68,6 +69,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection (Form::Sales::Pages::NotRetiredValueCheck.new("age_2_not_retired_value_check", nil, self, person_index: 2) if form.start_year_2024_or_later?), (Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_2_student_not_child_value_check", nil, self, person_index: 2) unless form.start_year_2025_or_later?), (Form::Sales::Pages::PartnerUnder16ValueCheck.new("age_2_partner_under_16_value_check", nil, self, person_index: 2) if form.start_year_2024_or_later?), + Form::Sales::Pages::PersonSexRegisteredAtBirth.new("person_2_sex_registered_at_birth", nil, self, person_index: 2), Form::Sales::Pages::PersonGenderIdentity.new("person_2_gender_identity", nil, self, person_index: 2), Form::Sales::Pages::PersonWorkingSituation.new("person_2_working_situation", nil, self, person_index: 2), Form::Sales::Pages::RetirementValueCheck.new("working_situation_2_retirement_value_check", nil, self, person_index: 2), @@ -83,6 +85,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection (Form::Sales::Pages::NotRetiredValueCheck.new("age_3_not_retired_value_check", nil, self, person_index: 3) if form.start_year_2024_or_later?), (Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_3_student_not_child_value_check", nil, self, person_index: 3) unless form.start_year_2025_or_later?), (Form::Sales::Pages::PartnerUnder16ValueCheck.new("age_3_partner_under_16_value_check", nil, self, person_index: 3) if form.start_year_2024_or_later?), + Form::Sales::Pages::PersonSexRegisteredAtBirth.new("person_3_sex_registered_at_birth", nil, self, person_index: 3), Form::Sales::Pages::PersonGenderIdentity.new("person_3_gender_identity", nil, self, person_index: 3), Form::Sales::Pages::PersonWorkingSituation.new("person_3_working_situation", nil, self, person_index: 3), Form::Sales::Pages::RetirementValueCheck.new("working_situation_3_retirement_value_check", nil, self, person_index: 3), @@ -98,6 +101,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection (Form::Sales::Pages::NotRetiredValueCheck.new("age_4_not_retired_value_check", nil, self, person_index: 4) if form.start_year_2024_or_later?), (Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_4_student_not_child_value_check", nil, self, person_index: 4) unless form.start_year_2025_or_later?), (Form::Sales::Pages::PartnerUnder16ValueCheck.new("age_4_partner_under_16_value_check", nil, self, person_index: 4) if form.start_year_2024_or_later?), + Form::Sales::Pages::PersonSexRegisteredAtBirth.new("person_4_sex_registered_at_birth", nil, self, person_index: 4), Form::Sales::Pages::PersonGenderIdentity.new("person_4_gender_identity", nil, self, person_index: 4), Form::Sales::Pages::PersonWorkingSituation.new("person_4_working_situation", nil, self, person_index: 4), Form::Sales::Pages::RetirementValueCheck.new("working_situation_4_retirement_value_check", nil, self, person_index: 4), @@ -113,6 +117,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection (Form::Sales::Pages::NotRetiredValueCheck.new("age_5_not_retired_value_check", nil, self, person_index: 5) if form.start_year_2024_or_later?), (Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_5_student_not_child_value_check", nil, self, person_index: 5) unless form.start_year_2025_or_later?), (Form::Sales::Pages::PartnerUnder16ValueCheck.new("age_5_partner_under_16_value_check", nil, self, person_index: 5) if form.start_year_2024_or_later?), + Form::Sales::Pages::PersonSexRegisteredAtBirth.new("person_5_sex_registered_at_birth", nil, self, person_index: 5), Form::Sales::Pages::PersonGenderIdentity.new("person_5_gender_identity", nil, self, person_index: 5), Form::Sales::Pages::PersonWorkingSituation.new("person_5_working_situation", nil, self, person_index: 5), Form::Sales::Pages::RetirementValueCheck.new("working_situation_5_retirement_value_check", nil, self, person_index: 5), @@ -128,6 +133,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection (Form::Sales::Pages::NotRetiredValueCheck.new("age_6_not_retired_value_check", nil, self, person_index: 6) if form.start_year_2024_or_later?), (Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_6_student_not_child_value_check", nil, self, person_index: 6) unless form.start_year_2025_or_later?), (Form::Sales::Pages::PartnerUnder16ValueCheck.new("age_6_partner_under_16_value_check", nil, self, person_index: 6) if form.start_year_2024_or_later?), + Form::Sales::Pages::PersonSexRegisteredAtBirth.new("person_6_sex_registered_at_birth", nil, self, person_index: 6), Form::Sales::Pages::PersonGenderIdentity.new("person_6_gender_identity", nil, self, person_index: 6), Form::Sales::Pages::PersonWorkingSituation.new("person_6_working_situation", nil, self, person_index: 6), Form::Sales::Pages::RetirementValueCheck.new("working_situation_6_retirement_value_check", nil, self, person_index: 6), diff --git a/config/locales/forms/2026/sales/household_characteristics.en.yml b/config/locales/forms/2026/sales/household_characteristics.en.yml index 07cc860a9..534ee747a 100644 --- a/config/locales/forms/2026/sales/household_characteristics.en.yml +++ b/config/locales/forms/2026/sales/household_characteristics.en.yml @@ -20,8 +20,8 @@ en: page_header: "" check_answer_label: "Buyer 1’s sex registered at birth" check_answer_prompt: "" - hint_text: "This is your sex that was registered at birth. The next question will ask about your gender identity." - question_text: "What is your sex?" + hint_text: "This is the sex that was registered at birth. The next question will ask about the buyer's gender identity." + question_text: "What was buyer 1's sex at birth?" sex1: page_header: "" @@ -137,6 +137,20 @@ en: hint_text: "" question_text: "Age" + sexRAB2: + buyer: + page_header: "" + check_answer_label: "Buyer 2’s sex registered at birth" + check_answer_prompt: "" + hint_text: "This is the sex that was registered at birth. The next question will ask about the buyer's gender identity." + question_text: "What was buyer 2's sex at birth?" + person: + page_header: "" + check_answer_label: "Person 2’s sex registered at birth" + check_answer_prompt: "" + hint_text: "This is the sex that was registered at birth. The next question will ask about the person's gender identity." + question_text: "What was person 2's sex at birth?" + sex2: buyer: page_header: "" @@ -273,6 +287,13 @@ en: hint_text: "" question_text: "Age" + sexRAB3: + page_header: "" + check_answer_label: "Person 3’s sex registered at birth" + check_answer_prompt: "" + hint_text: "This is the sex that was registered at birth. The next question will ask about the person's gender identity." + question_text: "What was person 3's sex at birth?" + sex3: page_header: "" check_answer_label: "Person 3’s gender identity" @@ -314,6 +335,13 @@ en: hint_text: "" question_text: "Age" + sexRAB4: + page_header: "" + check_answer_label: "Person 4’s sex registered at birth" + check_answer_prompt: "" + hint_text: "This is the sex that was registered at birth. The next question will ask about the person's gender identity." + question_text: "What was person 4's sex at birth?" + sex4: page_header: "" check_answer_label: "Person 4’s gender identity" @@ -355,6 +383,13 @@ en: hint_text: "" question_text: "Age" + sexRAB5: + page_header: "" + check_answer_label: "Person 5’s sex registered at birth" + check_answer_prompt: "" + hint_text: "This is the sex that was registered at birth. The next question will ask about the person's gender identity." + question_text: "What was person 5's sex at birth?" + sex5: page_header: "" check_answer_label: "Person 5’s gender identity" @@ -396,6 +431,13 @@ en: hint_text: "" question_text: "Age" + sexRAB6: + page_header: "" + check_answer_label: "Person 6’s sex registered at birth" + check_answer_prompt: "" + hint_text: "This is the sex that was registered at birth. The next question will ask about the person's gender identity." + question_text: "What was person 6's sex at birth?" + sex6: page_header: "" check_answer_label: "Person 6’s gender identity" From 72d78c1f4951a6d14eee1736a1f2759ca1e2e60c Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Thu, 15 Jan 2026 16:58:40 +0000 Subject: [PATCH 05/20] CLCD-4177: Unit tests --- .../person_sex_registered_at_birth.rb | 2 +- .../questions/sex_registered_at_birth2.rb | 4 +- .../subsections/household_characteristics.rb | 14 +- .../person_sex_registered_at_birth_spec.rb | 104 ++++++++++++++ .../pages/sex_registered_at_birth1_spec.rb | 29 ++++ .../pages/sex_registered_at_birth2_spec.rb | 38 +++++ .../person_sex_registered_at_birth_spec.rb | 133 ++++++++++++++++++ .../sex_registered_at_birth1_spec.rb | 45 ++++++ .../sex_registered_at_birth2_spec.rb | 51 +++++++ .../household_characteristics_spec.rb | 131 +++++++++++++++++ 10 files changed, 541 insertions(+), 10 deletions(-) create mode 100644 spec/models/form/sales/pages/person_sex_registered_at_birth_spec.rb create mode 100644 spec/models/form/sales/pages/sex_registered_at_birth1_spec.rb create mode 100644 spec/models/form/sales/pages/sex_registered_at_birth2_spec.rb create mode 100644 spec/models/form/sales/questions/person_sex_registered_at_birth_spec.rb create mode 100644 spec/models/form/sales/questions/sex_registered_at_birth1_spec.rb create mode 100644 spec/models/form/sales/questions/sex_registered_at_birth2_spec.rb diff --git a/app/models/form/sales/questions/person_sex_registered_at_birth.rb b/app/models/form/sales/questions/person_sex_registered_at_birth.rb index fe1f14fa0..12079761d 100644 --- a/app/models/form/sales/questions/person_sex_registered_at_birth.rb +++ b/app/models/form/sales/questions/person_sex_registered_at_birth.rb @@ -10,7 +10,7 @@ class Form::Sales::Questions::PersonSexRegisteredAtBirth < ::Form::Question "condition" => { id => "R", }, - "value" => "Prefers not to say", + "value" => "Person prefers not to say", }] @answer_options = ANSWER_OPTIONS @question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] diff --git a/app/models/form/sales/questions/sex_registered_at_birth2.rb b/app/models/form/sales/questions/sex_registered_at_birth2.rb index 073be25a2..23af640c8 100644 --- a/app/models/form/sales/questions/sex_registered_at_birth2.rb +++ b/app/models/form/sales/questions/sex_registered_at_birth2.rb @@ -9,9 +9,9 @@ class Form::Sales::Questions::SexRegisteredAtBirth2 < ::Form::Question @check_answers_card_number = 2 @inferred_check_answers_value = [{ "condition" => { - "sex2" => "R", + "sexRAB2" => "R", }, - "value" => "Prefers not to say", + "value" => "Buyer prefers not to say", }] @answer_options = ANSWER_OPTIONS @question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] diff --git a/app/models/form/sales/subsections/household_characteristics.rb b/app/models/form/sales/subsections/household_characteristics.rb index 4542ad49d..47466a492 100644 --- a/app/models/form/sales/subsections/household_characteristics.rb +++ b/app/models/form/sales/subsections/household_characteristics.rb @@ -24,7 +24,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection (Form::Sales::Pages::NotRetiredValueCheck.new("age_1_not_retired_value_check", nil, self, person_index: 1) if form.start_year_2024_or_later?), Form::Sales::Pages::OldPersonsSharedOwnershipValueCheck.new("age_1_old_persons_shared_ownership_joint_purchase_value_check", nil, self, joint_purchase: true), Form::Sales::Pages::OldPersonsSharedOwnershipValueCheck.new("age_1_old_persons_shared_ownership_value_check", nil, self, joint_purchase: false), - Form::Sales::Pages::SexRegisteredAtBirth1.new(nil, nil, self), + (Form::Sales::Pages::SexRegisteredAtBirth1.new(nil, nil, self) if form.start_year_2026_or_later?), Form::Sales::Pages::GenderIdentity1.new(nil, nil, self), Form::Sales::Pages::Buyer1EthnicGroup.new(nil, nil, self), Form::Sales::Pages::Buyer1EthnicBackgroundBlack.new(nil, nil, self), @@ -47,7 +47,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection Form::Sales::Pages::RetirementValueCheck.new("age_2_buyer_retirement_value_check", nil, self, person_index: 2), (Form::Sales::Pages::NotRetiredValueCheck.new("age_2_buyer_not_retired_value_check", nil, self, person_index: 2) if form.start_year_2024_or_later?), (Form::Sales::Pages::PersonStudentNotChildValueCheck.new("buyer_2_age_student_not_child_value_check", nil, self, person_index: 2) unless form.start_year_2025_or_later?), - Form::Sales::Pages::SexRegisteredAtBirth2.new(nil, nil, self), + (Form::Sales::Pages::SexRegisteredAtBirth2.new(nil, nil, self) if form.start_year_2026_or_later?), Form::Sales::Pages::GenderIdentity2.new(nil, nil, self), buyer_2_ethnicity_nationality_pages, Form::Sales::Pages::Buyer2WorkingSituation.new(nil, nil, self), @@ -69,7 +69,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection (Form::Sales::Pages::NotRetiredValueCheck.new("age_2_not_retired_value_check", nil, self, person_index: 2) if form.start_year_2024_or_later?), (Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_2_student_not_child_value_check", nil, self, person_index: 2) unless form.start_year_2025_or_later?), (Form::Sales::Pages::PartnerUnder16ValueCheck.new("age_2_partner_under_16_value_check", nil, self, person_index: 2) if form.start_year_2024_or_later?), - Form::Sales::Pages::PersonSexRegisteredAtBirth.new("person_2_sex_registered_at_birth", nil, self, person_index: 2), + (Form::Sales::Pages::PersonSexRegisteredAtBirth.new("person_2_sex_registered_at_birth", nil, self, person_index: 2) if form.start_year_2026_or_later?), Form::Sales::Pages::PersonGenderIdentity.new("person_2_gender_identity", nil, self, person_index: 2), Form::Sales::Pages::PersonWorkingSituation.new("person_2_working_situation", nil, self, person_index: 2), Form::Sales::Pages::RetirementValueCheck.new("working_situation_2_retirement_value_check", nil, self, person_index: 2), @@ -85,7 +85,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection (Form::Sales::Pages::NotRetiredValueCheck.new("age_3_not_retired_value_check", nil, self, person_index: 3) if form.start_year_2024_or_later?), (Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_3_student_not_child_value_check", nil, self, person_index: 3) unless form.start_year_2025_or_later?), (Form::Sales::Pages::PartnerUnder16ValueCheck.new("age_3_partner_under_16_value_check", nil, self, person_index: 3) if form.start_year_2024_or_later?), - Form::Sales::Pages::PersonSexRegisteredAtBirth.new("person_3_sex_registered_at_birth", nil, self, person_index: 3), + (Form::Sales::Pages::PersonSexRegisteredAtBirth.new("person_3_sex_registered_at_birth", nil, self, person_index: 3) if form.start_year_2026_or_later?), Form::Sales::Pages::PersonGenderIdentity.new("person_3_gender_identity", nil, self, person_index: 3), Form::Sales::Pages::PersonWorkingSituation.new("person_3_working_situation", nil, self, person_index: 3), Form::Sales::Pages::RetirementValueCheck.new("working_situation_3_retirement_value_check", nil, self, person_index: 3), @@ -101,7 +101,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection (Form::Sales::Pages::NotRetiredValueCheck.new("age_4_not_retired_value_check", nil, self, person_index: 4) if form.start_year_2024_or_later?), (Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_4_student_not_child_value_check", nil, self, person_index: 4) unless form.start_year_2025_or_later?), (Form::Sales::Pages::PartnerUnder16ValueCheck.new("age_4_partner_under_16_value_check", nil, self, person_index: 4) if form.start_year_2024_or_later?), - Form::Sales::Pages::PersonSexRegisteredAtBirth.new("person_4_sex_registered_at_birth", nil, self, person_index: 4), + (Form::Sales::Pages::PersonSexRegisteredAtBirth.new("person_4_sex_registered_at_birth", nil, self, person_index: 4) if form.start_year_2026_or_later?), Form::Sales::Pages::PersonGenderIdentity.new("person_4_gender_identity", nil, self, person_index: 4), Form::Sales::Pages::PersonWorkingSituation.new("person_4_working_situation", nil, self, person_index: 4), Form::Sales::Pages::RetirementValueCheck.new("working_situation_4_retirement_value_check", nil, self, person_index: 4), @@ -117,7 +117,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection (Form::Sales::Pages::NotRetiredValueCheck.new("age_5_not_retired_value_check", nil, self, person_index: 5) if form.start_year_2024_or_later?), (Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_5_student_not_child_value_check", nil, self, person_index: 5) unless form.start_year_2025_or_later?), (Form::Sales::Pages::PartnerUnder16ValueCheck.new("age_5_partner_under_16_value_check", nil, self, person_index: 5) if form.start_year_2024_or_later?), - Form::Sales::Pages::PersonSexRegisteredAtBirth.new("person_5_sex_registered_at_birth", nil, self, person_index: 5), + (Form::Sales::Pages::PersonSexRegisteredAtBirth.new("person_5_sex_registered_at_birth", nil, self, person_index: 5) if form.start_year_2026_or_later?), Form::Sales::Pages::PersonGenderIdentity.new("person_5_gender_identity", nil, self, person_index: 5), Form::Sales::Pages::PersonWorkingSituation.new("person_5_working_situation", nil, self, person_index: 5), Form::Sales::Pages::RetirementValueCheck.new("working_situation_5_retirement_value_check", nil, self, person_index: 5), @@ -133,7 +133,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection (Form::Sales::Pages::NotRetiredValueCheck.new("age_6_not_retired_value_check", nil, self, person_index: 6) if form.start_year_2024_or_later?), (Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_6_student_not_child_value_check", nil, self, person_index: 6) unless form.start_year_2025_or_later?), (Form::Sales::Pages::PartnerUnder16ValueCheck.new("age_6_partner_under_16_value_check", nil, self, person_index: 6) if form.start_year_2024_or_later?), - Form::Sales::Pages::PersonSexRegisteredAtBirth.new("person_6_sex_registered_at_birth", nil, self, person_index: 6), + (Form::Sales::Pages::PersonSexRegisteredAtBirth.new("person_6_sex_registered_at_birth", nil, self, person_index: 6) if form.start_year_2026_or_later?), Form::Sales::Pages::PersonGenderIdentity.new("person_6_gender_identity", nil, self, person_index: 6), Form::Sales::Pages::PersonWorkingSituation.new("person_6_working_situation", nil, self, person_index: 6), Form::Sales::Pages::RetirementValueCheck.new("working_situation_6_retirement_value_check", nil, self, person_index: 6), diff --git a/spec/models/form/sales/pages/person_sex_registered_at_birth_spec.rb b/spec/models/form/sales/pages/person_sex_registered_at_birth_spec.rb new file mode 100644 index 000000000..0885e1d3e --- /dev/null +++ b/spec/models/form/sales/pages/person_sex_registered_at_birth_spec.rb @@ -0,0 +1,104 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Pages::PersonSexRegisteredAtBirth, type: :model do + subject(:page) { described_class.new(page_id, page_definition, subsection, person_index:) } + + let(:page_definition) { nil } + let(:subsection) { instance_double(Form::Subsection, form: instance_double(Form, start_date: Time.zone.local(2026, 4, 1))) } + let(:person_index) { 1 } + + let(:page_id) { "person_2_sex_registered_at_birth" } + + it "has correct subsection" do + expect(page.subsection).to eq(subsection) + end + + it "has the correct description" do + expect(page.description).to be_nil + end + + context "with person 2" do + let(:person_index) { 2 } + let(:page_id) { "person_2_sex_registered_at_birth" } + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[sexRAB2]) + end + + it "has the correct id" do + expect(page.id).to eq("person_2_sex_registered_at_birth") + end + + it "has correct depends_on" do + expect(page.depends_on).to eq([{ "details_known_2" => 1 }]) + end + end + + context "with person 3" do + let(:person_index) { 3 } + let(:page_id) { "person_3_sex_registered_at_birth" } + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[sexRAB3]) + end + + it "has the correct id" do + expect(page.id).to eq("person_3_sex_registered_at_birth") + end + + it "has correct depends_on" do + expect(page.depends_on).to eq([{ "details_known_3" => 1 }]) + end + end + + context "with person 4" do + let(:person_index) { 4 } + let(:page_id) { "person_4_sex_registered_at_birth" } + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[sexRAB4]) + end + + it "has the correct id" do + expect(page.id).to eq("person_4_sex_registered_at_birth") + end + + it "has correct depends_on" do + expect(page.depends_on).to eq([{ "details_known_4" => 1 }]) + end + end + + context "with person 5" do + let(:person_index) { 5 } + let(:page_id) { "person_5_sex_registered_at_birth" } + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[sexRAB5]) + end + + it "has the correct id" do + expect(page.id).to eq("person_5_sex_registered_at_birth") + end + + it "has correct depends_on" do + expect(page.depends_on).to eq([{ "details_known_5" => 1 }]) + end + end + + context "with person 6" do + let(:person_index) { 6 } + let(:page_id) { "person_6_sex_registered_at_birth" } + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[sexRAB6]) + end + + it "has the correct id" do + expect(page.id).to eq("person_6_sex_registered_at_birth") + end + + it "has correct depends_on" do + expect(page.depends_on).to eq([{ "details_known_6" => 1 }]) + end + end +end diff --git a/spec/models/form/sales/pages/sex_registered_at_birth1_spec.rb b/spec/models/form/sales/pages/sex_registered_at_birth1_spec.rb new file mode 100644 index 000000000..2339a1064 --- /dev/null +++ b/spec/models/form/sales/pages/sex_registered_at_birth1_spec.rb @@ -0,0 +1,29 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Pages::SexRegisteredAtBirth1, type: :model do + subject(:page) { described_class.new(page_id, page_definition, subsection) } + + let(:page_id) { nil } + let(:page_definition) { nil } + let(:subsection) { instance_double(Form::Subsection, form: instance_double(Form, start_date: Time.zone.local(2026, 4, 1))) } + + it "has correct subsection" do + expect(page.subsection).to eq(subsection) + end + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[sexRAB1]) + end + + it "has the correct id" do + expect(page.id).to eq("buyer_1_sex_registered_at_birth") + end + + it "has the correct description" do + expect(page.description).to be_nil + end + + it "has correct depends_on" do + expect(page.depends_on).to eq([{ "buyer_has_seen_privacy_notice?" => true }, { "buyer_not_interviewed?" => true }]) + end +end diff --git a/spec/models/form/sales/pages/sex_registered_at_birth2_spec.rb b/spec/models/form/sales/pages/sex_registered_at_birth2_spec.rb new file mode 100644 index 000000000..cb1a20cdd --- /dev/null +++ b/spec/models/form/sales/pages/sex_registered_at_birth2_spec.rb @@ -0,0 +1,38 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Pages::SexRegisteredAtBirth2, type: :model do + subject(:page) { described_class.new(page_id, page_definition, subsection) } + + let(:page_id) { nil } + let(:page_definition) { nil } + let(:subsection) { instance_double(Form::Subsection, form: instance_double(Form, start_date: Time.zone.local(2026, 4, 1))) } + + it "has correct subsection" do + expect(page.subsection).to eq(subsection) + end + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[sexRAB2]) + end + + it "has the correct id" do + expect(page.id).to eq("buyer_2_sex_registered_at_birth") + end + + it "has the correct description" do + expect(page.description).to be_nil + end + + it "has correct depends_on" do + expect(page.depends_on).to eq([ + { + "joint_purchase?" => true, + "buyer_has_seen_privacy_notice?" => true, + }, + { + "joint_purchase?" => true, + "buyer_not_interviewed?" => true, + }, + ]) + end +end diff --git a/spec/models/form/sales/questions/person_sex_registered_at_birth_spec.rb b/spec/models/form/sales/questions/person_sex_registered_at_birth_spec.rb new file mode 100644 index 000000000..804a390c2 --- /dev/null +++ b/spec/models/form/sales/questions/person_sex_registered_at_birth_spec.rb @@ -0,0 +1,133 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Questions::PersonSexRegisteredAtBirth, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page, person_index:) } + + let(:question_id) { "sexRAB2" } + let(:question_definition) { nil } + let(:page) { instance_double(Form::Page) } + let(:person_index) { 2 } + let(:subsection) { instance_double(Form::Subsection) } + let(:form) { instance_double(Form, start_date: Time.zone.local(2026, 4, 1)) } + + before do + allow(page).to receive(:subsection).and_return(subsection) + allow(subsection).to receive(:form).and_return(form) + end + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct type" do + expect(question.type).to eq("radio") + end + + it "is not marked as derived" do + expect(question.derived?(nil)).to be false + end + + it "has the correct answer_options" do + expect(question.answer_options).to eq({ + "F" => { "value" => "Female" }, + "M" => { "value" => "Male" }, + "divider" => { "value" => true }, + "R" => { "value" => "Person prefers not to say" }, + }) + end + + context "when person 2" do + let(:question_id) { "sexRAB2" } + let(:person_index) { 2 } + + it "has the correct id" do + expect(question.id).to eq("sexRAB2") + end + + it "has expected check answers card number" do + expect(question.check_answers_card_number).to eq(2) + end + + it "has the correct inferred_check_answers_value" do + expect(question.inferred_check_answers_value).to eq([ + { "condition" => { "sexRAB2" => "R" }, "value" => "Person prefers not to say" }, + ]) + end + end + + context "when person 3" do + let(:question_id) { "sexRAB3" } + let(:person_index) { 3 } + + it "has the correct id" do + expect(question.id).to eq("sexRAB3") + end + + it "has expected check answers card number" do + expect(question.check_answers_card_number).to eq(3) + end + + it "has the correct inferred_check_answers_value" do + expect(question.inferred_check_answers_value).to eq([ + { "condition" => { "sexRAB3" => "R" }, "value" => "Person prefers not to say" }, + ]) + end + end + + context "when person 4" do + let(:question_id) { "sexRAB4" } + let(:person_index) { 4 } + + it "has the correct id" do + expect(question.id).to eq("sexRAB4") + end + + it "has expected check answers card number" do + expect(question.check_answers_card_number).to eq(4) + end + + it "has the correct inferred_check_answers_value" do + expect(question.inferred_check_answers_value).to eq([ + { "condition" => { "sexRAB4" => "R" }, "value" => "Person prefers not to say" }, + ]) + end + end + + context "when person 5" do + let(:question_id) { "sexRAB5" } + let(:person_index) { 5 } + + it "has the correct id" do + expect(question.id).to eq("sexRAB5") + end + + it "has expected check answers card number" do + expect(question.check_answers_card_number).to eq(5) + end + + it "has the correct inferred_check_answers_value" do + expect(question.inferred_check_answers_value).to eq([ + { "condition" => { "sexRAB5" => "R" }, "value" => "Person prefers not to say" }, + ]) + end + end + + context "when person 6" do + let(:question_id) { "sexRAB6" } + let(:person_index) { 6 } + + it "has the correct id" do + expect(question.id).to eq("sexRAB6") + end + + it "has expected check answers card number" do + expect(question.check_answers_card_number).to eq(6) + end + + it "has the correct inferred_check_answers_value" do + expect(question.inferred_check_answers_value).to eq([ + { "condition" => { "sexRAB6" => "R" }, "value" => "Person prefers not to say" }, + ]) + end + end +end diff --git a/spec/models/form/sales/questions/sex_registered_at_birth1_spec.rb b/spec/models/form/sales/questions/sex_registered_at_birth1_spec.rb new file mode 100644 index 000000000..b6e0a216f --- /dev/null +++ b/spec/models/form/sales/questions/sex_registered_at_birth1_spec.rb @@ -0,0 +1,45 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Questions::SexRegisteredAtBirth1, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page) } + + let(:question_id) { nil } + let(:question_definition) { nil } + let(:page) { instance_double(Form::Page) } + let(:subsection) { instance_double(Form::Subsection) } + let(:form) { instance_double(Form, start_date: Time.zone.local(2026, 4, 1)) } + + before do + allow(page).to receive(:subsection).and_return(subsection) + allow(subsection).to receive(:form).and_return(form) + end + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("sexRAB1") + end + + it "has the correct type" do + expect(question.type).to eq("radio") + end + + it "is not marked as derived" do + expect(question.derived?(nil)).to be false + end + + it "has the correct answer_options" do + expect(question.answer_options).to eq({ + "F" => { "value" => "Female" }, + "M" => { "value" => "Male" }, + "divider" => { "value" => true }, + "R" => { "value" => "Buyer prefers not to say" }, + }) + end + + it "has the correct check_answers_card_number" do + expect(question.check_answers_card_number).to eq(1) + end +end diff --git a/spec/models/form/sales/questions/sex_registered_at_birth2_spec.rb b/spec/models/form/sales/questions/sex_registered_at_birth2_spec.rb new file mode 100644 index 000000000..bad96fc20 --- /dev/null +++ b/spec/models/form/sales/questions/sex_registered_at_birth2_spec.rb @@ -0,0 +1,51 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Questions::SexRegisteredAtBirth2, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page) } + + let(:question_id) { nil } + let(:question_definition) { nil } + let(:page) { instance_double(Form::Page) } + let(:subsection) { instance_double(Form::Subsection) } + let(:form) { instance_double(Form, start_date: Time.zone.local(2026, 4, 1)) } + + before do + allow(page).to receive(:subsection).and_return(subsection) + allow(subsection).to receive(:form).and_return(form) + end + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("sexRAB2") + end + + it "has the correct type" do + expect(question.type).to eq("radio") + end + + it "is not marked as derived" do + expect(question.derived?(nil)).to be false + end + + it "has the correct answer_options" do + expect(question.answer_options).to eq({ + "F" => { "value" => "Female" }, + "M" => { "value" => "Male" }, + "divider" => { "value" => true }, + "R" => { "value" => "Buyer prefers not to say" }, + }) + end + + it "has the correct check_answers_card_number" do + expect(question.check_answers_card_number).to eq(2) + end + + it "has the correct inferred_check_answers_value" do + expect(question.inferred_check_answers_value).to eq([ + { "condition" => { "sexRAB2" => "R" }, "value" => "Buyer prefers not to say" }, + ]) + end +end diff --git a/spec/models/form/sales/subsections/household_characteristics_spec.rb b/spec/models/form/sales/subsections/household_characteristics_spec.rb index 67f758ae3..392391381 100644 --- a/spec/models/form/sales/subsections/household_characteristics_spec.rb +++ b/spec/models/form/sales/subsections/household_characteristics_spec.rb @@ -21,6 +21,7 @@ RSpec.describe Form::Sales::Subsections::HouseholdCharacteristics, type: :model allow(form).to receive(:start_date).and_return(Time.zone.local(2023, 4, 1)) allow(form).to receive(:start_year_2024_or_later?).and_return(false) allow(form).to receive(:start_year_2025_or_later?).and_return(false) + allow(form).to receive(:start_year_2026_or_later?).and_return(false) end it "has correct pages" do @@ -130,6 +131,7 @@ RSpec.describe Form::Sales::Subsections::HouseholdCharacteristics, type: :model allow(form).to receive(:start_date).and_return(Time.zone.local(2024, 4, 1)) allow(form).to receive(:start_year_2024_or_later?).and_return(true) allow(form).to receive(:start_year_2025_or_later?).and_return(false) + allow(form).to receive(:start_year_2026_or_later?).and_return(false) end it "has correct depends on" do @@ -284,6 +286,7 @@ RSpec.describe Form::Sales::Subsections::HouseholdCharacteristics, type: :model allow(form).to receive(:start_date).and_return(Time.zone.local(2025, 4, 1)) allow(form).to receive(:start_year_2024_or_later?).and_return(true) allow(form).to receive(:start_year_2025_or_later?).and_return(true) + allow(form).to receive(:start_year_2026_or_later?).and_return(false) end it "has correct pages" do @@ -398,4 +401,132 @@ RSpec.describe Form::Sales::Subsections::HouseholdCharacteristics, type: :model expect(household_characteristics.depends_on).to eq([{ "setup_completed?" => true }]) end end + + context "with 2026/27 form" do + before do + allow(form).to receive(:start_date).and_return(Time.zone.local(2026, 4, 1)) + allow(form).to receive(:start_year_2024_or_later?).and_return(true) + allow(form).to receive(:start_year_2025_or_later?).and_return(true) + allow(form).to receive(:start_year_2026_or_later?).and_return(true) + end + + it "has correct pages" do + expect(household_characteristics.pages.map(&:id)).to eq( + %w[ + buyer_1_age + age_1_retirement_value_check + age_1_not_retired_value_check + age_1_old_persons_shared_ownership_joint_purchase_value_check + age_1_old_persons_shared_ownership_value_check + buyer_1_sex_registered_at_birth + buyer_1_gender_identity + buyer_1_ethnic_group + buyer_1_ethnic_background_black + buyer_1_ethnic_background_asian + buyer_1_ethnic_background_arab + buyer_1_ethnic_background_mixed + buyer_1_ethnic_background_white + buyer_1_nationality + buyer_1_working_situation + working_situation_1_retirement_value_check + working_situation_1_not_retired_value_check + working_situation_buyer_1_income_value_check + buyer_1_live_in_property + buyer_1_live_in_property_value_check + buyer_2_relationship_to_buyer_1 + buyer_2_age + age_2_old_persons_shared_ownership_joint_purchase_value_check + age_2_old_persons_shared_ownership_value_check + age_2_buyer_retirement_value_check + age_2_buyer_not_retired_value_check + buyer_2_sex_registered_at_birth + buyer_2_gender_identity + buyer_2_ethnic_group + buyer_2_ethnic_background_black + buyer_2_ethnic_background_asian + buyer_2_ethnic_background_arab + buyer_2_ethnic_background_mixed + buyer_2_ethnic_background_white + buyer_2_nationality + buyer_2_working_situation + working_situation_2_retirement_value_check_joint_purchase + working_situation_2_not_retired_value_check_joint_purchase + working_situation_buyer_2_income_value_check + buyer_2_live_in_property + buyer_2_live_in_property_value_check + number_of_others_in_property + number_of_others_in_property_joint_purchase + person_2_known + person_2_relationship_to_buyer_1 + relationship_2_partner_under_16_value_check + relationship_2_multiple_partners_value_check + person_2_age + age_2_retirement_value_check + age_2_not_retired_value_check + age_2_partner_under_16_value_check + person_2_sex_registered_at_birth + person_2_gender_identity + person_2_working_situation + working_situation_2_retirement_value_check + working_situation_2_not_retired_value_check + person_3_known + person_3_relationship_to_buyer_1 + relationship_3_partner_under_16_value_check + relationship_3_multiple_partners_value_check + person_3_age + age_3_retirement_value_check + age_3_not_retired_value_check + age_3_partner_under_16_value_check + person_3_sex_registered_at_birth + person_3_gender_identity + person_3_working_situation + working_situation_3_retirement_value_check + working_situation_3_not_retired_value_check + person_4_known + person_4_relationship_to_buyer_1 + relationship_4_partner_under_16_value_check + relationship_4_multiple_partners_value_check + person_4_age + age_4_retirement_value_check + age_4_not_retired_value_check + age_4_partner_under_16_value_check + person_4_sex_registered_at_birth + person_4_gender_identity + person_4_working_situation + working_situation_4_retirement_value_check + working_situation_4_not_retired_value_check + person_5_known + person_5_relationship_to_buyer_1 + relationship_5_partner_under_16_value_check + relationship_5_multiple_partners_value_check + person_5_age + age_5_retirement_value_check + age_5_not_retired_value_check + age_5_partner_under_16_value_check + person_5_sex_registered_at_birth + person_5_gender_identity + person_5_working_situation + working_situation_5_retirement_value_check + working_situation_5_not_retired_value_check + person_6_known + person_6_relationship_to_buyer_1 + relationship_6_partner_under_16_value_check + relationship_6_multiple_partners_value_check + person_6_age + age_6_retirement_value_check + age_6_not_retired_value_check + age_6_partner_under_16_value_check + person_6_sex_registered_at_birth + person_6_gender_identity + person_6_working_situation + working_situation_6_retirement_value_check + working_situation_6_not_retired_value_check + ], + ) + end + + it "has correct depends on" do + expect(household_characteristics.depends_on).to eq([{ "setup_completed?" => true }]) + end + end end From 7c70077d27f97c9737083fc45c20741fe534e3ed Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Fri, 16 Jan 2026 14:49:04 +0000 Subject: [PATCH 06/20] CLDC-4177: Misc inclusions where sex is also used --- app/services/csv/sales_log_csv_service.rb | 1 + app/services/exports/sales_log_export_constants.rb | 1 + 2 files changed, 2 insertions(+) diff --git a/app/services/csv/sales_log_csv_service.rb b/app/services/csv/sales_log_csv_service.rb index 0b6612a19..b5291b0f9 100644 --- a/app/services/csv/sales_log_csv_service.rb +++ b/app/services/csv/sales_log_csv_service.rb @@ -114,6 +114,7 @@ module Csv hash["age1"] = { "refused_code" => "-9", "refused_label" => "Not known", "age_known_field" => "age1_known" } (2..6).each do |i| hash["age#{i}"] = { "refused_code" => "-9", "refused_label" => "Not known", "details_known_field" => "details_known_#{i}", "age_known_field" => "age#{i}_known" } + hash["sexRAB#{i}"] = { "refused_code" => "R", "refused_label" => "Prefers not to say", "details_known_field" => "details_known_#{i}" } hash["sex#{i}"] = { "refused_code" => "R", "refused_label" => "Prefers not to say", "details_known_field" => "details_known_#{i}" } hash["relat#{i}"] = { "refused_code" => "R", "refused_label" => "Prefers not to say", "details_known_field" => "details_known_#{i}" } hash["ecstat#{i}"] = { "refused_code" => "10", "refused_label" => "Prefers not to say", "details_known_field" => "details_known_#{i}" } diff --git a/app/services/exports/sales_log_export_constants.rb b/app/services/exports/sales_log_export_constants.rb index 09a0d5d68..99a99a65a 100644 --- a/app/services/exports/sales_log_export_constants.rb +++ b/app/services/exports/sales_log_export_constants.rb @@ -137,6 +137,7 @@ module Exports::SalesLogExportConstants (1..6).each do |index| EXPORT_FIELDS << "AGE#{index}" EXPORT_FIELDS << "ECSTAT#{index}" + EXPORT_FIELDS << "SEXRAB#{index}" EXPORT_FIELDS << "SEX#{index}" end From 8df6a60655f2a9f3317cb50761280738d2184693 Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Fri, 16 Jan 2026 17:29:02 +0000 Subject: [PATCH 07/20] CLDC-4177: Lint fixes --- app/models/form/sales/pages/person_sex_registered_at_birth.rb | 2 +- .../form/sales/subsections/household_characteristics_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/form/sales/pages/person_sex_registered_at_birth.rb b/app/models/form/sales/pages/person_sex_registered_at_birth.rb index d77e8d98d..b85fa0659 100644 --- a/app/models/form/sales/pages/person_sex_registered_at_birth.rb +++ b/app/models/form/sales/pages/person_sex_registered_at_birth.rb @@ -12,7 +12,7 @@ class Form::Sales::Pages::PersonSexRegisteredAtBirth < ::Form::Page def questions @questions ||= [ - Form::Sales::Questions::PersonSexRegisteredAtBirth.new("sexRAB#{@person_index}", nil, self, person_index:@person_index), + Form::Sales::Questions::PersonSexRegisteredAtBirth.new("sexRAB#{@person_index}", nil, self, person_index: @person_index), ] end end diff --git a/spec/models/form/sales/subsections/household_characteristics_spec.rb b/spec/models/form/sales/subsections/household_characteristics_spec.rb index 392391381..74ed15da4 100644 --- a/spec/models/form/sales/subsections/household_characteristics_spec.rb +++ b/spec/models/form/sales/subsections/household_characteristics_spec.rb @@ -522,7 +522,7 @@ RSpec.describe Form::Sales::Subsections::HouseholdCharacteristics, type: :model working_situation_6_retirement_value_check working_situation_6_not_retired_value_check ], - ) + ) end it "has correct depends on" do From 8855b046364a1680e2ecb47413c97ed5c89683e3 Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Tue, 20 Jan 2026 11:16:58 +0000 Subject: [PATCH 08/20] CLDC-4177: Do not include sexRAB in pre-2026 exports --- app/services/exports/sales_log_export_constants.rb | 7 ++++++- app/services/exports/sales_log_export_service.rb | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/services/exports/sales_log_export_constants.rb b/app/services/exports/sales_log_export_constants.rb index 99a99a65a..a901c1ebf 100644 --- a/app/services/exports/sales_log_export_constants.rb +++ b/app/services/exports/sales_log_export_constants.rb @@ -137,11 +137,16 @@ module Exports::SalesLogExportConstants (1..6).each do |index| EXPORT_FIELDS << "AGE#{index}" EXPORT_FIELDS << "ECSTAT#{index}" - EXPORT_FIELDS << "SEXRAB#{index}" EXPORT_FIELDS << "SEX#{index}" end (2..6).each do |index| EXPORT_FIELDS << "RELAT#{index}" end + + POST_2026_EXPORT_FIELDS = Set[] + + (1..6).each do |index| + POST_2026_EXPORT_FIELDS << "SEXRAB#{index}" + end end diff --git a/app/services/exports/sales_log_export_service.rb b/app/services/exports/sales_log_export_service.rb index 7fac8d27e..e894f9dda 100644 --- a/app/services/exports/sales_log_export_service.rb +++ b/app/services/exports/sales_log_export_service.rb @@ -151,7 +151,8 @@ module Exports end def is_omitted_field?(field_name, _sales_log) - !EXPORT_FIELDS.include?(field_name) + !EXPORT_FIELDS.include?(field_name) || + (!_sales_log.form.start_year_2026_or_later? && POST_2026_EXPORT_FIELDS.include?(field_name)) end def build_export_xml(sales_logs) From 8c1b8f6856ef1ffaf72b7f12e0db8c49de2d6ef6 Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Thu, 22 Jan 2026 16:47:14 +0000 Subject: [PATCH 09/20] CLDC-4177: Fixes bug with copy key in new page --- app/models/form/sales/pages/person_sex_registered_at_birth.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/form/sales/pages/person_sex_registered_at_birth.rb b/app/models/form/sales/pages/person_sex_registered_at_birth.rb index b85fa0659..495513766 100644 --- a/app/models/form/sales/pages/person_sex_registered_at_birth.rb +++ b/app/models/form/sales/pages/person_sex_registered_at_birth.rb @@ -3,7 +3,7 @@ class Form::Sales::Pages::PersonSexRegisteredAtBirth < ::Form::Page def initialize(id, hsh, subsection, person_index:) super(id, hsh, subsection) - @copy_key = "sales.household_characteristics.sex2.person" if person_index == 2 + @copy_key = "sales.household_characteristics.sexRAB2.person" if person_index == 2 @person_index = person_index @depends_on = [ { "details_known_#{person_index}" => 1 }, From 22e7a119b3aa8a0ac42cf4376f34f3c99e8b39bd Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Thu, 22 Jan 2026 16:48:32 +0000 Subject: [PATCH 10/20] CLDC-4177: Changes logic used to decide which fields to export --- .../exports/sales_log_export_service.rb | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/app/services/exports/sales_log_export_service.rb b/app/services/exports/sales_log_export_service.rb index e894f9dda..a4f44f38e 100644 --- a/app/services/exports/sales_log_export_service.rb +++ b/app/services/exports/sales_log_export_service.rb @@ -150,9 +150,19 @@ module Exports attribute_hash end - def is_omitted_field?(field_name, _sales_log) - !EXPORT_FIELDS.include?(field_name) || - (!_sales_log.form.start_year_2026_or_later? && POST_2026_EXPORT_FIELDS.include?(field_name)) + def is_included_field?(field_name, included_fields) + included_fields.include?(field_name) + end + + def get_included_fields(sales_log) + included_fields = Set[] + included_fields.merge(EXPORT_FIELDS) + + if sales_log.form.start_year_2026_or_later? + included_fields.merge(POST_2026_EXPORT_FIELDS) + end + + return included_fields end def build_export_xml(sales_logs) @@ -162,11 +172,12 @@ module Exports attribute_hash = apply_cds_transformation(sales_log, EXPORT_MODE[:xml]) form = doc.create_element("form") doc.at("forms") << form + included_fields = get_included_fields(sales_log) attribute_hash.each do |key, value| - if is_omitted_field?(key, sales_log) - next - else + if is_included_field?(key, included_fields) form << doc.create_element(key, value) + else + next end end end From 1cc93eb0875493d99f683c0da7b8caa12f6c41e3 Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Thu, 22 Jan 2026 17:28:47 +0000 Subject: [PATCH 11/20] CLDC-4177: Linting fixes --- app/models/form/sales/pages/sex_registered_at_birth2.rb | 2 +- app/services/exports/sales_log_export_service.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/form/sales/pages/sex_registered_at_birth2.rb b/app/models/form/sales/pages/sex_registered_at_birth2.rb index 55031b92a..e453e2f39 100644 --- a/app/models/form/sales/pages/sex_registered_at_birth2.rb +++ b/app/models/form/sales/pages/sex_registered_at_birth2.rb @@ -4,7 +4,7 @@ class Form::Sales::Pages::SexRegisteredAtBirth2 < ::Form::Page def initialize(id, hsh, subsection) super @id = "buyer_2_sex_registered_at_birth" - @copy_key = "sales.household_characteristics.sex2.buyer" + @copy_key = "sales.household_characteristics.sexRAB2.buyer" @depends_on = [ { "joint_purchase?" => true, diff --git a/app/services/exports/sales_log_export_service.rb b/app/services/exports/sales_log_export_service.rb index a4f44f38e..cd9dd0a95 100644 --- a/app/services/exports/sales_log_export_service.rb +++ b/app/services/exports/sales_log_export_service.rb @@ -162,7 +162,7 @@ module Exports included_fields.merge(POST_2026_EXPORT_FIELDS) end - return included_fields + included_fields end def build_export_xml(sales_logs) From 3e334157fbfc7345c520b46c31a3990e25198d7d Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Thu, 22 Jan 2026 18:00:34 +0000 Subject: [PATCH 12/20] CLDC-4177: Converts new field to lowercase --- .../pages/person_sex_registered_at_birth.rb | 4 +-- .../sales/pages/sex_registered_at_birth2.rb | 2 +- .../person_sex_registered_at_birth.rb | 2 +- .../questions/sex_registered_at_birth1.rb | 2 +- .../questions/sex_registered_at_birth2.rb | 6 ++-- app/services/csv/sales_log_csv_service.rb | 2 +- .../sales/household_characteristics.en.yml | 12 +++---- ...d_sex_registered_at_birth_to_sales_logs.rb | 12 +++---- db/schema.rb | 12 +++---- .../person_sex_registered_at_birth_spec.rb | 10 +++--- .../pages/sex_registered_at_birth1_spec.rb | 2 +- .../pages/sex_registered_at_birth2_spec.rb | 2 +- .../person_sex_registered_at_birth_spec.rb | 32 +++++++++---------- .../sex_registered_at_birth1_spec.rb | 2 +- .../sex_registered_at_birth2_spec.rb | 4 +-- 15 files changed, 53 insertions(+), 53 deletions(-) diff --git a/app/models/form/sales/pages/person_sex_registered_at_birth.rb b/app/models/form/sales/pages/person_sex_registered_at_birth.rb index 495513766..807afe9b0 100644 --- a/app/models/form/sales/pages/person_sex_registered_at_birth.rb +++ b/app/models/form/sales/pages/person_sex_registered_at_birth.rb @@ -3,7 +3,7 @@ class Form::Sales::Pages::PersonSexRegisteredAtBirth < ::Form::Page def initialize(id, hsh, subsection, person_index:) super(id, hsh, subsection) - @copy_key = "sales.household_characteristics.sexRAB2.person" if person_index == 2 + @copy_key = "sales.household_characteristics.sexrab2.person" if person_index == 2 @person_index = person_index @depends_on = [ { "details_known_#{person_index}" => 1 }, @@ -12,7 +12,7 @@ class Form::Sales::Pages::PersonSexRegisteredAtBirth < ::Form::Page def questions @questions ||= [ - Form::Sales::Questions::PersonSexRegisteredAtBirth.new("sexRAB#{@person_index}", nil, self, person_index: @person_index), + Form::Sales::Questions::PersonSexRegisteredAtBirth.new("sexrab#{@person_index}", nil, self, person_index: @person_index), ] end end diff --git a/app/models/form/sales/pages/sex_registered_at_birth2.rb b/app/models/form/sales/pages/sex_registered_at_birth2.rb index e453e2f39..74cf4034c 100644 --- a/app/models/form/sales/pages/sex_registered_at_birth2.rb +++ b/app/models/form/sales/pages/sex_registered_at_birth2.rb @@ -4,7 +4,7 @@ class Form::Sales::Pages::SexRegisteredAtBirth2 < ::Form::Page def initialize(id, hsh, subsection) super @id = "buyer_2_sex_registered_at_birth" - @copy_key = "sales.household_characteristics.sexRAB2.buyer" + @copy_key = "sales.household_characteristics.sexrab2.buyer" @depends_on = [ { "joint_purchase?" => true, diff --git a/app/models/form/sales/questions/person_sex_registered_at_birth.rb b/app/models/form/sales/questions/person_sex_registered_at_birth.rb index 12079761d..fdc5ce3db 100644 --- a/app/models/form/sales/questions/person_sex_registered_at_birth.rb +++ b/app/models/form/sales/questions/person_sex_registered_at_birth.rb @@ -4,7 +4,7 @@ class Form::Sales::Questions::PersonSexRegisteredAtBirth < ::Form::Question def initialize(id, hsh, page, person_index:) super(id, hsh, page) @type = "radio" - @copy_key = "sales.household_characteristics.sexRAB2.person" if person_index == 2 + @copy_key = "sales.household_characteristics.sexrab2.person" if person_index == 2 @check_answers_card_number = person_index @inferred_check_answers_value = [{ "condition" => { diff --git a/app/models/form/sales/questions/sex_registered_at_birth1.rb b/app/models/form/sales/questions/sex_registered_at_birth1.rb index f6b219d74..a1a659753 100644 --- a/app/models/form/sales/questions/sex_registered_at_birth1.rb +++ b/app/models/form/sales/questions/sex_registered_at_birth1.rb @@ -3,7 +3,7 @@ class Form::Sales::Questions::SexRegisteredAtBirth1 < ::Form::Question def initialize(id, hsh, page) super - @id = "sexRAB1" + @id = "sexrab1" @type = "radio" @check_answers_card_number = 1 @answer_options = ANSWER_OPTIONS diff --git a/app/models/form/sales/questions/sex_registered_at_birth2.rb b/app/models/form/sales/questions/sex_registered_at_birth2.rb index 23af640c8..45edb3775 100644 --- a/app/models/form/sales/questions/sex_registered_at_birth2.rb +++ b/app/models/form/sales/questions/sex_registered_at_birth2.rb @@ -3,13 +3,13 @@ class Form::Sales::Questions::SexRegisteredAtBirth2 < ::Form::Question def initialize(id, hsh, page) super - @id = "sexRAB2" + @id = "sexrab2" @type = "radio" - @copy_key = "sales.household_characteristics.sexRAB2.buyer" + @copy_key = "sales.household_characteristics.sexrab2.buyer" @check_answers_card_number = 2 @inferred_check_answers_value = [{ "condition" => { - "sexRAB2" => "R", + "sexrab2" => "R", }, "value" => "Buyer prefers not to say", }] diff --git a/app/services/csv/sales_log_csv_service.rb b/app/services/csv/sales_log_csv_service.rb index b5291b0f9..ed16653f1 100644 --- a/app/services/csv/sales_log_csv_service.rb +++ b/app/services/csv/sales_log_csv_service.rb @@ -114,7 +114,7 @@ module Csv hash["age1"] = { "refused_code" => "-9", "refused_label" => "Not known", "age_known_field" => "age1_known" } (2..6).each do |i| hash["age#{i}"] = { "refused_code" => "-9", "refused_label" => "Not known", "details_known_field" => "details_known_#{i}", "age_known_field" => "age#{i}_known" } - hash["sexRAB#{i}"] = { "refused_code" => "R", "refused_label" => "Prefers not to say", "details_known_field" => "details_known_#{i}" } + hash["sexrab#{i}"] = { "refused_code" => "R", "refused_label" => "Prefers not to say", "details_known_field" => "details_known_#{i}" } hash["sex#{i}"] = { "refused_code" => "R", "refused_label" => "Prefers not to say", "details_known_field" => "details_known_#{i}" } hash["relat#{i}"] = { "refused_code" => "R", "refused_label" => "Prefers not to say", "details_known_field" => "details_known_#{i}" } hash["ecstat#{i}"] = { "refused_code" => "10", "refused_label" => "Prefers not to say", "details_known_field" => "details_known_#{i}" } diff --git a/config/locales/forms/2026/sales/household_characteristics.en.yml b/config/locales/forms/2026/sales/household_characteristics.en.yml index 534ee747a..4bdb07670 100644 --- a/config/locales/forms/2026/sales/household_characteristics.en.yml +++ b/config/locales/forms/2026/sales/household_characteristics.en.yml @@ -16,7 +16,7 @@ en: hint_text: "" question_text: "Age" - sexRAB1: + sexrab1: page_header: "" check_answer_label: "Buyer 1’s sex registered at birth" check_answer_prompt: "" @@ -137,7 +137,7 @@ en: hint_text: "" question_text: "Age" - sexRAB2: + sexrab2: buyer: page_header: "" check_answer_label: "Buyer 2’s sex registered at birth" @@ -287,7 +287,7 @@ en: hint_text: "" question_text: "Age" - sexRAB3: + sexrab3: page_header: "" check_answer_label: "Person 3’s sex registered at birth" check_answer_prompt: "" @@ -335,7 +335,7 @@ en: hint_text: "" question_text: "Age" - sexRAB4: + sexrab4: page_header: "" check_answer_label: "Person 4’s sex registered at birth" check_answer_prompt: "" @@ -383,7 +383,7 @@ en: hint_text: "" question_text: "Age" - sexRAB5: + sexrab5: page_header: "" check_answer_label: "Person 5’s sex registered at birth" check_answer_prompt: "" @@ -431,7 +431,7 @@ en: hint_text: "" question_text: "Age" - sexRAB6: + sexrab6: page_header: "" check_answer_label: "Person 6’s sex registered at birth" check_answer_prompt: "" diff --git a/db/migrate/20260113143404_add_sex_registered_at_birth_to_sales_logs.rb b/db/migrate/20260113143404_add_sex_registered_at_birth_to_sales_logs.rb index c245d1d51..27273b566 100644 --- a/db/migrate/20260113143404_add_sex_registered_at_birth_to_sales_logs.rb +++ b/db/migrate/20260113143404_add_sex_registered_at_birth_to_sales_logs.rb @@ -1,12 +1,12 @@ class AddSexRegisteredAtBirthToSalesLogs < ActiveRecord::Migration[7.2] def change change_table :sales_logs, bulk: true do |t| - t.column :sexRAB1, :string - t.column :sexRAB2, :string - t.column :sexRAB3, :string - t.column :sexRAB4, :string - t.column :sexRAB5, :string - t.column :sexRAB6, :string + t.column :sexrab1, :string + t.column :sexrab2, :string + t.column :sexrab3, :string + t.column :sexrab4, :string + t.column :sexrab5, :string + t.column :sexrab6, :string end end end diff --git a/db/schema.rb b/db/schema.rb index 99b47a365..d8d145162 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -787,12 +787,12 @@ ActiveRecord::Schema[7.2].define(version: 2026_01_13_143404) do t.datetime "lasttransaction" t.datetime "initialpurchase" t.boolean "manual_address_entry_selected", default: false - t.string "sexRAB1" - t.string "sexRAB2" - t.string "sexRAB3" - t.string "sexRAB4" - t.string "sexRAB5" - t.string "sexRAB6" + t.string "sexrab1" + t.string "sexrab2" + t.string "sexrab3" + t.string "sexrab4" + t.string "sexrab5" + t.string "sexrab6" t.index ["assigned_to_id"], name: "index_sales_logs_on_assigned_to_id" t.index ["bulk_upload_id"], name: "index_sales_logs_on_bulk_upload_id" t.index ["created_by_id"], name: "index_sales_logs_on_created_by_id" diff --git a/spec/models/form/sales/pages/person_sex_registered_at_birth_spec.rb b/spec/models/form/sales/pages/person_sex_registered_at_birth_spec.rb index 0885e1d3e..fa116818c 100644 --- a/spec/models/form/sales/pages/person_sex_registered_at_birth_spec.rb +++ b/spec/models/form/sales/pages/person_sex_registered_at_birth_spec.rb @@ -22,7 +22,7 @@ RSpec.describe Form::Sales::Pages::PersonSexRegisteredAtBirth, type: :model do let(:page_id) { "person_2_sex_registered_at_birth" } it "has correct questions" do - expect(page.questions.map(&:id)).to eq(%w[sexRAB2]) + expect(page.questions.map(&:id)).to eq(%w[sexrab2]) end it "has the correct id" do @@ -39,7 +39,7 @@ RSpec.describe Form::Sales::Pages::PersonSexRegisteredAtBirth, type: :model do let(:page_id) { "person_3_sex_registered_at_birth" } it "has correct questions" do - expect(page.questions.map(&:id)).to eq(%w[sexRAB3]) + expect(page.questions.map(&:id)).to eq(%w[sexrab3]) end it "has the correct id" do @@ -56,7 +56,7 @@ RSpec.describe Form::Sales::Pages::PersonSexRegisteredAtBirth, type: :model do let(:page_id) { "person_4_sex_registered_at_birth" } it "has correct questions" do - expect(page.questions.map(&:id)).to eq(%w[sexRAB4]) + expect(page.questions.map(&:id)).to eq(%w[sexrab4]) end it "has the correct id" do @@ -73,7 +73,7 @@ RSpec.describe Form::Sales::Pages::PersonSexRegisteredAtBirth, type: :model do let(:page_id) { "person_5_sex_registered_at_birth" } it "has correct questions" do - expect(page.questions.map(&:id)).to eq(%w[sexRAB5]) + expect(page.questions.map(&:id)).to eq(%w[sexrab5]) end it "has the correct id" do @@ -90,7 +90,7 @@ RSpec.describe Form::Sales::Pages::PersonSexRegisteredAtBirth, type: :model do let(:page_id) { "person_6_sex_registered_at_birth" } it "has correct questions" do - expect(page.questions.map(&:id)).to eq(%w[sexRAB6]) + expect(page.questions.map(&:id)).to eq(%w[sexrab6]) end it "has the correct id" do diff --git a/spec/models/form/sales/pages/sex_registered_at_birth1_spec.rb b/spec/models/form/sales/pages/sex_registered_at_birth1_spec.rb index 2339a1064..da020aa91 100644 --- a/spec/models/form/sales/pages/sex_registered_at_birth1_spec.rb +++ b/spec/models/form/sales/pages/sex_registered_at_birth1_spec.rb @@ -12,7 +12,7 @@ RSpec.describe Form::Sales::Pages::SexRegisteredAtBirth1, type: :model do end it "has correct questions" do - expect(page.questions.map(&:id)).to eq(%w[sexRAB1]) + expect(page.questions.map(&:id)).to eq(%w[sexrab1]) end it "has the correct id" do diff --git a/spec/models/form/sales/pages/sex_registered_at_birth2_spec.rb b/spec/models/form/sales/pages/sex_registered_at_birth2_spec.rb index cb1a20cdd..d120c6e23 100644 --- a/spec/models/form/sales/pages/sex_registered_at_birth2_spec.rb +++ b/spec/models/form/sales/pages/sex_registered_at_birth2_spec.rb @@ -12,7 +12,7 @@ RSpec.describe Form::Sales::Pages::SexRegisteredAtBirth2, type: :model do end it "has correct questions" do - expect(page.questions.map(&:id)).to eq(%w[sexRAB2]) + expect(page.questions.map(&:id)).to eq(%w[sexrab2]) end it "has the correct id" do diff --git a/spec/models/form/sales/questions/person_sex_registered_at_birth_spec.rb b/spec/models/form/sales/questions/person_sex_registered_at_birth_spec.rb index 804a390c2..2f51fa8c4 100644 --- a/spec/models/form/sales/questions/person_sex_registered_at_birth_spec.rb +++ b/spec/models/form/sales/questions/person_sex_registered_at_birth_spec.rb @@ -3,7 +3,7 @@ require "rails_helper" RSpec.describe Form::Sales::Questions::PersonSexRegisteredAtBirth, type: :model do subject(:question) { described_class.new(question_id, question_definition, page, person_index:) } - let(:question_id) { "sexRAB2" } + let(:question_id) { "sexrab2" } let(:question_definition) { nil } let(:page) { instance_double(Form::Page) } let(:person_index) { 2 } @@ -37,11 +37,11 @@ RSpec.describe Form::Sales::Questions::PersonSexRegisteredAtBirth, type: :model end context "when person 2" do - let(:question_id) { "sexRAB2" } + let(:question_id) { "sexrab2" } let(:person_index) { 2 } it "has the correct id" do - expect(question.id).to eq("sexRAB2") + expect(question.id).to eq("sexrab2") end it "has expected check answers card number" do @@ -50,17 +50,17 @@ RSpec.describe Form::Sales::Questions::PersonSexRegisteredAtBirth, type: :model it "has the correct inferred_check_answers_value" do expect(question.inferred_check_answers_value).to eq([ - { "condition" => { "sexRAB2" => "R" }, "value" => "Person prefers not to say" }, + { "condition" => { "sexrab2" => "R" }, "value" => "Person prefers not to say" }, ]) end end context "when person 3" do - let(:question_id) { "sexRAB3" } + let(:question_id) { "sexrab3" } let(:person_index) { 3 } it "has the correct id" do - expect(question.id).to eq("sexRAB3") + expect(question.id).to eq("sexrab3") end it "has expected check answers card number" do @@ -69,17 +69,17 @@ RSpec.describe Form::Sales::Questions::PersonSexRegisteredAtBirth, type: :model it "has the correct inferred_check_answers_value" do expect(question.inferred_check_answers_value).to eq([ - { "condition" => { "sexRAB3" => "R" }, "value" => "Person prefers not to say" }, + { "condition" => { "sexrab3" => "R" }, "value" => "Person prefers not to say" }, ]) end end context "when person 4" do - let(:question_id) { "sexRAB4" } + let(:question_id) { "sexrab4" } let(:person_index) { 4 } it "has the correct id" do - expect(question.id).to eq("sexRAB4") + expect(question.id).to eq("sexrab4") end it "has expected check answers card number" do @@ -88,17 +88,17 @@ RSpec.describe Form::Sales::Questions::PersonSexRegisteredAtBirth, type: :model it "has the correct inferred_check_answers_value" do expect(question.inferred_check_answers_value).to eq([ - { "condition" => { "sexRAB4" => "R" }, "value" => "Person prefers not to say" }, + { "condition" => { "sexrab4" => "R" }, "value" => "Person prefers not to say" }, ]) end end context "when person 5" do - let(:question_id) { "sexRAB5" } + let(:question_id) { "sexrab5" } let(:person_index) { 5 } it "has the correct id" do - expect(question.id).to eq("sexRAB5") + expect(question.id).to eq("sexrab5") end it "has expected check answers card number" do @@ -107,17 +107,17 @@ RSpec.describe Form::Sales::Questions::PersonSexRegisteredAtBirth, type: :model it "has the correct inferred_check_answers_value" do expect(question.inferred_check_answers_value).to eq([ - { "condition" => { "sexRAB5" => "R" }, "value" => "Person prefers not to say" }, + { "condition" => { "sexrab5" => "R" }, "value" => "Person prefers not to say" }, ]) end end context "when person 6" do - let(:question_id) { "sexRAB6" } + let(:question_id) { "sexrab6" } let(:person_index) { 6 } it "has the correct id" do - expect(question.id).to eq("sexRAB6") + expect(question.id).to eq("sexrab6") end it "has expected check answers card number" do @@ -126,7 +126,7 @@ RSpec.describe Form::Sales::Questions::PersonSexRegisteredAtBirth, type: :model it "has the correct inferred_check_answers_value" do expect(question.inferred_check_answers_value).to eq([ - { "condition" => { "sexRAB6" => "R" }, "value" => "Person prefers not to say" }, + { "condition" => { "sexrab6" => "R" }, "value" => "Person prefers not to say" }, ]) end end diff --git a/spec/models/form/sales/questions/sex_registered_at_birth1_spec.rb b/spec/models/form/sales/questions/sex_registered_at_birth1_spec.rb index b6e0a216f..0b3661ad6 100644 --- a/spec/models/form/sales/questions/sex_registered_at_birth1_spec.rb +++ b/spec/models/form/sales/questions/sex_registered_at_birth1_spec.rb @@ -19,7 +19,7 @@ RSpec.describe Form::Sales::Questions::SexRegisteredAtBirth1, type: :model do end it "has the correct id" do - expect(question.id).to eq("sexRAB1") + expect(question.id).to eq("sexrab1") end it "has the correct type" do diff --git a/spec/models/form/sales/questions/sex_registered_at_birth2_spec.rb b/spec/models/form/sales/questions/sex_registered_at_birth2_spec.rb index bad96fc20..ed0d0bc61 100644 --- a/spec/models/form/sales/questions/sex_registered_at_birth2_spec.rb +++ b/spec/models/form/sales/questions/sex_registered_at_birth2_spec.rb @@ -19,7 +19,7 @@ RSpec.describe Form::Sales::Questions::SexRegisteredAtBirth2, type: :model do end it "has the correct id" do - expect(question.id).to eq("sexRAB2") + expect(question.id).to eq("sexrab2") end it "has the correct type" do @@ -45,7 +45,7 @@ RSpec.describe Form::Sales::Questions::SexRegisteredAtBirth2, type: :model do it "has the correct inferred_check_answers_value" do expect(question.inferred_check_answers_value).to eq([ - { "condition" => { "sexRAB2" => "R" }, "value" => "Buyer prefers not to say" }, + { "condition" => { "sexrab2" => "R" }, "value" => "Buyer prefers not to say" }, ]) end end From e49fc4be6f9b5ec6dc9d1d836355f823949d902a Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Tue, 20 Jan 2026 16:46:02 +0000 Subject: [PATCH 13/20] CLDC-4177: Satisfy bulk upload tests (not tested manually) --- .../bulk_upload/sales/year2026/row_parser.rb | 30 +++++++++++++++++++ .../sales/year2026/row_parser_spec.rb | 4 ++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/app/services/bulk_upload/sales/year2026/row_parser.rb b/app/services/bulk_upload/sales/year2026/row_parser.rb index 1010296f6..03aed9abf 100644 --- a/app/services/bulk_upload/sales/year2026/row_parser.rb +++ b/app/services/bulk_upload/sales/year2026/row_parser.rb @@ -135,6 +135,13 @@ class BulkUpload::Sales::Year2026::RowParser field_119: "Does this include any extra borrowing?", field_120: "How much was the cash deposit paid on the property?", field_121: "What are the total monthly leasehold charges for the property?", + + field_122: "Buyer 1's sex, as registered at birth", + field_123: "Buyer 2's sex, as registered at birth", + field_124: "Person 3's sex, as registered at birth", + field_125: "Person 4's sex, as registered at birth", + field_126: "Person 5's sex, as registered at birth", + field_127: "Person 6's sex, as registered at birth", }.freeze ERROR_BASE_KEY = "validations.sales.2026.bulk_upload".freeze @@ -275,6 +282,13 @@ class BulkUpload::Sales::Year2026::RowParser attribute :field_120, :decimal attribute :field_121, :decimal + attribute :field_122, :string + attribute :field_123, :string + attribute :field_124, :string + attribute :field_125, :string + attribute :field_126, :string + attribute :field_127, :string + validates :field_1, presence: { message: I18n.t("#{ERROR_BASE_KEY}.not_answered", question: "sale completion date (day)."), @@ -513,6 +527,7 @@ class BulkUpload::Sales::Year2026::RowParser "field_22", # postcode "field_28", # age1 "field_29", # sex1 + "field_122", #sexRAB1 "field_32", # ecstat1 ) end @@ -780,6 +795,12 @@ private lasttransaction: %i[field_104 field_105 field_106], initialpurchase: %i[field_100 field_101 field_102], + sexRAB1: %i[field_122], + sexRAB2: %i[field_123], + sexRAB3: %i[field_124], + sexRAB4: %i[field_125], + sexRAB5: %i[field_126], + sexRAB6: %i[field_127], } end @@ -815,6 +836,13 @@ private attributes["sex5"] = field_52 attributes["sex6"] = field_56 + attributes["sexRAB1"] = field_122 + attributes["sexRAB2"] = field_123 + attributes["sexRAB3"] = field_124 + attributes["sexRAB4"] = field_125 + attributes["sexRAB5"] = field_126 + attributes["sexRAB6"] = field_127 + attributes["relat2"] = relationship_from_is_partner(field_34) attributes["relat3"] = relationship_from_is_partner(field_42) attributes["relat4"] = relationship_from_is_partner(field_46) @@ -1241,6 +1269,7 @@ private %w[ saledate age1 + sexRAB1 sex1 ecstat1 owning_organisation @@ -1419,6 +1448,7 @@ private errors.add(:field_22, error_message) # Postcode errors.add(:field_28, error_message) # Buyer 1 age errors.add(:field_29, error_message) # Buyer 1 gender + errors.add(:field_122, error_message) # Buyer 1 sex registered at birth errors.add(:field_32, error_message) # Buyer 1 working situation errors.add(:field_7, error_message) # Purchaser code 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 d424a5c25..81b2d366c 100644 --- a/spec/services/bulk_upload/sales/year2026/row_parser_spec.rb +++ b/spec/services/bulk_upload/sales/year2026/row_parser_spec.rb @@ -112,6 +112,8 @@ RSpec.describe BulkUpload::Sales::Year2026::RowParser do field_105: "07", field_106: "2023", field_110: "900", + field_122: "F", + field_123: "F", } end @@ -1432,7 +1434,7 @@ RSpec.describe BulkUpload::Sales::Year2026::RowParser do let(:attributes) { { bulk_upload: } } before do - build(:sales_log, owning_organisation: nil, saledate: nil, purchid: nil, age1: nil, sex1: nil, ecstat1: nil).save(validate: false) + build(:sales_log, owning_organisation: nil, saledate: nil, purchid: nil, age1: nil, sexRAB1: nil, sex1: nil, ecstat1: nil).save(validate: false) end it "does not add duplicate logs validation to the blank row" do From 3f0ea6b08c211f6af2219ba2cda170b56fd5d67f Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Fri, 23 Jan 2026 10:52:35 +0000 Subject: [PATCH 14/20] CLDC-4177: Rename new fields to lowercase --- .../bulk_upload/sales/year2026/row_parser.rb | 28 +++++++++---------- .../sales/year2026/row_parser_spec.rb | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/services/bulk_upload/sales/year2026/row_parser.rb b/app/services/bulk_upload/sales/year2026/row_parser.rb index 03aed9abf..9b863df8c 100644 --- a/app/services/bulk_upload/sales/year2026/row_parser.rb +++ b/app/services/bulk_upload/sales/year2026/row_parser.rb @@ -527,7 +527,7 @@ class BulkUpload::Sales::Year2026::RowParser "field_22", # postcode "field_28", # age1 "field_29", # sex1 - "field_122", #sexRAB1 + "field_122", # sexrab1 "field_32", # ecstat1 ) end @@ -795,12 +795,12 @@ private lasttransaction: %i[field_104 field_105 field_106], initialpurchase: %i[field_100 field_101 field_102], - sexRAB1: %i[field_122], - sexRAB2: %i[field_123], - sexRAB3: %i[field_124], - sexRAB4: %i[field_125], - sexRAB5: %i[field_126], - sexRAB6: %i[field_127], + sexrab1: %i[field_122], + sexrab2: %i[field_123], + sexrab3: %i[field_124], + sexrab4: %i[field_125], + sexrab5: %i[field_126], + sexrab6: %i[field_127], } end @@ -836,12 +836,12 @@ private attributes["sex5"] = field_52 attributes["sex6"] = field_56 - attributes["sexRAB1"] = field_122 - attributes["sexRAB2"] = field_123 - attributes["sexRAB3"] = field_124 - attributes["sexRAB4"] = field_125 - attributes["sexRAB5"] = field_126 - attributes["sexRAB6"] = field_127 + attributes["sexrab1"] = field_122 + attributes["sexrab2"] = field_123 + attributes["sexrab3"] = field_124 + attributes["sexrab4"] = field_125 + attributes["sexrab5"] = field_126 + attributes["sexrab6"] = field_127 attributes["relat2"] = relationship_from_is_partner(field_34) attributes["relat3"] = relationship_from_is_partner(field_42) @@ -1269,7 +1269,7 @@ private %w[ saledate age1 - sexRAB1 + sexrab1 sex1 ecstat1 owning_organisation 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 81b2d366c..0bf0ce26b 100644 --- a/spec/services/bulk_upload/sales/year2026/row_parser_spec.rb +++ b/spec/services/bulk_upload/sales/year2026/row_parser_spec.rb @@ -1434,7 +1434,7 @@ RSpec.describe BulkUpload::Sales::Year2026::RowParser do let(:attributes) { { bulk_upload: } } before do - build(:sales_log, owning_organisation: nil, saledate: nil, purchid: nil, age1: nil, sexRAB1: nil, sex1: nil, ecstat1: nil).save(validate: false) + build(:sales_log, owning_organisation: nil, saledate: nil, purchid: nil, age1: nil, sexrab1: nil, sex1: nil, ecstat1: nil).save(validate: false) end it "does not add duplicate logs validation to the blank row" do From e0fea01724cdac507bdf2824d67aa16b3f7a5ef6 Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Tue, 27 Jan 2026 15:01:24 +0000 Subject: [PATCH 15/20] CLDC-4177: Rename field in bulk upload. --- app/services/bulk_upload/sales/year2026/row_parser.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/bulk_upload/sales/year2026/row_parser.rb b/app/services/bulk_upload/sales/year2026/row_parser.rb index 9b863df8c..8e3e2936c 100644 --- a/app/services/bulk_upload/sales/year2026/row_parser.rb +++ b/app/services/bulk_upload/sales/year2026/row_parser.rb @@ -137,7 +137,7 @@ class BulkUpload::Sales::Year2026::RowParser field_121: "What are the total monthly leasehold charges for the property?", field_122: "Buyer 1's sex, as registered at birth", - field_123: "Buyer 2's sex, as registered at birth", + field_123: "Buyer/Person 2's sex, as registered at birth", field_124: "Person 3's sex, as registered at birth", field_125: "Person 4's sex, as registered at birth", field_126: "Person 5's sex, as registered at birth", From 60aaf4212972458b56ee48e3a665d3a8d83e1785 Mon Sep 17 00:00:00 2001 From: oscar-richardson-softwire Date: Tue, 3 Feb 2026 14:28:28 +0000 Subject: [PATCH 16/20] Fix db casing --- ...0203142107_enforce_lowercase_for_sex_rab_columns.rb | 10 ++++++++++ db/schema.rb | 5 ++++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20260203142107_enforce_lowercase_for_sex_rab_columns.rb diff --git a/db/migrate/20260203142107_enforce_lowercase_for_sex_rab_columns.rb b/db/migrate/20260203142107_enforce_lowercase_for_sex_rab_columns.rb new file mode 100644 index 000000000..7d2fb4e3e --- /dev/null +++ b/db/migrate/20260203142107_enforce_lowercase_for_sex_rab_columns.rb @@ -0,0 +1,10 @@ +class EnforceLowercaseForSexRabColumns < ActiveRecord::Migration[7.2] + def change + rename_column :sales_logs, :"sexRAB1", :sexrab1 + rename_column :sales_logs, :"sexRAB2", :sexrab2 + rename_column :sales_logs, :"sexRAB3", :sexrab3 + rename_column :sales_logs, :"sexRAB4", :sexrab4 + rename_column :sales_logs, :"sexRAB5", :sexrab5 + rename_column :sales_logs, :"sexRAB6", :sexrab6 + end +end diff --git a/db/schema.rb b/db/schema.rb index d8d145162..eba2bb08e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.2].define(version: 2026_01_13_143404) do +ActiveRecord::Schema[7.2].define(version: 2026_02_03_142107) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -375,6 +375,9 @@ ActiveRecord::Schema[7.2].define(version: 2026_01_13_143404) do t.bigint "created_by_id" t.boolean "manual_address_entry_selected", default: false t.integer "referral_type" + t.integer "referral_register" + t.integer "referral_noms" + t.integer "referral_org" t.index ["assigned_to_id"], name: "index_lettings_logs_on_assigned_to_id" t.index ["bulk_upload_id"], name: "index_lettings_logs_on_bulk_upload_id" t.index ["created_by_id"], name: "index_lettings_logs_on_created_by_id" From 66456344c1e105995c6befc5959beddbabdbd511 Mon Sep 17 00:00:00 2001 From: Nat Dean-Lewis Date: Wed, 4 Feb 2026 11:04:57 +0000 Subject: [PATCH 17/20] CLDC-4177: remove frozen string literals --- app/models/form/sales/pages/person_sex_registered_at_birth.rb | 2 -- app/models/form/sales/pages/sex_registered_at_birth1.rb | 2 -- app/models/form/sales/pages/sex_registered_at_birth2.rb | 2 -- .../form/sales/questions/person_sex_registered_at_birth.rb | 2 -- app/models/form/sales/questions/sex_registered_at_birth1.rb | 2 -- app/models/form/sales/questions/sex_registered_at_birth2.rb | 2 -- 6 files changed, 12 deletions(-) diff --git a/app/models/form/sales/pages/person_sex_registered_at_birth.rb b/app/models/form/sales/pages/person_sex_registered_at_birth.rb index 807afe9b0..b2ea1da20 100644 --- a/app/models/form/sales/pages/person_sex_registered_at_birth.rb +++ b/app/models/form/sales/pages/person_sex_registered_at_birth.rb @@ -1,5 +1,3 @@ -# frozen_string_literal: true - class Form::Sales::Pages::PersonSexRegisteredAtBirth < ::Form::Page def initialize(id, hsh, subsection, person_index:) super(id, hsh, subsection) diff --git a/app/models/form/sales/pages/sex_registered_at_birth1.rb b/app/models/form/sales/pages/sex_registered_at_birth1.rb index 0990f3932..4e6f012a9 100644 --- a/app/models/form/sales/pages/sex_registered_at_birth1.rb +++ b/app/models/form/sales/pages/sex_registered_at_birth1.rb @@ -1,5 +1,3 @@ -# frozen_string_literal: true - class Form::Sales::Pages::SexRegisteredAtBirth1 < ::Form::Page def initialize(id, hsh, subsection) super diff --git a/app/models/form/sales/pages/sex_registered_at_birth2.rb b/app/models/form/sales/pages/sex_registered_at_birth2.rb index 74cf4034c..49ce339c4 100644 --- a/app/models/form/sales/pages/sex_registered_at_birth2.rb +++ b/app/models/form/sales/pages/sex_registered_at_birth2.rb @@ -1,5 +1,3 @@ -# frozen_string_literal: true - class Form::Sales::Pages::SexRegisteredAtBirth2 < ::Form::Page def initialize(id, hsh, subsection) super diff --git a/app/models/form/sales/questions/person_sex_registered_at_birth.rb b/app/models/form/sales/questions/person_sex_registered_at_birth.rb index fdc5ce3db..86bef9acd 100644 --- a/app/models/form/sales/questions/person_sex_registered_at_birth.rb +++ b/app/models/form/sales/questions/person_sex_registered_at_birth.rb @@ -1,5 +1,3 @@ -# frozen_string_literal: true - class Form::Sales::Questions::PersonSexRegisteredAtBirth < ::Form::Question def initialize(id, hsh, page, person_index:) super(id, hsh, page) diff --git a/app/models/form/sales/questions/sex_registered_at_birth1.rb b/app/models/form/sales/questions/sex_registered_at_birth1.rb index a1a659753..77a8e3fc3 100644 --- a/app/models/form/sales/questions/sex_registered_at_birth1.rb +++ b/app/models/form/sales/questions/sex_registered_at_birth1.rb @@ -1,5 +1,3 @@ -# frozen_string_literal: true - class Form::Sales::Questions::SexRegisteredAtBirth1 < ::Form::Question def initialize(id, hsh, page) super diff --git a/app/models/form/sales/questions/sex_registered_at_birth2.rb b/app/models/form/sales/questions/sex_registered_at_birth2.rb index 45edb3775..9a26d527a 100644 --- a/app/models/form/sales/questions/sex_registered_at_birth2.rb +++ b/app/models/form/sales/questions/sex_registered_at_birth2.rb @@ -1,5 +1,3 @@ -# frozen_string_literal: true - class Form::Sales::Questions::SexRegisteredAtBirth2 < ::Form::Question def initialize(id, hsh, page) super From d1a848bf398f7e0b09f17ae19d95fe6ee43e0f8b Mon Sep 17 00:00:00 2001 From: oscar-richardson-softwire Date: Wed, 4 Feb 2026 11:12:15 +0000 Subject: [PATCH 18/20] Delete redundant migration --- ...0203142107_enforce_lowercase_for_sex_rab_columns.rb | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 db/migrate/20260203142107_enforce_lowercase_for_sex_rab_columns.rb diff --git a/db/migrate/20260203142107_enforce_lowercase_for_sex_rab_columns.rb b/db/migrate/20260203142107_enforce_lowercase_for_sex_rab_columns.rb deleted file mode 100644 index 7d2fb4e3e..000000000 --- a/db/migrate/20260203142107_enforce_lowercase_for_sex_rab_columns.rb +++ /dev/null @@ -1,10 +0,0 @@ -class EnforceLowercaseForSexRabColumns < ActiveRecord::Migration[7.2] - def change - rename_column :sales_logs, :"sexRAB1", :sexrab1 - rename_column :sales_logs, :"sexRAB2", :sexrab2 - rename_column :sales_logs, :"sexRAB3", :sexrab3 - rename_column :sales_logs, :"sexRAB4", :sexrab4 - rename_column :sales_logs, :"sexRAB5", :sexrab5 - rename_column :sales_logs, :"sexRAB6", :sexrab6 - end -end From 5d0119ffbfb6a59bab3aeabec738e362a6213ddb Mon Sep 17 00:00:00 2001 From: oscar-richardson-softwire Date: Wed, 4 Feb 2026 16:49:05 +0000 Subject: [PATCH 19/20] Remove extraneous lines from schema.rb --- db/schema.rb | 3 --- 1 file changed, 3 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index eba2bb08e..ea914599f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -375,9 +375,6 @@ ActiveRecord::Schema[7.2].define(version: 2026_02_03_142107) do t.bigint "created_by_id" t.boolean "manual_address_entry_selected", default: false t.integer "referral_type" - t.integer "referral_register" - t.integer "referral_noms" - t.integer "referral_org" t.index ["assigned_to_id"], name: "index_lettings_logs_on_assigned_to_id" t.index ["bulk_upload_id"], name: "index_lettings_logs_on_bulk_upload_id" t.index ["created_by_id"], name: "index_lettings_logs_on_created_by_id" From 5342d691795a7a3cc1259cd3a082f13997604d16 Mon Sep 17 00:00:00 2001 From: oscar-richardson-softwire Date: Wed, 4 Feb 2026 16:49:59 +0000 Subject: [PATCH 20/20] Add new sexrab fields to the :completed trait in the Sales Log factory --- spec/factories/sales_log.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spec/factories/sales_log.rb b/spec/factories/sales_log.rb index a2e3f7d4c..7c6762b0d 100644 --- a/spec/factories/sales_log.rb +++ b/spec/factories/sales_log.rb @@ -83,6 +83,7 @@ FactoryBot.define do privacynotice { 1 } age1_known { 0 } age1 { Faker::Number.within(range: 27..45) } + sexrab1 { %w[F M X R].sample } sex1 { %w[F M X R].sample } national { 18 } buy1livein { 1 } @@ -93,6 +94,7 @@ FactoryBot.define do builtype { 1 } ethnic { 3 } ethnic_group { 17 } + sexrab2 { %w[F M X R].sample } sex2 { "X" } buy2livein { "1" } ecstat1 { "1" } @@ -125,9 +127,13 @@ FactoryBot.define do savingsnk { 1 } prevown { 1 } prevshared { 2 } + sexrab3 { %w[F M X R].sample } sex3 { %w[F M X R].sample } + sexrab4 { %w[F M X R].sample } sex4 { %w[F M X R].sample } + sexrab5 { %w[F M X R].sample } sex5 { %w[F M X R].sample } + sexrab6 { %w[F M X R].sample } sex6 { %w[F M X R].sample } mortgage { 20_000 } ecstat3 { 9 }