This PR adds a new standalone `GET /api/v2/accounts/:id/reports/outgoing_messages_count` endpoint that returns outgoing message counts grouped by agent, team, inbox, or label.
80 lines
2.2 KiB
Ruby
80 lines
2.2 KiB
Ruby
class V2::Reports::OutgoingMessagesCountBuilder
|
|
include DateRangeHelper
|
|
attr_reader :account, :params
|
|
|
|
def initialize(account, params)
|
|
@account = account
|
|
@params = params
|
|
end
|
|
|
|
def build
|
|
send("build_by_#{params[:group_by]}")
|
|
end
|
|
|
|
private
|
|
|
|
def base_messages
|
|
account.messages.outgoing.unscope(:order).where(created_at: range)
|
|
end
|
|
|
|
def build_by_agent
|
|
counts = base_messages
|
|
.where(sender_type: 'User')
|
|
.where.not(sender_id: nil)
|
|
.group(:sender_id)
|
|
.count
|
|
|
|
user_names = account.users.where(id: counts.keys).index_by(&:id)
|
|
|
|
counts.map do |user_id, count|
|
|
user = user_names[user_id]
|
|
{ id: user_id, name: user&.name, outgoing_messages_count: count }
|
|
end
|
|
end
|
|
|
|
def build_by_team
|
|
counts = base_messages
|
|
.joins('INNER JOIN conversations ON messages.conversation_id = conversations.id')
|
|
.where.not(conversations: { team_id: nil })
|
|
.group('conversations.team_id')
|
|
.count
|
|
|
|
team_names = account.teams.where(id: counts.keys).index_by(&:id)
|
|
|
|
counts.map do |team_id, count|
|
|
team = team_names[team_id]
|
|
{ id: team_id, name: team&.name, outgoing_messages_count: count }
|
|
end
|
|
end
|
|
|
|
def build_by_inbox
|
|
counts = base_messages
|
|
.group(:inbox_id)
|
|
.count
|
|
|
|
inbox_names = account.inboxes.where(id: counts.keys).index_by(&:id)
|
|
|
|
counts.map do |inbox_id, count|
|
|
inbox = inbox_names[inbox_id]
|
|
{ id: inbox_id, name: inbox&.name, outgoing_messages_count: count }
|
|
end
|
|
end
|
|
|
|
def build_by_label
|
|
counts = base_messages
|
|
.joins('INNER JOIN conversations ON messages.conversation_id = conversations.id')
|
|
.joins("INNER JOIN taggings ON taggings.taggable_id = conversations.id
|
|
AND taggings.taggable_type = 'Conversation' AND taggings.context = 'labels'")
|
|
.joins('INNER JOIN tags ON tags.id = taggings.tag_id')
|
|
.group('tags.name')
|
|
.count
|
|
|
|
label_ids = account.labels.where(title: counts.keys).index_by(&:title)
|
|
|
|
counts.map do |label_name, count|
|
|
label = label_ids[label_name]
|
|
{ id: label&.id, name: label_name, outgoing_messages_count: count }
|
|
end
|
|
end
|
|
end
|