Browse Source

Add some convenience methods to make validations more readable

pull/321/head
baarkerlounger 4 years ago
parent
commit
ef16c4f7f1
  1. 135
      app/models/case_log.rb
  2. 3
      app/models/validations/financial_validations.rb
  3. 18
      app/models/validations/household_validations.rb
  4. 2
      app/models/validations/local_authority_validations.rb
  5. 21
      app/models/validations/property_validations.rb
  6. 19
      app/models/validations/tenancy_validations.rb
  7. 2
      spec/models/validations/property_validations_spec.rb

135
app/models/case_log.rb

@ -73,23 +73,14 @@ class CaseLog < ApplicationRecord
status == "in_progress" status == "in_progress"
end end
def postcode_known?
postcode_known == 1
end
def previous_postcode_known?
previous_postcode_known == 1
end
def weekly_net_income def weekly_net_income
return unless earnings && incfreq return unless earnings && incfreq
case incfreq if net_income_is_weekly?
when 0
earnings earnings
when 1 elsif net_income_is_monthly?
((earnings * 12) / 52.0).round(0) ((earnings * 12) / 52.0).round(0)
when 2 elsif net_income_is_yearly?
(earnings / 12.0).round(0) (earnings / 12.0).round(0)
end end
end end
@ -104,6 +95,118 @@ class CaseLog < ApplicationRecord
first_time_property_let_as_social_housing == 1 first_time_property_let_as_social_housing == 1
end 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 private
PIO = Postcodes::IO.new PIO = Postcodes::IO.new
@ -169,7 +272,7 @@ private
self.month = startdate.month self.month = startdate.month
self.year = startdate.year self.year = startdate.year
end 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.hhmemb = other_hhmemb + 1 if other_hhmemb.present?
self.renttype = RENT_TYPE_MAPPING[rent_type] self.renttype = RENT_TYPE_MAPPING[rent_type]
self.lettype = get_lettype self.lettype = get_lettype
@ -186,13 +289,13 @@ private
self.has_benefits = get_has_benefits self.has_benefits = get_has_benefits
self.nocharge = household_charge&.zero? ? 1 : 0 self.nocharge = household_charge&.zero? ? 1 : 0
self.underoccupation_benefitcap = 3 if renewal == 1 && year == 2021 self.underoccupation_benefitcap = 3 if renewal == 1 && year == 2021
if renewal == 1 if is_renewal?
self.homeless = 2 self.homeless = 2
self.referral = 0 self.referral = 0
self.layear = 1 self.layear = 1
self.reasonpref = nil if reasonpref&.zero? self.reasonpref = nil if given_reasonable_preference?
end end
if needstype == 1 if is_general_needs?
self.prevten = 2 if managing_organisation.provider_type == "PRP" self.prevten = 2 if managing_organisation.provider_type == "PRP"
self.prevten = 0 if managing_organisation.provider_type == "LA" self.prevten = 0 if managing_organisation.provider_type == "LA"
end end

3
app/models/validations/financial_validations.rb

@ -50,12 +50,11 @@ module Validations::FinancialValidations
end end
def validate_tshortfall(record) def validate_tshortfall(record)
is_yes = record.hbrentshortfall&.zero?
hb_donotknow = record.hb == 5 hb_donotknow = record.hb == 5
hb_none = record.hb == 4 hb_none = record.hb == 4
hb_uc_no_hb = record.hb == 3 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") record.errors.add :tshortfall, I18n.t("validations.financial.hbrentshortfall.outstanding_no_benefits")
end end
end end

18
app/models/validations/household_validations.rb

@ -4,7 +4,7 @@ module Validations::HouseholdValidations
# Validations methods need to be called 'validate_<page_name>' to run on model save # Validations methods need to be called 'validate_<page_name>' to run on model save
# or 'validate_' to run on submit as well # or 'validate_' to run on submit as well
def validate_reasonable_preference(record) 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 :reasonpref, I18n.t("validations.household.reasonpref.not_homeless")
record.errors.add :homeless, I18n.t("validations.household.homeless.reasonpref.not_homeless") record.errors.add :homeless, I18n.t("validations.household.homeless.reasonpref.not_homeless")
elsif record.reasonpref == 1 elsif record.reasonpref == 1
@ -23,16 +23,16 @@ module Validations::HouseholdValidations
end end
def validate_armed_forces(record) 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") record.errors.add :reservist, I18n.t("validations.household.reservist.injury_not_required")
end 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") record.errors.add :leftreg, I18n.t("validations.household.leftreg.question_not_required")
end end
end end
def validate_pregnancy(record) 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") record.errors.add :preg_occ, I18n.t("validations.household.preg_occ.no_female")
end end
end end
@ -67,30 +67,30 @@ module Validations::HouseholdValidations
end end
def validate_previous_housing_situation(record) 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") record.errors.add :prevten, I18n.t("validations.household.prevten.non_temp_accommodation")
end end
end end
def validate_referral(record) 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 :referral, I18n.t("validations.household.referral.secure_tenancy")
record.errors.add :tenancy, I18n.t("validations.tenancy.cannot_be_internal_transfer") record.errors.add :tenancy, I18n.t("validations.tenancy.cannot_be_internal_transfer")
end 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 :referral, I18n.t("validations.household.referral.assessed_homeless")
record.errors.add :homeless, I18n.t("validations.household.homeless.assessed.internal_transfer") record.errors.add :homeless, I18n.t("validations.household.homeless.assessed.internal_transfer")
end 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 :referral, I18n.t("validations.household.referral.other_homeless")
record.errors.add :homeless, I18n.t("validations.household.homeless.other.internal_transfer") record.errors.add :homeless, I18n.t("validations.household.homeless.other.internal_transfer")
end end
end end
def validate_prevloc(record) 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") record.errors.add :prevloc, I18n.t("validations.household.previous_la_known")
end end
end end

