Ignore system article in notifications.

This commit is contained in:
Martin Edenhofer 2016-05-04 11:45:05 +02:00
parent 43bb991f27
commit dfc5900234
9 changed files with 103 additions and 32 deletions

View file

@ -23,6 +23,9 @@ class Observer::Ticket::Article::CommunicateEmail::BackgroundJob
sender = Ticket::Article::Sender.lookup(id: record.sender_id) sender = Ticket::Article::Sender.lookup(id: record.sender_id)
if sender['name'] == 'System' if sender['name'] == 'System'
notification = true notification = true
# ignore notifications in developer mode
return if Setting.get('developer_mode') == true
end end
# get linked channel and send # get linked channel and send

View file

@ -5,42 +5,57 @@ class Observer::Ticket::ArticleChanges < ActiveRecord::Observer
def after_create(record) def after_create(record)
article_count_update(record) changed = false
if article_count_update(record)
changed = true
end
first_response_update(record) if first_response_update(record)
changed = true
end
sender_type_update(record) if sender_type_update(record)
changed = true
end
last_contact_update(record) if last_contact_update(record)
changed = true
end
# save ticket # save ticket
return if !changed
record.ticket.save record.ticket.save
end end
# get article count # get article count
def article_count_update(record) def article_count_update(record)
record.ticket.article_count = record.ticket.articles.count current_count = record.ticket.article_count
sender = Ticket::Article::Sender.lookup(name: 'System')
count = Ticket::Article.where(ticket_id: record.ticket_id).where('sender_id NOT IN (?)', sender.id).count
return false if current_count == count
record.ticket.article_count = count
true
end end
# set frist response # set frist response
def first_response_update(record) def first_response_update(record)
# return if we run import mode # return if we run import mode
return if Setting.get('import_mode') return false if Setting.get('import_mode')
# if article in internal # if article in internal
return true if record.internal return false if record.internal
# if sender is not agent # if sender is not agent
sender = Ticket::Article::Sender.lookup(id: record.sender_id) sender = Ticket::Article::Sender.lookup(id: record.sender_id)
type = Ticket::Article::Type.lookup(id: record.type_id) return false if sender.name != 'Agent'
return true if sender.name != 'Agent'
# if article is a message to customer # if article is a message to customer
return true if !type.communication type = Ticket::Article::Type.lookup(id: record.type_id)
return false if !type.communication
# check if first_response is already set # check if first_response is already set
return true if record.ticket.first_response return false if record.ticket.first_response
# set first_response # set first_response
record.ticket.first_response = record.created_at record.ticket.first_response = record.created_at
@ -53,20 +68,25 @@ class Observer::Ticket::ArticleChanges < ActiveRecord::Observer
# ignore if create channel is already set # ignore if create channel is already set
count = Ticket::Article.where(ticket_id: record.ticket_id).count count = Ticket::Article.where(ticket_id: record.ticket_id).count
return if count > 1 return false if count > 1
record.ticket.create_article_type_id = record.type_id record.ticket.create_article_type_id = record.type_id
record.ticket.create_article_sender_id = record.sender_id record.ticket.create_article_sender_id = record.sender_id
true
end end
# set last contact # set last contact
def last_contact_update(record) def last_contact_update(record)
# if article in internal # if article in internal
return true if record.internal return false if record.internal
# if sender is system
sender = Ticket::Article::Sender.lookup(id: record.sender_id)
return false if sender.name == 'System'
# if article is a message to customer # if article is a message to customer
return true if !Ticket::Article::Type.lookup(id: record.type_id).communication return false if !Ticket::Article::Type.lookup(id: record.type_id).communication
# if sender is customer # if sender is customer
sender = Ticket::Article::Sender.lookup(id: record.sender_id) sender = Ticket::Article::Sender.lookup(id: record.sender_id)
@ -74,9 +94,9 @@ class Observer::Ticket::ArticleChanges < ActiveRecord::Observer
if sender.name == 'Customer' if sender.name == 'Customer'
# if customer is sending agains, ignore update of last contact (usecase of update escalation) # if customer is sending agains, ignore update of last contact (usecase of update escalation)
return true if ticket.last_contact_customer && return false if ticket.last_contact_customer &&
ticket.last_contact && ticket.last_contact &&
ticket.last_contact_customer == ticket.last_contact ticket.last_contact_customer == ticket.last_contact
# check if last communication is done by agent, else do not set last_contact_customer # check if last communication is done by agent, else do not set last_contact_customer
if ticket.last_contact_customer.nil? || if ticket.last_contact_customer.nil? ||
@ -94,7 +114,7 @@ class Observer::Ticket::ArticleChanges < ActiveRecord::Observer
end end
# if sender is not agent # if sender is not agent
return if sender.name != 'Agent' return false if sender.name != 'Agent'
# set last_contact_agent # set last_contact_agent
record.ticket.last_contact_agent = record.created_at record.ticket.last_contact_agent = record.created_at

