trigger.rb 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class Transaction::Trigger
  3. =begin
  4. {
  5. object: 'Ticket',
  6. type: 'update',
  7. object_id: 123,
  8. interface_handle: 'application_server', # application_server|websocket|scheduler
  9. changes: {
  10. 'attribute1' => [before, now],
  11. 'attribute2' => [before, now],
  12. },
  13. created_at: Time.zone.now,
  14. user_id: 123,
  15. },
  16. =end
  17. def initialize(item, params = {})
  18. @item = item
  19. @params = params
  20. end
  21. def perform
  22. # return if we run import mode
  23. return if Setting.get('import_mode')
  24. return if @item[:object] != 'Ticket'
  25. triggers = Trigger.where(active: true).order('LOWER(name)')
  26. return if triggers.empty?
  27. ticket = Ticket.lookup(id: @item[:object_id])
  28. return if !ticket
  29. if @item[:article_id]
  30. article = Ticket::Article.lookup(id: @item[:article_id])
  31. end
  32. original_user_id = UserInfo.current_user_id
  33. Transaction.execute(reset_user_id: true, disable: ['Transaction::Trigger']) do
  34. triggers.each { |trigger|
  35. condition = trigger.condition
  36. # check action
  37. if condition['ticket.action']
  38. next if condition['ticket.action']['operator'] == 'is' && condition['ticket.action']['value'] != @item[:type]
  39. next if condition['ticket.action']['operator'] != 'is' && condition['ticket.action']['value'] == @item[:type]
  40. condition.delete('ticket.action')
  41. end
  42. # check action
  43. if condition['article.action']
  44. next if !article
  45. condition.delete('article.action')
  46. end
  47. # check "has changed" options
  48. has_changed_condition_exists = false
  49. has_changed = false
  50. condition.each do |key, value|
  51. next if !value
  52. next if !value['operator']
  53. next if !value['operator']['has changed']
  54. has_changed_condition_exists = true
  55. # next if has changed? && !@item[:changes][attribute]
  56. (object_name, attribute) = key.split('.', 2)
  57. # remove condition item, because it has changed
  58. if @item[:changes][attribute]
  59. has_changed = true
  60. condition.delete(key)
  61. next
  62. end
  63. break
  64. end
  65. next if has_changed_condition_exists && !has_changed
  66. # check if selector is matching
  67. condition['ticket.id'] = {
  68. operator: 'is',
  69. value: ticket.id,
  70. }
  71. # check if min one article attribute is used
  72. article_selector = false
  73. trigger.condition.each do |key, _value|
  74. (object_name, attribute) = key.split('.', 2)
  75. next if object_name != 'article'
  76. next if attribute == 'id'
  77. article_selector = true
  78. end
  79. next if article_selector && !article
  80. if article_selector
  81. condition['article.id'] = {
  82. operator: 'is',
  83. value: article.id,
  84. }
  85. end
  86. ticket_count, tickets = Ticket.selectors(condition, 1)
  87. next if ticket_count.zero?
  88. next if tickets.first.id != ticket.id
  89. # check in min one attribute has changed
  90. if @item[:type] == 'update' && !article_selector
  91. match = false
  92. if has_changed_condition_exists && has_changed
  93. match = true
  94. else
  95. trigger.condition.each do |key, _value|
  96. (object_name, attribute) = key.split('.', 2)
  97. next if object_name != 'ticket'
  98. next if !@item[:changes][attribute]
  99. match = true
  100. break
  101. end
  102. end
  103. next if !match
  104. end
  105. ticket.perform_changes(trigger.perform, 'trigger', @item)
  106. }
  107. end
  108. UserInfo.current_user_id = original_user_id
  109. end
  110. end