You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.8 KiB
71 lines
1.8 KiB
class Location < ApplicationRecord |
|
validate :validate_postcode |
|
validates :units, :type_of_unit, :mobility_type, presence: true |
|
belongs_to :scheme |
|
|
|
has_paper_trail |
|
|
|
before_save :lookup_postcode!, if: :postcode_changed? |
|
|
|
attr_accessor :add_another_location |
|
|
|
scope :search_by_postcode, ->(postcode) { where("REPLACE(postcode, ' ', '') ILIKE ?", "%#{postcode.delete(' ')}%") } |
|
scope :search_by_name, ->(name) { where("name ILIKE ?", "%#{name}%") } |
|
scope :search_by, ->(param) { search_by_name(param).or(search_by_postcode(param)) } |
|
|
|
MOBILITY_TYPE = { |
|
"Wheelchair-user standard": "W", |
|
"Fitted with equipment and adaptations": "A", |
|
"Property designed to accessible general standard": "M", |
|
"None": "N", |
|
"Missing": "X", |
|
}.freeze |
|
|
|
enum mobility_type: MOBILITY_TYPE |
|
|
|
TYPE_OF_UNIT = { |
|
"Bungalow": 6, |
|
"Self-contained flat or bedsit": 1, |
|
"Self-contained flat or bedsit with common facilities": 2, |
|
"Self-contained house": 7, |
|
"Shared flat": 3, |
|
"Shared house or hostel": 4, |
|
}.freeze |
|
|
|
enum type_of_unit: TYPE_OF_UNIT |
|
|
|
def display_attributes |
|
[ |
|
{ name: "Location code ", value: location_code, suffix: false }, |
|
{ name: "Postcode", value: postcode, suffix: county }, |
|
{ name: "Type of unit", value: type_of_unit, suffix: false }, |
|
] |
|
end |
|
|
|
def postcode=(postcode) |
|
if postcode |
|
super UKPostcode.parse(postcode).to_s |
|
else |
|
super nil |
|
end |
|
end |
|
|
|
private |
|
|
|
PIO = PostcodeService.new |
|
|
|
def validate_postcode |
|
if postcode.nil? || !postcode&.match(POSTCODE_REGEXP) |
|
error_message = I18n.t("validations.postcode") |
|
errors.add :postcode, error_message |
|
end |
|
end |
|
|
|
def lookup_postcode! |
|
result = PIO.lookup(postcode) |
|
if result |
|
self.location_code = result[:location_code] |
|
self.location_admin_district = result[:location_admin_district] |
|
end |
|
end |
|
end
|
|
|