View file

@ -24,7 +24,7 @@ class Observer::Ticket::RefObjectTouch < ActiveRecord::Observer
cutomer_id_changed = record.changes['customer_id'] cutomer_id_changed = record.changes['customer_id']
if cutomer_id_changed && cutomer_id_changed[0] != cutomer_id_changed[1] if cutomer_id_changed && cutomer_id_changed[0] != cutomer_id_changed[1]
if cutomer_id_changed[0] if cutomer_id_changed[0]
User.find( cutomer_id_changed[0] ).touch User.find(cutomer_id_changed[0]).touch
end end
end end
@ -37,7 +37,7 @@ class Observer::Ticket::RefObjectTouch < ActiveRecord::Observer
organization_id_changed = record.changes['organization_id'] organization_id_changed = record.changes['organization_id']
if organization_id_changed && organization_id_changed[0] != organization_id_changed[1] if organization_id_changed && organization_id_changed[0] != organization_id_changed[1]
if organization_id_changed[0] if organization_id_changed[0]
Organization.find( organization_id_changed[0] ).touch Organization.find(organization_id_changed[0]).touch
end end
end end

View file

@ -265,21 +265,21 @@ returns
def merge_to(data) def merge_to(data)
# update articles # update articles
Ticket::Article.where( ticket_id: id ).each(&:touch) Ticket::Article.where(ticket_id: id).each(&:touch)
# quiet update of reassign of articles # quiet update of reassign of articles
Ticket::Article.where( ticket_id: id ).update_all( ['ticket_id = ?', data[:ticket_id] ] ) Ticket::Article.where(ticket_id: id).update_all(['ticket_id = ?', data[:ticket_id] ])
# touch new ticket (to broadcast change) # touch new ticket (to broadcast change)
Ticket.find( data[:ticket_id] ).touch Ticket.find(data[:ticket_id]).touch
# update history # update history
# create new merge article # create new merge article
Ticket::Article.create( Ticket::Article.create(
ticket_id: id, ticket_id: id,
type_id: Ticket::Article::Type.lookup( name: 'note' ).id, type_id: Ticket::Article::Type.lookup(name: 'note').id,
sender_id: Ticket::Article::Sender.lookup( name: Z_ROLENAME_AGENT ).id, sender_id: Ticket::Article::Sender.lookup(name: Z_ROLENAME_AGENT).id,
body: 'merged', body: 'merged',
internal: false, internal: false,
created_by_id: data[:user_id], created_by_id: data[:user_id],
@ -298,10 +298,10 @@ returns
) )
# set state to 'merged' # set state to 'merged'
self.state_id = Ticket::State.lookup( name: 'merged' ).id self.state_id = Ticket::State.lookup(name: 'merged').id
# rest owner # rest owner
self.owner_id = User.find_by( login: '-' ).id self.owner_id = User.find_by(login: '-').id
# save ticket # save ticket
save save

View file

@ -33,6 +33,13 @@ class Transaction::Notification
ticket = Ticket.find(@item[:object_id]) ticket = Ticket.find(@item[:object_id])
if @item[:article_id] if @item[:article_id]
article = Ticket::Article.find(@item[:article_id]) article = Ticket::Article.find(@item[:article_id])
# ignore notifications
sender = Ticket::Article::Sender.lookup(id: article.sender_id)
if sender && sender.name == 'System'
return if @item[:changes].empty?
article = nil
end
end end
# find recipients # find recipients

View file

@ -37,6 +37,7 @@ class Transaction::Trigger
article = Ticket::Article.lookup(id: @item[:article_id]) article = Ticket::Article.lookup(id: @item[:article_id])
end end
original_user_id = UserInfo.current_user_id
UserInfo.current_user_id = 1 UserInfo.current_user_id = 1
triggers.each {|trigger| triggers.each {|trigger|
@ -89,6 +90,7 @@ class Transaction::Trigger
ticket.perform_changes(trigger.perform, 'trigger', @item) ticket.perform_changes(trigger.perform, 'trigger', @item)
} }
UserInfo.current_user_id = original_user_id
end end
end end

