|
|
|
module Imports
|
|
|
|
class LogsImportService < ImportService
|
|
|
|
private
|
|
|
|
|
|
|
|
# Safe: A string that represents only an integer (or empty/nil)
|
|
|
|
def safe_string_as_integer(xml_doc, attribute)
|
|
|
|
str = field_value(xml_doc, "xmlns", attribute)
|
|
|
|
Integer(str, exception: false)
|
|
|
|
end
|
|
|
|
|
|
|
|
# Unsafe: A string that has more than just the integer value
|
|
|
|
def unsafe_string_as_integer(xml_doc, attribute)
|
|
|
|
str = string_or_nil(xml_doc, attribute)
|
|
|
|
str&.to_i
|
|
|
|
end
|
|
|
|
|
|
|
|
def compose_date(xml_doc, day_str, month_str, year_str)
|
|
|
|
day = Integer(field_value(xml_doc, "xmlns", day_str), exception: false)
|
|
|
|
month = Integer(field_value(xml_doc, "xmlns", month_str), exception: false)
|
|
|
|
year = Integer(field_value(xml_doc, "xmlns", year_str), exception: false)
|
|
|
|
if day.nil? || month.nil? || year.nil?
|
|
|
|
nil
|
|
|
|
else
|
|
|
|
Time.zone.local(year, month, day)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def creation_method(xml_doc)
|
|
|
|
upload_id = meta_field_value(xml_doc, "upload-id")
|
|
|
|
upload_id.present? ? "bulk upload" : "single log"
|
|
|
|
end
|
|
|
|
|
|
|
|
def find_organisation_id(xml_doc, id_field)
|
|
|
|
old_org_id = meta_field_value(xml_doc, id_field)&.strip.presence
|
|
|
|
organisation = Organisation.find_by(old_org_id:)
|
|
|
|
raise "Organisation not found with old org ID #{old_org_id}" if organisation.nil?
|
|
|
|
|
|
|
|
organisation.id
|
|
|
|
end
|
|
|
|
|
|
|
|
def string_or_nil(xml_doc, attribute)
|
|
|
|
str = field_value(xml_doc, "xmlns", attribute)
|
|
|
|
str.presence
|
|
|
|
end
|
|
|
|
|
|
|
|
def ethnic_group(ethnic)
|
|
|
|
case ethnic
|
|
|
|
when 1, 2, 3, 18
|
|
|
|
# White
|
|
|
|
0
|
|
|
|
when 4, 5, 6, 7
|
|
|
|
# Mixed
|
|
|
|
1
|
|
|
|
when 8, 9, 10, 11, 15
|
|
|
|
# Asian
|
|
|
|
2
|
|
|
|
when 12, 13, 14
|
|
|
|
# Black
|
|
|
|
3
|
|
|
|
when 16, 19
|
|
|
|
# Others
|
|
|
|
4
|
|
|
|
when 17
|
|
|
|
# Refused
|
|
|
|
17
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Safe: A string that represents only a decimal (or empty/nil)
|
|
|
|
def safe_string_as_decimal(xml_doc, attribute)
|
|
|
|
str = string_or_nil(xml_doc, attribute)
|
|
|
|
if str.nil?
|
|
|
|
nil
|
|
|
|
else
|
|
|
|
BigDecimal(str, exception: false)&.round(2)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def compose_postcode(xml_doc, outcode, incode)
|
|
|
|
outcode_value = string_or_nil(xml_doc, outcode)&.strip
|
|
|
|
incode_value = string_or_nil(xml_doc, incode)&.strip
|
|
|
|
if outcode_value.nil? || incode_value.nil? || !"#{outcode_value} #{incode_value}".match(POSTCODE_REGEXP)
|
|
|
|
nil
|
|
|
|
else
|
|
|
|
"#{outcode_value} #{incode_value}"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def previous_postcode_known(xml_doc, previous_postcode, prevloc)
|
|
|
|
previous_postcode_known = string_or_nil(xml_doc, "Q7UnknownPostcode")
|
|
|
|
if previous_postcode_known == "If postcode not known tick" || (previous_postcode.nil? && prevloc.present?)
|
|
|
|
1
|
|
|
|
elsif previous_postcode.nil?
|
|
|
|
nil
|
|
|
|
else
|
|
|
|
0
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def sex(xml_doc, index)
|
|
|
|
sex = string_or_nil(xml_doc, "P#{index}Sex")
|
|
|
|
case sex
|
|
|
|
when "Male"
|
|
|
|
"M"
|
|
|
|
when "Female"
|
|
|
|
"F"
|
|
|
|
when "Other", "Non-binary"
|
|
|
|
"X"
|
|
|
|
when "Refused", "Person prefers not to say", "Buyer prefers not to say"
|
|
|
|
"R"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def relat(xml_doc, index)
|
|
|
|
relat = string_or_nil(xml_doc, "P#{index}Rel")
|
|
|
|
case relat
|
|
|
|
when "Child"
|
|
|
|
"C"
|
|
|
|
when "Partner"
|
|
|
|
"P"
|
|
|
|
when "Other", "Non-binary"
|
|
|
|
"X"
|
|
|
|
when "Refused", "Person prefers not to say", "Buyer prefers not to say"
|
|
|
|
"R"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|