trabajo-afectivo/lib/stats/ticket_channel_distribution.rb
2022-01-01 14:38:12 +01:00

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