3 changed files with 134 additions and 241 deletions
@ -0,0 +1,127 @@
|
||||
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) |
||||
if str.nil? |
||||
nil |
||||
else |
||||
str.to_i |
||||
end |
||||
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 find_organisation_id(xml_doc, id_field) |
||||
old_visible_id = string_or_nil(xml_doc, id_field) |
||||
organisation = Organisation.find_by(old_visible_id:) |
||||
raise "Organisation not found with legacy ID #{old_visible_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) |
||||
end |
||||
end |
||||
|
||||
def compose_postcode(xml_doc, outcode, incode) |
||||
outcode_value = string_or_nil(xml_doc, outcode) |
||||
incode_value = string_or_nil(xml_doc, incode) |
||||
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" |
||||
"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", "Buyer prefers not to say" |
||||
"R" |
||||
end |
||||
end |
||||
end |
||||
end |
||||
Loading…
Reference in new issue