trabajo-afectivo/lib/stats/ticket_channel_distribution.rb

94 lines
2.5 KiB
Ruby
Raw Normal View History

2016-10-19 03:11:36 +00:00
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
2015-09-06 22:42:11 +00:00
class Stats::TicketChannelDistribution
def self.generate(user)
# which time range?
time_range = 7.days
# get users groups
group_ids = user.group_ids_access('full')
2015-09-06 22:42:11 +00:00
# get channels
channels = [
{
sender: 'email',
icon: 'email',
},
{
sender: 'phone',
icon: 'phone',
},
{
sender: 'twitter',
icon: 'twitter',
},
{
sender: 'facebook',
icon: 'facebook',
},
]
# calcualte
result = {}
total_in = 0
total_out = 0
2016-06-30 20:04:48 +00:00
channels.each { |channel|
2015-09-06 22:42:11 +00:00
result[channel[:sender].to_sym] = {
icon: channel[:icon]
}
type_ids = []
2016-06-30 20:04:48 +00:00
Ticket::Article::Type.all.each { |type|
2015-09-06 22:42:11 +00:00
next if type.name !~ /^#{channel[:sender]}/i
type_ids.push type.id
}
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
}
# append in percent
2016-06-30 20:04:48 +00:00
channels.each { |channel|
2015-09-06 22:42:11 +00:00
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
2015-09-06 22:42:11 +00:00
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
2015-09-06 22:42:11 +00:00
result[channel[:sender].to_sym][:outbound_in_percent] = out_process_precent
}
{ channels: result }
end
def self.average_state(result, _user_id)
result
end
2015-09-06 22:42:11 +00:00
end