karma.rb 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class Transaction::Karma
  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. user = User.lookup(id: @item[:user_id])
  25. # ticket
  26. if @item[:object] == 'Ticket'
  27. ticket_karma(user)
  28. ticket_article_karma(user)
  29. end
  30. # add tagging (check last action time)
  31. if @item[:object] == 'Tag'
  32. tagging(user)
  33. end
  34. true
  35. end
  36. def ticket_karma(user)
  37. ticket = Ticket.lookup(id: @item[:object_id])
  38. return if !ticket
  39. if @item[:type] == 'create'
  40. Karma::ActivityLog.add('ticket create', user, 'Ticket', ticket.id)
  41. return
  42. end
  43. if @item[:type] == 'reminder_reached'
  44. return if ticket.owner_id == 1
  45. return if ticket.pending_time > Time.zone.now - 2.days
  46. Karma::ActivityLog.add('ticket reminder overdue (+2 days)', ticket.owner, 'Ticket', ticket.id)
  47. return
  48. end
  49. if @item[:type] == 'escalation'
  50. return if ticket.owner_id == 1
  51. Karma::ActivityLog.add('ticket escalated', ticket.owner, 'Ticket', ticket.id)
  52. return
  53. end
  54. return if @item[:type] != 'update'
  55. return if !@item[:changes]
  56. return if !@item[:changes]['state_id']
  57. state_before = Ticket::State.lookup(id: @item[:changes]['state_id'][0])
  58. state_now = Ticket::State.lookup(id: @item[:changes]['state_id'][1])
  59. # close
  60. if state_before.state_type.name != 'closed' && state_now.state_type.name == 'closed'
  61. # did user send a response to customer before?
  62. current_time = @item[:created_at]
  63. ticket.articles.reverse.each { |local_article|
  64. next if local_article.created_at > current_time
  65. next if local_article.created_by_id != @item[:user_id]
  66. next if local_article.internal
  67. local_type = Ticket::Article::Type.lookup(id: local_article.type_id)
  68. return false if !local_type
  69. next if !local_type.communication
  70. local_sender = Ticket::Article::Sender.lookup(id: local_article.sender_id)
  71. return false if !local_sender
  72. Karma::ActivityLog.add('ticket close', user, 'Ticket', ticket.id)
  73. break
  74. }
  75. end
  76. # pending state
  77. if (!state_before.next_state_id && state_before.state_type.name != 'pending reminder') && (state_now.next_state_id || state_now.state_type.name == 'pending reminder')
  78. Karma::ActivityLog.add('ticket pending state', user, 'Ticket', ticket.id)
  79. end
  80. end
  81. def ticket_article_karma(user)
  82. return if !@item[:article_id]
  83. article = Ticket::Article.lookup(id: @item[:article_id])
  84. return if !article
  85. # get sender
  86. sender = Ticket::Article::Sender.lookup(id: article.sender_id)
  87. return if !sender
  88. return if sender.name != 'Agent'
  89. # get type
  90. type = Ticket::Article::Type.lookup(id: article.type_id)
  91. return if !type
  92. return if !type.communication
  93. ### answer sent (check last action time / within what time?)
  94. articles = Ticket::Article.where(ticket_id: article.ticket_id).order(created_at: :asc, id: :asc)
  95. if articles.count > 1
  96. last_sender_customer = nil
  97. last_customer_contact = nil
  98. articles.each { |local_article|
  99. next if local_article.id == article.id
  100. next if local_article.internal
  101. local_type = Ticket::Article::Type.lookup(id: local_article.type_id)
  102. return false if !local_type
  103. next if !local_type.communication
  104. local_sender = Ticket::Article::Sender.lookup(id: local_article.sender_id)
  105. return false if !local_sender
  106. next if local_sender.name == 'System'
  107. last_sender_customer = if local_sender.name == 'Customer'
  108. true
  109. else
  110. false
  111. end
  112. next if local_sender.name != 'Customer'
  113. last_customer_contact = local_article.created_at
  114. }
  115. if last_sender_customer && last_customer_contact
  116. diff = article.created_at - last_customer_contact
  117. if diff >= 0
  118. if diff < 1.hour
  119. Karma::ActivityLog.add('ticket answer 1h', user, 'Ticket', @item[:object_id])
  120. elsif diff < 2.hours
  121. Karma::ActivityLog.add('ticket answer 2h', user, 'Ticket', @item[:object_id])
  122. elsif diff < 12.hours
  123. Karma::ActivityLog.add('ticket answer 12h', user, 'Ticket', @item[:object_id])
  124. elsif diff < 24.hours
  125. Karma::ActivityLog.add('ticket answer 24h', user, 'Ticket', @item[:object_id])
  126. end
  127. end
  128. end
  129. end
  130. ### text module
  131. if article.preferences[:text_module_ids] && !article.preferences[:text_module_ids].empty?
  132. Karma::ActivityLog.add('text module', user, 'Ticket', @item[:object_id])
  133. end
  134. end
  135. def tagging(user)
  136. return if @item[:type] != 'create'
  137. tag = Tag.lookup(id: @item[:object_id])
  138. return if !tag
  139. Karma::ActivityLog.add('tagging', user, tag.tag_object.name, tag.o_id)
  140. end
  141. end