From bcab0917b8325b8e73d3355b00b2fcb0848baf70 Mon Sep 17 00:00:00 2001 From: baarkerlounger Date: Fri, 11 Feb 2022 17:04:39 +0000 Subject: [PATCH] Derive collection windows from form definitions --- app/models/form.rb | 6 +++--- app/models/validations/date_validations.rb | 10 +++++++++- config/forms/2021_2022.json | 4 ++-- spec/fixtures/forms/2021_2022.json | 2 ++ spec/fixtures/forms/2022_2023.json | 2 ++ spec/models/validations/date_validations_spec.rb | 2 +- 6 files changed, 19 insertions(+), 7 deletions(-) diff --git a/app/models/form.rb b/app/models/form.rb index d21728def..d704b78a1 100644 --- a/app/models/form.rb +++ b/app/models/form.rb @@ -1,14 +1,14 @@ class Form attr_reader :form_definition, :sections, :subsections, :pages, :questions, - :start_year, :end_year, :type, :name + :start_date, :end_date, :type, :name def initialize(form_path, name) raise "No form definition file exists for given year".freeze unless File.exist?(form_path) @form_definition = JSON.parse(File.open(form_path).read) @name = name - @start_year = form_definition["start_year"] - @end_year = form_definition["end_year"] + @start_date = form_definition["start_date"] + @end_date = form_definition["end_date"] @type = form_definition["form_type"] @sections = form_definition["sections"].map { |id, s| Form::Section.new(id, s, self) } @subsections = sections.flat_map(&:subsections) diff --git a/app/models/validations/date_validations.rb b/app/models/validations/date_validations.rb index 4ba2f6a0a..f92d2a39e 100644 --- a/app/models/validations/date_validations.rb +++ b/app/models/validations/date_validations.rb @@ -31,7 +31,7 @@ module Validations::DateValidations def validate_startdate(record) return unless record.startdate && date_valid?("startdate", record) - if record.startdate < Time.zone.local(2021, 0o4, 0o1) || record.startdate > Time.zone.local(2023, 0o6, 30) + if record.startdate < first_collection_start_date || record.startdate > second_collection_end_date record.errors.add :startdate, I18n.t("validations.date.outside_collection_window") end end @@ -42,6 +42,14 @@ module Validations::DateValidations private + def first_collection_start_date + @first_collection_start_date ||= FormHandler.instance.forms.map { |form| form.second.start_date }.compact.min + end + + def second_collection_end_date + @second_collection_end_date ||= FormHandler.instance.forms.map { |form| form.second.end_date }.compact.max + end + def date_valid?(question, record) if record[question].is_a?(ActiveSupport::TimeWithZone) && record[question].year.zero? record.errors.add question, I18n.t("validations.date.invalid_date") diff --git a/config/forms/2021_2022.json b/config/forms/2021_2022.json index 321797c09..bba24426d 100644 --- a/config/forms/2021_2022.json +++ b/config/forms/2021_2022.json @@ -1,7 +1,7 @@ { "form_type": "lettings", - "start_year": 2021, - "end_year": 2022, + "start_date": "2021-04-01T00:00:00.000+01:00", + "end_date": "2022-07-01T00:00:00.000+01:00", "sections": { "setup": { "label": "Before you start", diff --git a/spec/fixtures/forms/2021_2022.json b/spec/fixtures/forms/2021_2022.json index c26509345..2495baf7a 100644 --- a/spec/fixtures/forms/2021_2022.json +++ b/spec/fixtures/forms/2021_2022.json @@ -1,5 +1,7 @@ { "form_type": "lettings", + "start_date": "2021-04-01T00:00:00.000+01:00", + "end_date": "2022-07-01T00:00:00.000+01:00", "sections": { "household": { "label": "About the household", diff --git a/spec/fixtures/forms/2022_2023.json b/spec/fixtures/forms/2022_2023.json index b599e3067..afa2e5506 100644 --- a/spec/fixtures/forms/2022_2023.json +++ b/spec/fixtures/forms/2022_2023.json @@ -1,5 +1,7 @@ { "form_type": "lettings", + "start_date": "2022-04-01T00:00:00.000+01:00", + "end_date": "2023-07-01T00:00:00.000+01:00", "sections": { "setup": { "label": "Before you start", diff --git a/spec/models/validations/date_validations_spec.rb b/spec/models/validations/date_validations_spec.rb index f27eba6c1..6be9e6cf9 100644 --- a/spec/models/validations/date_validations_spec.rb +++ b/spec/models/validations/date_validations_spec.rb @@ -14,7 +14,7 @@ RSpec.describe Validations::DateValidations do end it "cannot be after the second collection window end date" do - record.startdate = Time.zone.local(2023, 7, 1) + record.startdate = Time.zone.local(2023, 7, 1, 6) date_validator.validate_startdate(record) expect(record.errors["startdate"]).to include(match I18n.t("validations.date.outside_collection_window")) end