diff --git a/app/models/case_log.rb b/app/models/case_log.rb index c71ead78a..3c55d51e4 100644 --- a/app/models/case_log.rb +++ b/app/models/case_log.rb @@ -73,23 +73,14 @@ class CaseLog < ApplicationRecord status == "in_progress" end - def postcode_known? - postcode_known == 1 - end - - def previous_postcode_known? - previous_postcode_known == 1 - end - def weekly_net_income return unless earnings && incfreq - case incfreq - when 0 + if net_income_is_weekly? earnings - when 1 + elsif net_income_is_monthly? ((earnings * 12) / 52.0).round(0) - when 2 + elsif net_income_is_yearly? (earnings / 12.0).round(0) end end @@ -104,6 +95,118 @@ class CaseLog < ApplicationRecord first_time_property_let_as_social_housing == 1 end + def net_income_refused? + net_income_known == 2 + end + + def net_income_is_weekly? + !!(incfreq && incfreq.zero?) + end + + def net_income_is_monthly? + incfreq == 1 + end + + def net_income_is_yearly? + incfreq == 2 + end + + def given_reasonable_preference? + !!(reasonpref && reasonpref.zero?) + end + + def is_renewal? + renewal == 1 + end + + def is_general_needs? + needstype == 1 + end + + def has_hbrentshortfall? + !!(hbrentshortfall && hbrentshortfall.zero?) + end + + def postcode_known? + postcode_known == 1 + end + + def previous_postcode_known? + previous_postcode_known == 1 + end + + def la_known? + la_known == 1 + end + + def previous_la_known? + previous_la_known == 1 + end + + def is_secure_tenancy? + tenancy == 3 + end + + def is_assured_shorthold_tenancy? + tenancy == 1 + end + + def is_internal_transfer? + !!(referral && referral.zero?) + end + + def is_relet_to_temp_tenant? + rsnvac == 2 + end + + def is_bedsit? + unittype_gn == 1 + end + + def is_shared_housing? + [4, 5, 6].include?(unittype_gn) + end + + def has_first_let_vacancy_reason? + [11, 12, 13].include?(rsnvac) + end + + def previous_tenancy_was_temporary? + ![4, 5, 16, 21, 22].include?(prevten) + end + + def armed_forces_regular? + !!(armedforces && armedforces.zero?) + end + + def armed_forces_no? + armedforces == 3 + end + + def armed_forces_refused? + armedforces == 4 + end + + def has_pregnancy? + !!(preg_occ && preg_occ.zero?) + end + + def pregnancy_refused? + preg_occ == 2 + end + + def is_assessed_homeless? + !!(homeless && homeless.zero?) + end + + def is_other_homeless? + homeless == 1 + end + + def is_not_homeless? + homeless == 2 + end + private PIO = Postcodes::IO.new @@ -169,7 +272,7 @@ private self.month = startdate.month self.year = startdate.year end - self.incref = 1 if net_income_known == 2 + self.incref = 1 if net_income_refused? self.hhmemb = other_hhmemb + 1 if other_hhmemb.present? self.renttype = RENT_TYPE_MAPPING[rent_type] self.lettype = get_lettype @@ -186,13 +289,13 @@ private self.has_benefits = get_has_benefits self.nocharge = household_charge&.zero? ? 1 : 0 self.underoccupation_benefitcap = 3 if renewal == 1 && year == 2021 - if renewal == 1 + if is_renewal? self.homeless = 2 self.referral = 0 self.layear = 1 - self.reasonpref = nil if reasonpref&.zero? + self.reasonpref = nil if given_reasonable_preference? end - if needstype == 1 + if is_general_needs? self.prevten = 2 if managing_organisation.provider_type == "PRP" self.prevten = 0 if managing_organisation.provider_type == "LA" end diff --git a/app/models/validations/financial_validations.rb b/app/models/validations/financial_validations.rb index ff6903a3c..53c650413 100644 --- a/app/models/validations/financial_validations.rb +++ b/app/models/validations/financial_validations.rb @@ -50,12 +50,11 @@ module Validations::FinancialValidations end def validate_tshortfall(record) - is_yes = record.hbrentshortfall&.zero? hb_donotknow = record.hb == 5 hb_none = record.hb == 4 hb_uc_no_hb = record.hb == 3 - if is_yes && (hb_donotknow || hb_none || hb_uc_no_hb) + if record.has_hbrentshortfall? && (hb_donotknow || hb_none || hb_uc_no_hb) record.errors.add :tshortfall, I18n.t("validations.financial.hbrentshortfall.outstanding_no_benefits") end end diff --git a/app/models/validations/household_validations.rb b/app/models/validations/household_validations.rb index bc16e5a63..0c4f2ca40 100644 --- a/app/models/validations/household_validations.rb +++ b/app/models/validations/household_validations.rb @@ -4,7 +4,7 @@ module Validations::HouseholdValidations # Validations methods need to be called 'validate_' to run on model save # or 'validate_' to run on submit as well def validate_reasonable_preference(record) - if record.homeless == 2 && record.reasonpref && record.reasonpref.zero? + if record.is_not_homeless? && record.given_reasonable_preference? record.errors.add :reasonpref, I18n.t("validations.household.reasonpref.not_homeless") record.errors.add :homeless, I18n.t("validations.household.homeless.reasonpref.not_homeless") elsif record.reasonpref == 1 @@ -23,16 +23,16 @@ module Validations::HouseholdValidations end def validate_armed_forces(record) - if (record.armedforces == 3 || record.armedforces == 4) && record.reservist.present? + if (record.armed_forces_no? || record.armed_forces_refused?) && record.reservist.present? record.errors.add :reservist, I18n.t("validations.household.reservist.injury_not_required") end - if record.armedforces != 0 && record.leftreg.present? + if !record.armed_forces_regular? && record.leftreg.present? record.errors.add :leftreg, I18n.t("validations.household.leftreg.question_not_required") end end def validate_pregnancy(record) - if ((record.preg_occ && record.preg_occ.zero?) || record.preg_occ == 2) && !women_of_child_bearing_age_in_household(record) + if (record.has_pregnancy? || record.pregnancy_refused?) && !women_of_child_bearing_age_in_household(record) record.errors.add :preg_occ, I18n.t("validations.household.preg_occ.no_female") end end @@ -67,30 +67,30 @@ module Validations::HouseholdValidations end def validate_previous_housing_situation(record) - if record.rsnvac == 2 && NON_TEMP_ACCOMMODATION.include?(record.prevten) + if record.is_relet_to_temp_tenant? && !record.previous_tenancy_was_temporary? record.errors.add :prevten, I18n.t("validations.household.prevten.non_temp_accommodation") end end def validate_referral(record) - if record.referral.present? && record.tenancy.present? && record.referral != 0 && record.tenancy == 3 + if record.referral.present? && record.tenancy.present? && !record.is_internal_transfer? && record.is_secure_tenancy? record.errors.add :referral, I18n.t("validations.household.referral.secure_tenancy") record.errors.add :tenancy, I18n.t("validations.tenancy.cannot_be_internal_transfer") end - if record.referral && record.referral.zero? && record.homeless && record.homeless.zero? + if record.is_internal_transfer? && record.is_assessed_homeless? record.errors.add :referral, I18n.t("validations.household.referral.assessed_homeless") record.errors.add :homeless, I18n.t("validations.household.homeless.assessed.internal_transfer") end - if record.referral && record.referral.zero? && record.homeless == 1 + if record.is_internal_transfer? && record.is_other_homeless? record.errors.add :referral, I18n.t("validations.household.referral.other_homeless") record.errors.add :homeless, I18n.t("validations.household.homeless.other.internal_transfer") end end def validate_prevloc(record) - if record.previous_la_known == 1 && record.prevloc.blank? + if record.previous_la_known? && record.prevloc.blank? record.errors.add :prevloc, I18n.t("validations.household.previous_la_known") end end diff --git a/app/models/validations/local_authority_validations.rb b/app/models/validations/local_authority_validations.rb index 892367ef5..2264145ce 100644 --- a/app/models/validations/local_authority_validations.rb +++ b/app/models/validations/local_authority_validations.rb @@ -3,7 +3,7 @@ module Validations::LocalAuthorityValidations def validate_previous_accommodation_postcode(record) postcode = record.previous_postcode - if record.previous_postcode_known == 1 && (postcode.blank? || !postcode.match(POSTCODE_REGEXP)) + if record.previous_postcode_known? && (postcode.blank? || !postcode.match(POSTCODE_REGEXP)) error_message = I18n.t("validations.postcode") record.errors.add :previous_postcode, error_message end diff --git a/app/models/validations/property_validations.rb b/app/models/validations/property_validations.rb index 20d61f037..bb57fda31 100644 --- a/app/models/validations/property_validations.rb +++ b/app/models/validations/property_validations.rb @@ -59,28 +59,26 @@ module Validations::PropertyValidations record.errors.add :la, I18n.t("validations.property.la.london_rent") end - if record.la_known == 1 && record.la.blank? + if record.la_known? && record.la.blank? record.errors.add :la, I18n.t("validations.property.la.la_known") end end - FIRST_LET_VACANCY_REASONS = [11, 12, 13].freeze - NON_TEMP_ACCOMMODATION = [4, 5, 16, 21, 22].freeze REFERRAL_INVALID_TMP = [2, 3, 5, 6, 7, 8].freeze def validate_rsnvac(record) - if !record.first_time_property_let_as_social_housing? && FIRST_LET_VACANCY_REASONS.include?(record.rsnvac) + if !record.first_time_property_let_as_social_housing? && record.has_first_let_vacancy_reason? record.errors.add :rsnvac, I18n.t("validations.property.rsnvac.first_let_not_social") end - if record.first_time_property_let_as_social_housing? && record.rsnvac.present? && !FIRST_LET_VACANCY_REASONS.include?(record.rsnvac) + if record.first_time_property_let_as_social_housing? && record.rsnvac.present? && !record.has_first_let_vacancy_reason? record.errors.add :rsnvac, I18n.t("validations.property.rsnvac.first_let_social") end - if record.rsnvac == 2 && NON_TEMP_ACCOMMODATION.include?(record.prevten) + if record.is_relet_to_temp_tenant? && !record.previous_tenancy_was_temporary? record.errors.add :rsnvac, I18n.t("validations.property.rsnvac.non_temp_accommodation") end - if record.rsnvac == 2 && REFERRAL_INVALID_TMP.include?(record.referral) + if record.is_relet_to_temp_tenant? && REFERRAL_INVALID_TMP.include?(record.referral) record.errors.add :rsnvac, I18n.t("validations.property.rsnvac.referral_invalid") record.errors.add :referral, I18n.t("validations.household.referral.rsnvac_non_temp") end @@ -94,29 +92,28 @@ module Validations::PropertyValidations def validate_property_postcode(record) postcode = record.property_postcode - if record.postcode_known == 1 && (postcode.blank? || !postcode.match(POSTCODE_REGEXP)) + if record.postcode_known? && (postcode.blank? || !postcode.match(POSTCODE_REGEXP)) error_message = I18n.t("validations.postcode") record.errors.add :property_postcode, error_message end end - SHARED_HOUSING = [4, 5, 6].freeze def validate_shared_housing_rooms(record) if record.beds.present? && record.beds.negative? record.errors.add :beds, I18n.t("validations.property.beds.negative") end unless record.unittype_gn.nil? - if record.unittype_gn == 1 && record.beds != 1 && record.beds.present? + if record.is_bedsit? && record.beds != 1 && record.beds.present? record.errors.add :unittype_gn, I18n.t("validations.property.unittype_gn.one_bedroom_bedsit") record.errors.add :beds, I18n.t("validations.property.unittype_gn.one_bedroom_bedsit") end - if record.other_hhmemb&.zero? && SHARED_HOUSING.include?(record.unittype_gn) && + if record.other_hhmemb&.zero? && record.is_shared_housing? && !record.beds.to_i.between?(1, 3) && record.beds.present? record.errors.add :unittype_gn, I18n.t("validations.property.unittype_gn.one_three_bedroom_single_tenant_shared") record.errors.add :beds, I18n.t("validations.property.unittype_gn.one_three_bedroom_single_tenant_shared") - elsif SHARED_HOUSING.include?(record.unittype_gn) && record.beds.present? && !record.beds.to_i.between?(1, 7) + elsif record.is_shared_housing? && record.beds.present? && !record.beds.to_i.between?(1, 7) record.errors.add :unittype_gn, I18n.t("validations.property.unittype_gn.one_seven_bedroom_shared") record.errors.add :beds, I18n.t("validations.property.unittype_gn.one_seven_bedroom_shared") end diff --git a/app/models/validations/tenancy_validations.rb b/app/models/validations/tenancy_validations.rb index 7dde66817..e02b7b368 100644 --- a/app/models/validations/tenancy_validations.rb +++ b/app/models/validations/tenancy_validations.rb @@ -6,12 +6,19 @@ module Validations::TenancyValidations def validate_fixed_term_tenancy(record) is_present = record.tenancylength.present? is_in_range = record.tenancylength.to_i.between?(2, 99) - is_secure = record.tenancy == 3 - is_ast = record.tenancy == 1 conditions = [ - { condition: !(is_secure || is_ast) && is_present, error: I18n.t("validations.tenancy.length.fixed_term_not_required") }, - { condition: (is_ast && !is_in_range) && is_present, error: I18n.t("validations.tenancy.length.shorthold") }, - { condition: is_secure && (!is_in_range && is_present), error: I18n.t("validations.tenancy.length.secure") }, + { + condition: !(record.is_secure_tenancy? || record.is_assured_shorthold_tenancy?) && is_present, + error: I18n.t("validations.tenancy.length.fixed_term_not_required"), + }, + { + condition: (record.is_assured_shorthold_tenancy? && !is_in_range) && is_present, + error: I18n.t("validations.tenancy.length.shorthold"), + }, + { + condition: record.is_secure_tenancy? && (!is_in_range && is_present), + error: I18n.t("validations.tenancy.length.secure"), + }, ] conditions.each do |condition| @@ -27,7 +34,7 @@ module Validations::TenancyValidations end def validate_tenancy_type(record) - if record.tenancy.present? && record.tenancy != 3 && record.referral&.zero? + if record.tenancy.present? && !record.is_secure_tenancy? && record.is_internal_transfer? record.errors.add :tenancy, I18n.t("validations.tenancy.internal_transfer") record.errors.add :referral, I18n.t("validations.household.referral.cannot_be_secure_tenancy") end diff --git a/spec/models/validations/property_validations_spec.rb b/spec/models/validations/property_validations_spec.rb index dd523e703..fec1e61ef 100644 --- a/spec/models/validations/property_validations_spec.rb +++ b/spec/models/validations/property_validations_spec.rb @@ -257,7 +257,7 @@ RSpec.describe Validations::PropertyValidations do end context "when the property has been let before" do - let(:non_temporary_previous_tenancies) { described_class::NON_TEMP_ACCOMMODATION } + let(:non_temporary_previous_tenancies) { [4, 5, 16, 21, 22] } context "when the previous tenancy was not temporary" do let(:referral_sources) { described_class::REFERRAL_INVALID_TMP }