2020-03-18 11:23:35 +00:00
|
|
|
class V2::ReportBuilder
|
2021-06-29 15:29:41 +00:00
|
|
|
include DateRangeHelper
|
2020-03-18 11:23:35 +00:00
|
|
|
attr_reader :account, :params
|
|
|
|
|
2022-02-15 11:40:49 +00:00
|
|
|
DEFAULT_GROUP_BY = 'day'.freeze
|
|
|
|
|
2020-03-18 11:23:35 +00:00
|
|
|
def initialize(account, params)
|
|
|
|
@account = account
|
|
|
|
@params = params
|
2022-02-28 05:26:24 +00:00
|
|
|
|
|
|
|
timezone_offset = (params[:timezone_offset] || 0).to_f
|
|
|
|
@timezone = ActiveSupport::TimeZone[timezone_offset]&.name
|
2020-03-18 11:23:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def timeseries
|
|
|
|
send(params[:metric])
|
|
|
|
end
|
|
|
|
|
|
|
|
# For backward compatible with old report
|
|
|
|
def build
|
|
|
|
timeseries.each_with_object([]) do |p, arr|
|
|
|
|
arr << { value: p[1], timestamp: p[0].to_time.to_i }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def summary
|
|
|
|
{
|
|
|
|
conversations_count: conversations_count.values.sum,
|
|
|
|
incoming_messages_count: incoming_messages_count.values.sum,
|
|
|
|
outgoing_messages_count: outgoing_messages_count.values.sum,
|
|
|
|
avg_first_response_time: avg_first_response_time_summary,
|
|
|
|
avg_resolution_time: avg_resolution_time_summary,
|
|
|
|
resolutions_count: resolutions_count.values.sum
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def scope
|
2021-08-27 17:16:32 +00:00
|
|
|
case params[:type]
|
|
|
|
when :account
|
|
|
|
account
|
|
|
|
when :inbox
|
|
|
|
inbox
|
|
|
|
when :agent
|
|
|
|
user
|
|
|
|
when :label
|
|
|
|
label
|
2021-09-27 15:42:08 +00:00
|
|
|
when :team
|
|
|
|
team
|
2021-08-27 17:16:32 +00:00
|
|
|
end
|
2020-03-18 11:23:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def inbox
|
2021-09-27 15:42:08 +00:00
|
|
|
@inbox ||= account.inboxes.find(params[:id])
|
2020-03-18 11:23:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def user
|
2021-09-27 15:42:08 +00:00
|
|
|
@user ||= account.users.find(params[:id])
|
2020-03-18 11:23:35 +00:00
|
|
|
end
|
|
|
|
|
2021-08-27 17:16:32 +00:00
|
|
|
def label
|
2021-09-27 15:42:08 +00:00
|
|
|
@label ||= account.labels.find(params[:id])
|
|
|
|
end
|
|
|
|
|
|
|
|
def team
|
|
|
|
@team ||= account.teams.find(params[:id])
|
2021-08-27 17:16:32 +00:00
|
|
|
end
|
|
|
|
|
2022-02-28 05:26:24 +00:00
|
|
|
def get_grouped_values(object_scope)
|
|
|
|
object_scope.group_by_period(
|
|
|
|
params[:group_by] || DEFAULT_GROUP_BY,
|
|
|
|
:created_at,
|
|
|
|
default_value: 0,
|
|
|
|
range: range,
|
|
|
|
permit: %w[day week month year],
|
|
|
|
time_zone: @timezone
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2020-03-18 11:23:35 +00:00
|
|
|
def conversations_count
|
2022-02-28 05:26:24 +00:00
|
|
|
(get_grouped_values scope.conversations).count
|
2020-03-18 11:23:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def incoming_messages_count
|
2022-02-28 05:26:24 +00:00
|
|
|
(get_grouped_values scope.messages.incoming.unscope(:order)).count
|
2020-03-18 11:23:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def outgoing_messages_count
|
2022-02-28 05:26:24 +00:00
|
|
|
(get_grouped_values scope.messages.outgoing.unscope(:order)).count
|
2020-03-18 11:23:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def resolutions_count
|
2022-02-28 05:26:24 +00:00
|
|
|
(get_grouped_values scope.conversations.resolved).count
|
2020-03-18 11:23:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def avg_first_response_time
|
2022-02-28 05:26:24 +00:00
|
|
|
(get_grouped_values scope.events.where(name: 'first_response')).average(:value)
|
2020-03-18 11:23:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def avg_resolution_time
|
2022-02-28 05:26:24 +00:00
|
|
|
(get_grouped_values scope.events.where(name: 'conversation_resolved')).average(:value)
|
2020-03-18 11:23:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def avg_resolution_time_summary
|
2022-02-28 05:26:24 +00:00
|
|
|
avg_rt = scope.events
|
|
|
|
.where(name: 'conversation_resolved', created_at: range)
|
|
|
|
.average(:value)
|
2020-03-18 11:23:35 +00:00
|
|
|
|
2022-02-28 05:26:24 +00:00
|
|
|
return 0 if avg_rt.blank?
|
|
|
|
|
|
|
|
avg_rt
|
2020-03-18 11:23:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def avg_first_response_time_summary
|
2022-02-28 05:26:24 +00:00
|
|
|
avg_frt = scope.events
|
|
|
|
.where(name: 'first_response', created_at: range)
|
|
|
|
.average(:value)
|
|
|
|
|
|
|
|
return 0 if avg_frt.blank?
|
2020-03-18 11:23:35 +00:00
|
|
|
|
2022-02-28 05:26:24 +00:00
|
|
|
avg_frt
|
2020-03-18 11:23:35 +00:00
|
|
|
end
|
|
|
|
end
|