39 lines
1.1 KiB
Ruby
39 lines
1.1 KiB
Ruby
|
|
class V2::Reports::ChannelSummaryBuilder
|
||
|
|
include DateRangeHelper
|
||
|
|
|
||
|
|
pattr_initialize [:account!, :params!]
|
||
|
|
|
||
|
|
def build
|
||
|
|
conversations_by_channel_and_status.transform_values { |status_counts| build_channel_stats(status_counts) }
|
||
|
|
end
|
||
|
|
|
||
|
|
private
|
||
|
|
|
||
|
|
def conversations_by_channel_and_status
|
||
|
|
account.conversations
|
||
|
|
.joins(:inbox)
|
||
|
|
.where(created_at: range)
|
||
|
|
.group('inboxes.channel_type', 'conversations.status')
|
||
|
|
.count
|
||
|
|
.each_with_object({}) do |((channel_type, status), count), grouped|
|
||
|
|
grouped[channel_type] ||= {}
|
||
|
|
grouped[channel_type][status] = count
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
def build_channel_stats(status_counts)
|
||
|
|
open_count = status_counts['open'] || 0
|
||
|
|
resolved_count = status_counts['resolved'] || 0
|
||
|
|
pending_count = status_counts['pending'] || 0
|
||
|
|
snoozed_count = status_counts['snoozed'] || 0
|
||
|
|
|
||
|
|
{
|
||
|
|
open: open_count,
|
||
|
|
resolved: resolved_count,
|
||
|
|
pending: pending_count,
|
||
|
|
snoozed: snoozed_count,
|
||
|
|
total: open_count + resolved_count + pending_count + snoozed_count
|
||
|
|
}
|
||
|
|
end
|
||
|
|
end
|