From 9f332bcecd96f0752f8de7ec019be086d347905e Mon Sep 17 00:00:00 2001 From: Dushan <47317567+dushan-madetech@users.noreply.github.com> Date: Mon, 29 Nov 2021 15:30:10 +0000 Subject: [PATCH 01/14] CLDC-494 key dates validation (#115) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add major repairs dates validation * Add more key dates validations * Add remaining validations Co-authored-by: Dushan * Move validation tests from feature to model spec Co-authored-by: Dushan * Fix dates for validation in complete case log fixture Co-authored-by: Dushan * schema fix * fix all tests 🙌 * lint fixes 😎 * recactor out a conditional method Co-authored-by: Kat Co-authored-by: Dushan --- app/validations/date_validations.rb | 31 ++++ ...25154916_change_property_void_date_type.rb | 15 ++ db/schema.rb | 4 +- spec/fixtures/complete_case_log.json | 28 ++-- spec/models/case_log_spec.rb | 137 ++++++++++++++++++ spec/requests/case_log_controller_spec.rb | 3 +- 6 files changed, 201 insertions(+), 17 deletions(-) create mode 100644 db/migrate/20211125154916_change_property_void_date_type.rb diff --git a/app/validations/date_validations.rb b/app/validations/date_validations.rb index 77f737344..e5975c094 100644 --- a/app/validations/date_validations.rb +++ b/app/validations/date_validations.rb @@ -1,6 +1,31 @@ module DateValidations def validate_property_major_repairs(record) date_valid?("mrcdate", record) + if record["startdate"].present? && record["mrcdate"].present? && record["startdate"] < record["mrcdate"] + record.errors.add :mrcdate, "Major repairs date must be before the tenancy start date" + end + + if is_rsnvac_first_let?(record) && record["mrcdate"].present? + record.errors.add :mrcdate, "Major repairs date must not be completed if the tenancy is first let" + end + + if record["mrcdate"].present? && record["startdate"].present? && record["startdate"].to_date - record["mrcdate"].to_date > 730 + record.errors.add :mrcdate, "Major repairs cannot be more than 730 days before the tenancy start date" + end + end + + def validate_property_void_date(record) + if record["property_void_date"].present? && record["startdate"].present? && record["startdate"].to_date - record["property_void_date"].to_date > 3650 + record.errors.add :property_void_date, "Void date cannot be more than 730 days before the tenancy start date" + end + + if record["property_void_date"].present? && record["startdate"].present? && record["startdate"].to_date < record["property_void_date"].to_date + record.errors.add :property_void_date, "Void date must be before the tenancy start date" + end + + if record["property_void_date"].present? && record["mrcdate"].present? && record["mrcdate"].to_date < record["property_void_date"].to_date + record.errors.add :property_void_date, "Void date must be after the major repair date if a major repair date has been provided" + end end def validate_startdate(record) @@ -18,4 +43,10 @@ private record.errors.add question, "Please enter a valid date" end end + + def is_rsnvac_first_let?(record) + record["rsnvac"] == "First let of newbuild property" || + record["rsnvac"] == "First let of conversion/rehabilitation/acquired property" || + record["rsnvac"] == "First let of leased property" + end end diff --git a/db/migrate/20211125154916_change_property_void_date_type.rb b/db/migrate/20211125154916_change_property_void_date_type.rb new file mode 100644 index 000000000..fed1fcac9 --- /dev/null +++ b/db/migrate/20211125154916_change_property_void_date_type.rb @@ -0,0 +1,15 @@ +class ChangePropertyVoidDateType < ActiveRecord::Migration[6.1] + def up + change_table :case_logs, bulk: true do |t| + t.remove :property_void_date + t.column :property_void_date, :datetime + end + end + + def down + change_table :case_logs, bulk: true do |t| + t.remove :property_void_date + t.column :property_void_date, :string + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 1f7ec27d6..b63e15a8f 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.define(version: 2021_11_25_114400) do +ActiveRecord::Schema.define(version: 2021_11_25_154916) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -83,7 +83,6 @@ ActiveRecord::Schema.define(version: 2021_11_25_114400) do t.integer "rsnvac" t.integer "unittype_gn" t.integer "beds" - t.string "property_void_date" t.integer "offered" t.integer "wchair" t.integer "earnings" @@ -166,6 +165,7 @@ ActiveRecord::Schema.define(version: 2021_11_25_114400) do t.string "why_dont_you_know_la" t.integer "unitletas" t.integer "builtype" + t.datetime "property_void_date" t.index ["discarded_at"], name: "index_case_logs_on_discarded_at" end diff --git a/spec/fixtures/complete_case_log.json b/spec/fixtures/complete_case_log.json index a1bcea38b..88e72fc34 100644 --- a/spec/fixtures/complete_case_log.json +++ b/spec/fixtures/complete_case_log.json @@ -50,7 +50,7 @@ "accessibility_requirements": "No", "condition_effects": "dummy", "tenancy_code": "BZ757", - "startdate": "12/03/2019", + "startdate": "12/12/2020", "startertenancy": "No", "tenancylength": "5", "tenancy": "Secure (including flexible)", @@ -59,16 +59,16 @@ "la": "Barnet", "property_postcode": "NW1 5TY", "property_relet": "No", - "rsnvac": "First let of newbuild property", + "rsnvac": "Renewal of fixed-term tenancy", "property_reference": "P9876", "unittype_gn": "House", "property_building_type": "dummy", "beds": 3, - "property_void_date": "03/11/2019", - "majorrepairs": "No", - "mrcdate": "05/05/2020", - "mrcday": 5, - "mrcmonth": 5, + "property_void_date": "10/10/2020", + "majorrepairs": "Yes", + "mrcdate": "11/11/2020", + "mrcday": 11, + "mrcmonth": 11, "mrcyear": 2020, "offered": 2, "wchair": "Yes", @@ -120,17 +120,17 @@ "rp_hardship": "No", "rp_dontknow": "No", "discarded_at": "05/05/2020", - "override_net_income_validation": "", - "gdpr_acceptance": "", + "override_net_income_validation": "", + "gdpr_acceptance": "", "gdpr_declined": "", - "property_owner_organisation": "", + "property_owner_organisation": "", "property_manager_organisation": "", - "sale_or_letting": "", - "rent_type": "", + "sale_or_letting": "", + "rent_type": "", "intermediate_rent_product_name": "", - "needs_type": "", + "needs_type": "", "sale_completion_date": "01/01/2020", - "purchaser_code": "", + "purchaser_code": "", "propcode": "123", "postcode": "a1", "postcod2": "w3", diff --git a/spec/models/case_log_spec.rb b/spec/models/case_log_spec.rb index 0ffb5cc9c..b52d04a63 100644 --- a/spec/models/case_log_spec.rb +++ b/spec/models/case_log_spec.rb @@ -410,6 +410,143 @@ RSpec.describe Form, type: :model do end end end + + context "major repairs date" do + it "cannot be later than the tenancy start date" do + expect { + CaseLog.create!( + mrcdate: Date.new(2020, 10, 10), + startdate: Date.new(2020, 10, 9), + ) + }.to raise_error(ActiveRecord::RecordInvalid) + + expect { + CaseLog.create!( + mrcdate: Date.new(2020, 10, 9), + startdate: Date.new(2020, 10, 10), + ) + }.not_to raise_error + end + + it "must not be completed if reason for vacancy is first let" do + expect { + CaseLog.create!( + mrcdate: Date.new(2020, 10, 10), + rsnvac: "First let of newbuild property", + ) + }.to raise_error(ActiveRecord::RecordInvalid) + + expect { + CaseLog.create!( + mrcdate: Date.new(2020, 10, 10), + rsnvac: "First let of conversion/rehabilitation/acquired property", + ) + }.to raise_error(ActiveRecord::RecordInvalid) + + expect { + CaseLog.create!( + mrcdate: Date.new(2020, 10, 10), + rsnvac: "First let of leased property", + ) + }.to raise_error(ActiveRecord::RecordInvalid) + end + + it "must have less than two years between the tenancy start date and major repairs date" do + expect { + CaseLog.create!( + startdate: Date.new(2020, 10, 10), + mrcdate: Date.new(2017, 10, 10), + ) + }.to raise_error(ActiveRecord::RecordInvalid) + end + end + + context "void date" do + it "must have less than 10 years between the tenancy start date and void" do + expect { + CaseLog.create!( + startdate: Date.new(2020, 10, 10), + property_void_date: Date.new(2009, 10, 10), + ) + }.to raise_error(ActiveRecord::RecordInvalid) + + expect { + CaseLog.create!( + startdate: Date.new(2020, 10, 10), + property_void_date: Date.new(2015, 10, 10), + ) + }.not_to raise_error + end + + it "must be before the tenancy start date" do + expect { + CaseLog.create!( + startdate: Date.new(2020, 10, 10), + property_void_date: Date.new(2021, 10, 10), + ) + }.to raise_error(ActiveRecord::RecordInvalid) + + expect { + CaseLog.create!( + startdate: Date.new(2020, 10, 10), + property_void_date: Date.new(2019, 10, 10), + ) + }.not_to raise_error + end + + it "must be before major repairs date if major repairs date provided" do + expect { + CaseLog.create!( + startdate: Date.new(2020, 10, 10), + mrcdate: Date.new(2019, 10, 10), + property_void_date: Date.new(2019, 11, 11), + ) + }.to raise_error(ActiveRecord::RecordInvalid) + end + end + + context "Validate pregnancy questions" do + it "Cannot answer yes if no female tenants" do + expect { + CaseLog.create!(preg_occ: "Yes", + sex1: "Male", + age1: 20) + }.to raise_error(ActiveRecord::RecordInvalid) + end + + it "Cannot answer yes if no female tenants within age range" do + expect { + CaseLog.create!(preg_occ: "Yes", + sex1: "Female", + age1: 51) + }.to raise_error(ActiveRecord::RecordInvalid) + end + + it "Cannot answer prefer not to say if no valid tenants" do + expect { + CaseLog.create!(preg_occ: "Prefer not to say", + sex1: "Male", + age1: 20) + }.to raise_error(ActiveRecord::RecordInvalid) + end + + it "Can answer yes if valid tenants" do + expect { + CaseLog.create!(preg_occ: "Yes", + sex1: "Female", + age1: 20) + }.not_to raise_error + end + + it "Can answer yes if valid second tenant" do + expect { + CaseLog.create!(preg_occ: "Yes", + sex1: "Male", age1: 99, + sex2: "Female", + age2: 20) + }.not_to raise_error + end + end end describe "status" do diff --git a/spec/requests/case_log_controller_spec.rb b/spec/requests/case_log_controller_spec.rb index eb8b9c9c9..443e22b75 100644 --- a/spec/requests/case_log_controller_spec.rb +++ b/spec/requests/case_log_controller_spec.rb @@ -84,6 +84,7 @@ RSpec.describe CaseLogsController, type: :request do it "marks the record as completed" do json_response = JSON.parse(response.body) + expect(json_response).not_to have_key("errors") expect(json_response["status"]).to eq(completed) end end @@ -318,7 +319,7 @@ RSpec.describe CaseLogsController, type: :request do case_log: { page: page_id, age1: answer, - age2: 2000 + age2: 2000, }, } end From cdf9af37d2335842b8249a73baa1a46da88a8dc7 Mon Sep 17 00:00:00 2001 From: Paul Robert Lloyd Date: Mon, 29 Nov 2021 16:47:44 +0000 Subject: [PATCH 02/14] Ensure compatibility with ARM processors --- .nvmrc | 1 + Gemfile.lock | 3 +++ package.json | 3 +++ 3 files changed, 7 insertions(+) create mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..8351c1939 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +14 diff --git a/Gemfile.lock b/Gemfile.lock index 300874dd8..b64e1380e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -231,6 +231,8 @@ GEM minitest (5.14.4) msgpack (1.4.2) nio4r (2.5.8) + nokogiri (1.12.5-arm64-darwin) + racc (~> 1.4) nokogiri (1.12.5-x86_64-darwin) racc (~> 1.4) nokogiri (1.12.5-x86_64-linux) @@ -394,6 +396,7 @@ GEM zeitwerk (2.5.1) PLATFORMS + arm64-darwin-21 x86_64-darwin-19 x86_64-darwin-20 x86_64-linux diff --git a/package.json b/package.json index 5da73dd8c..c3ede97ff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,9 @@ { "name": "data-collector", "private": true, + "engines": { + "node": "^14.0.0" + }, "dependencies": { "@activeadmin/activeadmin": "^2.9.0", "@hotwired/stimulus": "^3.0.0", From 7bd7bc1aae7fad1ee61f44b72a42fbeb390bf578 Mon Sep 17 00:00:00 2001 From: Paul Robert Lloyd Date: Mon, 29 Nov 2021 16:52:04 +0000 Subject: [PATCH 03/14] Remove multiple header containers --- app/views/layouts/application.html.erb | 29 +++++++++++++------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 8f043f6ee..7b3b968fc 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -33,21 +33,20 @@ Skip to main content - + <%= render GovukComponent::HeaderComponent.new( + logotype: 'GOV.UK', + service_name: 'Share Lettings and Sales for Social Housing in England Data with DLUHC', + service_url: '/' + ) do |component| + if current_user.nil? + component.navigation_item(text: 'Case logs', href: '/case_logs') + elsif + component.navigation_item(text: 'Your account', href: '/users/account') + component.navigation_item(text: 'Sign out', href: destroy_user_session_path, options: {:method => :delete}) + end + end + %> +