Browse Source

infer correct location fields

pull/1125/head
Kat 4 years ago
parent
commit
54bd5b43cb
  1. 2
      app/models/form/sales/questions/previous_postcode.rb
  2. 28
      app/models/lettings_log.rb
  3. 28
      app/models/log.rb
  4. 24
      app/models/sales_log.rb
  5. 1
      spec/factories/sales_log.rb
  6. 9
      spec/models/form/sales/questions/previous_postcode_spec.rb
  7. 4
      spec/models/form_handler_spec.rb
  8. 66
      spec/models/sales_log_spec.rb

2
app/models/form/sales/questions/previous_postcode.rb

@ -9,7 +9,7 @@ class Form::Sales::Questions::PreviousPostcode < ::Form::Question
@hint_text = "This is also known as the household’s 'last settled home'"
@inferred_check_answers_value = {
"condition" => {
"ppcodenk" => 0,
"ppcodenk" => 1,
},
"value" => "Not known",
}

28
app/models/lettings_log.rb

@ -521,8 +521,6 @@ class LettingsLog < Log
private
PIO = PostcodeService.new
def reset_derived_questions
dependent_questions = { waityear: [{ key: :renewal, value: 0 }],
referral: [{ key: :renewal, value: 0 }],
@ -600,11 +598,6 @@ private
process_postcode(postcode_full, "postcode_known", "is_la_inferred", "la")
end
def process_previous_postcode_changes!
self.ppostcode_full = upcase_and_remove_whitespace(ppostcode_full)
process_postcode(ppostcode_full, "ppcodenk", "is_previous_la_inferred", "prevloc")
end
def process_postcode(postcode, postcode_known_key, la_inferred_key, la_key)
return if postcode.blank?
@ -618,23 +611,6 @@ private
reset_location(is_la_inferred, "la", "is_la_inferred", "postcode_full", 1)
end
def reset_previous_location_fields!
reset_location(is_previous_la_inferred, "prevloc", "is_previous_la_inferred", "ppostcode_full", previous_la_known)
end
def reset_location(is_inferred, la_key, is_inferred_key, postcode_key, is_la_known)
if is_inferred || is_la_known != 1
self[la_key] = nil
end
self[is_inferred_key] = false
self[postcode_key] = nil
end
def get_inferred_la(postcode)
result = PIO.lookup(postcode)
result[:location_code] if result
end
def get_has_benefits
HAS_BENEFITS_OPTIONS.include?(hb) ? 1 : 0
end
@ -687,10 +663,6 @@ private
(value * 52 / num_of_weeks).round(2)
end
def upcase_and_remove_whitespace(string)
string.present? ? string.upcase.gsub(/\s+/, "") : string
end
def fully_wheelchair_accessible?
housingneeds_type.present? && housingneeds_type.zero?
end

28
app/models/log.rb

@ -88,4 +88,32 @@ private
update!(created_by: nil)
end
PIO = PostcodeService.new
def process_previous_postcode_changes!
self.ppostcode_full = upcase_and_remove_whitespace(ppostcode_full)
process_postcode(ppostcode_full, "ppcodenk", "is_previous_la_inferred", "prevloc")
end
def get_inferred_la(postcode)
result = PIO.lookup(postcode)
result[:location_code] if result
end
def upcase_and_remove_whitespace(string)
string.present? ? string.upcase.gsub(/\s+/, "") : string
end
def reset_previous_location_fields!
reset_location(is_previous_la_inferred, "prevloc", "is_previous_la_inferred", "ppostcode_full", previous_la_known)
end
def reset_location(is_inferred, la_key, is_inferred_key, postcode_key, is_la_known)
if is_inferred || is_la_known != 1
self[la_key] = nil
end
self[is_inferred_key] = false
self[postcode_key] = nil
end
end

24
app/models/sales_log.rb

@ -2,6 +2,7 @@ class SalesLogValidator < ActiveModel::Validator
include Validations::Sales::HouseholdValidations
include Validations::SharedValidations
include Validations::Sales::FinancialValidations
include Validations::LocalAuthorityValidations
def validate(record)
validation_methods = public_methods.select { |method| method.starts_with?("validate_") }
@ -20,6 +21,8 @@ class SalesLog < Log
validates_with SalesLogValidator
before_validation :set_derived_fields!
before_validation :reset_invalidated_dependent_fields!
before_validation :process_previous_postcode_changes!, if: :ppostcode_full_changed?
before_validation :reset_previous_location_fields!, unless: :previous_postcode_known?
scope :filter_by_year, ->(year) { where(saledate: Time.zone.local(year.to_i, 4, 1)...Time.zone.local(year.to_i + 1, 4, 1)) }
scope :search_by, ->(param) { filter_by_id(param) }
@ -111,4 +114,25 @@ class SalesLog < Log
def income2_used_for_mortgage?
inc2mort == 1
end
def ppostcode_full=(postcode)
if postcode
super UKPostcode.parse(postcode).to_s
else
super nil
end
end
def previous_postcode_known?
ppcodenk&.zero?
end
def process_postcode(postcode, postcode_known_key, la_inferred_key, la_key)
return if postcode.blank?
self[postcode_known_key] = 0
inferred_la = get_inferred_la(postcode)
self[la_inferred_key] = inferred_la.present?
self[la_key] = inferred_la if inferred_la.present?
end
end

1
spec/factories/sales_log.rb

@ -74,6 +74,7 @@ FactoryBot.define do
disabled { 1 }
hhregres { 1 }
hhregresstill { 4 }
ppcodenk { 1 }
end
end
end

9
spec/models/form/sales/questions/previous_postcode_spec.rb

@ -35,21 +35,20 @@ RSpec.describe Form::Sales::Questions::PreviousPostcode, type: :model do
expect(question.hint_text).to eq("This is also known as the household’s 'last settled home'")
end
it "has the correct inferred_answers" do
expect(question.inferred_answers).to eq({
"prevloc" => {
"is_previous_la_inferred" => true
}
"is_previous_la_inferred" => true,
},
})
end
it "has the correct inferred_check_answers_value" do
expect(question.inferred_check_answers_value).to eq({
"condition" => {
"ppcodenk" => 0
"ppcodenk" => 1,
},
"value" => "Not known"
"value" => "Not known",
})
end
end

