feat: API to Filter reports by teams (#3066)
Add API to Filter reports by teams Fixes: #2916
This commit is contained in:
parent
8b7f6c691a
commit
15aaa8883c
10 changed files with 88 additions and 9 deletions
|
@ -41,19 +41,25 @@ class V2::ReportBuilder
|
|||
user
|
||||
when :label
|
||||
label
|
||||
when :team
|
||||
team
|
||||
end
|
||||
end
|
||||
|
||||
def inbox
|
||||
@inbox ||= account.inboxes.where(id: params[:id]).first
|
||||
@inbox ||= account.inboxes.find(params[:id])
|
||||
end
|
||||
|
||||
def user
|
||||
@user ||= account.users.where(id: params[:id]).first
|
||||
@user ||= account.users.find(params[:id])
|
||||
end
|
||||
|
||||
def label
|
||||
@label ||= account.labels.where(id: params[:id]).first
|
||||
@label ||= account.labels.find(params[:id])
|
||||
end
|
||||
|
||||
def team
|
||||
@team ||= account.teams.find(params[:id])
|
||||
end
|
||||
|
||||
def conversations_count
|
||||
|
|
|
@ -29,6 +29,12 @@ class Api::V2::Accounts::ReportsController < Api::V1::Accounts::BaseController
|
|||
render layout: false, template: 'api/v2/accounts/reports/labels.csv.erb', format: 'csv'
|
||||
end
|
||||
|
||||
def teams
|
||||
response.headers['Content-Type'] = 'text/csv'
|
||||
response.headers['Content-Disposition'] = 'attachment; filename=teams_report.csv'
|
||||
render layout: false, template: 'api/v2/accounts/reports/teams.csv.erb', format: 'csv'
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def check_authorization
|
||||
|
|
|
@ -40,4 +40,12 @@ class Team < ApplicationRecord
|
|||
def remove_member(user_id)
|
||||
team_members.find_by(user_id: user_id)&.destroy
|
||||
end
|
||||
|
||||
def messages
|
||||
account.messages.where(conversation_id: conversations.pluck(:id))
|
||||
end
|
||||
|
||||
def events
|
||||
account.events.where(conversation_id: conversations.pluck(:id))
|
||||
end
|
||||
end
|
||||
|
|
19
app/views/api/v2/accounts/reports/teams.csv.erb
Normal file
19
app/views/api/v2/accounts/reports/teams.csv.erb
Normal file
|
@ -0,0 +1,19 @@
|
|||
<% headers = [
|
||||
I18n.t('reports.team_csv.team_name'),
|
||||
I18n.t('reports.team_csv.conversations_count'),
|
||||
I18n.t('reports.team_csv.avg_first_response_time'),
|
||||
I18n.t('reports.team_csv.avg_resolution_time')
|
||||
]
|
||||
%>
|
||||
<%= CSV.generate_line headers %>
|
||||
<% Current.account.teams.each do |team| %>
|
||||
<% team_report = V2::ReportBuilder.new(Current.account, {
|
||||
type: :team,
|
||||
id: team.id,
|
||||
since: params[:since],
|
||||
until: params[:until]
|
||||
}).summary %>
|
||||
<% row = [ team.name, team_report[:conversations_count], (team_report[:avg_first_response_time]/60).to_i, (team_report[:avg_resolution_time]/60).to_i ] %>
|
||||
<%= CSV.generate_line row %>
|
||||
<% end %>
|
||||
<%= CSV.generate_line [I18n.t('reports.period', since: Date.strptime(params[:since], '%s'), until: Date.strptime(params[:until], '%s'))] %>
|
|
@ -52,6 +52,11 @@ en:
|
|||
conversations_count: Conversations count
|
||||
avg_first_response_time: Avg first response time (Minutes)
|
||||
avg_resolution_time: Avg resolution time (Minutes)
|
||||
team_csv:
|
||||
team_name: Team name
|
||||
conversations_count: Conversations count
|
||||
avg_first_response_time: Avg first response time (Minutes)
|
||||
avg_resolution_time: Avg resolution time (Minutes)
|
||||
|
||||
notifications:
|
||||
notification_title:
|
||||
|
|
|
@ -188,6 +188,7 @@ Rails.application.routes.draw do
|
|||
get :agents
|
||||
get :inboxes
|
||||
get :labels
|
||||
get :teams
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -192,4 +192,37 @@ RSpec.describe 'Reports API', type: :request do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET /api/v2/accounts/:account_id/reports/teams' do
|
||||
context 'when it is an unauthenticated user' do
|
||||
it 'returns unauthorized' do
|
||||
get "/api/v2/accounts/#{account.id}/reports/teams.csv"
|
||||
|
||||
expect(response).to have_http_status(:unauthorized)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when it is an authenticated user' do
|
||||
params = {
|
||||
since: 30.days.ago.to_i.to_s,
|
||||
until: Time.zone.today.to_time.to_i.to_s
|
||||
}
|
||||
|
||||
it 'returns unauthorized for teams' do
|
||||
get "/api/v2/accounts/#{account.id}/reports/teams.csv",
|
||||
params: params,
|
||||
headers: agent.create_new_auth_token
|
||||
|
||||
expect(response).to have_http_status(:unauthorized)
|
||||
end
|
||||
|
||||
it 'returns summary' do
|
||||
get "/api/v2/accounts/#{account.id}/reports/teams.csv",
|
||||
params: params,
|
||||
headers: admin.create_new_auth_token
|
||||
|
||||
expect(response).to have_http_status(:success)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,6 +2,6 @@ in: query
|
|||
name: report_type
|
||||
schema:
|
||||
type: string
|
||||
enum: [account,agent,inbox,label]
|
||||
enum: [account,agent,inbox,label,team]
|
||||
required: true
|
||||
description: Type of report
|
||||
|
|
|
@ -314,7 +314,7 @@ public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversat
|
|||
### Reports
|
||||
|
||||
# List
|
||||
/api/v1/accounts/{id}/reports:
|
||||
/api/v2/accounts/{id}/reports:
|
||||
parameters:
|
||||
- $ref: '#/parameters/account_id'
|
||||
- $ref: '#/parameters/report_metric'
|
||||
|
@ -338,7 +338,7 @@ public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversat
|
|||
$ref: './reports/index.yml'
|
||||
|
||||
# Summary
|
||||
/api/v1/accounts/{id}/reports/summary:
|
||||
/api/v2/accounts/{id}/reports/summary:
|
||||
parameters:
|
||||
- $ref: '#/parameters/account_id'
|
||||
- $ref: '#/parameters/report_type'
|
||||
|
|
|
@ -3088,7 +3088,7 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"/api/v1/accounts/{id}/reports": {
|
||||
"/api/v2/accounts/{id}/reports": {
|
||||
"parameters": [
|
||||
{
|
||||
"$ref": "#/parameters/account_id"
|
||||
|
@ -3151,7 +3151,7 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"/api/v1/accounts/{id}/reports/summary": {
|
||||
"/api/v2/accounts/{id}/reports/summary": {
|
||||
"parameters": [
|
||||
{
|
||||
"$ref": "#/parameters/account_id"
|
||||
|
@ -4498,7 +4498,8 @@
|
|||
"account",
|
||||
"agent",
|
||||
"inbox",
|
||||
"label"
|
||||
"label",
|
||||
"team"
|
||||
]
|
||||
},
|
||||
"required": true,
|
||||
|
|
Loading…
Reference in a new issue