From 7268bd72369e1ec9f81c6381c2782b9e906d4ecf Mon Sep 17 00:00:00 2001 From: Dushan Despotovic Date: Mon, 20 Jun 2022 16:30:40 +0100 Subject: [PATCH] start date validations --- app/models/case_log.rb | 3 +- app/models/scheme.rb | 1 + app/models/validations/setup_validations.rb | 29 ++++++++ config/locales/en.yml | 5 ++ ...0220616130451_add_reference_to_case_log.rb | 5 ++ .../20220617102313_add_end_date_to_schemes.rb | 5 ++ db/schema.rb | 6 +- .../validations/setup_validations_spec.rb | 73 +++++++++++++++++++ 8 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20220616130451_add_reference_to_case_log.rb create mode 100644 db/migrate/20220617102313_add_end_date_to_schemes.rb diff --git a/app/models/case_log.rb b/app/models/case_log.rb index 7f9e1ecd6..2edc459b8 100644 --- a/app/models/case_log.rb +++ b/app/models/case_log.rb @@ -35,7 +35,8 @@ class CaseLog < ApplicationRecord belongs_to :owning_organisation, class_name: "Organisation", optional: true belongs_to :managing_organisation, class_name: "Organisation", optional: true belongs_to :created_by, class_name: "User", optional: true - + belongs_to :scheme, required: false + scope :filter_by_organisation, ->(org, _user = nil) { where(owning_organisation: org).or(where(managing_organisation: org)) } scope :filter_by_status, ->(status, _user = nil) { where status: } scope :filter_by_years, lambda { |years, _user = nil| diff --git a/app/models/scheme.rb b/app/models/scheme.rb index bc3273ef4..625ea28f1 100644 --- a/app/models/scheme.rb +++ b/app/models/scheme.rb @@ -1,6 +1,7 @@ class Scheme < ApplicationRecord belongs_to :organisation has_many :locations + has_many :case_logs scope :search_by_code, ->(code) { where("code ILIKE ?", "%#{code}%") } scope :search_by_service_name, ->(name) { where("service_name ILIKE ?", "%#{name}%") } diff --git a/app/models/validations/setup_validations.rb b/app/models/validations/setup_validations.rb index 44770c947..2e9699a55 100644 --- a/app/models/validations/setup_validations.rb +++ b/app/models/validations/setup_validations.rb @@ -5,6 +5,35 @@ module Validations::SetupValidations end end + def validate_startdate(record) + if record.needstype == 2 + if record.startdate > Time.zone.today + record.errors.add :startdate, I18n.t("validations.setup.startdate.today_or_earlier") + end + + if record.voiddate.present? + if (record.startdate.to_date - record.voiddate.to_date).to_i.abs > 730 + record.errors.add :startdate, I18n.t("validations.setup.startdate.voiddate_difference") + end + end + + if record.mrcdate.present? + if (record.startdate.to_date - record.mrcdate.to_date).to_i.abs > 730 + record.errors.add :startdate, I18n.t("validations.setup.startdate.mrcdate_difference") + end + end + + if record.scheme_id.present? + scheme_end_date = Scheme.find(record.scheme_id).end_date + if scheme_end_date.present? + if record.startdate > scheme_end_date + record.errors.add :startdate, I18n.t("validations.setup.startdate.before_scheme_end_date") + end + end + end + end + end + private def intermediate_product_rent_type?(record) diff --git a/config/locales/en.yml b/config/locales/en.yml index 726dcacc0..e923ff8af 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -61,6 +61,11 @@ en: setup: intermediate_rent_product_name: blank: "Enter name of other intermediate rent product" + startdate: + today_or_earlier: "The start date of a supported housing tenancy must be today or ealier" + before_scheme_end_date: "The start date of a supported housing tenancy must be before the housing scheme end date" + voiddate_difference: "The difference between the tenancy start date and property void date must be 730 days or less" + mrcdate_difference: "The difference between the tenancy start date and major repais date must be 730 days or less" property: mrcdate: diff --git a/db/migrate/20220616130451_add_reference_to_case_log.rb b/db/migrate/20220616130451_add_reference_to_case_log.rb new file mode 100644 index 000000000..52f7bfecb --- /dev/null +++ b/db/migrate/20220616130451_add_reference_to_case_log.rb @@ -0,0 +1,5 @@ +class AddReferenceToCaseLog < ActiveRecord::Migration[7.0] + def change + add_reference :case_logs, :scheme, foreign_key: true + end +end diff --git a/db/migrate/20220617102313_add_end_date_to_schemes.rb b/db/migrate/20220617102313_add_end_date_to_schemes.rb new file mode 100644 index 000000000..1c1946b20 --- /dev/null +++ b/db/migrate/20220617102313_add_end_date_to_schemes.rb @@ -0,0 +1,5 @@ +class AddEndDateToSchemes < ActiveRecord::Migration[7.0] + def change + add_column :schemes, :end_date, :datetime + end +end diff --git a/db/schema.rb b/db/schema.rb index ca8c033ee..56f4c9b08 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2022_06_14_124115) do +ActiveRecord::Schema[7.0].define(version: 2022_06_17_102313) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -198,10 +198,12 @@ ActiveRecord::Schema[7.0].define(version: 2022_06_14_124115) do t.integer "hhtype" t.integer "new_old" t.integer "vacdays" + t.bigint "scheme_id" t.index ["created_by_id"], name: "index_case_logs_on_created_by_id" t.index ["managing_organisation_id"], name: "index_case_logs_on_managing_organisation_id" t.index ["old_id"], name: "index_case_logs_on_old_id", unique: true t.index ["owning_organisation_id"], name: "index_case_logs_on_owning_organisation_id" + t.index ["scheme_id"], name: "index_case_logs_on_scheme_id" end create_table "data_protection_confirmations", force: :cascade do |t| @@ -308,6 +310,7 @@ ActiveRecord::Schema[7.0].define(version: 2022_06_14_124115) do t.integer "registered_under_care_act" t.integer "support_type" t.string "intended_stay" + t.datetime "end_date" t.index ["organisation_id"], name: "index_schemes_on_organisation_id" end @@ -364,6 +367,7 @@ ActiveRecord::Schema[7.0].define(version: 2022_06_14_124115) do t.index ["item_type", "item_id"], name: "index_versions_on_item_type_and_item_id" end + add_foreign_key "case_logs", "schemes" add_foreign_key "locations", "schemes" add_foreign_key "schemes", "organisations" end diff --git a/spec/models/validations/setup_validations_spec.rb b/spec/models/validations/setup_validations_spec.rb index 56b335464..6348907fb 100644 --- a/spec/models/validations/setup_validations_spec.rb +++ b/spec/models/validations/setup_validations_spec.rb @@ -30,4 +30,77 @@ RSpec.describe Validations::SetupValidations do expect(record.errors["irproduct_other"]).to be_empty end end + + context "when a user is setting up a supported housing log" do + describe "#validate_startdate" do + let(:record) { FactoryBot.create(:case_log, needstype: 2) } + let(:scheme) { FactoryBot.create(:scheme, end_date: Time.zone.today - 5.days)} + let(:scheme_no_end_date) { FactoryBot.create(:scheme, end_date: nil)} + + it "validates that the tenancy start date must be today or earlier" do + record.startdate = Time.zone.today + 3.days + setup_validator.validate_startdate(record) + expect(record.errors["startdate"]) + .to include(match I18n.t("validations.setup.startdate.today_or_earlier")) + end + + it "produces no error if the tenancy start date is today or earlier" do + record.startdate = Time.zone.today + setup_validator.validate_startdate(record) + expect(record.errors["startdate"]).to be_empty + end + + it "validates that the tenancy start date is before the end date of the chosen scheme if it has an end date" do + record.startdate = Time.zone.today - 3.days + record.scheme = scheme + setup_validator.validate_startdate(record) + expect(record.errors["startdate"]) + .to include(match I18n.t("validations.setup.startdate.before_scheme_end_date")) + end + + it "produces no error when the tenancy start date is before the end date of the chosen scheme if it has an end date" do + record.startdate = Time.zone.today - 30.days + record.scheme = scheme + setup_validator.validate_startdate(record) + expect(record.errors["startdate"]).to be_empty + end + + it "produces no startdate error for scheme end dates when the chosen scheme does not have an end date" do + record.startdate = Time.zone.today + record.scheme = scheme_no_end_date + setup_validator.validate_startdate(record) + expect(record.errors["startdate"]).to be_empty + end + + it "validates that tenancy start date is less than 730 days away from the void date" do + record.startdate = Time.zone.today + record.voiddate = Time.zone.today - 3.years + setup_validator.validate_startdate(record) + expect(record.errors["startdate"]) + .to include(match I18n.t("validations.setup.startdate.voiddate_difference")) + end + + it "produces no error tenancy start date is less than 730 days away from the void date" do + record.startdate = Time.zone.today + record.voiddate = Time.zone.today - 6.months + setup_validator.validate_startdate(record) + expect(record.errors["startdate"]).to be_empty + end + + it "validates that tenancy start date is less than 730 days away from the major repairs date" do + record.startdate = Time.zone.today + record.mrcdate = Time.zone.today - 3.years + setup_validator.validate_startdate(record) + expect(record.errors["startdate"]) + .to include(match I18n.t("validations.setup.startdate.mrcdate_difference")) + end + + it "produces no error when tenancy start date is less than 730 days away from the major repairs date" do + record.startdate = Time.zone.today + record.mrcdate = Time.zone.today - 6.months + setup_validator.validate_startdate(record) + expect(record.errors["startdate"]).to be_empty + end + end + end end