Browse Source

Merge branch 'main' into CLDC-4119-amend-lettings-duplicate-log-check

pull/3179/head
Samuel Young 1 week ago committed by GitHub
parent
commit
0e6edb6e54
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_lead_age_value_check.rb
  2. 2
      app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check.rb
  3. 2
      app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_lead_value_check.rb
  4. 2
      app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_person_age_value_check.rb
  5. 2
      app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_person_value_check.rb
  6. 2
      app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_value_check.rb
  7. 24
      app/models/form/lettings/pages/no_household_member_likely_to_be_pregnant_check.rb
  8. 25
      app/models/form/lettings/subsections/household_characteristics.rb
  9. 5
      app/models/form/lettings/subsections/household_needs.rb
  10. 91
      app/models/validations/soft_validations.rb
  11. 16
      app/services/bulk_upload/lettings/year2026/row_parser.rb
  12. 36
      config/forms/2021_2022.json
  13. 36
      config/forms/2022_2023.json
  14. 4
      config/locales/forms/2026/lettings/soft_validations.en.yml
  15. 4
      spec/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_person_age_value_check_spec.rb
  16. 4
      spec/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_person_value_check_spec.rb
  17. 51
      spec/models/form/lettings/subsections/household_characteristics_spec.rb
  18. 3
      spec/models/form/lettings/subsections/household_needs_spec.rb
  19. 194
      spec/models/validations/soft_validations_spec.rb
  20. 14
      spec/services/bulk_upload/lettings/year2026/row_parser_spec.rb

2
app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_lead_age_value_check.rb

