Submit social housing lettings and sales data (CORE)
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.

89 lines
3.0 KiB

module Imports
class UserImportService < ImportService
def create_users(folder)
import_from(folder, :create_user)
end
private
PROVIDER_TYPE = {
"Data Provider" => User.roles[:data_provider],
}.freeze
def create_user(xml_document)
organisation = Organisation.find_by(old_org_id: user_field_value(xml_document, "institution"))
old_user_id = user_field_value(xml_document, "id")
email = user_field_value(xml_document, "email").downcase.strip
name = user_field_value(xml_document, "full-name") || email
deleted = user_field_value(xml_document, "deleted")
if LegacyUser.find_by(old_user_id:)
@logger.warn("User #{name} with old user id #{old_user_id} is already present, skipping.")
elsif deleted == "true"
@logger.warn("User #{name} with old user id #{old_user_id} is deleted, skipping.")
elsif (user = User.find_by(email:, organisation:))
is_dpo = user.is_data_protection_officer? || is_dpo?(user_field_value(xml_document, "user-type"))
role = highest_role(user.role, role(user_field_value(xml_document, "user-type")))
user.update!(role:, is_dpo:)
user.legacy_users.create!(old_user_id:)
else
user = User.new
user.email = email
user.name = name
user.password = Devise.friendly_token
user.phone = user_field_value(xml_document, "telephone-no")
user.organisation = organisation
user.role = role(user_field_value(xml_document, "user-type"))
user.is_dpo = is_dpo?(user_field_value(xml_document, "user-type"))
user.is_key_contact = is_key_contact?(user_field_value(xml_document, "contact-priority-id"))
user.active = user_field_value(xml_document, "active")
user.skip_confirmation_notification!
begin
user.save!
user.legacy_users.create!(old_user_id:)
user
rescue ActiveRecord::RecordInvalid => e
@logger.error(e.message)
@logger.error("Could not save user with email: #{email}")
end
end
end
def user_field_value(xml_document, field)
field_value(xml_document, "user", field, { "user" => "dclg:user" })
end
def role(field_value)
return unless field_value
{
"co-ordinator" => "data_coordinator",
"data provider" => "data_provider",
"private data downloader" => "data_accessor",
}[field_value.downcase.strip]
end
def highest_role(role_a, role_b)
return unless role_a || role_b
return role_a unless role_b
return role_b unless role_a
[role_a, role_b].map(&:to_sym).sort! { |a, b| User::ROLES[b] <=> User::ROLES[a] }.first
end
def is_dpo?(field_value)
return false if field_value.blank?
field_value.downcase.strip == "data protection officer"
end
def is_key_contact?(field_value)
return false if field_value.blank?
["ecore contact", "key performance contact"].include?(field_value.downcase.strip)
end
end
end