Maintenance::MigrateMidBackOfficeToEnumTask

Source code
# frozen_string_literal: true

class Maintenance::MigrateMidBackOfficeToEnumTask < MaintenanceTasks::Task
  MBO_MAPPING = {
    'protas' => MboProfiles::MidBackOffice::PROTAS,
    'travelogix' => MboProfiles::MidBackOffice::TRAVELOGIX,
    'lumina' => MboProfiles::MidBackOffice::LUMINA,
    'd365' => MboProfiles::MidBackOffice::D365,
    'partner' => MboProfiles::MidBackOffice::PARTNER,
    'dynamics' => MboProfiles::MidBackOffice::D365,
    'viaxeo' => MboProfiles::MidBackOffice::VIAXEO,
    'travelsky' => MboProfiles::MidBackOffice::FCM_PLATFORM_CN,
    'travcom' => MboProfiles::MidBackOffice::TRAVCOM,
    'fcm_platform_cn' => MboProfiles::MidBackOffice::FCM_PLATFORM_CN
  }.freeze

  collection_batch_size(1000)

  def collection
    MboProfile.all
  end

  def process(element)
    mapped_value = map_mid_back_office(element)

    # rubocop:disable Rails/SkipsModelValidations
    element.update_column(:mid_back_office, mapped_value)
    # rubocop:enable Rails/SkipsModelValidations
  rescue StandardError => e
    Rails.logger.error("Failed to migrate MboProfile #{element.id}: #{e.message}")
  end

  private

  def map_mid_back_office(element)
    mapped_from_id(element) || mapped_current_mbo(element) || country_default(element) || MboProfiles::MidBackOffice::INHOUSE
  end

  def mapped_from_id(element)
    return unless element.id

    result = ActiveRecord::Base.connection.exec_query(
      'SELECT mid_back_office_id FROM mbo_profiles WHERE id = $1 LIMIT 1',
      'SQL',
      [element.id]
    )

    mbo_id = result.rows.dig(0, 0)
    return unless mbo_id

    old_name_result = ActiveRecord::Base.connection.exec_query(
      'SELECT name FROM mid_back_offices WHERE id = $1 LIMIT 1',
      'SQL',
      [mbo_id]
    )

    old_name = old_name_result.rows.dig(0, 0)&.to_s&.downcase
    MBO_MAPPING[old_name]
  end

  def mapped_current_mbo(element)
    MBO_MAPPING[element.mid_back_office.to_s.strip.downcase]
  end

  def country_default(element)
    element.country&.default_mbo_to_country&.default_mbo
  end
end