diff --git a/app/models/observer/transaction.rb b/app/models/observer/transaction.rb
index e62b7e788..be7092504 100644
--- a/app/models/observer/transaction.rb
+++ b/app/models/observer/transaction.rb
@@ -58,6 +58,7 @@ class Observer::Transaction < ActiveRecord::Observer
rescue => e
Rails.logger.error 'ERROR: ' + backend.inspect
Rails.logger.error 'ERROR: ' + e.inspect
+ Rails.logger.error e.backtrace.inspect
end
end
diff --git a/app/models/ticket.rb b/app/models/ticket.rb
index fa1bf2721..8034b67e3 100644
--- a/app/models/ticket.rb
+++ b/app/models/ticket.rb
@@ -652,11 +652,11 @@ condition example
perform changes on ticket
- ticket.perform_changes({}, 'trigger', item)
+ ticket.perform_changes({}, 'trigger', item, current_user_id)
=end
- def perform_changes(perform, perform_origin, item = nil)
+ def perform_changes(perform, perform_origin, item = nil, current_user_id = nil)
logger.debug "Perform #{perform_origin} #{perform.inspect} on Ticket.find(#{id})"
changed = false
perform.each do |key, value|
@@ -785,6 +785,16 @@ perform changes on ticket
next
end
+ # lookup pre_condition
+ if value['pre_condition']
+ if value['pre_condition'] =~ /^not_set/
+ value['value'] = 1
+ elsif value['pre_condition'] =~ /^current_user\./
+ raise 'Unable to use current_user, got no current_user_id for ticket.perform_changes' if !current_user_id
+ value['value'] = current_user_id
+ end
+ end
+
# update ticket
next if self[attribute].to_s == value['value'].to_s
changed = true
diff --git a/app/models/transaction/trigger.rb b/app/models/transaction/trigger.rb
index 7b2b6ad5d..46408051d 100644
--- a/app/models/transaction/trigger.rb
+++ b/app/models/transaction/trigger.rb
@@ -29,7 +29,11 @@ class Transaction::Trigger
return if @item[:object] != 'Ticket'
- triggers = Trigger.where(active: true).order('LOWER(name)')
+ triggers = if Rails.configuration.db_case_sensitive
+ Trigger.where(active: true).order('LOWER(name)')
+ else
+ Trigger.where(active: true).order(:name)
+ end
return if triggers.empty?
ticket = Ticket.lookup(id: @item[:object_id])
@@ -44,49 +48,8 @@ class Transaction::Trigger
triggers.each { |trigger|
condition = trigger.condition
- # check action
- if condition['ticket.action']
- next if condition['ticket.action']['operator'] == 'is' && condition['ticket.action']['value'] != @item[:type]
- next if condition['ticket.action']['operator'] != 'is' && condition['ticket.action']['value'] == @item[:type]
- condition.delete('ticket.action')
- end
-
- # check action
- if condition['article.action']
- next if !article
- condition.delete('article.action')
- end
-
- # check "has changed" options
- has_changed_condition_exists = false
- has_changed = false
- condition.each do |key, value|
- next if !value
- next if !value['operator']
- next if !value['operator']['has changed']
- has_changed_condition_exists = true
-
- # next if has changed? && !@item[:changes][attribute]
- (object_name, attribute) = key.split('.', 2)
-
- # remove condition item, because it has changed
- if @item[:changes][attribute]
- has_changed = true
- condition.delete(key)
- next
- end
- break
- end
-
- next if has_changed_condition_exists && !has_changed
-
- # check if selector is matching
- condition['ticket.id'] = {
- operator: 'is',
- value: ticket.id,
- }
-
- # check if min one article attribute is used
+ # check if one article attribute is used
+ one_has_changed_done = false
article_selector = false
trigger.condition.each do |key, _value|
(object_name, attribute) = key.split('.', 2)
@@ -94,8 +57,70 @@ class Transaction::Trigger
next if attribute == 'id'
article_selector = true
end
+ if article && article_selector
+ one_has_changed_done = true
+ end
+ if article && @item[:type] == 'update'
+ one_has_changed_done = true
+ end
+ # check ticket "has changed" options
+ has_changed_done = true
+ condition.each do |key, value|
+ next if !value
+ next if !value['operator']
+ next if !value['operator']['has changed']
+
+ # remove condition item, because it has changed
+ (object_name, attribute) = key.split('.', 2)
+ next if object_name != 'ticket'
+ next if !@item[:changes]
+ next if !@item[:changes].key?(attribute)
+ condition.delete(key)
+ one_has_changed_done = true
+ end
+
+ # check if we have not matching "has changed" attributes
+ condition.each do |_key, value|
+ next if !value
+ next if !value['operator']
+ next if !value['operator']['has changed']
+ has_changed_done = false
+ break
+ end
+
+ # check ticket action
+ if condition['ticket.action']
+ next if condition['ticket.action']['operator'] == 'is' && condition['ticket.action']['value'] != @item[:type]
+ next if condition['ticket.action']['operator'] != 'is' && condition['ticket.action']['value'] == @item[:type]
+ condition.delete('ticket.action')
+ end
+ next if !has_changed_done
+
+ # check in min one attribute of condition has changed on update
+ one_has_changed_condition = false
+ if @item[:type] == 'update'
+
+ # verify if ticket condition exists
+ condition.each do |key, _value|
+ (object_name, attribute) = key.split('.', 2)
+ next if object_name != 'ticket'
+ one_has_changed_condition = true
+ next if !@item[:changes] || !@item[:changes].key?(attribute)
+ one_has_changed_done = true
+ break
+ end
+ next if one_has_changed_condition && !one_has_changed_done
+ end
+
+ # check if ticket selector is matching
+ condition['ticket.id'] = {
+ operator: 'is',
+ value: ticket.id,
+ }
next if article_selector && !article
+
+ # check if article selector is matching
if article_selector
condition['article.id'] = {
operator: 'is',
@@ -103,28 +128,15 @@ class Transaction::Trigger
}
end
+ # verify is condition is matching
ticket_count, tickets = Ticket.selectors(condition, 1)
next if ticket_count.zero?
next if tickets.first.id != ticket.id
-
- # check in min one attribute has changed
- if @item[:type] == 'update' && !article_selector
- match = false
- if has_changed_condition_exists && has_changed
- match = true
- else
- trigger.condition.each do |key, _value|
- (object_name, attribute) = key.split('.', 2)
- next if object_name != 'ticket'
- next if !@item[:changes][attribute]
- match = true
- break
- end
- end
- next if !match
+ user_id = ticket.updated_by_id
+ if article
+ user_id = article.updated_by_id
end
-
- ticket.perform_changes(trigger.perform, 'trigger', @item)
+ ticket.perform_changes(trigger.perform, 'trigger', @item, user_id)
}
end
UserInfo.current_user_id = original_user_id
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 267151689..4b151afbe 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -44,6 +44,7 @@ class ActiveSupport::TestCase
# remove background jobs
Delayed::Job.destroy_all
+ Trigger.destroy_all
ActivityStream.destroy_all
PostmasterFilter.destroy_all
Ticket.destroy_all
diff --git a/test/unit/ticket_trigger_test.rb b/test/unit/ticket_trigger_test.rb
index 91ac530d3..8953e0986 100644
--- a/test/unit/ticket_trigger_test.rb
+++ b/test/unit/ticket_trigger_test.rb
@@ -155,8 +155,6 @@ class TicketTriggerTest < ActiveSupport::TestCase
title: "some title\n äöüß",
group: Group.lookup(name: 'Users'),
customer: User.lookup(email: 'nicole.braun@zammad.org'),
- state: Ticket::State.lookup(name: 'new'),
- priority: Ticket::Priority.lookup(name: '2 normal'),
updated_by_id: 1,
created_by_id: 1,
)
@@ -175,6 +173,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
created_by_id: 1,
)
+ ticket1.reload
assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
assert_equal('new', ticket1.state.name, 'ticket1.state verify')
@@ -184,7 +183,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
Observer::Transaction.commit
- ticket1 = Ticket.lookup(id: ticket1.id)
+ ticket1.reload
assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
assert_equal('new', ticket1.state.name, 'ticket1.state verify')
@@ -200,10 +199,10 @@ class TicketTriggerTest < ActiveSupport::TestCase
assert_equal('text/html', article1.content_type)
ticket1.priority = Ticket::Priority.lookup(name: '2 normal')
- ticket1.save
-
+ ticket1.save!
Observer::Transaction.commit
+ ticket1.reload
assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
assert_equal('new', ticket1.state.name, 'ticket1.state verify')
@@ -212,10 +211,11 @@ class TicketTriggerTest < ActiveSupport::TestCase
assert_equal(%w(aa kk abc), Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
ticket1.state = Ticket::State.lookup(name: 'open')
- ticket1.save
+ ticket1.save!
Observer::Transaction.commit
+ ticket1.reload
assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
assert_equal('open', ticket1.state.name, 'ticket1.state verify')
@@ -224,11 +224,11 @@ class TicketTriggerTest < ActiveSupport::TestCase
assert_equal(%w(aa kk abc), Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
ticket1.state = Ticket::State.lookup(name: 'new')
- ticket1.save
+ ticket1.save!
Observer::Transaction.commit
- ticket1 = Ticket.lookup(id: ticket1.id)
+ ticket1.reload
assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
assert_equal('new', ticket1.state.name, 'ticket1.state verify')
@@ -256,7 +256,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
Observer::Transaction.commit
- ticket2 = Ticket.lookup(id: ticket2.id)
+ ticket2.reload
assert_equal('some title äöüß', ticket2.title, 'ticket2.title verify')
assert_equal('Users', ticket2.group.name, 'ticket2.group verify')
assert_equal('open', ticket2.state.name, 'ticket2.state verify')
@@ -268,8 +268,6 @@ class TicketTriggerTest < ActiveSupport::TestCase
title: "some title\n äöüß3",
group: Group.lookup(name: 'Users'),
customer: User.lookup(email: 'nicole.braun@zammad.org'),
- state: Ticket::State.lookup(name: 'new'),
- priority: Ticket::Priority.lookup(name: '2 normal'),
updated_by_id: 1,
created_by_id: 1,
)
@@ -299,7 +297,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
Observer::Transaction.commit
- ticket3 = Ticket.lookup(id: ticket3.id)
+ ticket3.reload
assert_equal('some title äöüß3', ticket3.title, 'ticket3.title verify')
assert_equal('Users', ticket3.group.name, 'ticket3.group verify')
assert_equal('new', ticket3.state.name, 'ticket3.state verify')
@@ -337,13 +335,38 @@ class TicketTriggerTest < ActiveSupport::TestCase
Observer::Transaction.commit
- ticket3 = Ticket.lookup(id: ticket3.id)
+ ticket3.reload
assert_equal('some title äöüß3', ticket3.title, 'ticket3.title verify')
assert_equal('Users', ticket3.group.name, 'ticket3.group verify')
assert_equal('new', ticket3.state.name, 'ticket3.state verify')
assert_equal('3 high', ticket3.priority.name, 'ticket3.priority verify')
assert_equal(4, ticket3.articles.count, 'ticket3.articles verify')
- assert_equal(%w(aa kk abc article_create_trigger), Tag.tag_list(object: 'Ticket', o_id: ticket3.id))
+ assert_equal(%w(aa abc article_create_trigger), Tag.tag_list(object: 'Ticket', o_id: ticket3.id))
+
+ Ticket::Article.create(
+ ticket_id: ticket3.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'some subject NOT 1234',
+ message_id: 'some@id',
+ content_type: 'text/html',
+ body: 'some message note
new line',
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+
+ Observer::Transaction.commit
+
+ ticket3.reload
+ assert_equal('some title äöüß3', ticket3.title, 'ticket3.title verify')
+ assert_equal('Users', ticket3.group.name, 'ticket3.group verify')
+ assert_equal('new', ticket3.state.name, 'ticket3.state verify')
+ assert_equal('3 high', ticket3.priority.name, 'ticket3.priority verify')
+ assert_equal(5, ticket3.articles.count, 'ticket3.articles verify')
+ assert_equal(%w(aa abc article_create_trigger), Tag.tag_list(object: 'Ticket', o_id: ticket3.id))
Ticket::Article.create(
ticket_id: ticket3.id,
@@ -362,15 +385,13 @@ class TicketTriggerTest < ActiveSupport::TestCase
Observer::Transaction.commit
- ticket3 = Ticket.lookup(id: ticket3.id)
+ ticket3.reload
assert_equal('some title äöüß3', ticket3.title, 'ticket3.title verify')
assert_equal('Users', ticket3.group.name, 'ticket3.group verify')
assert_equal('new', ticket3.state.name, 'ticket3.state verify')
assert_equal('3 high', ticket3.priority.name, 'ticket3.priority verify')
- assert_equal(5, ticket3.articles.count, 'ticket3.articles verify')
- assert_equal(%w(aa kk abc article_create_trigger), Tag.tag_list(object: 'Ticket', o_id: ticket3.id))
-
- Trigger.destroy_all
+ assert_equal(7, ticket3.articles.count, 'ticket3.articles verify')
+ assert_equal(%w(aa abc article_create_trigger), Tag.tag_list(object: 'Ticket', o_id: ticket3.id))
end
test '2 actions - create' do
@@ -406,8 +427,6 @@ class TicketTriggerTest < ActiveSupport::TestCase
title: "some title\n äöüß",
group: Group.lookup(name: 'Users'),
customer: User.lookup(email: 'nicole.braun@zammad.org'),
- state: Ticket::State.lookup(name: 'new'),
- priority: Ticket::Priority.lookup(name: '2 normal'),
updated_by_id: 1,
created_by_id: 1,
)
@@ -421,7 +440,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
Observer::Transaction.commit
- ticket1 = Ticket.lookup(id: ticket1.id)
+ ticket1.reload
assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
assert_equal('new', ticket1.state.name, 'ticket1.state verify')
@@ -435,7 +454,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
assert_equal('text/html', article1.content_type)
ticket1.priority = Ticket::Priority.lookup(name: '2 normal')
- ticket1.save
+ ticket1.save!
Observer::Transaction.commit
@@ -446,7 +465,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
ticket1.state = Ticket::State.lookup(name: 'open')
- ticket1.save
+ ticket1.save!
Observer::Transaction.commit
@@ -457,18 +476,16 @@ class TicketTriggerTest < ActiveSupport::TestCase
assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
ticket1.state = Ticket::State.lookup(name: 'new')
- ticket1.save
+ ticket1.save!
Observer::Transaction.commit
- ticket1 = Ticket.lookup(id: ticket1.id)
+ ticket1.reload
assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
assert_equal('new', ticket1.state.name, 'ticket1.state verify')
assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
-
- Trigger.destroy_all
end
test '2 actions - update' do
@@ -504,8 +521,6 @@ class TicketTriggerTest < ActiveSupport::TestCase
title: "some title\n äöüß",
group: Group.lookup(name: 'Users'),
customer: User.lookup(email: 'nicole.braun@zammad.org'),
- state: Ticket::State.lookup(name: 'new'),
- priority: Ticket::Priority.lookup(name: '2 normal'),
updated_by_id: 1,
created_by_id: 1,
)
@@ -519,7 +534,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
Observer::Transaction.commit
- ticket1 = Ticket.lookup(id: ticket1.id)
+ ticket1.reload
assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
assert_equal('new', ticket1.state.name, 'ticket1.state verify')
@@ -527,7 +542,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
assert_equal(0, ticket1.articles.count, 'ticket1.articles verify')
ticket1.priority = Ticket::Priority.lookup(name: '2 normal')
- ticket1.save
+ ticket1.save!
Observer::Transaction.commit
@@ -538,7 +553,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
assert_equal(0, ticket1.articles.count, 'ticket1.articles verify')
ticket1.state = Ticket::State.lookup(name: 'open')
- ticket1.save
+ ticket1.save!
Observer::Transaction.commit
@@ -549,25 +564,23 @@ class TicketTriggerTest < ActiveSupport::TestCase
assert_equal(0, ticket1.articles.count, 'ticket1.articles verify')
ticket1.state = Ticket::State.lookup(name: 'new')
- ticket1.save
+ ticket1.save!
Observer::Transaction.commit
- ticket1 = Ticket.lookup(id: ticket1.id)
+ ticket1.reload
assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
assert_equal('new', ticket1.state.name, 'ticket1.state verify')
assert_equal('3 high', ticket1.priority.name, 'ticket1.priority verify')
assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
-
- Trigger.destroy_all
end
test '3 auto replys' do
roles = Role.where(name: 'Customer')
customer1 = User.create_or_update(
login: 'postmaster@example.com',
- firstname: 'Notification',
+ firstname: 'Trigger',
lastname: 'Customer1',
email: 'postmaster@example.com',
password: 'customerpw',
@@ -579,7 +592,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
)
customer2 = User.create_or_update(
login: 'ticket-auto-reply-customer2@example.com',
- firstname: 'Notification',
+ firstname: 'Trigger',
lastname: 'Customer2',
email: 'ticket-auto-reply-customer2@example.com',
password: 'customerpw',
@@ -711,7 +724,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
assert_equal('text/html', article_p.content_type)
ticket_p.priority = Ticket::Priority.lookup(name: '2 normal')
- ticket_p.save
+ ticket_p.save!
Observer::Transaction.commit
assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
assert_equal('Users', ticket_p.group.name, 'ticket_p.group verify')
@@ -789,7 +802,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
assert_equal('text/html', article_p.content_type)
ticket_p.state = Ticket::State.lookup(name: 'open')
- ticket_p.save
+ ticket_p.save!
article_p = Ticket::Article.create(
ticket_id: ticket_p.id,
from: 'some_sender@example.com',
@@ -839,15 +852,13 @@ class TicketTriggerTest < ActiveSupport::TestCase
assert_equal('new', ticket_p.state.name)
assert_equal(1, ticket_p.articles.count)
-
- Trigger.destroy_all
end
test '4 has changed' do
roles = Role.where(name: 'Customer')
customer1 = User.create_or_update(
login: 'postmaster@example.com',
- firstname: 'Notification',
+ firstname: 'Trigger',
lastname: 'Customer1',
email: 'postmaster@example.com',
password: 'customerpw',
@@ -859,7 +870,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
)
customer2 = User.create_or_update(
login: 'ticket-has-changed-customer2@example.com',
- firstname: 'Notification',
+ firstname: 'Trigger',
lastname: 'Customer2',
email: 'ticket-has-changed-customer2@example.com',
password: 'customerpw',
@@ -925,7 +936,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
Observer::Transaction.commit
ticket_p.owner = agent1
- ticket_p.save
+ ticket_p.save!
Observer::Transaction.commit
assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
assert_equal('Users', ticket_p.group.name, 'ticket_p.group verify')
@@ -991,21 +1002,22 @@ class TicketTriggerTest < ActiveSupport::TestCase
assert_equal(1, ticket_p.articles.count)
ticket_p.priority = Ticket::Priority.lookup(name: '1 low')
- ticket_p.save
+ ticket_p.save!
Observer::Transaction.commit
assert_equal(1, ticket_p.articles.count)
ticket_p.priority = Ticket::Priority.lookup(name: '3 high')
- ticket_p.save
+ ticket_p.save!
Observer::Transaction.commit
assert_equal(1, ticket_p.articles.count)
ticket_p.owner = agent1
- ticket_p.save
+ ticket_p.save!
Observer::Transaction.commit
+
assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
assert_equal('Users', ticket_p.group.name, 'ticket_p.group verify')
assert_equal('new', ticket_p.state.name, 'ticket_p.state verify')
@@ -1075,19 +1087,19 @@ class TicketTriggerTest < ActiveSupport::TestCase
assert_equal(1, ticket_p.articles.count)
ticket_p.priority = Ticket::Priority.lookup(name: '1 low')
- ticket_p.save
+ ticket_p.save!
Observer::Transaction.commit
assert_equal(1, ticket_p.articles.count)
ticket_p.priority = Ticket::Priority.lookup(name: '3 high')
- ticket_p.save
+ ticket_p.save!
Observer::Transaction.commit
assert_equal(1, ticket_p.articles.count)
ticket_p.owner = agent1
- ticket_p.save
+ ticket_p.save!
Observer::Transaction.commit
assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
@@ -1151,12 +1163,1287 @@ class TicketTriggerTest < ActiveSupport::TestCase
assert_equal(1, ticket_p.articles.count)
ticket_p.owner = agent1
- ticket_p.save
+ ticket_p.save!
Observer::Transaction.commit
assert_equal(1, ticket_p.articles.count)
+ end
+
+ test '5 notify owner' do
+ trigger1 = Trigger.create_or_update(
+ name: 'aaa notify mail',
+ condition: {
+ 'ticket.state_id' => {
+ 'operator' => 'is',
+ 'value' => Ticket::State.all.pluck(:id),
+ },
+ 'ticket.action' => {
+ 'operator' => 'is',
+ 'value' => 'update',
+ },
+ },
+ perform: {
+ 'notification.email' => {
+ 'body' => 'some lala',
+ 'recipient' => 'ticket_owner',
+ 'subject' => 'CC NOTE (#{ticket.title})!',
+ },
+ },
+ disable_notification: true,
+ active: true,
+ created_by_id: 1,
+ updated_by_id: 1,
+ )
+ roles = Role.where(name: 'Agent')
+ agent = User.create_or_update(
+ login: 'agent@example.com',
+ firstname: 'Trigger',
+ lastname: 'Agent1',
+ email: 'agent@example.com',
+ password: 'agentpw',
+ active: true,
+ roles: roles,
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+
+ ticket1 = Ticket.create(
+ title: 'test 123',
+ owner: agent,
+ group: Group.lookup(name: 'Users'),
+ customer: User.lookup(email: 'nicole.braun@zammad.org'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'some subject',
+ message_id: 'some@id',
+ body: "some message note\nnew line",
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ Observer::Transaction.commit
+
+ assert_equal(1, ticket1.articles.count)
+
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'update',
+ message_id: 'some@id',
+ content_type: 'text/html',
+ body: 'update',
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Observer::Transaction.commit
+
+ assert_equal(3, ticket1.articles.count)
+
+ trigger1 = Trigger.create_or_update(
+ name: 'aaa notify mail 2',
+ condition: {
+ 'ticket.state_id' => {
+ 'operator' => 'is',
+ 'value' => Ticket::State.all.pluck(:id),
+ },
+ 'ticket.action' => {
+ 'operator' => 'is',
+ 'value' => 'update',
+ },
+ },
+ perform: {
+ 'notification.email' => {
+ 'body' => 'some lala',
+ 'recipient' => 'ticket_owner',
+ 'subject' => 'CC NOTE (#{ticket.title})!',
+ },
+ },
+ disable_notification: true,
+ active: true,
+ created_by_id: 1,
+ updated_by_id: 1,
+ )
+
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'update',
+ message_id: 'some@id',
+ content_type: 'text/html',
+ body: 'update',
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Observer::Transaction.commit
+
+ assert_equal(6, ticket1.articles.count)
+ end
+
+ test '6 owner auto assignment' do
+ trigger1 = Trigger.create_or_update(
+ name: 'aaa auto assignment',
+ condition: {
+ 'ticket.owner_id' => {
+ 'operator' => 'is',
+ 'pre_condition' => 'not_set',
+ 'value' => '',
+ 'value_completion' => '',
+ },
+ 'ticket.action' => {
+ 'operator' => 'is',
+ 'value' => 'update',
+ },
+ },
+ perform: {
+ 'ticket.owner_id' => {
+ 'pre_condition' => 'current_user.id',
+ 'value' => '',
+ 'value_completion' => '',
+ },
+ },
+ disable_notification: true,
+ active: true,
+ created_by_id: 1,
+ updated_by_id: 1,
+ )
+ roles = Role.where(name: 'Agent')
+ agent = User.create_or_update(
+ login: 'agent@example.com',
+ firstname: 'Trigger',
+ lastname: 'Agent1',
+ email: 'agent@example.com',
+ password: 'agentpw',
+ active: true,
+ roles: roles,
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+
+ ticket1 = Ticket.create(
+ title: 'test 123',
+ #owner: agent,
+ group: Group.lookup(name: 'Users'),
+ customer: User.lookup(email: 'nicole.braun@zammad.org'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'some subject',
+ message_id: 'some@id',
+ body: "some message note\nnew line",
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Observer::Transaction.commit
+
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(1, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ UserInfo.current_user_id = agent.id
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'update',
+ message_id: 'some@id',
+ content_type: 'text/html',
+ body: 'update',
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ )
+ Observer::Transaction.commit
+ UserInfo.current_user_id = nil
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ UserInfo.current_user_id = agent.id
+ ticket1.owner_id = 1
+ ticket1.save!
+ Observer::Transaction.commit
+ UserInfo.current_user_id = nil
+
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(1, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ end
+
+ test '7 owner auto assignment' do
+ trigger1 = Trigger.create_or_update(
+ name: 'aaa auto assignment',
+ condition: {
+ 'ticket.owner_id' => {
+ 'operator' => 'is',
+ 'pre_condition' => 'not_set',
+ 'value' => '',
+ 'value_completion' => '',
+ },
+ 'article.type_id' => {
+ 'operator' => 'is',
+ 'value' => Ticket::Article::Type.find_by(name: 'note'),
+ },
+ 'article.sender_id' => {
+ 'operator' => 'is',
+ 'value' => Ticket::Article::Sender.find_by(name: 'Agent'),
+ },
+ },
+ perform: {
+ 'ticket.owner_id' => {
+ 'pre_condition' => 'current_user.id',
+ 'value' => '',
+ 'value_completion' => '',
+ },
+ },
+ disable_notification: true,
+ active: true,
+ created_by_id: 1,
+ updated_by_id: 1,
+ )
+ roles = Role.where(name: 'Agent')
+ agent1 = User.create_or_update(
+ login: 'agent@example.com',
+ firstname: 'Trigger',
+ lastname: 'Agent1',
+ email: 'agent@example.com',
+ password: 'agentpw',
+ active: true,
+ roles: roles,
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ agent2 = User.create_or_update(
+ login: 'agent@example.com',
+ firstname: 'Trigger',
+ lastname: 'Agent2',
+ email: 'agent@example.com',
+ password: 'agentpw',
+ active: true,
+ roles: roles,
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+
+ ticket1 = Ticket.create(
+ title: 'test 123',
+ #owner: agent,
+ group: Group.lookup(name: 'Users'),
+ customer: User.lookup(email: 'nicole.braun@zammad.org'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'some subject',
+ message_id: 'some@id',
+ body: "some message note\nnew line",
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Observer::Transaction.commit
+
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(1, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ UserInfo.current_user_id = agent1.id
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'update',
+ message_id: 'some@id',
+ content_type: 'text/html',
+ body: 'update',
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ )
+ Observer::Transaction.commit
+ UserInfo.current_user_id = nil
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent1.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ UserInfo.current_user_id = agent1.id
+ ticket1.owner_id = 1
+ ticket1.save!
+ Observer::Transaction.commit
+ UserInfo.current_user_id = nil
+
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(1, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ UserInfo.current_user_id = agent1.id
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'update',
+ message_id: 'some@id',
+ content_type: 'text/html',
+ body: 'update',
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Customer'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ )
+ Observer::Transaction.commit
+ UserInfo.current_user_id = nil
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(1, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(3, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ UserInfo.current_user_id = agent2.id
+ ticket1.owner_id = agent2.id
+ ticket1.save!
+ Observer::Transaction.commit
+ UserInfo.current_user_id = nil
+
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent2.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(3, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ UserInfo.current_user_id = agent1.id
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'update',
+ message_id: 'some@id',
+ content_type: 'text/html',
+ body: 'update',
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ )
+ Observer::Transaction.commit
+ UserInfo.current_user_id = nil
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent1.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(4, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+ end
+
+ test '8 owner auto assignment' do
+ trigger1 = Trigger.create_or_update(
+ name: 'aaa auto assignment',
+ condition: {
+ 'ticket.owner_id' => {
+ 'operator' => 'is',
+ 'pre_condition' => 'not_set',
+ 'value' => '',
+ 'value_completion' => '',
+ },
+ 'ticket.priority_id' => {
+ 'operator' => 'has changed',
+ 'pre_condition' => '',
+ 'value' => '2',
+ 'value_completion' => '',
+ },
+ 'ticket.action' => {
+ 'operator' => 'is',
+ 'value' => 'update',
+ },
+ },
+ perform: {
+ 'ticket.owner_id' => {
+ 'pre_condition' => 'current_user.id',
+ 'value' => '',
+ 'value_completion' => '',
+ },
+ },
+ disable_notification: true,
+ active: true,
+ created_by_id: 1,
+ updated_by_id: 1,
+ )
+ roles = Role.where(name: 'Agent')
+ agent = User.create_or_update(
+ login: 'agent@example.com',
+ firstname: 'Trigger',
+ lastname: 'Agent1',
+ email: 'agent@example.com',
+ password: 'agentpw',
+ active: true,
+ roles: roles,
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+
+ ticket1 = Ticket.create(
+ title: 'test 123',
+ #owner: agent,
+ group: Group.lookup(name: 'Users'),
+ customer: User.lookup(email: 'nicole.braun@zammad.org'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'some subject',
+ message_id: 'some@id',
+ body: "some message note\nnew line",
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Observer::Transaction.commit
+
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(1, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ UserInfo.current_user_id = agent.id
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'update',
+ message_id: 'some@id',
+ content_type: 'text/html',
+ body: 'update',
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ )
+ Observer::Transaction.commit
+ UserInfo.current_user_id = nil
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(1, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ UserInfo.current_user_id = agent.id
+ ticket1.priority = Ticket::Priority.find_by(name: '1 low')
+ ticket1.save!
+ Observer::Transaction.commit
+ UserInfo.current_user_id = nil
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('1 low', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ UserInfo.current_user_id = agent.id
+ ticket1.owner_id = 1
+ ticket1.save!
+ Observer::Transaction.commit
+ UserInfo.current_user_id = nil
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(1, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('1 low', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ UserInfo.current_user_id = agent.id
+ ticket1.owner_id = agent.id
+ ticket1.save!
+ Observer::Transaction.commit
+ UserInfo.current_user_id = nil
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('1 low', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+ end
+
+ test '9 vip priority set' do
+ trigger1 = Trigger.create_or_update(
+ name: 'aaa vip priority',
+ condition: {
+ 'customer.vip' => {
+ 'operator' => 'is',
+ 'value' => true,
+ },
+ },
+ perform: {
+ 'ticket.priority_id' => {
+ 'value' => Ticket::Priority.find_by(name: '3 high').id,
+ },
+ },
+ disable_notification: true,
+ active: true,
+ created_by_id: 1,
+ updated_by_id: 1,
+ )
+ roles = Role.where(name: 'Agent')
+ agent = User.create_or_update(
+ login: 'agent@example.com',
+ firstname: 'Trigger',
+ lastname: 'Agent1',
+ email: 'agent@example.com',
+ password: 'agentpw',
+ active: true,
+ roles: roles,
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ roles = Role.where(name: 'Customer')
+ customer = User.create_or_update(
+ login: 'customer@example.com',
+ firstname: 'Trigger',
+ lastname: 'Customer1',
+ email: 'customer@example.com',
+ password: 'customerpw',
+ vip: true,
+ active: true,
+ roles: roles,
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+
+ ticket1 = Ticket.create(
+ title: 'test 123',
+ owner: agent,
+ customer: customer,
+ group: Group.lookup(name: 'Users'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'some subject',
+ message_id: 'some@id',
+ body: "some message note\nnew line",
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ Observer::Transaction.commit
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('3 high', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ customer.vip = false
+ customer.save!
+
+ ticket2 = Ticket.create(
+ title: 'test 123',
+ owner: agent,
+ customer: customer,
+ group: Group.lookup(name: 'Users'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Ticket::Article.create(
+ ticket_id: ticket2.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'some subject',
+ message_id: 'some@id',
+ body: "some message note\nnew line",
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+
+ assert_equal('test 123', ticket2.title, 'ticket2.title verify')
+ assert_equal('Users', ticket2.group.name, 'ticket2.group verify')
+ assert_equal(agent.id, ticket2.owner_id, 'ticket2.owner_id verify')
+ assert_equal(customer.id, ticket2.customer_id, 'ticket2.customer_id verify')
+ assert_equal('new', ticket2.state.name, 'ticket2.state verify')
+ assert_equal('2 normal', ticket2.priority.name, 'ticket2.priority verify')
+ assert_equal(1, ticket2.articles.count, 'ticket2.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket2.id))
+
+ Observer::Transaction.commit
+
+ ticket2.reload
+ assert_equal('test 123', ticket2.title, 'ticket2.title verify')
+ assert_equal('Users', ticket2.group.name, 'ticket2.group verify')
+ assert_equal(agent.id, ticket2.owner_id, 'ticket2.owner_id verify')
+ assert_equal(customer.id, ticket2.customer_id, 'ticket2.customer_id verify')
+ assert_equal('new', ticket2.state.name, 'ticket2.state verify')
+ assert_equal('2 normal', ticket2.priority.name, 'ticket2.priority verify')
+ assert_equal(1, ticket2.articles.count, 'ticket2.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket2.id))
+
+ end
+
+ test '10 owner auto assignment notify to customer' do
+ trigger1 = Trigger.create_or_update(
+ name: 'aaa auto assignment',
+ condition: {
+ 'ticket.owner_id' => {
+ 'operator' => 'has changed',
+ 'pre_condition' => '',
+ 'value' => '2',
+ 'value_completion' => '',
+ },
+ },
+ perform: {
+ 'notification.email' => {
+ 'body' => 'some lala',
+ 'recipient' => 'ticket_customer',
+ 'subject' => 'NEW OWNER (#{ticket.title})!',
+ },
+ },
+ disable_notification: true,
+ active: true,
+ created_by_id: 1,
+ updated_by_id: 1,
+ )
+ roles = Role.where(name: 'Agent')
+ agent1 = User.create_or_update(
+ login: 'agent1@example.com',
+ firstname: 'Trigger',
+ lastname: 'Agent1',
+ email: 'agent1@example.com',
+ password: 'agentpw',
+ active: true,
+ roles: roles,
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ agent2 = User.create_or_update(
+ login: 'agent2@example.com',
+ firstname: 'Trigger',
+ lastname: 'Agent2',
+ email: 'agent2@example.com',
+ password: 'agentpw',
+ active: true,
+ roles: roles,
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+
+ ticket1 = Ticket.create(
+ title: 'test 123',
+ group: Group.lookup(name: 'Users'),
+ customer: User.lookup(email: 'nicole.braun@zammad.org'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'some subject',
+ message_id: 'some@id',
+ body: "some message note\nnew line",
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Observer::Transaction.commit
+
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(1, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ UserInfo.current_user_id = agent1.id
+ ticket1.owner_id = agent1.id
+ ticket1.save!
+ Observer::Transaction.commit
+ UserInfo.current_user_id = nil
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent1.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ UserInfo.current_user_id = agent1.id
+ ticket1.owner_id = agent1.id
+ ticket1.save!
+ Observer::Transaction.commit
+ UserInfo.current_user_id = nil
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent1.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ UserInfo.current_user_id = agent1.id
+ ticket1.owner_id = agent2.id
+ ticket1.save!
+ Observer::Transaction.commit
+ UserInfo.current_user_id = nil
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent2.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(3, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ end
+
+ test '11 notify to customer on public note' do
+ trigger1 = Trigger.create_or_update(
+ name: 'aaa notify to customer on public note',
+ condition: {
+ 'article.internal' => {
+ 'operator' => 'is',
+ 'value' => 'false',
+ },
+ 'article.sender_id' => {
+ 'operator' => 'is',
+ 'value' => Ticket::Article::Sender.lookup(name: 'Agent').id,
+ },
+ 'article.type_id' => {
+ 'operator' => 'is',
+ 'value' => [
+ Ticket::Article::Type.lookup(name: 'note').id,
+ ],
+ },
+ },
+ perform: {
+ 'notification.email' => {
+ 'body' => 'some lala',
+ 'recipient' => 'ticket_customer',
+ 'subject' => 'UPDATE (#{ticket.title})!',
+ },
+ },
+ disable_notification: true,
+ active: true,
+ created_by_id: 1,
+ updated_by_id: 1,
+ )
+ roles = Role.where(name: 'Agent')
+ agent = User.create_or_update(
+ login: 'agent@example.com',
+ firstname: 'Trigger',
+ lastname: 'Agent1',
+ email: 'agent@example.com',
+ password: 'agentpw',
+ active: true,
+ roles: roles,
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ roles = Role.where(name: 'Customer')
+ customer = User.create_or_update(
+ login: 'customer@example.com',
+ firstname: 'Trigger',
+ lastname: 'Customer1',
+ email: 'customer@example.com',
+ password: 'customerpw',
+ vip: true,
+ active: true,
+ roles: roles,
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+
+ ticket1 = Ticket.create(
+ title: 'test 123',
+ owner: agent,
+ customer: customer,
+ group: Group.lookup(name: 'Users'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'some subject',
+ message_id: 'some@id',
+ body: "some message note\nnew line",
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+
+ Observer::Transaction.commit
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'some subject',
+ message_id: 'some@id',
+ body: "some message note\nnew line",
+ internal: true,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Observer::Transaction.commit
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(3, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'some subject',
+ message_id: 'some@id',
+ body: "some message note\nnew line",
+ internal: false,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Observer::Transaction.commit
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(5, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ ticket1.priority = Ticket::Priority.find_by(name: '3 high')
+ ticket1.save!
+ article = Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'some subject',
+ message_id: 'some@id',
+ body: "some message note\nnew line",
+ internal: true,
+ sender: Ticket::Article::Sender.find_by(name: 'Agent'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Observer::Transaction.commit
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('3 high', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(6, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ article.internal = false
+ article.save!
+ Observer::Transaction.commit
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('3 high', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(6, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+ Ticket::Article.create(
+ ticket_id: ticket1.id,
+ from: 'some_sender@example.com',
+ to: 'some_recipient@example.com',
+ subject: 'some subject',
+ message_id: 'some@id',
+ body: "some message note\nnew line",
+ internal: true,
+ sender: Ticket::Article::Sender.find_by(name: 'Customer'),
+ type: Ticket::Article::Type.find_by(name: 'note'),
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ Observer::Transaction.commit
+
+ ticket1.reload
+ assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+ assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+ assert_equal(agent.id, ticket1.owner_id, 'ticket1.owner_id verify')
+ assert_equal(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+ assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+ assert_equal('3 high', ticket1.priority.name, 'ticket1.priority verify')
+ assert_equal(7, ticket1.articles.count, 'ticket1.articles verify')
+ assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+ end
+
+ test '12 notify on owner change' do
+ trigger1 = Trigger.create_or_update(
+ name: 'aaa notify to customer on public note',
+ condition: {
+ 'ticket.owner_id' => {
+ 'operator' => 'has changed',
+ 'pre_condition' => 'current_user.id',
+ 'value' => '',
+ 'value_completion' => '',
+ }
+ },
+ perform: {
+ 'notification.email' => {
+ 'body' => 'some lala',
+ 'recipient' => 'ticket_customer',
+ 'subject' => 'UPDATE (#{ticket.title})!',
+ },
+ },
+ disable_notification: true,
+ active: true,
+ created_by_id: 1,
+ updated_by_id: 1,
+ )
+ Trigger.create_or_update(
+ name: 'auto reply (on new tickets)',
+ 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,
+ ],
+ },
+ 'article.sender_id' => {
+ 'operator' => 'is',
+ 'value' => Ticket::Article::Sender.lookup(name: 'Customer').id,
+ },
+ },
+ perform: {
+ 'notification.email' => {
+ 'body' => '