Browse Source

Add import rent ranges rake task

Co-authored-by: baarkerlounger  <baarkerlounger@users.noreply.github.com>
pull/411/head
Kat 3 years ago
parent
commit
175525d717
  1. 12
      app/models/la_rent_range.rb
  2. 4
      app/models/validations/financial_validations.rb
  3. 9
      db/migrate/20220321093810_create_la_rent_ranges.rb
  4. 9
      db/schema.rb
  5. 13
      db/seeds.rb
  6. 26
      lib/tasks/rent_ranges.rake
  7. 6
      spec/fixtures/files/rent_ranges.csv
  8. 51
      spec/lib/tasks/rent_range_import_spec.rb
  9. 37
      spec/models/validations/financial_validations_spec.rb

12
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

4
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")

9
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

9
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|

13
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",
)

26
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

6
spec/fixtures/files/rent_ranges.csv vendored

@ -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
1 ranges_rent_id lettype la beds soft_min soft_max hard_min hard_max
2 1 1 E07000223 1 58.37 125.59 26.36 179.73
3 327 1 E07000223 2 72.5 149.4 26.36 190.57
4 653 1 E07000223 3 82.85 164.58 26.36 207.89
5 979 1 E07000223 4 91.33 181.9 26.36 226.27
6 1305 3 E07000223 1 52.73 118.01 26.36 162.4

51
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

37
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"])

Loading…
Cancel
Save