chatwoot/chatwoot

View on GitHub
app/builders/v2/reports/agent_summary_builder.rb

Summary

Maintainability
A
0 mins
Test Coverage
F
46%
class V2::Reports::AgentSummaryBuilder < V2::Reports::BaseSummaryBuilder
  pattr_initialize [:account!, :params!]

  def build
    set_grouped_conversations_count
    set_grouped_avg_reply_time
    set_grouped_avg_first_response_time
    set_grouped_avg_resolution_time
    prepare_report
  end

  private

  def set_grouped_conversations_count
    @grouped_conversations_count = Current.account.conversations.where(created_at: range).group('assignee_id').count
  end

  def set_grouped_avg_resolution_time
    @grouped_avg_resolution_time = get_grouped_average(reporting_events.where(name: 'conversation_resolved'))
  end

  def set_grouped_avg_first_response_time
    @grouped_avg_first_response_time = get_grouped_average(reporting_events.where(name: 'first_response'))
  end

  def set_grouped_avg_reply_time
    @grouped_avg_reply_time = get_grouped_average(reporting_events.where(name: 'reply_time'))
  end

  def group_by_key
    :user_id
  end

  def reporting_events
    @reporting_events ||= Current.account.reporting_events.where(created_at: range)
  end

  def prepare_report
    account.account_users.each_with_object([]) do |account_user, arr|
      arr << {
        id: account_user.user_id,
        conversations_count: @grouped_conversations_count[account_user.user_id],
        avg_resolution_time: @grouped_avg_resolution_time[account_user.user_id],
        avg_first_response_time: @grouped_avg_first_response_time[account_user.user_id],
        avg_reply_time: @grouped_avg_reply_time[account_user.user_id]
      }
    end
  end

  def average_value_key
    ActiveModel::Type::Boolean.new.cast(params[:business_hours]).present? ? :value_in_business_hours : :value
  end
end