View file

@ -3878,7 +3878,7 @@ Trigger.create_or_update(
}, },
perform: { perform: {
'notification.email' => { 'notification.email' => {
'body' => '<p>Your request (#{config.ticket_hook}##{ticket.number}) has been received and will be reviewed by our support staff.<p> 'body' => '<p>Your request (#{config.ticket_hook}#{ticket.number}) has been received and will be reviewed by our support staff.<p>
<br/> <br/>
<p>To provide additional information, please reply to this email or click on the following link: <p>To provide additional information, please reply to this email or click on the following link:
<a href="#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}</a> <a href="#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}</a>
@ -3917,7 +3917,7 @@ Trigger.create_or_update(
}, },
perform: { perform: {
'notification.email' => { 'notification.email' => {
'body' => '<p>Your follow up for (#{config.ticket_hook}##{ticket.number}) has been received and will be reviewed by our support staff.<p> 'body' => '<p>Your follow up for (#{config.ticket_hook}#{ticket.number}) has been received and will be reviewed by our support staff.<p>
<br/> <br/>
<p>To provide additional information, please reply to this email or click on the following link: <p>To provide additional information, please reply to this email or click on the following link:
<a href="#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}</a> <a href="#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}</a>

View file

@ -3,6 +3,45 @@ require 'test_helper'
class TicketNotificationTest < ActiveSupport::TestCase class TicketNotificationTest < ActiveSupport::TestCase
Trigger.create_or_update(
name: 'auto reply - new ticket',
condition: {
'ticket.action' => {
'operator' => 'is',
'value' => 'create',
},
'ticket.state_id' => {
'operator' => 'is not',
'value' => Ticket::State.lookup(name: 'closed').id,
},
'article.type_id' => {
'operator' => 'is',
'value' => [
Ticket::Article::Type.lookup(name: 'email').id,
Ticket::Article::Type.lookup(name: 'phone').id,
Ticket::Article::Type.lookup(name: 'web').id,
],
},
},
perform: {
'notification.email' => {
'body' => '<p>Your request (Ticket##{ticket.number}) has been received and will be reviewed by our support staff.<p>
<br/>
<p>To provide additional information, please reply to this email or click on the following link:
<a href="#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}</a>
</p>
<br/>
<p><i><a href="http://zammad.com">Zammad</a>, your customer support system</i></p>',
'recipient' => 'ticket_customer',
'subject' => 'Thanks for your inquiry (#{ticket.title})',
},
},
disable_notification: true,
active: true,
created_by_id: 1,
updated_by_id: 1,
)
# create agent1 & agent2 # create agent1 & agent2
groups = Group.where(name: 'Users') groups = Group.where(name: 'Users')
roles = Role.where(name: 'Agent') roles = Role.where(name: 'Agent')
@ -64,7 +103,7 @@ class TicketNotificationTest < ActiveSupport::TestCase
ticket1 = Ticket.create( ticket1 = Ticket.create(
title: 'some notification test 1', title: 'some notification test 1',
group: Group.lookup(name: 'Users'), group: Group.lookup(name: 'Users'),
customer: agent1, customer: customer,
state: Ticket::State.lookup(name: 'new'), state: Ticket::State.lookup(name: 'new'),
priority: Ticket::Priority.lookup(name: '2 normal'), priority: Ticket::Priority.lookup(name: '2 normal'),
updated_by_id: agent1.id, updated_by_id: agent1.id,
@ -98,7 +137,7 @@ class TicketNotificationTest < ActiveSupport::TestCase
ticket1 = Ticket.create( ticket1 = Ticket.create(
title: 'some notification test 1', title: 'some notification test 1',
group: Group.lookup(name: 'Users'), group: Group.lookup(name: 'Users'),
customer: agent1, customer: customer,
state: Ticket::State.lookup(name: 'new'), state: Ticket::State.lookup(name: 'new'),
priority: Ticket::Priority.lookup(name: '2 normal'), priority: Ticket::Priority.lookup(name: '2 normal'),
updated_by_id: agent1.id, updated_by_id: agent1.id,

View file

@ -371,7 +371,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
}, },
'ticket.state_id' => { 'ticket.state_id' => {
'operator' => 'is not', 'operator' => 'is not',
'value' => '4', 'value' => Ticket::State.lookup(name: 'closed').id,
}, },
'article.type_id' => { 'article.type_id' => {
'operator' => 'is', 'operator' => 'is',