trigger.rb 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
  2. class Transaction::Trigger
  3. =begin
  4. {
  5. object: 'Ticket',
  6. type: 'update',
  7. object_id: 123,
  8. via_web: true,
  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)
  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. UserInfo.current_user_id = 1
  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 "has changed" options
  43. has_changed_condition_exists = false
  44. has_changed = false
  45. condition.each do |key, value|
  46. next if !value
  47. next if !value['operator']
  48. next if !value['operator']['has changed']
  49. has_changed_condition_exists = true
  50. # next if has changed? && !@item[:changes][attribute]
  51. (object_name, attribute) = key.split('.', 2)
  52. # remove condition item, because it has changed
  53. if @item[:changes][attribute]
  54. has_changed = true
  55. condition.delete(key)
  56. next
  57. end
  58. break
  59. end
  60. next if has_changed_condition_exists && !has_changed
  61. # check if selector is matching
  62. condition['ticket.id'] = {
  63. operator: 'is',
  64. value: ticket.id,
  65. }
  66. if article
  67. condition['article.id'] = {
  68. operator: 'is',
  69. value: article.id,
  70. }
  71. end
  72. ticket_count, tickets = Ticket.selectors(condition, 1)
  73. next if ticket_count.zero?
  74. next if tickets.first.id != ticket.id
  75. # check if min one article attribute is used
  76. article_selector = false
  77. trigger.condition.each do |key, _value|
  78. (object_name, attribute) = key.split('.', 2)
  79. next if object_name != 'article'
  80. next if attribute == 'id'
  81. article_selector = true
  82. end
  83. # check in min one attribute has changed
  84. if @item[:type] == 'update' && !article_selector
  85. match = false
  86. if has_changed_condition_exists && has_changed
  87. match = true
  88. else
  89. trigger.condition.each do |key, _value|
  90. (object_name, attribute) = key.split('.', 2)
  91. next if object_name != 'ticket'
  92. next if !@item[:changes][attribute]
  93. match = true
  94. break
  95. end
  96. end
  97. next if !match
  98. end
  99. ticket.perform_changes(trigger.perform, 'trigger', @item)
  100. }
  101. UserInfo.current_user_id = original_user_id
  102. end
  103. end