@ -3,7 +3,7 @@ class Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdLeadAgeValu
super(id, hsh, subsection) super(id, hsh, subsection)
@id = "females_in_soft_age_range_in_pregnant_household_lead_age_value_check" @id = "females_in_soft_age_range_in_pregnant_household_lead_age_value_check"
@copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check" @copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check"
@depends_on = [{ "female_in_pregnant_household_in_soft_validation_range?" => true }] @depends_on = [{ "non_males_in_pregnant_household_not_in_pregnancy_range?" => true }]
@title_text = { @title_text = {
"translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text", "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [], "arguments" => [],

2
app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check.rb

@ -3,7 +3,7 @@ class Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdLeadHhmembV
super(id, hsh, subsection) super(id, hsh, subsection)
@id = "females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check" @id = "females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check"
@copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check" @copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check"
@depends_on = [{ "female_in_pregnant_household_in_soft_validation_range?" => true }] @depends_on = [{ "non_males_in_pregnant_household_not_in_pregnancy_range?" => true }]
@title_text = { @title_text = {
"translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text", "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [], "arguments" => [],

2
app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_lead_value_check.rb

@ -3,7 +3,7 @@ class Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdLeadValueCh
super super
@id = "females_in_soft_age_range_in_pregnant_household_lead_value_check" @id = "females_in_soft_age_range_in_pregnant_household_lead_value_check"
@copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check" @copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check"
@depends_on = [{ "female_in_pregnant_household_in_soft_validation_range?" => true }] @depends_on = [{ "non_males_in_pregnant_household_not_in_pregnancy_range?" => true }]
@title_text = { @title_text = {
"translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text", "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [], "arguments" => [],

2
app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_person_age_value_check.rb

@ -5,7 +5,7 @@ class Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdPersonAgeVa
@copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check" @copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check"
@depends_on = [ @depends_on = [
{ {
"female_in_pregnant_household_in_soft_validation_range?" => true, "non_males_in_pregnant_household_not_in_pregnancy_range?" => true,
"age#{person_index}_known" => 0, "age#{person_index}_known" => 0,
}, },
] ]

2
app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_person_value_check.rb

@ -6,7 +6,7 @@ class Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdPersonValue
@depends_on = [ @depends_on = [
{ {
"female_in_pregnant_household_in_soft_validation_range?" => true, "non_males_in_pregnant_household_not_in_pregnancy_range?" => true,
"details_known_#{person_index}" => 0, "details_known_#{person_index}" => 0,
}, },
] ]

2
app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_value_check.rb

@ -3,7 +3,7 @@ class Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdValueCheck
super super
@id = "females_in_soft_age_range_in_pregnant_household_value_check" @id = "females_in_soft_age_range_in_pregnant_household_value_check"
@copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check" @copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check"
@depends_on = [{ "female_in_pregnant_household_in_soft_validation_range?" => true }] @depends_on = [{ "non_males_in_pregnant_household_not_in_pregnancy_range?" => true }]
@title_text = { @title_text = {
"translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text", "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [], "arguments" => [],

24
app/models/form/lettings/pages/no_household_member_likely_to_be_pregnant_check.rb

@ -0,0 +1,24 @@
class Form::Lettings::Pages::NoHouseholdMemberLikelyToBePregnantCheck < ::Form::Page
def initialize(id, hsh, subsection, person_index: 0)
super(id, hsh, subsection)
@copy_key = "lettings.soft_validations.pregnancy_value_check.no_household_member_likely_to_be_pregnant_check"
@depends_on = [{ "no_household_member_likely_to_be_pregnant?" => true }]
@title_text = {
"translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [],
}
@informative_text = {
"translation" => "forms.#{form.start_date.year}.#{@copy_key}.informative_text",
"arguments" => [],
}
@person_index = person_index
end
def questions
@questions ||= [Form::Lettings::Questions::PregnancyValueCheck.new(nil, nil, self, person_index: @person_index)]
end
def interruption_screen_question_ids
%w[preg_occ age1 sexrab1 gender_same_as_sex1 age2 sexrab2 gender_same_as_sex2 age3 sexrab3 gender_same_as_sex3 age4 sexrab4 gender_same_as_sex4 age5 sexrab5 gender_same_as_sex5 age6 sexrab6 gender_same_as_sex6 age7 sexrab7 gender_same_as_sex7 age8 sexrab8 gender_same_as_sex8]
end
end

25
app/models/form/lettings/subsections/household_characteristics.rb

@ -10,18 +10,21 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
@pages ||= [ @pages ||= [
(Form::Lettings::Pages::Declaration.new(nil, nil, self) unless form.start_year_2024_or_later?), (Form::Lettings::Pages::Declaration.new(nil, nil, self) unless form.start_year_2024_or_later?),
Form::Lettings::Pages::HouseholdMembers.new(nil, nil, self), Form::Lettings::Pages::HouseholdMembers.new(nil, nil, self),
Form::Lettings::Pages::NoFemalesPregnantHouseholdLeadHhmembValueCheck.new(nil, nil, self), (Form::Lettings::Pages::NoFemalesPregnantHouseholdLeadHhmembValueCheck.new(nil, nil, self) unless form.start_year_2026_or_later?),
Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdLeadHhmembValueCheck.new(nil, nil, self), (Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdLeadHhmembValueCheck.new(nil, nil, self) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::NoHouseholdMemberLikelyToBePregnantCheck.new("no_household_member_likely_to_be_pregnant_hhmemb_check", nil, self) if form.start_year_2026_or_later?),
Form::Lettings::Pages::LeadTenantAge.new(nil, nil, self), Form::Lettings::Pages::LeadTenantAge.new(nil, nil, self),
Form::Lettings::Pages::NoFemalesPregnantHouseholdLeadAgeValueCheck.new(nil, nil, self), (Form::Lettings::Pages::NoFemalesPregnantHouseholdLeadAgeValueCheck.new(nil, nil, self) unless form.start_year_2026_or_later?),
Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdLeadAgeValueCheck.new(nil, nil, self), (Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdLeadAgeValueCheck.new(nil, nil, self) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::NoHouseholdMemberLikelyToBePregnantCheck.new("no_household_member_likely_to_be_pregnant_lead_age_check", nil, self) if form.start_year_2026_or_later?),
Form::Lettings::Pages::LeadTenantUnderRetirementValueCheck.new("age_lead_tenant_under_retirement_value_check", nil, self), Form::Lettings::Pages::LeadTenantUnderRetirementValueCheck.new("age_lead_tenant_under_retirement_value_check", nil, self),
Form::Lettings::Pages::LeadTenantOverRetirementValueCheck.new("age_lead_tenant_over_retirement_value_check", nil, self), Form::Lettings::Pages::LeadTenantOverRetirementValueCheck.new("age_lead_tenant_over_retirement_value_check", nil, self),
(Form::Lettings::Pages::LeadTenantSexRegisteredAtBirth.new(nil, nil, self) if form.start_year_2026_or_later?), (Form::Lettings::Pages::LeadTenantSexRegisteredAtBirth.new(nil, nil, self) if form.start_year_2026_or_later?),
(Form::Lettings::Pages::LeadTenantGenderSameAsSex.new(nil, nil, self) if form.start_year_2026_or_later?), (Form::Lettings::Pages::LeadTenantGenderSameAsSex.new(nil, nil, self) if form.start_year_2026_or_later?),
Form::Lettings::Pages::LeadTenantGenderIdentity.new(nil, nil, self), Form::Lettings::Pages::LeadTenantGenderIdentity.new(nil, nil, self),
Form::Lettings::Pages::NoFemalesPregnantHouseholdLeadValueCheck.new(nil, nil, self), (Form::Lettings::Pages::NoFemalesPregnantHouseholdLeadValueCheck.new(nil, nil, self) unless form.start_year_2026_or_later?),
Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdLeadValueCheck.new(nil, nil, self), (Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdLeadValueCheck.new(nil, nil, self) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::NoHouseholdMemberLikelyToBePregnantCheck.new("no_household_member_likely_to_be_pregnant_lead_check", nil, self, person_index: 1) if form.start_year_2026_or_later?),
Form::Lettings::Pages::LeadTenantOverRetirementValueCheck.new("gender_lead_tenant_over_retirement_value_check", nil, self), Form::Lettings::Pages::LeadTenantOverRetirementValueCheck.new("gender_lead_tenant_over_retirement_value_check", nil, self),
Form::Lettings::Pages::LeadTenantEthnicGroup.new(nil, nil, self), Form::Lettings::Pages::LeadTenantEthnicGroup.new(nil, nil, self),
Form::Lettings::Pages::LeadTenantEthnicBackgroundArab.new(nil, nil, self), Form::Lettings::Pages::LeadTenantEthnicBackgroundArab.new(nil, nil, self),
@ -52,16 +55,18 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_#{person_index}_partner_under_16_value_check", nil, self, person_index:) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?), (Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_#{person_index}_partner_under_16_value_check", nil, self, person_index:) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_#{person_index}_multiple_partners_value_check", nil, self, person_index:) if form.start_year_2024_or_later?), (Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_#{person_index}_multiple_partners_value_check", nil, self, person_index:) if form.start_year_2024_or_later?),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index:) unless form.start_year_2026_or_later?), (Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index:) unless form.start_year_2026_or_later?),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonAgeValueCheck.new(nil, nil, self, person_index:), (Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonAgeValueCheck.new(nil, nil, self, person_index:) unless form.start_year_2026_or_later?),
Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdPersonAgeValueCheck.new(nil, nil, self, person_index:), (Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdPersonAgeValueCheck.new(nil, nil, self, person_index:) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::NoHouseholdMemberLikelyToBePregnantCheck.new("no_household_member_likely_to_be_pregnant_person_age_#{person_index}_check", nil, self, person_index:) if form.start_year_2026_or_later?),
Form::Lettings::Pages::PersonUnderRetirementValueCheck.new("age_#{person_index}_under_retirement_value_check", nil, self, person_index:), Form::Lettings::Pages::PersonUnderRetirementValueCheck.new("age_#{person_index}_under_retirement_value_check", nil, self, person_index:),
Form::Lettings::Pages::PersonOverRetirementValueCheck.new("age_#{person_index}_over_retirement_value_check", nil, self, person_index:), Form::Lettings::Pages::PersonOverRetirementValueCheck.new("age_#{person_index}_over_retirement_value_check", nil, self, person_index:),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_#{person_index}_partner_under_16_value_check", nil, self, person_index:) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?), (Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_#{person_index}_partner_under_16_value_check", nil, self, person_index:) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonSexRegisteredAtBirth.new(nil, nil, self, person_index:) if form.start_year_2026_or_later?), (Form::Lettings::Pages::PersonSexRegisteredAtBirth.new(nil, nil, self, person_index:) if form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonGenderSameAsSex.new(nil, nil, self, person_index:) if form.start_year_2026_or_later?), (Form::Lettings::Pages::PersonGenderSameAsSex.new(nil, nil, self, person_index:) if form.start_year_2026_or_later?),
Form::Lettings::Pages::PersonGenderIdentity.new(nil, nil, self, person_index:), Form::Lettings::Pages::PersonGenderIdentity.new(nil, nil, self, person_index:),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonValueCheck.new(nil, nil, self, person_index:), (Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonValueCheck.new(nil, nil, self, person_index:) unless form.start_year_2026_or_later?),
Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdPersonValueCheck.new(nil, nil, self, person_index:), (Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdPersonValueCheck.new(nil, nil, self, person_index:) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::NoHouseholdMemberLikelyToBePregnantCheck.new("no_household_member_likely_to_be_pregnant_person_#{person_index}_check", nil, self, person_index:) if form.start_year_2026_or_later?),
Form::Lettings::Pages::PersonOverRetirementValueCheck.new("gender_#{person_index}_over_retirement_value_check", nil, self, person_index:), Form::Lettings::Pages::PersonOverRetirementValueCheck.new("gender_#{person_index}_over_retirement_value_check", nil, self, person_index:),
Form::Lettings::Pages::PersonWorkingSituation.new(nil, nil, self, person_index:), Form::Lettings::Pages::PersonWorkingSituation.new(nil, nil, self, person_index:),
Form::Lettings::Pages::PersonUnderRetirementValueCheck.new("working_situation_#{person_index}_under_retirement_value_check", nil, self, person_index:), Form::Lettings::Pages::PersonUnderRetirementValueCheck.new("working_situation_#{person_index}_under_retirement_value_check", nil, self, person_index:),

5
app/models/form/lettings/subsections/household_needs.rb

@ -12,8 +12,9 @@ class Form::Lettings::Subsections::HouseholdNeeds < ::Form::Subsection
Form::Lettings::Pages::ArmedForcesServing.new(nil, nil, self), Form::Lettings::Pages::ArmedForcesServing.new(nil, nil, self),
Form::Lettings::Pages::ArmedForcesInjured.new(nil, nil, self), Form::Lettings::Pages::ArmedForcesInjured.new(nil, nil, self),
Form::Lettings::Pages::Pregnant.new("pregnant", nil, self), Form::Lettings::Pages::Pregnant.new("pregnant", nil, self),
Form::Lettings::Pages::NoFemalesPregnantHouseholdValueCheck.new(nil, nil, self), (Form::Lettings::Pages::NoFemalesPregnantHouseholdValueCheck.new(nil, nil, self) unless form.start_year_2026_or_later?),
Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdValueCheck.new(nil, nil, self), (Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdValueCheck.new(nil, nil, self) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::NoHouseholdMemberLikelyToBePregnantCheck.new("no_household_member_likely_to_be_pregnant_check", nil, self) if form.start_year_2026_or_later?),
Form::Lettings::Pages::AccessNeedsExist.new("access_needs_exist", nil, self), Form::Lettings::Pages::AccessNeedsExist.new("access_needs_exist", nil, self),
Form::Lettings::Pages::TypeOfAccessNeeds.new(nil, nil, self), Form::Lettings::Pages::TypeOfAccessNeeds.new(nil, nil, self),
Form::Lettings::Pages::HealthConditions.new("health_conditions", nil, self), Form::Lettings::Pages::HealthConditions.new("health_conditions", nil, self),

91
app/models/validations/soft_validations.rb

@ -75,30 +75,16 @@ module Validations::SoftValidations
end end
end end
def all_male_tenants_in_a_pregnant_household? def no_household_member_likely_to_be_pregnant?
all_male_tenants_in_the_household? && all_tenants_gender_information_completed? && preg_occ == 1 all_male_tenants_in_a_pregnant_household? || non_males_in_pregnant_household_not_in_pregnancy_range?
end end
def female_in_pregnant_household_in_soft_validation_range? def all_male_tenants_in_a_pregnant_household?
all_tenants_age_and_gender_information_completed? && females_in_the_household? && !females_in_age_range(16, 50) && preg_occ == 1 all_tenants_gender_information_completed? && all_male_tenants_in_the_household? && preg_occ == 1
end end
def all_tenants_age_and_gender_information_completed? def non_males_in_pregnant_household_not_in_pregnancy_range?
return false if hhmemb.present? && hhmemb > 8 all_tenants_age_and_gender_information_completed? && non_males_in_the_household? && !any_non_male_in_expected_pregnancy_age_range(16, 50) && preg_occ == 1
person_count = hhmemb || 8
(1..person_count).all? do |n|
public_send("sex#{n}").present? && public_send("age#{n}").present? && details_known_or_lead_tenant?(n) && public_send("age#{n}_known").present? && public_send("age#{n}_known").zero?
end
end
def all_tenants_gender_information_completed?
person_count = hhmemb || 8
(1..person_count).all? do |n|
public_send("sex#{n}").present? && details_known_or_lead_tenant?(n)
end
end end
TWO_YEARS_IN_DAYS = 730 TWO_YEARS_IN_DAYS = 730
@ -221,25 +207,54 @@ module Validations::SoftValidations
private private
def all_tenants_age_and_gender_information_completed?
return false if hhmemb.present? && hhmemb > 8
return false unless all_tenants_gender_information_completed?
person_count = hhmemb || 8
(1..person_count).all? do |n|
public_send("age#{n}").present? && public_send("age#{n}_known").present? && public_send("age#{n}_known").zero?
end
end
def all_tenants_gender_information_completed?
return false if hhmemb.present? && hhmemb > 8
person_count = hhmemb || 8
(1..person_count).all? do |n|
tenant_gender_information_completed?(n)
end
end
def tenant_gender_information_completed?(tenant_number)
if form.start_year_2026_or_later?
public_send("sexrab#{tenant_number}").present? && public_send("gender_same_as_sex#{tenant_number}").present? && details_known_or_lead_tenant?(tenant_number)
else
public_send("sex#{tenant_number}").present? && details_known_or_lead_tenant?(tenant_number)
end
end
def details_known_or_lead_tenant?(tenant_number) def details_known_or_lead_tenant?(tenant_number)
return true if tenant_number == 1 return true if tenant_number == 1
public_send("details_known_#{tenant_number}").zero? public_send("details_known_#{tenant_number}").zero?
end end
def females_in_age_range(min, max) def any_non_male_in_expected_pregnancy_age_range(min, max)
person_count = hhmemb || 8 person_count = hhmemb || 8
(1..person_count).any? do |n| (1..person_count).any? do |n|
public_send("sex#{n}") == "F" && public_send("age#{n}").present? && public_send("age#{n}").between?(min, max) person_in_expected_pregnancy_age_range(n, min, max) && person_is_non_male(n)
end end
end end
def females_in_the_household? def non_males_in_the_household?
person_count = hhmemb || 8 person_count = hhmemb || 8
(1..person_count).any? do |n| (1..person_count).any? do |n|
public_send("sex#{n}") == "F" || public_send("sex#{n}").nil? person_is_non_male(n)
end end
end end
@ -249,10 +264,36 @@ private
person_count = hhmemb || 8 person_count = hhmemb || 8
(1..person_count).all? do |n| (1..person_count).all? do |n|
public_send("sex#{n}") == "M" person_is_male(n)
end end
end end
def person_is_male(person_number)
if form.start_year_2026_or_later?
sexrab = public_send("sexrab#{person_number}")
gender_same_as_sex = public_send("gender_same_as_sex#{person_number}")
sexrab == "M" && gender_same_as_sex == 1
else
public_send("sex#{person_number}") == "M"
end
end
def person_is_non_male(person_number)
if form.start_year_2026_or_later?
!person_is_male(person_number)
else
# the "non-male" wording was introduced in the 26/27 collection year, before that this behavior was limited to female gender only
public_send("sex#{person_number}") == "F"
end
end
def person_in_expected_pregnancy_age_range(person_number, min, max)
age = public_send("age#{person_number}")
age.between?(min, max)
end
def tenant_is_retired?(economic_status) def tenant_is_retired?(economic_status)
economic_status == 5 economic_status == 5
end end

16
app/services/bulk_upload/lettings/year2026/row_parser.rb

@ -1262,6 +1262,22 @@ private
sexrab6: %i[field_135], sexrab6: %i[field_135],
sexrab7: %i[field_136], sexrab7: %i[field_136],
sexrab8: %i[field_137], sexrab8: %i[field_137],
gender_same_as_sex1: %i[field_138],
gender_same_as_sex2: %i[field_140],
gender_same_as_sex3: %i[field_142],
gender_same_as_sex4: %i[field_144],
gender_same_as_sex5: %i[field_146],
gender_same_as_sex6: %i[field_148],
gender_same_as_sex7: %i[field_150],
gender_same_as_sex8: %i[field_152],
gender_description1: %i[field_139],
gender_description2: %i[field_141],
gender_description3: %i[field_143],
gender_description4: %i[field_145],
gender_description5: %i[field_147],
gender_description6: %i[field_149],
gender_description7: %i[field_151],
gender_description8: %i[field_153],
}.compact }.compact
end end

36
config/forms/2021_2022.json

@ -1213,7 +1213,7 @@
"females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check": { "females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true "non_males_in_pregnant_household_not_in_pregnancy_range?": true
} }
], ],
"title_text": { "title_text": {
@ -1355,7 +1355,7 @@
"females_in_soft_age_range_in_pregnant_household_lead_age_value_check": { "females_in_soft_age_range_in_pregnant_household_lead_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true "non_males_in_pregnant_household_not_in_pregnancy_range?": true
} }
], ],
"title_text": { "title_text": {
@ -1476,7 +1476,7 @@
"females_in_soft_age_range_in_pregnant_household_lead_value_check": { "females_in_soft_age_range_in_pregnant_household_lead_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true "non_males_in_pregnant_household_not_in_pregnancy_range?": true
} }
], ],
"title_text": { "title_text": {
@ -2135,7 +2135,7 @@
"females_in_soft_age_range_in_pregnant_household_person_2_age_value_check": { "females_in_soft_age_range_in_pregnant_household_person_2_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"age2_known": 0 "age2_known": 0
} }
], ],
@ -2258,7 +2258,7 @@
"females_in_soft_age_range_in_pregnant_household_person_2_value_check": { "females_in_soft_age_range_in_pregnant_household_person_2_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"details_known_2": 0 "details_known_2": 0
} }
], ],
@ -2670,7 +2670,7 @@
"females_in_soft_age_range_in_pregnant_household_person_3_age_value_check": { "females_in_soft_age_range_in_pregnant_household_person_3_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"age3_known": 0 "age3_known": 0
} }
], ],
@ -2793,7 +2793,7 @@
"females_in_soft_age_range_in_pregnant_household_person_3_value_check": { "females_in_soft_age_range_in_pregnant_household_person_3_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"details_known_3": 0 "details_known_3": 0
} }
], ],
@ -3202,7 +3202,7 @@
"females_in_soft_age_range_in_pregnant_household_person_4_age_value_check": { "females_in_soft_age_range_in_pregnant_household_person_4_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"age4_known": 0 "age4_known": 0
} }
], ],
@ -3325,7 +3325,7 @@
"females_in_soft_age_range_in_pregnant_household_person_4_value_check": { "females_in_soft_age_range_in_pregnant_household_person_4_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"details_known_4": 0 "details_known_4": 0
} }
], ],
@ -3731,7 +3731,7 @@
"females_in_soft_age_range_in_pregnant_household_person_5_age_value_check": { "females_in_soft_age_range_in_pregnant_household_person_5_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"age5_known": 0 "age5_known": 0
} }
], ],
@ -3854,7 +3854,7 @@
"females_in_soft_age_range_in_pregnant_household_person_5_value_check": { "females_in_soft_age_range_in_pregnant_household_person_5_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"details_known_5": 0 "details_known_5": 0
} }
], ],
@ -4257,7 +4257,7 @@
"females_in_soft_age_range_in_pregnant_household_person_6_age_value_check": { "females_in_soft_age_range_in_pregnant_household_person_6_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"age6_known": 0 "age6_known": 0
} }
], ],
@ -4380,7 +4380,7 @@
"females_in_soft_age_range_in_pregnant_household_person_6_value_check": { "females_in_soft_age_range_in_pregnant_household_person_6_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"details_known_6": 0 "details_known_6": 0
} }
], ],
@ -4780,7 +4780,7 @@
"females_in_soft_age_range_in_pregnant_household_person_7_age_value_check": { "females_in_soft_age_range_in_pregnant_household_person_7_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"age7_known": 0 "age7_known": 0
} }
], ],
@ -4903,7 +4903,7 @@
"females_in_soft_age_range_in_pregnant_household_person_7_value_check": { "females_in_soft_age_range_in_pregnant_household_person_7_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"details_known_7": 0 "details_known_7": 0
} }
], ],
@ -5300,7 +5300,7 @@
"females_in_soft_age_range_in_pregnant_household_person_8_age_value_check": { "females_in_soft_age_range_in_pregnant_household_person_8_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"age8_known": 0 "age8_known": 0
} }
], ],
@ -5423,7 +5423,7 @@
"females_in_soft_age_range_in_pregnant_household_person_8_value_check": { "females_in_soft_age_range_in_pregnant_household_person_8_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"details_known_8": 0 "details_known_8": 0
} }
], ],
@ -5837,7 +5837,7 @@
"females_in_soft_age_range_in_pregnant_household_value_check": { "females_in_soft_age_range_in_pregnant_household_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true "non_males_in_pregnant_household_not_in_pregnancy_range?": true
} }
], ],
"title_text": { "title_text": {

36
config/forms/2022_2023.json

@ -1254,7 +1254,7 @@
"females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check": { "females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true "non_males_in_pregnant_household_not_in_pregnancy_range?": true
} }
], ],
"title_text": { "title_text": {
@ -1426,7 +1426,7 @@
"females_in_soft_age_range_in_pregnant_household_lead_age_value_check": { "females_in_soft_age_range_in_pregnant_household_lead_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true "non_males_in_pregnant_household_not_in_pregnancy_range?": true
} }
], ],
"title_text": { "title_text": {
@ -1577,7 +1577,7 @@
"females_in_soft_age_range_in_pregnant_household_lead_value_check": { "females_in_soft_age_range_in_pregnant_household_lead_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true "non_males_in_pregnant_household_not_in_pregnancy_range?": true
} }
], ],
"title_text": { "title_text": {
@ -2218,7 +2218,7 @@
"females_in_soft_age_range_in_pregnant_household_person_2_age_value_check": { "females_in_soft_age_range_in_pregnant_household_person_2_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"age2_known": 0 "age2_known": 0
} }
], ],
@ -2371,7 +2371,7 @@
"females_in_soft_age_range_in_pregnant_household_person_2_value_check": { "females_in_soft_age_range_in_pregnant_household_person_2_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"details_known_2": 0 "details_known_2": 0
} }
], ],
@ -2801,7 +2801,7 @@
"females_in_soft_age_range_in_pregnant_household_person_3_age_value_check": { "females_in_soft_age_range_in_pregnant_household_person_3_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"age3_known": 0 "age3_known": 0
} }
], ],
@ -2954,7 +2954,7 @@
"females_in_soft_age_range_in_pregnant_household_person_3_value_check": { "females_in_soft_age_range_in_pregnant_household_person_3_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"details_known_3": 0 "details_known_3": 0
} }
], ],
@ -3381,7 +3381,7 @@
"females_in_soft_age_range_in_pregnant_household_person_4_age_value_check": { "females_in_soft_age_range_in_pregnant_household_person_4_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"age4_known": 0 "age4_known": 0
} }
], ],
@ -3534,7 +3534,7 @@
"females_in_soft_age_range_in_pregnant_household_person_4_value_check": { "females_in_soft_age_range_in_pregnant_household_person_4_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"details_known_4": 0 "details_known_4": 0
} }
], ],
@ -3958,7 +3958,7 @@
"females_in_soft_age_range_in_pregnant_household_person_5_age_value_check": { "females_in_soft_age_range_in_pregnant_household_person_5_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"age5_known": 0 "age5_known": 0
} }
], ],
@ -4111,7 +4111,7 @@
"females_in_soft_age_range_in_pregnant_household_person_5_value_check": { "females_in_soft_age_range_in_pregnant_household_person_5_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"details_known_5": 0 "details_known_5": 0
} }
], ],
@ -4532,7 +4532,7 @@
"females_in_soft_age_range_in_pregnant_household_person_6_age_value_check": { "females_in_soft_age_range_in_pregnant_household_person_6_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"age6_known": 0 "age6_known": 0
} }
], ],
@ -4685,7 +4685,7 @@
"females_in_soft_age_range_in_pregnant_household_person_6_value_check": { "females_in_soft_age_range_in_pregnant_household_person_6_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"details_known_6": 0 "details_known_6": 0
} }
], ],
@ -5103,7 +5103,7 @@
"females_in_soft_age_range_in_pregnant_household_person_7_age_value_check": { "females_in_soft_age_range_in_pregnant_household_person_7_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"age7_known": 0 "age7_known": 0
} }
], ],
@ -5256,7 +5256,7 @@
"females_in_soft_age_range_in_pregnant_household_person_7_value_check": { "females_in_soft_age_range_in_pregnant_household_person_7_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"details_known_7": 0 "details_known_7": 0
} }
], ],
@ -5671,7 +5671,7 @@
"females_in_soft_age_range_in_pregnant_household_person_8_age_value_check": { "females_in_soft_age_range_in_pregnant_household_person_8_age_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"age8_known": 0 "age8_known": 0
} }
], ],
@ -5824,7 +5824,7 @@
"females_in_soft_age_range_in_pregnant_household_person_8_value_check": { "females_in_soft_age_range_in_pregnant_household_person_8_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true, "non_males_in_pregnant_household_not_in_pregnancy_range?": true,
"details_known_8": 0 "details_known_8": 0
} }
], ],
@ -6259,7 +6259,7 @@
"females_in_soft_age_range_in_pregnant_household_value_check": { "females_in_soft_age_range_in_pregnant_household_value_check": {
"depends_on": [ "depends_on": [
{ {
"female_in_pregnant_household_in_soft_validation_range?": true "non_males_in_pregnant_household_not_in_pregnancy_range?": true
} }
], ],
"title_text": { "title_text": {

4
config/locales/forms/2026/lettings/soft_validations.en.yml

@ -12,14 +12,14 @@ en:
question_text: "Are you sure this is correct?" question_text: "Are you sure this is correct?"
title_text: "You told us somebody in the household is pregnant." title_text: "You told us somebody in the household is pregnant."
informative_text: "You also told us that all the tenants living at the property are male." informative_text: "You also told us that all the tenants living at the property are male."
females_in_soft_age_range_in_pregnant_household_value_check: no_household_member_likely_to_be_pregnant_check:
page_header: "" page_header: ""
check_answer_label: "Pregnancy confirmation" check_answer_label: "Pregnancy confirmation"
check_answer_prompt: "Confirm pregnancy status" check_answer_prompt: "Confirm pregnancy status"
hint_text: "" hint_text: ""
question_text: "Are you sure this is correct?" question_text: "Are you sure this is correct?"
title_text: "You told us somebody in the household is pregnant." title_text: "You told us somebody in the household is pregnant."
informative_text: "You also told us that any female tenants living at the property are in the following age ranges:<ul class=\"govuk-body-l app-panel--interruption\"><li>under 16 years old</li><li>over 50 years old</li></ul>" informative_text: "Your answers for the age, sex and gender of each household member suggest there is no household member who is likely to be pregnant."
no_retirement_value_check: no_retirement_value_check:
page_header: "" page_header: ""

4
spec/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_person_age_value_check_spec.rb

@ -29,7 +29,7 @@ RSpec.describe Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdPe
[ [
{ {
"age2_known" => 0, "age2_known" => 0,
"female_in_pregnant_household_in_soft_validation_range?" => true, "non_males_in_pregnant_household_not_in_pregnancy_range?" => true,
}, },
], ],
) )
@ -62,7 +62,7 @@ RSpec.describe Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdPe
[ [
{ {
"age3_known" => 0, "age3_known" => 0,
"female_in_pregnant_household_in_soft_validation_range?" => true, "non_males_in_pregnant_household_not_in_pregnancy_range?" => true,
}, },
], ],
) )

