Source code
class Maintenance::ArchiveTreeNodesByCompanyGuidTask < MaintenanceTasks::Task
include ArrayHelper
csv_collection
attribute :emails, :string
validates :emails, presence: true, fcm_email_format: true
HEADER_COMPANY_GUID = 'CompanyGUID'
REPORT_COLUMNS = %w[company_guid result tree_node_id].freeze
REPORT_SENDER = 'Archive Tree Nodes By Company GUID'
after_start :prepare_csv_path
after_complete :send_report
after_error :send_report
def process(row)
company_guid = row.field(HEADER_COMPANY_GUID)&.strip
return append_report(company_guid, :blank_company_guid) if company_guid.blank?
tree_node = TreeNode.find_by_company_guid(company_guid)
return append_report(company_guid, :not_found) if tree_node.nil?
if tree_node.status == TreeNodes::Statuses::ARCHIVED
return append_report(company_guid, :already_archived, tree_node)
end
tree_node.update!(status: TreeNodes::Statuses::ARCHIVED)
append_report(company_guid, :archived, tree_node)
end
def csv_path
@csv_path ||= Rails.root.join('tmp', "archive_tree_nodes_by_company_guid_#{Time.now.to_i}.csv").to_s
end
private
def prepare_csv_path
@csv_path = Rails.root.join('tmp', "archive_tree_nodes_by_company_guid_#{Time.now.to_i}.csv").to_s
File.write(csv_path, REPORT_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: REPORT_SENDER
).deliver_now
ensure
File.delete(csv_path) if csv_path && File.exist?(csv_path)
end
def append_report(company_guid, result, tree_node = nil)
File.open(csv_path, 'a') do |file|
file.puts([company_guid, result, tree_node&.id].to_csv)
end
end
end