diff --git a/app/builders/v2/base_conversation_report_builder.rb b/app/builders/v2/base_conversation_report_builder.rb new file mode 100644 index 000000000..def3662c9 --- /dev/null +++ b/app/builders/v2/base_conversation_report_builder.rb @@ -0,0 +1,30 @@ +class V2::BaseConversationReportBuilder + pattr_initialize :account, :params + + private + + AVG_METRICS = %w[avg_first_response_time avg_resolution_time reply_time].freeze + COUNT_METRICS = %w[ + conversations_count + incoming_messages_count + outgoing_messages_count + resolutions_count + bot_resolutions_count + bot_handoffs_count + ].freeze + + def builder_class(metric) + case metric + when *AVG_METRICS + V2::Reports::Timeseries::AverageReportBuilder + when *COUNT_METRICS + V2::Reports::Timeseries::CountReportBuilder + end + end + + def log_invalid_metric + Rails.logger.error "ReportBuilder: Invalid metric - #{params[:metric]}" + + {} + end +end diff --git a/app/builders/v2/conversation_metric_builder.rb b/app/builders/v2/conversation_metric_builder.rb new file mode 100644 index 000000000..5f0ed7857 --- /dev/null +++ b/app/builders/v2/conversation_metric_builder.rb @@ -0,0 +1,30 @@ +class V2::ConversationMetricBuilder < V2::BaseConversationReportBuilder + def summary + { + conversations_count: count('conversations_count'), + incoming_messages_count: count('incoming_messages_count'), + outgoing_messages_count: count('outgoing_messages_count'), + avg_first_response_time: count('avg_first_response_time'), + avg_resolution_time: count('avg_resolution_time'), + resolutions_count: count('resolutions_count'), + reply_time: count('reply_time') + } + end + + def bot_summary + { + bot_resolutions_count: count('bot_resolutions_count'), + bot_handoffs_count: count('bot_handoffs_count') + } + end + + private + + def count(metric) + builder_class(metric).new(account, builder_params(metric)).aggregate_value + end + + def builder_params(metric) + params.merge({ metric: metric }) + end +end diff --git a/app/builders/v2/new_report_builder.rb b/app/builders/v2/new_report_builder.rb index 920d709a1..68a884adf 100644 --- a/app/builders/v2/new_report_builder.rb +++ b/app/builders/v2/new_report_builder.rb @@ -1,47 +1,25 @@ -class V2::NewReportBuilder +class V2::NewReportBuilder < V2::BaseConversationReportBuilder include DateRangeHelper pattr_initialize :account, :params - AVG_METRICS = %w[avg_first_response_time avg_resolution_time reply_time].freeze - COUNT_METRICS = %w[ - conversations_count - incoming_messages_count - outgoing_messages_count - resolutions_count - bot_resolutions_count - bot_handoffs_count - ].freeze - - DEFAULT_GROUP_BY = 'day'.freeze - AGENT_RESULTS_PER_PAGE = 25 - def timeseries - return builder_class.new(account, params).timeseries if builder_class.present? - - log_invalid_metric + perform_action(:timeseries) end def aggregate_value - return builder_class.new(account, params).aggregate_value if builder_class.present? - - log_invalid_metric + perform_action(:aggregate_value) end private - def builder_class - case params[:metric] - when *AVG_METRICS - V2::Reports::Timeseries::AverageReportBuilder - when *COUNT_METRICS - V2::Reports::Timeseries::MetricCountReportBuilder - end + def perform_action(method_name) + return builder.new(account, params).public_send(method_name) if builder.present? + + log_invalid_metric end - def log_invalid_metric - Rails.logger.error "ReportBuilder: Invalid metric - #{params[:metric]}" - - {} + def builder + builder_class(params[:metric]) end end diff --git a/app/builders/v2/reports/live_reports/account_reports_builder.rb b/app/builders/v2/reports/live_reports/account_reports_builder.rb index ca3d2ab85..e4eed6667 100644 --- a/app/builders/v2/reports/live_reports/account_reports_builder.rb +++ b/app/builders/v2/reports/live_reports/account_reports_builder.rb @@ -1,4 +1,4 @@ -class V2::LiveReports::AccountReportsBuilder +class V2::Reports::LiveReports::AccountReportsBuilder pattr_initialize :account def build diff --git a/app/builders/v2/reports/live_reports/agent_reports_builder.rb b/app/builders/v2/reports/live_reports/agent_reports_builder.rb index 854436365..5efb166e3 100644 --- a/app/builders/v2/reports/live_reports/agent_reports_builder.rb +++ b/app/builders/v2/reports/live_reports/agent_reports_builder.rb @@ -1,4 +1,4 @@ -class V2::LiveReports::AgentReportsBuilder +class V2::Reports::LiveReports::AgentReportsBuilder pattr_initialize :account, :params AGENT_RESULTS_PER_PAGE = 25 diff --git a/app/builders/v2/reports/timeseries/average_report_builder.rb b/app/builders/v2/reports/timeseries/average_report_builder.rb index 0f4f03932..af89fe005 100644 --- a/app/builders/v2/reports/timeseries/average_report_builder.rb +++ b/app/builders/v2/reports/timeseries/average_report_builder.rb @@ -27,8 +27,11 @@ class V2::Reports::Timeseries::AverageReportBuilder < V2::Reports::Timeseries::B metric_to_event_name[params[:metric].to_sym] end + def object_scope + scope.reporting_events.where(name: event_name, created_at: range) + end + def reporting_events - object_scope = scope.reporting_events.where(name: event_name) @grouped_values = object_scope.group_by_period( group_by, :created_at, diff --git a/app/builders/v2/reports/timeseries/metric_count_report_builder.rb b/app/builders/v2/reports/timeseries/count_report_builder.rb similarity index 94% rename from app/builders/v2/reports/timeseries/metric_count_report_builder.rb rename to app/builders/v2/reports/timeseries/count_report_builder.rb index 82b194a7d..45843b20c 100644 --- a/app/builders/v2/reports/timeseries/metric_count_report_builder.rb +++ b/app/builders/v2/reports/timeseries/count_report_builder.rb @@ -1,4 +1,4 @@ -class V2::Reports::Timeseries::MetricCountReportBuilder < V2::Reports::Timeseries::BaseTimeseriesBuilder +class V2::Reports::Timeseries::CountReportBuilder < V2::Reports::Timeseries::BaseTimeseriesBuilder def timeseries grouped_count.each_with_object([]) do |element, arr| event_date, event_count = element diff --git a/app/controllers/api/v2/accounts/reports_controller.rb b/app/controllers/api/v2/accounts/reports_controller.rb index a366e17b5..f26269989 100644 --- a/app/controllers/api/v2/accounts/reports_controller.rb +++ b/app/controllers/api/v2/accounts/reports_controller.rb @@ -11,13 +11,11 @@ class Api::V2::Accounts::ReportsController < Api::V1::Accounts::BaseController end def summary - render json: summary_metrics + render json: build_summary(:summary) end def bot_summary - summary = V2::NewReportBuilder.new(Current.account, current_summary_params).bot_summary - summary[:previous] = V2::ReportBuilder.new(Current.account, previous_summary_params).bot_summary - render json: summary + render json: build_summary(:bot_summary) end def agents @@ -51,9 +49,9 @@ class Api::V2::Accounts::ReportsController < Api::V1::Accounts::BaseController def conversations case params[:type].to_sym when :account - render json: V2::LiveReports::AccountReportsBuilder.new(Current.account).build + render json: V2::Reports::LiveReports::AccountReportsBuilder.new(Current.account).build when :agent - render json: V2::LiveReports::AgentReportsBuilder.new(Current.account, conversation_params).build + render json: V2::Reports::LiveReports::AgentReportsBuilder.new(Current.account, conversation_params).build else head :unprocessable_entity end @@ -127,9 +125,10 @@ class Api::V2::Accounts::ReportsController < Api::V1::Accounts::BaseController } end - def summary_metrics - summary = V2::ReportBuilder.new(Current.account, current_summary_params).summary - summary[:previous] = V2::ReportBuilder.new(Current.account, previous_summary_params).summary - summary + def build_summary(method) + builder = V2::ConversationMetricBuilder + current_summary = builder.new(Current.account, current_summary_params).send(method) + previous_summary = builder.new(Current.account, previous_summary_params).send(method) + current_summary.merge(previous: previous_summary) end end diff --git a/app/helpers/api/v2/accounts/heatmap_helper.rb b/app/helpers/api/v2/accounts/heatmap_helper.rb index a4977f43a..477984c44 100644 --- a/app/helpers/api/v2/accounts/heatmap_helper.rb +++ b/app/helpers/api/v2/accounts/heatmap_helper.rb @@ -66,18 +66,17 @@ module Api::V2::Accounts::HeatmapHelper end def generate_heatmap_data(date, offset) - report_params = { - type: :account, - group_by: 'hour', - metric: 'conversations_count', - business_hours: false - } - - V2::ReportBuilder.new(Current.account, report_params.merge({ - since: since_timestamp(date), - until: until_timestamp(date), - timezone_offset: offset - })).build + V2::NewReportBuilder.new( + Current.account, { + type: :account, + group_by: 'hour', + metric: 'conversations_count', + business_hours: false, + since: since_timestamp(date), + until: until_timestamp(date), + timezone_offset: offset + } + ).timeseries end def transform_data(data, zone_transform)