123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- # Copyright (C) 2012-2024 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
|