140 lines
3.4 KiB
Ruby
140 lines
3.4 KiB
Ruby
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
|
|
|
class Stats::TicketChannelDistribution
|
|
|
|
def self.generate(user)
|
|
|
|
# which time range?
|
|
time_range = 7.days
|
|
|
|
# get users groups
|
|
group_ids = user.group_ids_access('full')
|
|
|
|
# set default channels
|
|
channels = [
|
|
{
|
|
sender: 'email',
|
|
icon: 'email',
|
|
},
|
|
{
|
|
sender: 'phone',
|
|
icon: 'phone',
|
|
},
|
|
]
|
|
|
|
if Setting.get('customer_ticket_create')
|
|
channels.push(
|
|
{
|
|
sender: 'web',
|
|
icon: 'web',
|
|
}
|
|
)
|
|
end
|
|
|
|
if Setting.get('chat')
|
|
channels.push(
|
|
{
|
|
sender: 'chat',
|
|
icon: 'chat',
|
|
}
|
|
)
|
|
end
|
|
|
|
if Channel.exists?(area: 'Sms::Account')
|
|
channels.push(
|
|
{
|
|
sender: 'sms',
|
|
icon: 'sms',
|
|
}
|
|
)
|
|
end
|
|
|
|
if Channel.exists?(area: 'Twitter::Account')
|
|
channels.push(
|
|
{
|
|
sender: 'twitter',
|
|
icon: 'twitter',
|
|
}
|
|
)
|
|
end
|
|
|
|
if Channel.exists?(area: 'Facebook::Account')
|
|
channels.push(
|
|
{
|
|
sender: 'facebook',
|
|
icon: 'facebook',
|
|
}
|
|
)
|
|
end
|
|
|
|
if Channel.exists?(area: 'Telegram::Account')
|
|
channels.push(
|
|
{
|
|
sender: 'telegram',
|
|
icon: 'telegram',
|
|
}
|
|
)
|
|
end
|
|
|
|
# calculate
|
|
result = {}
|
|
total_in = 0
|
|
total_out = 0
|
|
channels.each do |channel|
|
|
result[channel[:sender].to_sym] = {
|
|
icon: channel[:icon]
|
|
}
|
|
type_ids = []
|
|
Ticket::Article::Type.all.each do |type|
|
|
next if !type.name.match?(%r{^#{channel[:sender]}}i)
|
|
|
|
type_ids.push type.id
|
|
end
|
|
|
|
sender = Ticket::Article::Sender.lookup(name: 'Customer')
|
|
count = Ticket.where(group_id: group_ids).joins(:articles).where(
|
|
ticket_articles: { sender_id: sender, type_id: type_ids }
|
|
).where(
|
|
'ticket_articles.created_at > ?', Time.zone.now - time_range
|
|
).count
|
|
result[channel[:sender].to_sym][:inbound] = count
|
|
total_in += count
|
|
|
|
sender = Ticket::Article::Sender.lookup(name: 'Agent')
|
|
count = Ticket.where(group_id: group_ids).joins(:articles).where(
|
|
ticket_articles: { sender_id: sender, type_id: type_ids }
|
|
).where(
|
|
'ticket_articles.created_at > ?', Time.zone.now - time_range
|
|
).count
|
|
result[channel[:sender].to_sym][:outbound] = count
|
|
total_out += count
|
|
end
|
|
|
|
# append in percent
|
|
channels.each do |channel| # rubocop:disable Style/CombinableLoops
|
|
count = result[channel[:sender].to_sym][:inbound]
|
|
# puts "#{channel.inspect}:in/#{result.inspect}:#{count}"
|
|
in_process_precent = if count.zero?
|
|
0
|
|
else
|
|
(count * 1000) / ((total_in * 1000) / 100)
|
|
end
|
|
result[channel[:sender].to_sym][:inbound_in_percent] = in_process_precent
|
|
|
|
count = result[channel[:sender].to_sym][:outbound]
|
|
out_process_precent = if count.zero?
|
|
0
|
|
else
|
|
(count * 1000) / ((total_out * 1000) / 100)
|
|
end
|
|
result[channel[:sender].to_sym][:outbound_in_percent] = out_process_precent
|
|
end
|
|
|
|
{ channels: result }
|
|
end
|
|
|
|
def self.average_state(result, _user_id)
|
|
result
|
|
end
|
|
|
|
end
|