123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- class Stats
- =begin
- generate stats for user
- Stats.generate
- returns
- result = true # if generation was successfully
- =end
- def self.generate
- # generate stats per agent
- users = User.with_permissions('ticket.agent')
- agent_count = 0
- user_result = {}
- users.each do |user|
- next if user.id == 1
- next if !user.active
- agent_count += 1
- data = {}
- backends = Setting.where(area: 'Dashboard::Stats')
- if backends.blank?
- raise __("No settings with area 'Dashboard::Stats' defined")
- end
- backends.each do |stats_item|
- # additional permission check
- next if stats_item.preferences[:permission] && !user.permissions?(stats_item.preferences[:permission])
- backend = stats_item.state_current[:value]
- if !backend
- raise "Dashboard::Stats backend #{stats_item.name} is not defined"
- end
- backend = backend.constantize
- data[backend] = backend.generate(user)
- end
- user_result[user] = data
- end
- # calculate average
- backend_average_sum = {}
- user_result.each_value do |data|
- data.each do |backend_model, backend_result|
- next if !backend_result.key?(:used_for_average)
- if !backend_average_sum[backend_model]
- backend_average_sum[backend_model] = 0
- end
- backend_average_sum[backend_model] += backend_result[:used_for_average]
- end
- end
- # generate average param and icon state
- backend_average_sum.each do |backend_model_average, result|
- average = (result.to_f / agent_count).round(1)
- user_result.each do |user, data|
- next if !data[backend_model_average]
- next if !data[backend_model_average].key?(:used_for_average)
- data[backend_model_average][:average_per_agent] = average
- # generate icon state
- backend_model_average.to_s.constantize.average_state(data[backend_model_average], user.id)
- end
- end
- user_result.each do |user, data|
- data_for_user = {}
- data.each do |backend, result|
- data_for_user[backend.to_app_model] = result
- end
- state_store = StatsStore.sync(
- stats_storable: user,
- key: 'dashboard',
- data: data_for_user,
- )
- message = {
- event: 'resetCollection',
- data: {
- state_store.class.to_app_model => [state_store],
- },
- }
- Sessions.send_to(user.id, message)
- event = {
- event: 'dashboard_stats_rebuild',
- }
- Sessions.send_to(user.id, event)
- end
- true
- end
- end
|