# frozen_string_literal: true module CsvExportable extend ActiveSupport::Concern COMMON_HEADERS = %i[notes tags signed_at].freeze COMMON_VALUES = %w[clean_notes clean_tags signed_on].freeze APPEARANCE_HEADERS = %i[name contact_info].freeze + COMMON_HEADERS APPEARANCE_VALUES = %w[name contact_info].freeze + COMMON_VALUES LOCATION_HEADERS = %i[name address].freeze + COMMON_HEADERS LOCATION_VALUES = %w[name address].freeze + COMMON_VALUES MATERIAL_HEADERS = %i[name].freeze + COMMON_HEADERS MATERIAL_VALUES = %w[name].freeze + COMMON_VALUES MEDICAL_HEADERS = %i[approved name contact_info].freeze + COMMON_HEADERS MEDICAL_VALUES = %w[approved? name contact_info].freeze + COMMON_VALUES HEADERS = { acquired_media_release: %i[name file_infos_count] + COMMON_HEADERS, appearance_release: APPEARANCE_HEADERS, location_release: LOCATION_HEADERS, material_release: MATERIAL_HEADERS, medical_release: MEDICAL_HEADERS, misc_release: %i[name contact_info] + COMMON_HEADERS, music_release: %i[name file_infos_count composers_count publishers_count] + COMMON_HEADERS, talent_release: %i[name phone email] + COMMON_HEADERS }.freeze VALUES = { acquired_media_release: %w[name file_count] + COMMON_VALUES, appearance_release: APPEARANCE_VALUES, location_release: LOCATION_VALUES, material_release: MATERIAL_VALUES, medical_release: MEDICAL_VALUES, misc_release: %w[name contact_info] + COMMON_VALUES, music_release: %w[name music_file_count music_composers_count music_publishers_count] + COMMON_VALUES, talent_release: %w[name person_phone person_email] + COMMON_VALUES }.freeze included do class << self def csv_headers plural_class_name = self.name.underscore.pluralize headers = HEADERS[self.name.underscore.to_sym] headers.map do |header| I18n.t("#{plural_class_name}.index.table_headers.#{header}") end end end def to_csv_row VALUES[self.class.name.underscore.to_sym].map do |function| send(function) end end private def file_count self.file_infos.any? ? self.file_infos.size : I18n.t('acquired_media_releases.acquired_media_release.no_media') end def music_file_count file_infos.size end def music_composers_count composers.size end def music_publishers_count publishers.size end def contact_info contact_info = '' contact_info += "#{person_address}; " if person_address.present? contact_info += "P: #{person_phone}; " if person_phone.present? contact_info += "E: #{person_email}" if person_email.present? contact_info.delete_suffix '; ' end def clean_notes notes = '' self.notes.order_by_recent.each do |note| notes += "#{note.content}(#{note.email}), " end notes.delete_suffix ', ' end def clean_tags tags = '' self.tags.each do |tag| tags += "#{tag.name}, " end tags.delete_suffix ', ' end end end