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.
128 lines
3.4 KiB
128 lines
3.4 KiB
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
|
|
|