49 lines
1.8 KiB
Ruby
49 lines
1.8 KiB
Ruby
# == Schema Information
|
|
#
|
|
# Table name: reporting_events_rollups
|
|
#
|
|
# id :bigint not null, primary key
|
|
# count :bigint default(0), not null
|
|
# date :date not null
|
|
# dimension_type :string not null
|
|
# metric :string not null
|
|
# sum_value :float default(0.0), not null
|
|
# sum_value_business_hours :float default(0.0), not null
|
|
# created_at :datetime not null
|
|
# updated_at :datetime not null
|
|
# account_id :integer not null
|
|
# dimension_id :bigint not null
|
|
#
|
|
# Indexes
|
|
#
|
|
# index_rollup_summary (account_id,dimension_type,date)
|
|
# index_rollup_timeseries (account_id,metric,date)
|
|
# index_rollup_unique_key (account_id,date,dimension_type,dimension_id,metric) UNIQUE
|
|
#
|
|
|
|
class ReportingEventsRollup < ApplicationRecord
|
|
belongs_to :account
|
|
|
|
# Store string values directly in the database for better readability and debugging
|
|
enum :dimension_type, %w[account agent inbox team].index_by(&:itself)
|
|
enum :metric, %w[
|
|
resolutions_count
|
|
first_response
|
|
resolution_time
|
|
reply_time
|
|
bot_resolutions_count
|
|
bot_handoffs_count
|
|
].index_by(&:itself)
|
|
|
|
validates :account_id, presence: true
|
|
validates :date, presence: true
|
|
validates :dimension_type, presence: true
|
|
validates :dimension_id, presence: true
|
|
validates :metric, presence: true
|
|
validates :count, numericality: { greater_than_or_equal_to: 0 }
|
|
|
|
scope :for_date_range, ->(start_date, end_date) { where(date: start_date..end_date) }
|
|
scope :for_dimension, ->(type, id) { where(dimension_type: type, dimension_id: id) }
|
|
scope :for_metric, ->(metric) { where(metric: metric) }
|
|
end
|