4
spec/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_person_value_check_spec.rb

@ -29,7 +29,7 @@ RSpec.describe Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdPe
[ [
{ {
"details_known_2" => 0, "details_known_2" => 0,
"female_in_pregnant_household_in_soft_validation_range?" => true, "non_males_in_pregnant_household_not_in_pregnancy_range?" => true,
}, },
], ],
) )
@ -62,7 +62,7 @@ RSpec.describe Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdPe
[ [
{ {
"details_known_3" => 0, "details_known_3" => 0,
"female_in_pregnant_household_in_soft_validation_range?" => true, "non_males_in_pregnant_household_not_in_pregnancy_range?" => true,
}, },
], ],
) )

51
spec/models/form/lettings/subsections/household_characteristics_spec.rb

@ -339,18 +339,15 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
expect(household_characteristics.pages.map(&:id)).to eq( expect(household_characteristics.pages.map(&:id)).to eq(
%w[ %w[
household_members household_members
no_females_pregnant_household_lead_hhmemb_value_check no_household_member_likely_to_be_pregnant_hhmemb_check
females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check
lead_tenant_age lead_tenant_age
no_females_pregnant_household_lead_age_value_check no_household_member_likely_to_be_pregnant_lead_age_check
females_in_soft_age_range_in_pregnant_household_lead_age_value_check
age_lead_tenant_under_retirement_value_check age_lead_tenant_under_retirement_value_check
age_lead_tenant_over_retirement_value_check age_lead_tenant_over_retirement_value_check
lead_tenant_sex_registered_at_birth lead_tenant_sex_registered_at_birth
lead_tenant_gender_same_as_sex lead_tenant_gender_same_as_sex
lead_tenant_gender_identity lead_tenant_gender_identity
no_females_pregnant_household_lead_value_check no_household_member_likely_to_be_pregnant_lead_check
females_in_soft_age_range_in_pregnant_household_lead_value_check
gender_lead_tenant_over_retirement_value_check gender_lead_tenant_over_retirement_value_check
lead_tenant_ethnic_group lead_tenant_ethnic_group
lead_tenant_ethnic_background_arab lead_tenant_ethnic_background_arab
@ -367,15 +364,13 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_2_age person_2_age
person_2_lead_partner person_2_lead_partner
relationship_2_multiple_partners_value_check relationship_2_multiple_partners_value_check
no_females_pregnant_household_person_2_age_value_check no_household_member_likely_to_be_pregnant_person_age_2_check
females_in_soft_age_range_in_pregnant_household_person_2_age_value_check
age_2_under_retirement_value_check age_2_under_retirement_value_check
age_2_over_retirement_value_check age_2_over_retirement_value_check
person_2_sex_registered_at_birth person_2_sex_registered_at_birth
person_2_gender_same_as_sex person_2_gender_same_as_sex
person_2_gender_identity person_2_gender_identity
no_females_pregnant_household_person_2_value_check no_household_member_likely_to_be_pregnant_person_2_check
females_in_soft_age_range_in_pregnant_household_person_2_value_check
gender_2_over_retirement_value_check gender_2_over_retirement_value_check
person_2_working_situation person_2_working_situation
working_situation_2_under_retirement_value_check working_situation_2_under_retirement_value_check
@ -385,15 +380,13 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_3_age person_3_age
person_3_lead_partner person_3_lead_partner
relationship_3_multiple_partners_value_check relationship_3_multiple_partners_value_check
no_females_pregnant_household_person_3_age_value_check no_household_member_likely_to_be_pregnant_person_age_3_check
females_in_soft_age_range_in_pregnant_household_person_3_age_value_check
age_3_under_retirement_value_check age_3_under_retirement_value_check
age_3_over_retirement_value_check age_3_over_retirement_value_check
person_3_sex_registered_at_birth person_3_sex_registered_at_birth
person_3_gender_same_as_sex person_3_gender_same_as_sex
person_3_gender_identity person_3_gender_identity
no_females_pregnant_household_person_3_value_check no_household_member_likely_to_be_pregnant_person_3_check
females_in_soft_age_range_in_pregnant_household_person_3_value_check
gender_3_over_retirement_value_check gender_3_over_retirement_value_check
person_3_working_situation person_3_working_situation
working_situation_3_under_retirement_value_check working_situation_3_under_retirement_value_check
@ -403,15 +396,13 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_4_age person_4_age
person_4_lead_partner person_4_lead_partner
relationship_4_multiple_partners_value_check relationship_4_multiple_partners_value_check
no_females_pregnant_household_person_4_age_value_check no_household_member_likely_to_be_pregnant_person_age_4_check
females_in_soft_age_range_in_pregnant_household_person_4_age_value_check
age_4_under_retirement_value_check age_4_under_retirement_value_check
age_4_over_retirement_value_check age_4_over_retirement_value_check
person_4_sex_registered_at_birth person_4_sex_registered_at_birth
person_4_gender_same_as_sex person_4_gender_same_as_sex
person_4_gender_identity person_4_gender_identity
no_females_pregnant_household_person_4_value_check no_household_member_likely_to_be_pregnant_person_4_check
females_in_soft_age_range_in_pregnant_household_person_4_value_check
gender_4_over_retirement_value_check gender_4_over_retirement_value_check
person_4_working_situation person_4_working_situation
working_situation_4_under_retirement_value_check working_situation_4_under_retirement_value_check
@ -421,15 +412,13 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_5_age person_5_age
person_5_lead_partner person_5_lead_partner
relationship_5_multiple_partners_value_check relationship_5_multiple_partners_value_check
no_females_pregnant_household_person_5_age_value_check no_household_member_likely_to_be_pregnant_person_age_5_check
females_in_soft_age_range_in_pregnant_household_person_5_age_value_check
age_5_under_retirement_value_check age_5_under_retirement_value_check
age_5_over_retirement_value_check age_5_over_retirement_value_check
person_5_sex_registered_at_birth person_5_sex_registered_at_birth
person_5_gender_same_as_sex person_5_gender_same_as_sex
person_5_gender_identity person_5_gender_identity
no_females_pregnant_household_person_5_value_check no_household_member_likely_to_be_pregnant_person_5_check
females_in_soft_age_range_in_pregnant_household_person_5_value_check
gender_5_over_retirement_value_check gender_5_over_retirement_value_check
person_5_working_situation person_5_working_situation
working_situation_5_under_retirement_value_check working_situation_5_under_retirement_value_check
@ -439,15 +428,13 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_6_age person_6_age
person_6_lead_partner person_6_lead_partner
relationship_6_multiple_partners_value_check relationship_6_multiple_partners_value_check
no_females_pregnant_household_person_6_age_value_check no_household_member_likely_to_be_pregnant_person_age_6_check
females_in_soft_age_range_in_pregnant_household_person_6_age_value_check
age_6_under_retirement_value_check age_6_under_retirement_value_check
age_6_over_retirement_value_check age_6_over_retirement_value_check
person_6_sex_registered_at_birth person_6_sex_registered_at_birth
person_6_gender_same_as_sex person_6_gender_same_as_sex
person_6_gender_identity person_6_gender_identity
no_females_pregnant_household_person_6_value_check no_household_member_likely_to_be_pregnant_person_6_check
females_in_soft_age_range_in_pregnant_household_person_6_value_check
gender_6_over_retirement_value_check gender_6_over_retirement_value_check
person_6_working_situation person_6_working_situation
working_situation_6_under_retirement_value_check working_situation_6_under_retirement_value_check
@ -457,15 +444,13 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_7_age person_7_age
person_7_lead_partner person_7_lead_partner
relationship_7_multiple_partners_value_check relationship_7_multiple_partners_value_check
no_females_pregnant_household_person_7_age_value_check no_household_member_likely_to_be_pregnant_person_age_7_check
females_in_soft_age_range_in_pregnant_household_person_7_age_value_check
age_7_under_retirement_value_check age_7_under_retirement_value_check
age_7_over_retirement_value_check age_7_over_retirement_value_check
person_7_sex_registered_at_birth person_7_sex_registered_at_birth
person_7_gender_same_as_sex person_7_gender_same_as_sex
person_7_gender_identity person_7_gender_identity
no_females_pregnant_household_person_7_value_check no_household_member_likely_to_be_pregnant_person_7_check
females_in_soft_age_range_in_pregnant_household_person_7_value_check
gender_7_over_retirement_value_check gender_7_over_retirement_value_check
person_7_working_situation person_7_working_situation
working_situation_7_under_retirement_value_check working_situation_7_under_retirement_value_check
@ -475,15 +460,13 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_8_age person_8_age
person_8_lead_partner person_8_lead_partner
relationship_8_multiple_partners_value_check relationship_8_multiple_partners_value_check
no_females_pregnant_household_person_8_age_value_check no_household_member_likely_to_be_pregnant_person_age_8_check
females_in_soft_age_range_in_pregnant_household_person_8_age_value_check
age_8_under_retirement_value_check age_8_under_retirement_value_check
age_8_over_retirement_value_check age_8_over_retirement_value_check
person_8_sex_registered_at_birth person_8_sex_registered_at_birth
person_8_gender_same_as_sex person_8_gender_same_as_sex
person_8_gender_identity person_8_gender_identity
no_females_pregnant_household_person_8_value_check no_household_member_likely_to_be_pregnant_person_8_check
females_in_soft_age_range_in_pregnant_household_person_8_value_check
gender_8_over_retirement_value_check gender_8_over_retirement_value_check
person_8_working_situation person_8_working_situation
working_situation_8_under_retirement_value_check working_situation_8_under_retirement_value_check

3
spec/models/form/lettings/subsections/household_needs_spec.rb

@ -53,8 +53,7 @@ RSpec.describe Form::Lettings::Subsections::HouseholdNeeds, type: :model do
armed_forces_serving armed_forces_serving
armed_forces_injured armed_forces_injured
pregnant pregnant
no_females_pregnant_household_value_check no_household_member_likely_to_be_pregnant_check
females_in_soft_age_range_in_pregnant_household_value_check
access_needs_exist access_needs_exist
type_of_access_needs type_of_access_needs
health_conditions health_conditions

194
spec/models/validations/soft_validations_spec.rb

@ -1,8 +1,11 @@
require "rails_helper" require "rails_helper"
RSpec.describe Validations::SoftValidations do RSpec.describe Validations::SoftValidations do
let(:organisation) { FactoryBot.build(:organisation, provider_type: "PRP", id: 123) } include CollectionTimeHelper
let(:record) { FactoryBot.build(:lettings_log, owning_organisation: organisation) }
let(:organisation) { build(:organisation, provider_type: "PRP", id: 123) }
let(:start_year) { current_collection_start_year }
let(:record) { build(:lettings_log, owning_organisation: organisation, startdate: collection_start_date_for_year(start_year)) }
describe "rent min max validations" do describe "rent min max validations" do
before do before do
@ -153,6 +156,9 @@ RSpec.describe Validations::SoftValidations do
end end
describe "pregnancy soft validations" do describe "pregnancy soft validations" do
context "when 2025" do
let(:start_year) { 2025 }
context "when all tenants are male" do context "when all tenants are male" do
it "shows the interruption screen" do it "shows the interruption screen" do
record.age1 = 43 record.age1 = 43
@ -199,7 +205,7 @@ RSpec.describe Validations::SoftValidations do
record.age1 = 18 record.age1 = 18
record.sex1 = "M" record.sex1 = "M"
record.age1_known = 0 record.age1_known = 0
expect(record.female_in_pregnant_household_in_soft_validation_range?).to be true expect(record.non_males_in_pregnant_household_not_in_pregnancy_range?).to be true
end end
end end
@ -210,7 +216,33 @@ RSpec.describe Validations::SoftValidations do
record.preg_occ = 1 record.preg_occ = 1
record.hhmemb = 1 record.hhmemb = 1
record.age1_known = 0 record.age1_known = 0
expect(record.female_in_pregnant_household_in_soft_validation_range?).to be true expect(record.non_males_in_pregnant_household_not_in_pregnancy_range?).to be true
end
end
context "when non-binary tenants are under 16" do
it "does not show the interruption screen" do
record.age2 = 14
record.sex2 = "X"
record.preg_occ = 1
record.hhmemb = 2
record.details_known_2 = 0
record.age2_known = 0
record.age1 = 18
record.sex1 = "M"
record.age1_known = 0
expect(record.non_males_in_pregnant_household_not_in_pregnancy_range?).to be false
end
end
context "when non-binary tenants are over 50" do
it "does not show the interruption screen" do
record.age1 = 54
record.sex1 = "X"
record.preg_occ = 1
record.hhmemb = 1
record.age1_known = 0
expect(record.non_males_in_pregnant_household_not_in_pregnancy_range?).to be false
end end
end end
@ -221,7 +253,7 @@ RSpec.describe Validations::SoftValidations do
record.preg_occ = 1 record.preg_occ = 1
record.hhmemb = 1 record.hhmemb = 1
expect(record.all_male_tenants_in_a_pregnant_household?).to be false expect(record.all_male_tenants_in_a_pregnant_household?).to be false
expect(record.female_in_pregnant_household_in_soft_validation_range?).to be false expect(record.non_males_in_pregnant_household_not_in_pregnancy_range?).to be false
end end
end end
@ -230,7 +262,7 @@ RSpec.describe Validations::SoftValidations do
record.preg_occ = 1 record.preg_occ = 1
record.hhmemb = 2 record.hhmemb = 2
expect(record.all_male_tenants_in_a_pregnant_household?).to be false expect(record.all_male_tenants_in_a_pregnant_household?).to be false
expect(record.female_in_pregnant_household_in_soft_validation_range?).to be false expect(record.non_males_in_pregnant_household_not_in_pregnancy_range?).to be false
end end
end end
@ -244,7 +276,155 @@ RSpec.describe Validations::SoftValidations do
end end
record.preg_occ = 1 record.preg_occ = 1
record.hhmemb = 9 record.hhmemb = 9
expect(record.female_in_pregnant_household_in_soft_validation_range?).to be false expect(record.non_males_in_pregnant_household_not_in_pregnancy_range?).to be false
end
end
end
context "when 2026" do
let(:start_year) { 2026 }
before do
record.age1 = 43
record.age1_known = 0
record.preg_occ = 1
record.hhmemb = 1
end
context "when all tenants are male" do
before do
record.sexrab1 = "M"
record.gender_same_as_sex1 = 1
end
it "shows the interruption screen" do
expect(record.all_male_tenants_in_a_pregnant_household?).to be true
end
end
context "when there all tenants are male and age of tenants is unknown" do
before do
record.sexrab1 = "M"
record.gender_same_as_sex1 = 1
record.age1_known = 1
end
it "shows the interruption screen" do
expect(record.all_male_tenants_in_a_pregnant_household?).to be true
end
end
context "when all tenants are male and household members are over 8" do
before do
(1..8).each do |n|
record.send("sexrab#{n}=", "M")
record.send("gender_same_as_sex#{n}=", 1)
record.send("age#{n}=", 30)
record.send("age#{n}_known=", 0)
record.send("details_known_#{n}=", 0) unless n == 1
end
record.preg_occ = 1
record.hhmemb = 9
end
it "does not show the interruption screen" do
expect(record.all_male_tenants_in_a_pregnant_household?).to be false
end
end
context "when female tenants are under 16" do
before do
record.age1 = 12
record.sexrab1 = "F"
record.gender_same_as_sex1 = 1
end
it "shows the interruption screen" do
expect(record.non_males_in_pregnant_household_not_in_pregnancy_range?).to be true
end
end
context "when female tenants are over 50" do
before do
record.age1 = 60
record.sexrab1 = "F"
record.gender_same_as_sex1 = 1
end
it "shows the interruption screen" do
expect(record.non_males_in_pregnant_household_not_in_pregnancy_range?).to be true
end
end
context "when non binary tenants are under 16" do
before do
record.age1 = 12
record.sexrab1 = "M"
record.gender_same_as_sex1 = 2
record.gender_description1 = "Non-binary"
end
it "shows the interruption screen" do
expect(record.non_males_in_pregnant_household_not_in_pregnancy_range?).to be true
end
end
context "when non binary tenants are over 50" do
before do
record.age1 = 60
record.sexrab1 = "M"
record.gender_same_as_sex1 = 2
record.gender_description1 = "Non-binary"
end
it "shows the interruption screen" do
expect(record.non_males_in_pregnant_household_not_in_pregnancy_range?).to be true
end
end
context "when female tenants are outside of soft validation ranges" do
before do
record.age1 = 30
record.sexrab1 = "F"
record.gender_same_as_sex1 = 1
end
it "does not show the interruption screen" do
expect(record.non_males_in_pregnant_household_not_in_pregnancy_range?).to be false
end
end
context "when the information about the tenants is not given" do
before do
record.age1 = nil
record.age1_known = nil
record.sexrab1 = nil
record.gender_same_as_sex1 = nil
record.preg_occ = 1
record.hhmemb = 1
end
it "does not show the interruption screen" do
expect(record.non_males_in_pregnant_household_not_in_pregnancy_range?).to be false
end
end
context "when number of household members is over 8" do
before do
(1..8).each do |n|
record.send("sexrab#{n}=", "F")
record.send("gender_same_as_sex#{n}=", 1)
record.send("age#{n}=", 30)
record.send("age#{n}_known=", 0)
record.send("details_known_#{n}=", 0) unless n == 1
end
record.preg_occ = 1
record.hhmemb = 9
end
it "does not show the interruption screen" do
expect(record.non_males_in_pregnant_household_not_in_pregnancy_range?).to be false
end
end end
end end
end end

14
spec/services/bulk_upload/lettings/year2026/row_parser_spec.rb

@ -1959,18 +1959,22 @@ RSpec.describe BulkUpload::Lettings::Year2026::RowParser do
end end
context "when a soft validation is triggered that relates both to fields that are and are not routed to" do context "when a soft validation is triggered that relates both to fields that are and are not routed to" do
let(:attributes) { setup_section_params.merge({ field_78: "1", field_43: "M", field_49: "M", field_53: "M" }) } let(:attributes) { setup_section_params.merge({ field_78: "1", field_130: "M", field_131: "M", field_132: "M", field_138: 1, field_140: 1, field_142: 1 }) }
it "adds errors to fields that are routed to" do it "adds errors to fields that are routed to" do
parser.valid? parser.valid?
expect(parser.errors.where(:field_49, category: :soft_validation)).to be_present expect(parser.errors.where(:field_130, category: :soft_validation)).to be_present
expect(parser.errors.where(:field_53, category: :soft_validation)).to be_present expect(parser.errors.where(:field_138, category: :soft_validation)).to be_present
expect(parser.errors.where(:field_131, category: :soft_validation)).to be_present
expect(parser.errors.where(:field_140, category: :soft_validation)).to be_present
end end
it "does not add errors to fields that are not routed to" do it "does not add errors to fields that are not routed to" do
parser.valid? parser.valid?
expect(parser.errors.where(:field_57, category: :soft_validation)).not_to be_present expect(parser.errors.where(:field_133, category: :soft_validation)).not_to be_present
expect(parser.errors.where(:field_61, category: :soft_validation)).not_to be_present expect(parser.errors.where(:field_144, category: :soft_validation)).not_to be_present
expect(parser.errors.where(:field_134, category: :soft_validation)).not_to be_present
expect(parser.errors.where(:field_146, category: :soft_validation)).not_to be_present
end end
end end

Loading…
Cancel
Save