# Copyright (C) 2012-2013 Zammad Foundation, http://zammad-foundation.org/
require 'event_buffer'
require 'notification_factory'
class Observer::Ticket::Notification < ActiveRecord::Observer
observe :ticket, 'ticket::_article'
def self.transaction
# return if we run import mode
return if Setting.get('import_mode')
# get buffer
list = EventBuffer.list
# reset buffer
EventBuffer.reset
list.each { |event|
# get current state of objects
if event[:name] == 'Ticket::Article'
article = Ticket::Article.lookup( :id => event[:id] )
# next if article is already deleted
next if !article
ticket = article.ticket
elsif event[:name] == 'Ticket'
ticket = Ticket.lookup( :id => event[:id] )
# next if ticket is already deleted
next if !ticket
article = ticket.articles[-1]
else
raise "unknown object for notification #{event[:name]}"
end
# send new ticket notification to agents
if event[:name] == 'Ticket' && event[:type] == 'create'
puts 'send new ticket notify to agent'
send_notify(
{
:event => event,
:recipient => 'to_work_on', # group|owner|to_work_on|customer
:subject => 'New Ticket (#{ticket.title})',
:body => 'Hi #{recipient.firstname},
a new Ticket (#{ticket.title}) via i18n(#{article.ticket_article_type.name}).
Group: #{ticket.group.name}
Owner: #{ticket.owner.firstname} #{ticket.owner.lastname}
State: i18n(#{ticket.ticket_state.name})
From: #{article.from}
#{article.body}
#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}/#{article.id}
'
},
ticket,
article
)
end
# send new ticket notification to customers
if event[:name] == 'Ticket' && event[:type] == 'create'
# only for incoming emails
next if article.ticket_article_type.name != 'email'
puts 'send new ticket notify to customer'
send_notify(
{
:event => event,
:recipient => 'customer', # group|owner|to_work_on|customer
:subject => 'New Ticket has been created! (#{ticket.title})',
:body => 'Thanks for your email. A new ticket has been created.
You wrote:
#{article.body}
Your email will be answered by a human ASAP
Have fun with Zammad! :-)
Your Zammad Team
'
},
ticket,
article
)
end
# send follow up notification
if event[:name] == 'Ticket::Article' && event[:type] == 'create'
# only send article notifications after init article is created (handled by ticket create event)
next if ticket.articles.count.to_i <= 1
puts 'send new ticket::article notify'
if article.ticket_article_sender.name == 'Customer'
send_notify(
{
:event => event,
:recipient => 'to_work_on', # group|owner|to_work_on|customer
:subject => 'Follow Up (#{ticket.title})',
:body => 'Hi #{recipient.firstname},
a follow Up (#{ticket.title}) via i18n(#{article.ticket_article_type.name}).
Group: #{ticket.group.name}
Owner: #{ticket.owner.firstname} #{ticket.owner.lastname}
State: i18n(#{ticket.ticket_state.name})
From: #{article.from}
#{article.body}
#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}/#{article.id}
'
},
ticket,
article
)
end
# send new note notification to owner
# if agent == created.id
if article.ticket_article_sender.name == 'Agent' && article.created_by_id != article.ticket.owner_id
send_notify(
{
:event => event,
:recipient => 'owner', # group|owner|to_work_on
:subject => 'Updated (#{ticket.title})',
:body => 'Hi #{recipient.firstname},
updated (#{ticket.title}) via i18n(#{article.ticket_article_type.name}).
Group: #{ticket.group.name}
Owner: #{ticket.owner.firstname} #{ticket.owner.lastname}
State: i18n(#{ticket.ticket_state.name})
From: #{article.from}
#{article.body}
#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}/#{article.id}
'
},
ticket,
article
)
end
end
}
end
def self.send_notify(data, ticket, article)
# find recipients
recipients = []
# group of agents to work on
if data[:recipient] == 'group'
recipients = ticket.agent_of_group()
# owner
elsif data[:recipient] == 'owner'
if ticket.owner_id != 1
recipients.push ticket.owner
end
# customer
elsif data[:recipient] == 'customer'
if ticket.customer_id != 1
# temporarily disabled
# recipients.push ticket.customer
end
# owner or group of agents to work on
elsif data[:recipient] == 'to_work_on'
if ticket.owner_id != 1
recipients.push ticket.owner
else
recipients = ticket.agent_of_group()
end
end
# send notifications
recipient_list = ''
notification_subject = ''
recipients.each do |user|
next if !user.email || user.email == ''
# add recipient_list
if recipient_list != ''
recipient_list += ','
end
recipient_list += user.email.to_s
# prepare subject & body
notification = {}
[:subject, :body].each { |key|
notification[key.to_sym] = NotificationFactory.build(
:locale => user.locale,
:string => data[key.to_sym],
:objects => {
:ticket => ticket,
:article => article,
:recipient => user,
}
)
}
notification_subject = notification[:subject]
# rebuild subject
notification[:subject] = ticket.subject_build( notification[:subject] )
# send notification
NotificationFactory.send(
:recipient => user,
:subject => notification[:subject],
:body => notification[:body]
)
end
# add history record
if recipient_list != ''
History.add(
:o_id => ticket.id,
:history_type => 'notification',
:history_object => 'Ticket',
:value_from => notification_subject,
:value_to => recipient_list,
:created_by_id => article.created_by_id || 1
)
end
end
def after_create(record)
# return if we run import mode
return if Setting.get('import_mode')
# puts 'CREATED!!!!'
# puts record.inspect
e = {
:name => record.class.name,
:type => 'create',
:data => record,
:id => record.id,
}
EventBuffer.add(e)
end
def before_update(record)
# return if we run import mode
return if Setting.get('import_mode')
#puts 'before_update'
current = record.class.find(record.id)
# do not send anything if nothing has changed
return if current.attributes == record.attributes
# puts 'UPDATE!!!!!!!!'
# puts 'current'
# puts current.inspect
# puts 'record'
# puts record.inspect
e = {
:name => record.class.name,
:type => 'update',
:data => record,
:id => record.id,
}
EventBuffer.add(e)
end
def after_update(record)
# return if we run import mode
return if Setting.get('import_mode')
# puts 'after_update'
# puts record.inspect
# puts '-----'
# puts @a.inspect
# AuditTrail.new(record, "UPDATED")
end
end