* feat: add control header slot * feat: add download API call * feat: add conversation traffic template * feat: allow downloading heatmap content * feat: wire up download * fix: grid layout for mobile * chore: revert formatting * revert: en.yml file * feat: add conversation traffic text * feat: disable rule for map block * test: conversation traffic * fix: timezone offset * feat: download report in UTC * feat: add UTC warning * chore: revert formatting * feat: add traffic text * chore: fix whitespace change
78 lines
2.2 KiB
Ruby
78 lines
2.2 KiB
Ruby
module Api::V2::Accounts::ReportsHelper
|
|
def generate_agents_report
|
|
Current.account.users.map do |agent|
|
|
agent_report = generate_report({ type: :agent, id: agent.id })
|
|
[agent.name] + generate_readable_report_metrics(agent_report)
|
|
end
|
|
end
|
|
|
|
def generate_inboxes_report
|
|
Current.account.inboxes.map do |inbox|
|
|
inbox_report = generate_report({ type: :inbox, id: inbox.id })
|
|
[inbox.name, inbox.channel&.name] + generate_readable_report_metrics(inbox_report)
|
|
end
|
|
end
|
|
|
|
def generate_teams_report
|
|
Current.account.teams.map do |team|
|
|
team_report = generate_report({ type: :team, id: team.id })
|
|
[team.name] + generate_readable_report_metrics(team_report)
|
|
end
|
|
end
|
|
|
|
def generate_labels_report
|
|
Current.account.labels.map do |label|
|
|
label_report = generate_report({ type: :label, id: label.id })
|
|
[label.title] + generate_readable_report_metrics(label_report)
|
|
end
|
|
end
|
|
|
|
def generate_conversations_heatmap_report
|
|
report_params = {
|
|
type: :account,
|
|
group_by: 'hour',
|
|
since: params[:since],
|
|
until: params[:until],
|
|
metric: 'conversations_count',
|
|
business_hours: false
|
|
}
|
|
data = V2::ReportBuilder.new(Current.account, report_params).build
|
|
|
|
# data format is { timestamp: 1231242342, value: 3}
|
|
# we need to convert it to { date: "2020-01-01", hour: 12, value: 3}
|
|
#
|
|
# the generated report is **always** in UTC timezone
|
|
data.map do |d|
|
|
date = Time.zone.at(d[:timestamp]).to_s
|
|
[date, d[:value]]
|
|
end
|
|
end
|
|
|
|
def generate_report(report_params)
|
|
V2::ReportBuilder.new(
|
|
Current.account,
|
|
report_params.merge(
|
|
{
|
|
since: params[:since],
|
|
until: params[:until],
|
|
business_hours: ActiveModel::Type::Boolean.new.cast(params[:business_hours])
|
|
}
|
|
)
|
|
).summary
|
|
end
|
|
|
|
private
|
|
|
|
def generate_readable_report_metrics(report_metric)
|
|
[
|
|
report_metric[:conversations_count],
|
|
time_to_minutes(report_metric[:avg_first_response_time]),
|
|
time_to_minutes(report_metric[:avg_resolution_time])
|
|
]
|
|
end
|
|
|
|
def time_to_minutes(time_in_seconds)
|
|
(time_in_seconds / 60).to_i
|
|
end
|
|
end
|