Files
timeoverflow/app/controllers/reports_controller.rb

99 lines
2.7 KiB
Ruby

require 'zip'
class ReportsController < ApplicationController
before_action :authenticate_user!
layout "report"
def user_list
@members = report_collection("Member")
report_responder('Member', current_organization, @members)
end
def post_list
@post_type = (params[:type] || "offer").capitalize.constantize
@posts = report_collection(@post_type)
report_responder('Post', current_organization, @posts, @post_type)
end
def transfer_list
@transfers = report_collection('Transfer')
report_responder('Transfer', current_organization, @transfers)
end
def download_all
filename = "#{current_organization.name.parameterize}_#{Date.today}.zip"
temp_file = Tempfile.new(filename)
begin
Zip::File.open(temp_file.path, Zip::File::CREATE) do |zipfile|
%w(Member Transfer Inquiry Offer).each do |report_class|
add_csv_to_zip(report_class, zipfile)
end
end
zip_data = File.read(temp_file.path)
send_data(zip_data, type: 'application/zip', disposition: 'attachment', filename: filename)
rescue Errno::ENOENT
redirect_to download_all_report_path
ensure
temp_file.close
temp_file.unlink
end
end
private
def report_responder(report_class, *args)
respond_to do |format|
format.html
format.csv { download_report("Csv::#{report_class}", *args) }
format.pdf { download_report("Pdf::#{report_class}", *args) }
end
end
def download_report(report_class, *args)
report = get_report(report_class, *args)
send_data report.run, filename: report.name, type: report.mime_type
end
def get_report(report_class, *args)
"Report::#{report_class}".constantize.new(*args)
end
def report_collection(report_class)
case report_class.to_s
when 'Member'
current_organization.members.active.includes(:user).order('members.member_uid')
when 'Transfer'
current_organization.all_transfers_with_accounts
when 'Inquiry', 'Offer'
report_class = report_class.constantize if report_class.is_a?(String)
current_organization.posts.of_active_members.active.
merge(report_class.all).
includes(:user, :category).
group_by(&:category).
sort_by { |category, _| category.try(:name).to_s }
end
end
def add_csv_to_zip(report_class, zip)
collection = report_collection(report_class)
report = if report_class.in? %w(Inquiry Offer)
get_report("Csv::Post", current_organization, collection, report_class.constantize)
else
get_report("Csv::#{report_class}", current_organization, collection)
end
file = Tempfile.new
file.write(report.run)
file.rewind
zip.add("#{report_class.pluralize}_#{Date.today}.csv", file.path)
end
end