123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
- class Transaction::Karma
- =begin
- {
- object: 'Ticket',
- type: 'update',
- object_id: 123,
- interface_handle: 'application_server', # application_server|websocket|scheduler
- changes: {
- 'attribute1' => [before, now],
- 'attribute2' => [before, now],
- },
- created_at: Time.zone.now,
- user_id: 123,
- },
- =end
- def initialize(item, params = {})
- @item = item
- @params = params
- end
- def perform
- # return if we run import mode
- return if Setting.get('import_mode')
- user = User.lookup(id: @item[:user_id])
- # ticket
- if @item[:object] == 'Ticket'
- ticket_karma(user)
- ticket_article_karma(user)
- end
- # add tagging (check last action time)
- if @item[:object] == 'Tag'
- tagging(user)
- end
- true
- end
- def ticket_karma(user)
- ticket = Ticket.lookup(id: @item[:object_id])
- return if !ticket
- if @item[:type] == 'create'
- Karma::ActivityLog.add('ticket create', user, 'Ticket', ticket.id)
- return
- end
- if @item[:type] == 'reminder_reached'
- return if ticket.owner_id == 1
- return if ticket.pending_time && ticket.pending_time > Time.zone.now - 2.days
- Karma::ActivityLog.add('ticket reminder overdue (+2 days)', ticket.owner, 'Ticket', ticket.id)
- return
- end
- if @item[:type] == 'escalation'
- return if ticket.owner_id == 1
- Karma::ActivityLog.add('ticket escalated', ticket.owner, 'Ticket', ticket.id)
- return
- end
- return if @item[:type] != 'update'
- return if !@item[:changes]
- return if !@item[:changes]['state_id']
- state_before = Ticket::State.lookup(id: @item[:changes]['state_id'][0])
- state_now = Ticket::State.lookup(id: @item[:changes]['state_id'][1])
- # close
- if state_before.state_type.name != 'closed' && state_now.state_type.name == 'closed'
- # did user send a response to customer before?
- current_time = @item[:created_at]
- ticket.articles.reverse.each do |local_article|
- next if local_article.created_at > current_time
- next if local_article.created_by_id != @item[:user_id]
- next if local_article.internal
- local_type = Ticket::Article::Type.lookup(id: local_article.type_id)
- return false if !local_type
- next if !local_type.communication
- local_sender = Ticket::Article::Sender.lookup(id: local_article.sender_id)
- return false if !local_sender
- Karma::ActivityLog.add('ticket close', user, 'Ticket', ticket.id)
- break
- end
- end
- # pending state
- 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')
- Karma::ActivityLog.add('ticket pending state', user, 'Ticket', ticket.id)
- end
- true
- end
- def ticket_article_karma(user)
- return if !@item[:article_id]
- article = Ticket::Article.lookup(id: @item[:article_id])
- return if !article
- # get sender
- sender = Ticket::Article::Sender.lookup(id: article.sender_id)
- return if !sender
- return if sender.name != 'Agent'
- # get type
- type = Ticket::Article::Type.lookup(id: article.type_id)
- return if !type
- return if !type.communication
- ### answer sent (check last action time / within what time?)
- articles = Ticket::Article.where(ticket_id: article.ticket_id).order(created_at: :asc, id: :asc)
- if articles.count > 1
- last_sender_customer = nil
- last_customer_contact = nil
- articles.each do |local_article|
- next if local_article.id == article.id
- next if local_article.internal
- local_type = Ticket::Article::Type.lookup(id: local_article.type_id)
- return false if !local_type
- next if !local_type.communication
- local_sender = Ticket::Article::Sender.lookup(id: local_article.sender_id)
- return false if !local_sender
- next if local_sender.name == 'System'
- last_sender_customer = local_sender.name == 'Customer'
- next if local_sender.name != 'Customer'
- last_customer_contact = local_article.created_at
- end
- if last_sender_customer && last_customer_contact
- diff = article.created_at - last_customer_contact
- if diff >= 0
- if diff < 1.hour
- Karma::ActivityLog.add('ticket answer 1h', user, 'Ticket', @item[:object_id])
- elsif diff < 2.hours
- Karma::ActivityLog.add('ticket answer 2h', user, 'Ticket', @item[:object_id])
- elsif diff < 12.hours
- Karma::ActivityLog.add('ticket answer 12h', user, 'Ticket', @item[:object_id])
- elsif diff < 24.hours
- Karma::ActivityLog.add('ticket answer 24h', user, 'Ticket', @item[:object_id])
- end
- end
- end
- end
- ### text module
- if article.preferences[:text_module_ids].present?
- Karma::ActivityLog.add('text module', user, 'Ticket', @item[:object_id])
- end
- true
- end
- def tagging(user)
- return if @item[:type] != 'create'
- tag = Tag.lookup(id: @item[:object_id])
- return if !tag
- Karma::ActivityLog.add('tagging', user, tag.tag_object.name, tag.o_id)
- end
- end
|