# frozen_string_literal: true # == Schema Information # # Table name: stats # # id :integer not null, primary key # count :integer default("0") # date :date not null # type :string not null # org_id :integer # created_at :datetime not null # updated_at :datetime not null # details :text # require "set" class StatCreatedPlan < Stat serialize :details, JSON def any_template if self.details.present? any_template = self.details["any_template"] end return [] unless any_template.present? any_template end def org_template if self.details.present? org_template = self.details["org_template"] end return [] unless org_template.present? org_template end class << self def to_csv(created_plans, details: { any_template: false, org_template: false,}) if details[:any_template] to_csv_by_template(created_plans, "any_template") elsif details[:org_template] to_csv_by_template(created_plans, "org_template") else super(created_plans) end end private def to_csv_by_template(created_plans, template_filter) template_names = lambda do |created_plans| unique = Set.new created_plans.each do |created_plan| created_plan.details&.fetch(template_filter, [])&.each do |name_count| unique.add(name_count.fetch("name")) end end unique.to_a end.call(created_plans) data = created_plans.map do |created_plan| tuple = { Date: created_plan.date.strftime("%b %Y") } template_names.reduce(tuple) do |acc, name| acc[name] = 0 acc end created_plan.details&.fetch(template_filter, [])&.each do |name_count| tuple[name_count.fetch("name")] = name_count.fetch("count") end tuple[:Count] = created_plan.count tuple end Csvable.from_array_of_hashes(data, false) end end end