2015-01-03 22:53:07 +00:00
|
|
|
# encoding: utf-8
|
|
|
|
|
2014-08-26 00:18:31 +00:00
|
|
|
class Observer::Ticket::Notification::BackgroundJob
|
2016-02-03 07:58:51 +00:00
|
|
|
def initialize(params, via_web = false)
|
2015-01-09 19:44:04 +00:00
|
|
|
@p = params
|
2016-02-03 07:58:51 +00:00
|
|
|
@via_web = via_web
|
2014-08-25 23:58:04 +00:00
|
|
|
end
|
2015-05-07 10:27:12 +00:00
|
|
|
|
2014-08-25 23:58:04 +00:00
|
|
|
def perform
|
2016-01-15 17:22:57 +00:00
|
|
|
ticket = Ticket.find(@p[:ticket_id])
|
2015-01-09 19:44:04 +00:00
|
|
|
if @p[:article_id]
|
|
|
|
article = Ticket::Article.find(@p[:article_id])
|
2015-01-03 22:53:07 +00:00
|
|
|
end
|
2014-08-25 23:58:04 +00:00
|
|
|
|
|
|
|
# find recipients
|
2016-02-07 13:00:29 +00:00
|
|
|
recipients_and_channels = []
|
2014-08-25 23:58:04 +00:00
|
|
|
|
2015-01-03 22:53:07 +00:00
|
|
|
=begin
|
2014-08-25 23:58:04 +00:00
|
|
|
# group of agents to work on
|
|
|
|
if data[:recipient] == 'group'
|
|
|
|
recipients = ticket.agent_of_group()
|
|
|
|
|
2015-01-02 15:50:31 +00:00
|
|
|
# owner
|
2014-08-25 23:58:04 +00:00
|
|
|
elsif data[:recipient] == 'owner'
|
|
|
|
if ticket.owner_id != 1
|
|
|
|
recipients.push ticket.owner
|
|
|
|
end
|
|
|
|
|
2015-01-02 15:50:31 +00:00
|
|
|
# customer
|
2014-08-25 23:58:04 +00:00
|
|
|
elsif data[:recipient] == 'customer'
|
|
|
|
if ticket.customer_id != 1
|
|
|
|
# temporarily disabled
|
|
|
|
# recipients.push ticket.customer
|
|
|
|
end
|
|
|
|
|
2015-01-02 15:50:31 +00:00
|
|
|
# owner or group of agents to work on
|
2014-08-25 23:58:04 +00:00
|
|
|
elsif data[:recipient] == 'to_work_on'
|
|
|
|
if ticket.owner_id != 1
|
|
|
|
recipients.push ticket.owner
|
|
|
|
else
|
|
|
|
recipients = ticket.agent_of_group()
|
|
|
|
end
|
|
|
|
end
|
2015-01-03 22:53:07 +00:00
|
|
|
=end
|
|
|
|
|
2016-02-07 13:00:29 +00:00
|
|
|
# loop through all users
|
|
|
|
possible_recipients = ticket.agent_of_group
|
|
|
|
if ticket.owner_id == 1
|
|
|
|
possible_recipients.push ticket.owner
|
2015-01-03 22:53:07 +00:00
|
|
|
end
|
2016-02-07 13:00:29 +00:00
|
|
|
already_checked_recipient_ids = {}
|
|
|
|
possible_recipients.each {|user|
|
|
|
|
next if already_checked_recipient_ids[user.id]
|
|
|
|
already_checked_recipient_ids[user.id] = true
|
|
|
|
next if !user.preferences
|
|
|
|
next if !user.preferences['notification_config']
|
|
|
|
matrix = user.preferences['notification_config']['matrix']
|
|
|
|
if ticket.owner_id != user.id
|
|
|
|
if user.preferences['notification_config']['group_ids'] ||
|
|
|
|
(user.preferences['notification_config']['group_ids'].class == Array && (!user.preferences['notification_config']['group_ids'].empty? || user.preferences['notification_config']['group_ids'][0] != '-'))
|
|
|
|
hit = false
|
|
|
|
user.preferences['notification_config']['group_ids'].each {|notify_group_id|
|
|
|
|
user.group_ids.each {|local_group_id|
|
|
|
|
if local_group_id.to_s == notify_group_id.to_s
|
|
|
|
hit = true
|
|
|
|
end
|
|
|
|
}
|
|
|
|
}
|
|
|
|
next if !hit
|
|
|
|
end
|
|
|
|
end
|
|
|
|
next if !matrix
|
|
|
|
next if !matrix[@p[:type]]
|
|
|
|
data = matrix[@p[:type]]
|
|
|
|
next if !data
|
|
|
|
next if !data['criteria']
|
|
|
|
channels = data['channel']
|
2016-02-08 22:06:21 +00:00
|
|
|
next if !channels
|
2016-02-07 13:00:29 +00:00
|
|
|
if data['criteria']['owned_by_me'] && ticket.owner_id == user.id
|
|
|
|
data = {
|
|
|
|
user: user,
|
|
|
|
channels: channels
|
|
|
|
}
|
|
|
|
recipients_and_channels.push data
|
|
|
|
next
|
|
|
|
end
|
|
|
|
if data['criteria']['owned_by_nobody'] && ticket.owner_id == 1
|
|
|
|
data = {
|
|
|
|
user: user,
|
|
|
|
channels: channels
|
|
|
|
}
|
|
|
|
recipients_and_channels.push data
|
|
|
|
next
|
|
|
|
end
|
|
|
|
next unless data['criteria']['no']
|
|
|
|
data = {
|
|
|
|
user: user,
|
|
|
|
channels: channels
|
|
|
|
}
|
|
|
|
recipients_and_channels.push data
|
|
|
|
next
|
|
|
|
}
|
2014-08-25 23:58:04 +00:00
|
|
|
|
|
|
|
# send notifications
|
2015-01-03 22:53:07 +00:00
|
|
|
recipient_list = ''
|
2016-02-07 13:00:29 +00:00
|
|
|
recipients_and_channels.each do |item|
|
|
|
|
user = item[:user]
|
|
|
|
channels = item[:channels]
|
2015-01-02 15:50:31 +00:00
|
|
|
|
2016-02-03 07:58:51 +00:00
|
|
|
# ignore user who changed it by him self via web
|
|
|
|
if @via_web
|
|
|
|
next if article && article.updated_by_id == user.id
|
|
|
|
next if !article && ticket.updated_by_id == user.id
|
|
|
|
end
|
2015-01-09 19:44:04 +00:00
|
|
|
|
|
|
|
# ignore inactive users
|
2015-01-02 15:53:59 +00:00
|
|
|
next if !user.active
|
2015-01-02 15:50:31 +00:00
|
|
|
|
2016-02-07 13:00:29 +00:00
|
|
|
# ignore if no changes has been done
|
|
|
|
changes = human_changes(user, ticket)
|
|
|
|
next if @p[:type] == 'update' && !article && ( !changes || changes.empty? )
|
2014-08-25 23:58:04 +00:00
|
|
|
|
2016-02-20 10:12:15 +00:00
|
|
|
# check if today already notified within last 24 hours
|
|
|
|
if @p[:type] == 'reminder_reached' || @p[:type] == 'escalation'
|
|
|
|
identifier = user.email
|
|
|
|
if !identifier || identifier == ''
|
|
|
|
identifier = user.login
|
|
|
|
end
|
|
|
|
already_notified = false
|
|
|
|
History.list('Ticket', ticket.id).each {|history|
|
|
|
|
next if history['type'] != 'notification'
|
|
|
|
next if history['value_to'] !~ /\(#{Regexp.escape(@p[:type])}:/
|
|
|
|
next if history['value_to'] !~ /#{Regexp.escape(identifier)}\(/
|
|
|
|
next if history['created_at'] < Time.zone.now - 24.hours
|
|
|
|
already_notified = true
|
|
|
|
}
|
|
|
|
next if already_notified
|
|
|
|
end
|
|
|
|
|
2016-02-07 13:00:29 +00:00
|
|
|
# create online notification
|
|
|
|
used_channels = []
|
|
|
|
if channels['online']
|
|
|
|
used_channels.push 'online'
|
|
|
|
seen = ticket.online_notification_seen_state(user.id)
|
2016-02-20 10:12:15 +00:00
|
|
|
|
|
|
|
# delete old notifications
|
|
|
|
if @p[:type] == 'reminder_reached' || @p[:type] == 'escalation'
|
|
|
|
OnlineNotification.remove_by_type('Ticket', ticket.id, @p[:type])
|
|
|
|
end
|
2016-02-07 13:00:29 +00:00
|
|
|
OnlineNotification.add(
|
|
|
|
type: @p[:type],
|
|
|
|
object: 'Ticket',
|
|
|
|
o_id: ticket.id,
|
|
|
|
seen: seen,
|
|
|
|
created_by_id: ticket.updated_by_id || 1,
|
|
|
|
user_id: user.id,
|
|
|
|
)
|
2016-02-19 21:05:36 +00:00
|
|
|
Rails.logger.debug "sent ticket online notifiaction to agent (#{@p[:type]}/#{ticket.id}/#{user.email})"
|
2014-08-25 23:58:04 +00:00
|
|
|
end
|
|
|
|
|
2016-02-07 13:00:29 +00:00
|
|
|
# ignore email channel notificaiton and empty emails
|
2016-02-08 11:01:32 +00:00
|
|
|
if !channels['email'] || !user.email || user.email == ''
|
2016-02-20 10:12:15 +00:00
|
|
|
add_recipient_list(ticket, user, used_channels, @p[:type])
|
2015-01-09 19:44:04 +00:00
|
|
|
next
|
|
|
|
end
|
2015-01-04 12:52:14 +00:00
|
|
|
|
2016-02-07 13:00:29 +00:00
|
|
|
used_channels.push 'email'
|
2016-02-20 10:12:15 +00:00
|
|
|
add_recipient_list(ticket, user, used_channels, @p[:type])
|
2016-02-07 13:00:29 +00:00
|
|
|
|
2015-01-03 22:53:07 +00:00
|
|
|
# get user based notification template
|
|
|
|
# if create, send create message / block update messages
|
2016-02-19 21:05:36 +00:00
|
|
|
template = nil
|
2015-01-09 19:44:04 +00:00
|
|
|
if @p[:type] == 'create'
|
2016-02-19 21:05:36 +00:00
|
|
|
template = 'ticket_create'
|
2015-01-09 19:44:04 +00:00
|
|
|
elsif @p[:type] == 'update'
|
2016-02-19 21:05:36 +00:00
|
|
|
template = 'ticket_update'
|
2016-02-20 10:12:15 +00:00
|
|
|
elsif @p[:type] == 'reminder_reached'
|
|
|
|
template = 'ticket_reminder_reached'
|
|
|
|
elsif @p[:type] == 'escalation'
|
|
|
|
template = 'ticket_escalation'
|
2015-01-03 22:53:07 +00:00
|
|
|
else
|
2015-05-07 11:27:07 +00:00
|
|
|
fail "unknown type for notification #{@p[:type]}"
|
2015-01-03 22:53:07 +00:00
|
|
|
end
|
|
|
|
|
2016-02-19 21:05:36 +00:00
|
|
|
NotificationFactory.notification(
|
|
|
|
template: template,
|
|
|
|
user: user,
|
|
|
|
objects: {
|
|
|
|
ticket: ticket,
|
|
|
|
article: article,
|
|
|
|
recipient: user,
|
|
|
|
changes: changes,
|
2016-02-20 07:14:51 +00:00
|
|
|
},
|
|
|
|
references: ticket.get_references,
|
|
|
|
main_object: ticket,
|
2014-08-25 23:58:04 +00:00
|
|
|
)
|
2016-02-19 21:05:36 +00:00
|
|
|
Rails.logger.debug "sent ticket email notifiaction to agent (#{@p[:type]}/#{ticket.id}/#{user.email})"
|
2014-08-25 23:58:04 +00:00
|
|
|
end
|
|
|
|
|
2016-02-07 15:53:21 +00:00
|
|
|
end
|
2015-04-30 15:25:04 +00:00
|
|
|
|
2016-02-20 10:12:15 +00:00
|
|
|
def add_recipient_list(ticket, user, channels, type)
|
2016-02-07 15:53:21 +00:00
|
|
|
return if channels.empty?
|
2016-02-07 16:17:27 +00:00
|
|
|
identifier = user.email
|
2016-02-08 05:58:28 +00:00
|
|
|
if !identifier || identifier == ''
|
2016-02-07 16:17:27 +00:00
|
|
|
identifier = user.login
|
|
|
|
end
|
2016-02-20 10:12:15 +00:00
|
|
|
recipient_list = "#{identifier}(#{type}:#{channels.join(',')})"
|
2015-04-30 15:25:04 +00:00
|
|
|
History.add(
|
|
|
|
o_id: ticket.id,
|
|
|
|
history_type: 'notification',
|
|
|
|
history_object: 'Ticket',
|
|
|
|
value_to: recipient_list,
|
2015-05-01 12:36:36 +00:00
|
|
|
created_by_id: ticket.updated_by_id || 1
|
2015-04-30 15:25:04 +00:00
|
|
|
)
|
2014-08-25 23:58:04 +00:00
|
|
|
end
|
2015-01-03 22:53:07 +00:00
|
|
|
|
2015-01-04 12:52:14 +00:00
|
|
|
def human_changes(user, record)
|
|
|
|
|
2015-01-09 19:44:04 +00:00
|
|
|
return {} if !@p[:changes]
|
2016-02-19 21:05:36 +00:00
|
|
|
locale = user.preferences[:locale] || 'en-us'
|
2015-01-04 12:52:14 +00:00
|
|
|
|
|
|
|
# only show allowed attributes
|
|
|
|
attribute_list = ObjectManager::Attribute.by_object_as_hash('Ticket', user)
|
2015-01-04 15:39:57 +00:00
|
|
|
#puts "AL #{attribute_list.inspect}"
|
2015-01-04 12:52:14 +00:00
|
|
|
user_related_changes = {}
|
2015-01-09 19:44:04 +00:00
|
|
|
@p[:changes].each {|key, value|
|
2015-01-04 15:39:57 +00:00
|
|
|
|
|
|
|
# if no config exists, use all attributes
|
|
|
|
if !attribute_list || attribute_list.empty?
|
|
|
|
user_related_changes[key] = value
|
|
|
|
|
|
|
|
# if config exists, just use existing attributes for user
|
|
|
|
elsif attribute_list[key.to_s]
|
2015-01-04 12:52:14 +00:00
|
|
|
user_related_changes[key] = value
|
|
|
|
end
|
|
|
|
}
|
|
|
|
|
|
|
|
changes = {}
|
|
|
|
user_related_changes.each {|key, value|
|
|
|
|
|
|
|
|
# get attribute name
|
|
|
|
attribute_name = key.to_s
|
|
|
|
object_manager_attribute = attribute_list[attribute_name]
|
2015-04-27 14:53:29 +00:00
|
|
|
if attribute_name[-3, 3] == '_id'
|
2015-04-27 14:41:03 +00:00
|
|
|
attribute_name = attribute_name[ 0, attribute_name.length - 3 ].to_s
|
2015-01-04 12:52:14 +00:00
|
|
|
end
|
2015-02-10 22:48:14 +00:00
|
|
|
|
|
|
|
# add item to changes hash
|
|
|
|
if key.to_s == attribute_name
|
|
|
|
changes[attribute_name] = value
|
2015-01-04 12:52:14 +00:00
|
|
|
end
|
|
|
|
|
2015-02-10 22:48:14 +00:00
|
|
|
# if changed item is an _id field/reference, do an lookup for the realy values
|
|
|
|
value_id = []
|
2015-01-04 12:52:14 +00:00
|
|
|
value_str = [ value[0], value[1] ]
|
2015-04-27 14:53:29 +00:00
|
|
|
if key.to_s[-3, 3] == '_id'
|
2015-01-04 12:52:14 +00:00
|
|
|
value_id[0] = value[0]
|
|
|
|
value_id[1] = value[1]
|
|
|
|
|
|
|
|
if record.respond_to?( attribute_name ) && record.send(attribute_name)
|
|
|
|
relation_class = record.send(attribute_name).class
|
|
|
|
if relation_class && value_id[0]
|
2015-04-27 13:42:53 +00:00
|
|
|
relation_model = relation_class.lookup( id: value_id[0] )
|
2015-01-04 12:52:14 +00:00
|
|
|
if relation_model
|
|
|
|
if relation_model['name']
|
|
|
|
value_str[0] = relation_model['name']
|
|
|
|
elsif relation_model.respond_to?('fullname')
|
|
|
|
value_str[0] = relation_model.send('fullname')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if relation_class && value_id[1]
|
2015-04-27 13:42:53 +00:00
|
|
|
relation_model = relation_class.lookup( id: value_id[1] )
|
2015-01-04 12:52:14 +00:00
|
|
|
if relation_model
|
|
|
|
if relation_model['name']
|
|
|
|
value_str[1] = relation_model['name']
|
|
|
|
elsif relation_model.respond_to?('fullname')
|
|
|
|
value_str[1] = relation_model.send('fullname')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2015-02-10 22:48:14 +00:00
|
|
|
|
|
|
|
# check if we have an dedcated display name for it
|
2015-01-04 12:52:14 +00:00
|
|
|
display = attribute_name
|
|
|
|
if object_manager_attribute && object_manager_attribute[:display]
|
2015-02-10 22:48:14 +00:00
|
|
|
|
|
|
|
# delete old key
|
|
|
|
changes.delete( display )
|
|
|
|
|
|
|
|
# set new key
|
|
|
|
display = object_manager_attribute[:display].to_s
|
2015-01-04 12:52:14 +00:00
|
|
|
end
|
2016-01-15 17:22:57 +00:00
|
|
|
changes[display] = if object_manager_attribute && object_manager_attribute[:translate]
|
2016-02-19 21:05:36 +00:00
|
|
|
from = Translation.translate(locale, value_str[0])
|
|
|
|
to = Translation.translate(locale, value_str[1])
|
|
|
|
[from, to]
|
2016-01-15 17:22:57 +00:00
|
|
|
else
|
|
|
|
[value_str[0].to_s, value_str[1].to_s]
|
|
|
|
end
|
2015-01-04 12:52:14 +00:00
|
|
|
}
|
|
|
|
changes
|
|
|
|
end
|
|
|
|
|
2015-04-27 14:15:29 +00:00
|
|
|
end
|