Skip to content
This repository was archived by the owner on Aug 13, 2020. It is now read-only.

Pricing Plans #1333

Draft
wants to merge 8 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 45 additions & 1 deletion app/models/concerns/properties/reportable.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,37 @@
module Properties
module Reportable
extend ActiveSupport::Concern

module ClassMethods
def average_rpm_by_audience_and_region(start = 91.days.ago, stop = 1.day.ago)
data = Property.includes(:audience).active.each_with_object({}) { |property, memo|
property.average_rpm_by_region(start, stop).each do |region, rpm|
key = "#{property.audience.name} - #{region&.name || "Unknown"}"
memo[key] ||= []
memo[key] << rpm
end
}
data.each do |key, rpms|
list = rpms.select { |rpm| rpm > 0 }
data[key] = {
min: list.min,
max: list.max,
avg: list.size > 0 ? (list.sum / list.size.to_f) : nil
}
end

# generate a csv report with this data
# CSV.open Rails.root.join("tmp/rpms.csv"), "wb" do |csv|
# csv << %w[category min max avg]
# data.each do |key, entry|
# csv << [key, entry[:min]&.format, entry[:max]&.format, entry[:avg]&.format]
# end
# end

data
end
end

def summary(start = nil, stop = nil, paid: true)
report = DailySummaryReport.scoped_by(self)
.where(impressionable_type: "Campaign", impressionable_id: campaign_ids_relation(paid))
Expand Down Expand Up @@ -41,12 +73,24 @@ def country_summaries(start = nil, stop = nil)
# where the list is comprised of DailySummaryReports scoped to country
def region_summaries(start = nil, stop = nil)
country_summaries(start, stop).each_with_object({}) do |summary, memo|
region = Region.with_all_country_codes(summary.scoped_by_id).first
region = Rails.local_ephemeral_cache.fetch("region_for_country/#{summary.scoped_by_id}") {
Region.with_all_country_codes(summary.scoped_by_id).first
}
memo[region] ||= []
memo[region] << summary
end
end

# Returns a Hash keyed as: Region => Money
# where the value is the average RPM for the region
def average_rpm_by_region(start = nil, stop = nil)
region_summaries(start, stop).each_with_object({}) do |(region, summaries), memo|
mille = summaries.sum(&:paid_impressions_count) / 1000.to_f
property_revenue = summaries.sum(&:property_revenue)
memo[region] = mille > 0 ? property_revenue / mille : Money.new(0)
end
end

# Daily report -------------------------------------------------------------------------------------------

def daily_summaries_by_day(start = nil, stop = nil, paid: true)
Expand Down
6 changes: 6 additions & 0 deletions app/models/daily_summary_report.rb
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ class DailySummaryReport < ApplicationRecord
.select(arel_table[:unique_ip_addresses_count].sum.as("unique_ip_addresses_count"))
.select(arel_table[:impressions_count].sum.as("impressions_count"))
.select(arel_table[:clicks_count].sum.as("clicks_count"))
.select(arel_table[:fallbacks_count].sum.as("fallbacks_count"))
.select(arel_table[:fallback_clicks_count].sum.as("fallback_clicks_count"))
.select(arel_table[:gross_revenue_cents].sum.as("gross_revenue_cents"))
.select(arel_table[:property_revenue_cents].sum.as("property_revenue_cents"))
.select(arel_table[:house_revenue_cents].sum.as("house_revenue_cents"))
Expand Down Expand Up @@ -100,6 +102,10 @@ class DailySummaryReport < ApplicationRecord
monetize :property_revenue_cents, numericality: {greater_than_or_equal_to: 0}
monetize :house_revenue_cents, numericality: {greater_than_or_equal_to: 0}

def paid_impressions_count
impressions_count - fallbacks_count
end

# class methods .............................................................

# public instance methods ...................................................
Expand Down
4 changes: 4 additions & 0 deletions app/models/impression.rb
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,10 @@ def calculate_estimated_revenue_and_save!(recalculate = false)
save! if changed?
end

def rpm
Money.new calculate_estimated_property_revenue_fractional_cents * 1000, "USD"
end

def obfuscate_ip_address
self.ip_address = self.class.obfuscate_ip_address(ip_address)
end
Expand Down