From b94e67f5d714cde69b8ca653be2d4479a7ef3b03 Mon Sep 17 00:00:00 2001 From: "Aswin Dev P.S" Date: Fri, 4 Mar 2022 17:19:26 +0530 Subject: [PATCH] feat: Add agents filter in CSAT reports (#4106) * add agents filter in csat reports --- .../csat_survey_responses_controller.rb | 3 +- app/javascript/dashboard/api/csatReports.js | 14 +++++-- .../dashboard/i18n/locale/en/report.json | 5 +++ .../settings/reports/CsatResponses.vue | 29 ++++++++++++-- .../dashboard/settings/reports/Index.vue | 1 + .../reports/components/FilterSelector.vue | 38 +++++++++++++++++- .../dashboard/store/modules/csat.js | 11 +++-- app/models/csat_survey_response.rb | 3 ++ .../csat_survey_responses_controller_spec.rb | 40 +++++++++++++++++++ 9 files changed, 130 insertions(+), 14 deletions(-) diff --git a/app/controllers/api/v1/accounts/csat_survey_responses_controller.rb b/app/controllers/api/v1/accounts/csat_survey_responses_controller.rb index 26de6d406..347f028f7 100644 --- a/app/controllers/api/v1/accounts/csat_survey_responses_controller.rb +++ b/app/controllers/api/v1/accounts/csat_survey_responses_controller.rb @@ -30,8 +30,7 @@ class Api::V1::Accounts::CsatSurveyResponsesController < Api::V1::Accounts::Base def set_csat_survey_responses @csat_survey_responses = filtrate( Current.account.csat_survey_responses.includes([:conversation, :assigned_agent, :contact]) - ) - @csat_survey_responses = @csat_survey_responses.where(created_at: range) if range.present? + ).filter_by_created_at(range).filter_by_assigned_agent_id(params[:user_ids]) end def set_current_page_surveys diff --git a/app/javascript/dashboard/api/csatReports.js b/app/javascript/dashboard/api/csatReports.js index a8b8308bc..cc0271d7d 100644 --- a/app/javascript/dashboard/api/csatReports.js +++ b/app/javascript/dashboard/api/csatReports.js @@ -6,15 +6,21 @@ class CSATReportsAPI extends ApiClient { super('csat_survey_responses', { accountScoped: true }); } - get({ page, from, to } = {}) { + get({ page, from, to, user_ids } = {}) { return axios.get(this.url, { - params: { page, since: from, until: to, sort: '-created_at' }, + params: { + page, + since: from, + until: to, + sort: '-created_at', + user_ids, + }, }); } - getMetrics({ from, to } = {}) { + getMetrics({ from, to, user_ids } = {}) { return axios.get(`${this.url}/metrics`, { - params: { since: from, until: to }, + params: { since: from, until: to, user_ids }, }); } } diff --git a/app/javascript/dashboard/i18n/locale/en/report.json b/app/javascript/dashboard/i18n/locale/en/report.json index 229c7b068..053c730e1 100644 --- a/app/javascript/dashboard/i18n/locale/en/report.json +++ b/app/javascript/dashboard/i18n/locale/en/report.json @@ -333,6 +333,11 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "FILTERS": { + "AGENTS": { + "PLACEHOLDER": "Choose Agents" + } + }, "TABLE": { "HEADER": { "CONTACT_NAME": "Contact", diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/CsatResponses.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/CsatResponses.vue index b893b763e..4498ead8a 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/CsatResponses.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/reports/CsatResponses.vue @@ -1,6 +1,11 @@ diff --git a/app/javascript/dashboard/store/modules/csat.js b/app/javascript/dashboard/store/modules/csat.js index d38b212be..7bc1dad6d 100644 --- a/app/javascript/dashboard/store/modules/csat.js +++ b/app/javascript/dashboard/store/modules/csat.js @@ -82,10 +82,13 @@ export const getters = { }; export const actions = { - get: async function getResponses({ commit }, { page = 1, from, to } = {}) { + get: async function getResponses( + { commit }, + { page = 1, from, to, user_ids } = {} + ) { commit(types.SET_CSAT_RESPONSE_UI_FLAG, { isFetching: true }); try { - const response = await CSATReports.get({ page, from, to }); + const response = await CSATReports.get({ page, from, to, user_ids }); commit(types.SET_CSAT_RESPONSE, response.data); } catch (error) { // Ignore error @@ -93,10 +96,10 @@ export const actions = { commit(types.SET_CSAT_RESPONSE_UI_FLAG, { isFetching: false }); } }, - getMetrics: async function getMetrics({ commit }, { from, to }) { + getMetrics: async function getMetrics({ commit }, { from, to, user_ids }) { commit(types.SET_CSAT_RESPONSE_UI_FLAG, { isFetchingMetrics: true }); try { - const response = await CSATReports.getMetrics({ from, to }); + const response = await CSATReports.getMetrics({ from, to, user_ids }); commit(types.SET_CSAT_RESPONSE_METRICS, response.data); } catch (error) { // Ignore error diff --git a/app/models/csat_survey_response.rb b/app/models/csat_survey_response.rb index 3f6a606de..119d5c615 100644 --- a/app/models/csat_survey_response.rb +++ b/app/models/csat_survey_response.rb @@ -40,4 +40,7 @@ class CsatSurveyResponse < ApplicationRecord validates :account_id, presence: true validates :contact_id, presence: true validates :conversation_id, presence: true + + scope :filter_by_created_at, ->(range) { where(created_at: range) if range.present? } + scope :filter_by_assigned_agent_id, ->(user_ids) { where(assigned_agent_id: user_ids) if user_ids.present? } end diff --git a/spec/controllers/api/v1/accounts/csat_survey_responses_controller_spec.rb b/spec/controllers/api/v1/accounts/csat_survey_responses_controller_spec.rb index 526879099..abb4231d9 100644 --- a/spec/controllers/api/v1/accounts/csat_survey_responses_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/csat_survey_responses_controller_spec.rb @@ -48,6 +48,25 @@ RSpec.describe 'CSAT Survey Responses API', type: :request do expect(response_data.pluck('id')).not_to include(csat_10_days_ago.id) end + it 'filters csat responses based on a date range and agent ids' do + csat1_assigned_agent = create(:user, account: account, role: :agent) + csat2_assigned_agent = create(:user, account: account, role: :agent) + + create(:csat_survey_response, account: account, created_at: 10.days.ago, assigned_agent: csat1_assigned_agent) + create(:csat_survey_response, account: account, created_at: 3.days.ago, assigned_agent: csat2_assigned_agent) + create(:csat_survey_response, account: account, created_at: 5.days.ago) + + get "/api/v1/accounts/#{account.id}/csat_survey_responses", + params: { since: 11.days.ago.to_time.to_i.to_s, until: Time.zone.today.to_time.to_i.to_s, + user_ids: [csat1_assigned_agent.id, csat2_assigned_agent.id] }, + headers: administrator.create_new_auth_token, + as: :json + + expect(response).to have_http_status(:success) + response_data = JSON.parse(response.body) + expect(response_data.size).to eq 2 + end + it 'returns csat responses even if the agent is deleted from account' do deleted_agent_csat = create(:csat_survey_response, account: account, assigned_agent: agent) deleted_agent_csat.assigned_agent.account_users.destroy_all @@ -106,6 +125,27 @@ RSpec.describe 'CSAT Survey Responses API', type: :request do expect(response_data['total_sent_messages_count']).to eq 0 expect(response_data['ratings_count']).to eq({ '1' => 1 }) end + + it 'filters csat metrics based on a date range and agent ids' do + csat1_assigned_agent = create(:user, account: account, role: :agent) + csat2_assigned_agent = create(:user, account: account, role: :agent) + + create(:csat_survey_response, account: account, created_at: 10.days.ago, assigned_agent: csat1_assigned_agent) + create(:csat_survey_response, account: account, created_at: 3.days.ago, assigned_agent: csat2_assigned_agent) + create(:csat_survey_response, account: account, created_at: 5.days.ago) + + get "/api/v1/accounts/#{account.id}/csat_survey_responses/metrics", + params: { since: 11.days.ago.to_time.to_i.to_s, until: Time.zone.today.to_time.to_i.to_s, + user_ids: [csat1_assigned_agent.id, csat2_assigned_agent.id] }, + headers: administrator.create_new_auth_token, + as: :json + + expect(response).to have_http_status(:success) + response_data = JSON.parse(response.body) + expect(response_data['total_count']).to eq 2 + expect(response_data['total_sent_messages_count']).to eq 0 + expect(response_data['ratings_count']).to eq({ '1' => 2 }) + end end end end