Maintenance::ImportAgentPortCompaniesTask

Source code
# frozen_string_literal: true

class Maintenance::ImportAgentPortCompaniesTask < MaintenanceTasks::Task
  include ArrayHelper

  csv_collection(in_batches: 50)
  attribute :emails, :string
  validates :emails, presence: true, fcm_email_format: true

  CSV_COLUMNS = %w[company_guid tree_node_name brand_name crm_sales_id mbo_id mbo_name country_code status
                   errors].freeze

  after_start    :prepare_csv_path
  after_complete :send_report
  after_error    :send_report

  def process(batch_of_rows)
    File.open(csv_path, 'a') do |file|
      batch_of_rows.each do |row|
        result = AgentPort::RowProcessor.new(row.to_h).call
        file.puts build_csv_line(result)
      end
    end
  end

  def csv_path
    @csv_path ||= Rails.root.join('tmp/import_agent_port_latest.csv').to_s
  end

  private

  def prepare_csv_path
    @csv_path = Rails.root.join('tmp', "import_agent_port_#{Time.now.to_i}.csv").to_s
    File.write(@csv_path, CSV_COLUMNS.to_csv)
  end

  def send_report
    return unless csv_path && File.exist?(csv_path)

    CsvReportMailer.send_report(
      recipients: emails_array(emails),
      file_path: csv_path,
      report_sender: 'Import AgentPort Companies'
    ).deliver_now
  ensure
    File.delete(csv_path) if csv_path && File.exist?(csv_path)
  end

  def build_csv_line(result)
    CSV_COLUMNS.map { |col| %w[status errors].include?(col) ? result[col.to_sym] : result[:row][col] }.to_csv
  end
end