From 175525d717e7b19a9036d13372ea85d1999b171b Mon Sep 17 00:00:00 2001 From: Kat Date: Wed, 23 Mar 2022 11:27:15 +0000 Subject: [PATCH] Add import rent ranges rake task Co-authored-by: baarkerlounger --- app/models/la_rent_range.rb | 12 ----- .../validations/financial_validations.rb | 4 +- .../20220321093810_create_la_rent_ranges.rb | 9 ++-- db/schema.rb | 9 ++-- db/seeds.rb | 13 ----- lib/tasks/rent_ranges.rake | 26 ++++++++++ spec/fixtures/files/rent_ranges.csv | 6 +++ spec/lib/tasks/rent_range_import_spec.rb | 51 +++++++++++++++++++ .../validations/financial_validations_spec.rb | 37 +++++--------- 9 files changed, 104 insertions(+), 63 deletions(-) create mode 100644 lib/tasks/rent_ranges.rake create mode 100644 spec/fixtures/files/rent_ranges.csv create mode 100644 spec/lib/tasks/rent_range_import_spec.rb diff --git a/app/models/la_rent_range.rb b/app/models/la_rent_range.rb index cefdc92ae..ad1d20b57 100644 --- a/app/models/la_rent_range.rb +++ b/app/models/la_rent_range.rb @@ -1,14 +1,2 @@ class LaRentRange < ApplicationRecord - PROVIDER_TYPE = { - "LA": 1, - "HA": 2, - }.freeze - - NEEDS_TYPE = { - "General Needs": 1, - "Supported Housing": 0, - }.freeze - - enum provider_type: PROVIDER_TYPE - enum needstype: NEEDS_TYPE end diff --git a/app/models/validations/financial_validations.rb b/app/models/validations/financial_validations.rb index 230d2ece5..d3b173a96 100644 --- a/app/models/validations/financial_validations.rb +++ b/app/models/validations/financial_validations.rb @@ -132,10 +132,8 @@ private record[field].present? && record.weekly_value(record[field]).present? && record.weekly_value(record[field]).between?(min, max) end - PROVIDER_TYPE = { "LA" => "LA", "PRP" => "HA" }.freeze - def validate_rent_range(record) - rent_range = LaRentRange.find_by(year: record.year, ons_code: record.la, provider_type: PROVIDER_TYPE[record.managing_organisation.provider_type], needstype: record.needstype, beds: record.beds, renttype: record.renttype) + rent_range = LaRentRange.find_by(start_year: record.year, la: record.la, beds: record.beds, lettype: record.lettype) if rent_range.present? && !weekly_value_in_range(record, "brent", rent_range.hard_min, rent_range.hard_max) record.errors.add :brent, I18n.t("validations.financial.brent.not_in_range") diff --git a/db/migrate/20220321093810_create_la_rent_ranges.rb b/db/migrate/20220321093810_create_la_rent_ranges.rb index a0d66842e..5bc1c6fac 100644 --- a/db/migrate/20220321093810_create_la_rent_ranges.rb +++ b/db/migrate/20220321093810_create_la_rent_ranges.rb @@ -2,19 +2,16 @@ class CreateLaRentRanges < ActiveRecord::Migration[7.0] def change create_table :la_rent_ranges do |t| t.integer :ranges_rent_id - t.integer :needstype - t.integer :provider_type - t.string :ons_code + t.integer :lettype t.string :la t.integer :beds t.decimal :soft_min, precision: 10, scale: 2 t.decimal :soft_max, precision: 10, scale: 2 t.decimal :hard_min, precision: 10, scale: 2 t.decimal :hard_max, precision: 10, scale: 2 - t.integer :year - t.integer :renttype + t.integer :start_year - t.index :year + t.index %i[start_year lettype beds la], unique: true t.timestamps end end diff --git a/db/schema.rb b/db/schema.rb index 7b8bf974a..7888d8903 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -234,20 +234,17 @@ ActiveRecord::Schema[7.0].define(version: 202202071123100) do create_table "la_rent_ranges", force: :cascade do |t| t.integer "ranges_rent_id" - t.integer "needstype" - t.integer "provider_type" - t.string "ons_code" + t.integer "lettype" t.string "la" t.integer "beds" t.decimal "soft_min", precision: 10, scale: 2 t.decimal "soft_max", precision: 10, scale: 2 t.decimal "hard_min", precision: 10, scale: 2 t.decimal "hard_max", precision: 10, scale: 2 - t.integer "year" - t.integer "renttype" + t.integer "start_year" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.index ["year"], name: "index_la_rent_ranges_on_year" + t.index ["start_year", "lettype", "beds", "la"], name: "index_la_rent_ranges_on_start_year_and_lettype_and_beds_and_la", unique: true end create_table "organisations", force: :cascade do |t| diff --git a/db/seeds.rb b/db/seeds.rb index bdb9b975d..0e63f2e5a 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -32,16 +32,3 @@ User.create!( ) AdminUser.create!(email: "admin@example.com", password: "password", phone: "000000000") - -LaRentRange.create!( - ranges_rent_id: "1", - lettype: "General Needs HA", - ons_code: "E07000223", - la: "Adur", - bedrooms: 1, - soft_min: 12.41, - soft_max: 89.54, - hard_min: 9.87, - hard_max: 100.99, - year: "2021", -) diff --git a/lib/tasks/rent_ranges.rake b/lib/tasks/rent_ranges.rake new file mode 100644 index 000000000..b66c5460d --- /dev/null +++ b/lib/tasks/rent_ranges.rake @@ -0,0 +1,26 @@ +require "csv" + +namespace :data_import do + desc "Import annual rent range data" + task :rent_ranges, %i[start_year path] => :environment do |_task, args| + start_year = args[:start_year] + path = args[:path] + + raise "Usage: rake data_import:rent_ranges[start_year,'path/to/csv_file']" if path.blank? || start_year.blank? + + CSV.foreach(path, headers: true) do |row| + LaRentRange.upsert( + { ranges_rent_id: row["ranges_rent_id"], + lettype: row["lettype"], + beds: row["beds"], + start_year:, + la: row["la"], + soft_min: row["soft_min"], + soft_max: row["soft_max"], + hard_min: row["hard_min"], + hard_max: row["hard_max"] }, + unique_by: %i[start_year lettype beds la], + ) + end + end +end diff --git a/spec/fixtures/files/rent_ranges.csv b/spec/fixtures/files/rent_ranges.csv new file mode 100644 index 000000000..645472a6f --- /dev/null +++ b/spec/fixtures/files/rent_ranges.csv @@ -0,0 +1,6 @@ +ranges_rent_id,lettype,la,beds,soft_min,soft_max,hard_min,hard_max +1,1,E07000223,1,58.37,125.59,26.36,179.73 +327,1,E07000223,2,72.5,149.4,26.36,190.57 +653,1,E07000223,3,82.85,164.58,26.36,207.89 +979,1,E07000223,4,91.33,181.9,26.36,226.27 +1305,3,E07000223,1,52.73,118.01,26.36,162.4 \ No newline at end of file diff --git a/spec/lib/tasks/rent_range_import_spec.rb b/spec/lib/tasks/rent_range_import_spec.rb new file mode 100644 index 000000000..755571fab --- /dev/null +++ b/spec/lib/tasks/rent_range_import_spec.rb @@ -0,0 +1,51 @@ +require "rails_helper" +require "rake" + +RSpec.describe "data_import" do + describe ":rent_ranges", type: :task do + subject(:task) { Rake::Task["data_import:rent_ranges"] } + + before do + Rake.application.rake_require("tasks/rent_ranges") + Rake::Task.define_task(:environment) + task.reenable + end + + context "when the rake task is run" do + let(:start_year) { 2021 } + let(:rent_ranges_file_path) { "./spec/fixtures/files/rent_ranges.csv" } + let(:wrong_file_path) { "/test/no_csv_here.csv" } + + before do + LaRentRange.delete_all + end + + it "creates new rent range records" do + expect { task.invoke(start_year, rent_ranges_file_path) }.to change(LaRentRange, :count).by(5) + expect(LaRentRange.where(ranges_rent_id: 1).exists?).to be true + end + + it "raises an error when no path is given" do + expect { task.invoke(start_year, nil) }.to raise_error(RuntimeError, "Usage: rake data_import:rent_ranges[start_year,'path/to/csv_file']") + end + + it "raises an error when no file exists at the given path" do + expect { task.invoke(start_year, wrong_file_path) }.to raise_error(Errno::ENOENT) + end + + it "asks for a start year if it is not given" do + expect { task.invoke(nil, rent_ranges_file_path) }.to raise_error(RuntimeError, "Usage: rake data_import:rent_ranges[start_year,'path/to/csv_file']") + end + + context "when a record already exists with a matching index of la, beds, start year and lettype" do + let!(:rent_range) { LaRentRange.create(lettype: 1, la: "E07000223", beds: 2, soft_min: 53.5, soft_max: 149.4, hard_min: 20.36, hard_max: 200.57, start_year: 2021) } + + it "updates rent ranges if the record is matched on la, beds, start year and lettype" do + task.invoke(start_year, rent_ranges_file_path) + rent_range.reload + expect(rent_range.hard_max).to eq(190.57) + end + end + end + end +end diff --git a/spec/models/validations/financial_validations_spec.rb b/spec/models/validations/financial_validations_spec.rb index eebe22080..7ed417df5 100644 --- a/spec/models/validations/financial_validations_spec.rb +++ b/spec/models/validations/financial_validations_spec.rb @@ -715,34 +715,27 @@ RSpec.describe Validations::FinancialValidations do end context "when validating ranges based on LA and needstype" do - rent_range = LaRentRange.create!( - ranges_rent_id: "1", - needstype: "General Needs", - provider_type: "HA", - ons_code: "E07000223", - la: "Adur", - beds: 1, - soft_min: 12.41, - soft_max: 89.54, - hard_min: 9.87, - hard_max: 100.99, - year: 2021, - renttype: 1, - ) - - after do - rent_range.destroy + before do + LaRentRange.find_or_create_by( + ranges_rent_id: "1", + la: "E07000223", + beds: 1, + lettype: 1, + soft_min: 12.41, + soft_max: 89.54, + hard_min: 9.87, + hard_max: 100.99, + start_year: 2021, + ) end it "validates hard minimum" do - record.needstype = 1 + record.lettype = 1 record.period = 1 - record.managing_organisation.provider_type = 2 record.la = "E07000223" record.beds = 1 record.year = 2021 record.brent = 9.17 - record.renttype = 1 financial_validator.validate_rent_amount(record) expect(record.errors["brent"]) @@ -750,14 +743,12 @@ RSpec.describe Validations::FinancialValidations do end it "validates hard max" do - record.needstype = 1 + record.lettype = 1 record.period = 1 - record.managing_organisation.provider_type = 2 record.la = "E07000223" record.beds = 1 record.year = 2021 record.brent = 200 - record.renttype = 1 financial_validator.validate_rent_amount(record) expect(record.errors["brent"])