2
app/models/validations/local_authority_validations.rb

@ -3,7 +3,7 @@ module Validations::LocalAuthorityValidations
def validate_previous_accommodation_postcode(record) def validate_previous_accommodation_postcode(record)
postcode = record.previous_postcode 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") error_message = I18n.t("validations.postcode")
record.errors.add :previous_postcode, error_message record.errors.add :previous_postcode, error_message
end end

21
app/models/validations/property_validations.rb

@ -59,28 +59,26 @@ module Validations::PropertyValidations
record.errors.add :la, I18n.t("validations.property.la.london_rent") record.errors.add :la, I18n.t("validations.property.la.london_rent")
end 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") record.errors.add :la, I18n.t("validations.property.la.la_known")
end end
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 REFERRAL_INVALID_TMP = [2, 3, 5, 6, 7, 8].freeze
def validate_rsnvac(record) 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") record.errors.add :rsnvac, I18n.t("validations.property.rsnvac.first_let_not_social")
end 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") record.errors.add :rsnvac, I18n.t("validations.property.rsnvac.first_let_social")
end 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") record.errors.add :rsnvac, I18n.t("validations.property.rsnvac.non_temp_accommodation")
end 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 :rsnvac, I18n.t("validations.property.rsnvac.referral_invalid")
record.errors.add :referral, I18n.t("validations.household.referral.rsnvac_non_temp") record.errors.add :referral, I18n.t("validations.household.referral.rsnvac_non_temp")
end end
@ -94,29 +92,28 @@ module Validations::PropertyValidations
def validate_property_postcode(record) def validate_property_postcode(record)
postcode = record.property_postcode 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") error_message = I18n.t("validations.postcode")
record.errors.add :property_postcode, error_message record.errors.add :property_postcode, error_message
end end
end end
SHARED_HOUSING = [4, 5, 6].freeze
def validate_shared_housing_rooms(record) def validate_shared_housing_rooms(record)
if record.beds.present? && record.beds.negative? if record.beds.present? && record.beds.negative?
record.errors.add :beds, I18n.t("validations.property.beds.negative") record.errors.add :beds, I18n.t("validations.property.beds.negative")
end end
unless record.unittype_gn.nil? 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 :unittype_gn, I18n.t("validations.property.unittype_gn.one_bedroom_bedsit")
record.errors.add :beds, I18n.t("validations.property.unittype_gn.one_bedroom_bedsit") record.errors.add :beds, I18n.t("validations.property.unittype_gn.one_bedroom_bedsit")
end 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.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 :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") 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 :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") record.errors.add :beds, I18n.t("validations.property.unittype_gn.one_seven_bedroom_shared")
end end

19
app/models/validations/tenancy_validations.rb

@ -6,12 +6,19 @@ module Validations::TenancyValidations
def validate_fixed_term_tenancy(record) def validate_fixed_term_tenancy(record)
is_present = record.tenancylength.present? is_present = record.tenancylength.present?
is_in_range = record.tenancylength.to_i.between?(2, 99) is_in_range = record.tenancylength.to_i.between?(2, 99)
is_secure = record.tenancy == 3
is_ast = record.tenancy == 1
conditions = [ 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: !(record.is_secure_tenancy? || record.is_assured_shorthold_tenancy?) && is_present,
{ condition: is_secure && (!is_in_range && is_present), error: I18n.t("validations.tenancy.length.secure") }, 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| conditions.each do |condition|
@ -27,7 +34,7 @@ module Validations::TenancyValidations
end end
def validate_tenancy_type(record) 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 :tenancy, I18n.t("validations.tenancy.internal_transfer")
record.errors.add :referral, I18n.t("validations.household.referral.cannot_be_secure_tenancy") record.errors.add :referral, I18n.t("validations.household.referral.cannot_be_secure_tenancy")
end end

2
spec/models/validations/property_validations_spec.rb

@ -257,7 +257,7 @@ RSpec.describe Validations::PropertyValidations do
end end
context "when the property has been let before" do 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 context "when the previous tenancy was not temporary" do
let(:referral_sources) { described_class::REFERRAL_INVALID_TMP } let(:referral_sources) { described_class::REFERRAL_INVALID_TMP }

Loading…
Cancel
Save