Reorganized object observers.
This commit is contained in:
parent
42c855a6d9
commit
c8c2fe521b
9 changed files with 394 additions and 4 deletions
|
@ -387,7 +387,7 @@ class Channel::EmailParser
|
||||||
end
|
end
|
||||||
|
|
||||||
# execute ticket events
|
# execute ticket events
|
||||||
Ticket::Observer::Notification.transaction
|
Observer::Ticket::Notification.transaction
|
||||||
|
|
||||||
# run postmaster post filter
|
# run postmaster post filter
|
||||||
filters = {
|
filters = {
|
||||||
|
|
|
@ -76,7 +76,7 @@ class Channel::Twitter2
|
||||||
end
|
end
|
||||||
|
|
||||||
# execute ticket events
|
# execute ticket events
|
||||||
Ticket::Observer::Notification.transaction
|
Observer::Ticket::Notification.transaction
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
class HistoryObserver < ActiveRecord::Observer
|
require 'history'
|
||||||
|
|
||||||
|
class Observer::History < ActiveRecord::Observer
|
||||||
include UserInfo
|
include UserInfo
|
||||||
observe :ticket, :user, 'ticket::_article'
|
observe :ticket, :user, 'ticket::_article'
|
||||||
|
|
21
app/models/observer/ticket/close_time.rb
Normal file
21
app/models/observer/ticket/close_time.rb
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
class Observer::Ticket::CloseTime < ActiveRecord::Observer
|
||||||
|
observe 'ticket'
|
||||||
|
|
||||||
|
def after_update(record)
|
||||||
|
# puts 'check close time'
|
||||||
|
|
||||||
|
# check if close_time is already set
|
||||||
|
return true if record.close_time
|
||||||
|
|
||||||
|
# check if ticket is closed now
|
||||||
|
ticket_state = Ticket::State.find( record.ticket_state_id )
|
||||||
|
ticket_state_type = Ticket::StateType.find( ticket_state.ticket_state_type_id )
|
||||||
|
return true if ticket_state_type.name != 'closed'
|
||||||
|
|
||||||
|
# set close_time
|
||||||
|
record.close_time = Time.now
|
||||||
|
|
||||||
|
# save ticket
|
||||||
|
record.save
|
||||||
|
end
|
||||||
|
end
|
25
app/models/observer/ticket/first_response.rb
Normal file
25
app/models/observer/ticket/first_response.rb
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
class Observer::Ticket::FirstResponse < ActiveRecord::Observer
|
||||||
|
observe 'ticket::_article'
|
||||||
|
|
||||||
|
def after_create(record)
|
||||||
|
# puts 'check first response'
|
||||||
|
|
||||||
|
# if article in internal
|
||||||
|
return true if record.internal
|
||||||
|
|
||||||
|
# if sender is not agent
|
||||||
|
return true if record.ticket_article_sender.name != 'Agent'
|
||||||
|
|
||||||
|
# if article is a message to customer
|
||||||
|
return true if !record.ticket_article_type.communication
|
||||||
|
|
||||||
|
# check if first_response is already set
|
||||||
|
return true if record.ticket.first_response
|
||||||
|
|
||||||
|
# set first_response
|
||||||
|
record.ticket.first_response = Time.now
|
||||||
|
|
||||||
|
# save ticket
|
||||||
|
record.ticket.save
|
||||||
|
end
|
||||||
|
end
|
43
app/models/observer/ticket/last_contact.rb
Normal file
43
app/models/observer/ticket/last_contact.rb
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
class Observer::Ticket::LastContact < ActiveRecord::Observer
|
||||||
|
observe 'ticket::_article'
|
||||||
|
|
||||||
|
def after_create(record)
|
||||||
|
# puts 'check last contact'
|
||||||
|
|
||||||
|
# if article in internal
|
||||||
|
return true if record.internal
|
||||||
|
|
||||||
|
# if article is a message to customer
|
||||||
|
return true if !record.ticket_article_type.communication
|
||||||
|
|
||||||
|
# if sender is not customer
|
||||||
|
if record.ticket_article_sender.name == 'Customer'
|
||||||
|
|
||||||
|
# check if last communication is done by agent, else do not set last_contact_customer
|
||||||
|
if record.ticket.last_contact_customer == nil ||
|
||||||
|
record.ticket.last_contact_agent == nil ||
|
||||||
|
record.ticket.last_contact_agent.to_i > record.ticket.last_contact_customer.to_i
|
||||||
|
record.ticket.last_contact_customer = Time.now
|
||||||
|
|
||||||
|
# set last_contact
|
||||||
|
record.ticket.last_contact = Time.now
|
||||||
|
|
||||||
|
# save ticket
|
||||||
|
record.ticket.save
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# if sender is not agent
|
||||||
|
if record.ticket_article_sender.name == 'Agent'
|
||||||
|
|
||||||
|
# set last_contact_agent
|
||||||
|
record.ticket.last_contact_agent = Time.now
|
||||||
|
|
||||||
|
# set last_contact
|
||||||
|
record.ticket.last_contact = Time.now
|
||||||
|
|
||||||
|
# save ticket
|
||||||
|
record.ticket.save
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
274
app/models/observer/ticket/notification.rb
Normal file
274
app/models/observer/ticket/notification.rb
Normal file
|
@ -0,0 +1,274 @@
|
||||||
|
class Observer::Ticket::Notification < ActiveRecord::Observer
|
||||||
|
observe :ticket, 'ticket::_article'
|
||||||
|
|
||||||
|
@@event_buffer = []
|
||||||
|
|
||||||
|
def self.transaction
|
||||||
|
|
||||||
|
# puts '@@event_buffer'
|
||||||
|
# puts @@event_buffer.inspect
|
||||||
|
@@event_buffer.each { |event|
|
||||||
|
|
||||||
|
# get current state of objects
|
||||||
|
if event[:name] == 'Ticket::Article'
|
||||||
|
article = Ticket::Article.find( event[:id] )
|
||||||
|
ticket = article.ticket
|
||||||
|
else
|
||||||
|
ticket = Ticket.find( event[:id] )
|
||||||
|
article = ticket.articles[-1]
|
||||||
|
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 #{article.ticket_article_type.name}.
|
||||||
|
|
||||||
|
Group: #{ticket.group.name}
|
||||||
|
Owner: #{ticket.owner.firstname} #{ticket.owner.lastname}
|
||||||
|
State: #{ticket.ticket_state.name}
|
||||||
|
|
||||||
|
From: #{article.from}
|
||||||
|
<snip>
|
||||||
|
#{article.body}
|
||||||
|
</snip>
|
||||||
|
|
||||||
|
#{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:
|
||||||
|
<snip>
|
||||||
|
#{article.body}
|
||||||
|
</snip>
|
||||||
|
|
||||||
|
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 #{article.ticket_article_type.name}.
|
||||||
|
|
||||||
|
Group: #{ticket.group.name}
|
||||||
|
Owner: #{ticket.owner.firstname} #{ticket.owner.lastname}
|
||||||
|
State: #{ticket.ticket_state.name}
|
||||||
|
|
||||||
|
From: #{article.from}
|
||||||
|
<snip>
|
||||||
|
#{article.body}
|
||||||
|
</snip>
|
||||||
|
|
||||||
|
#{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 #{article.ticket_article_type.name}.
|
||||||
|
|
||||||
|
Group: #{ticket.group.name}
|
||||||
|
Owner: #{ticket.owner.firstname} #{ticket.owner.lastname}
|
||||||
|
State: #{ticket.ticket_state.name}
|
||||||
|
|
||||||
|
From: #{article.from}
|
||||||
|
<snip>
|
||||||
|
#{article.body}
|
||||||
|
</snip>
|
||||||
|
|
||||||
|
#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}/#{article.id}
|
||||||
|
'
|
||||||
|
},
|
||||||
|
ticket,
|
||||||
|
article
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
# reset buffer
|
||||||
|
@@event_buffer = []
|
||||||
|
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(
|
||||||
|
: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.history_create(
|
||||||
|
: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)
|
||||||
|
# puts 'CREATED!!!!'
|
||||||
|
# puts record.inspect
|
||||||
|
e = {
|
||||||
|
:name => record.class.name,
|
||||||
|
:type => 'create',
|
||||||
|
:data => record,
|
||||||
|
:id => record.id,
|
||||||
|
}
|
||||||
|
@@event_buffer.push e
|
||||||
|
end
|
||||||
|
|
||||||
|
def before_update(record)
|
||||||
|
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,
|
||||||
|
}
|
||||||
|
@@event_buffer.push e
|
||||||
|
end
|
||||||
|
|
||||||
|
def after_update(record)
|
||||||
|
# puts 'after_update'
|
||||||
|
# puts record.inspect
|
||||||
|
# puts '-----'
|
||||||
|
# puts @a.inspect
|
||||||
|
# AuditTrail.new(record, "UPDATED")
|
||||||
|
end
|
||||||
|
end
|
25
app/models/observer/ticket/user_ticket_counter.rb
Normal file
25
app/models/observer/ticket/user_ticket_counter.rb
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
class Observer::Ticket::UserTicketCounter < ActiveRecord::Observer
|
||||||
|
observe 'ticket'
|
||||||
|
|
||||||
|
def after_create(record)
|
||||||
|
user_ticket_counter_update(record)
|
||||||
|
end
|
||||||
|
def after_update(record)
|
||||||
|
user_ticket_counter_update(record)
|
||||||
|
end
|
||||||
|
|
||||||
|
def user_ticket_counter_update(record)
|
||||||
|
return if !record.customer_id
|
||||||
|
|
||||||
|
ticket_state_list_open = Ticket::State.where( :ticket_state_type_id => Ticket::StateType.where(:name => ['new','open', 'pending reminder', 'pending action']) )
|
||||||
|
ticket_state_list_closed = Ticket::State.where( :ticket_state_type_id => Ticket::StateType.where(:name => ['closed'] ) )
|
||||||
|
|
||||||
|
tickets_open = Ticket.where( :customer_id => record.customer_id, :ticket_state_id => ticket_state_list_open ).count()
|
||||||
|
tickets_closed = Ticket.where( :customer_id => record.customer_id, :ticket_state_id => ticket_state_list_closed ).count()
|
||||||
|
|
||||||
|
customer = User.find( record.customer_id )
|
||||||
|
customer[:preferences][:tickets_open] = tickets_open
|
||||||
|
customer[:preferences][:tickets_closed] = tickets_closed
|
||||||
|
customer.save
|
||||||
|
end
|
||||||
|
end
|
|
@ -141,7 +141,7 @@ class HistoryTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
# execute ticket events
|
# execute ticket events
|
||||||
Ticket::Observer::Notification.transaction
|
Observer::Ticket::Notification.transaction
|
||||||
|
|
||||||
# remember ticket
|
# remember ticket
|
||||||
tickets.push ticket
|
tickets.push ticket
|
||||||
|
|
Loading…
Reference in a new issue