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