4
spec/models/form_handler_spec.rb

@ -52,14 +52,14 @@ RSpec.describe FormHandler do
it "is able to load a current sales form" do
form = form_handler.get_form("current_sales")
expect(form).to be_a(Form)
expect(form.pages.count).to eq(73)
expect(form.pages.count).to eq(74)
expect(form.name).to eq("2022_2023_sales")
end
it "is able to load a previous sales form" do
form = form_handler.get_form("previous_sales")
expect(form).to be_a(Form)
expect(form.pages.count).to eq(73)
expect(form.pages.count).to eq(74)
expect(form.name).to eq("2021_2022_sales")
end
end

66
spec/models/sales_log_spec.rb

@ -90,4 +90,70 @@ RSpec.describe SalesLog, type: :model do
expect(described_class.filter_by_organisation([organisation_3]).count).to eq(0)
end
end
context "when saving previous address" do
def check_previous_postcode_fields(postcode_field)
record_from_db = ActiveRecord::Base.connection.execute("select #{postcode_field} from sales_logs where id=#{address_sales_log.id}").to_a[0]
expect(address_sales_log[postcode_field]).to eq("M1 1AE")
expect(record_from_db[postcode_field]).to eq("M1 1AE")
end
before do
stub_request(:get, /api.postcodes.io/)
.to_return(status: 200, body: "{\"status\":200,\"result\":{\"admin_district\":\"Manchester\", \"codes\":{\"admin_district\": \"E08000003\"}}}", headers: {})
end
let!(:address_sales_log) do
described_class.create({
managing_organisation: owning_organisation,
owning_organisation:,
created_by: created_by_user,
ppcodenk: 1,
ppostcode_full: "M1 1AE",
})
end
def previous_postcode_fields
check_previous_postcode_fields("ppostcode_full")
end
it "correctly formats previous postcode" do
address_sales_log.update!(ppostcode_full: "M1 1AE")
previous_postcode_fields
address_sales_log.update!(ppostcode_full: "m1 1ae")
previous_postcode_fields
address_sales_log.update!(ppostcode_full: "m11Ae")
previous_postcode_fields
address_sales_log.update!(ppostcode_full: "m11ae")
previous_postcode_fields
end
it "correctly infers prevloc" do
record_from_db = ActiveRecord::Base.connection.execute("select prevloc from sales_logs where id=#{address_sales_log.id}").to_a[0]
expect(address_sales_log.prevloc).to eq("E08000003")
expect(record_from_db["prevloc"]).to eq("E08000003")
end
it "errors if the previous postcode is emptied" do
expect { address_sales_log.update!({ ppostcode_full: "" }) }
.to raise_error(ActiveRecord::RecordInvalid, /#{I18n.t("validations.postcode")}/)
end
it "errors if the previous postcode is not valid" do
expect { address_sales_log.update!({ ppostcode_full: "invalid_postcode" }) }
.to raise_error(ActiveRecord::RecordInvalid, /#{I18n.t("validations.postcode")}/)
end
it "correctly resets all fields if previous postcode not known" do
address_sales_log.update!({ ppcodenk: 1 })
record_from_db = ActiveRecord::Base.connection.execute("select prevloc, ppostcode_full from sales_logs where id=#{address_sales_log.id}").to_a[0]
expect(record_from_db["ppostcode_full"]).to eq(nil)
expect(address_sales_log.prevloc).to eq(nil)
expect(record_from_db["prevloc"]).to eq(nil)
end
end
end

Loading…
Cancel
Save