trabajo-afectivo/app/models/transaction/karma.rb

180 lines
5.1 KiB
Ruby
Raw Normal View History

2022-01-01 13:38:12 +00:00
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
2016-07-10 22:47:21 +00:00
class Transaction::Karma
=begin
{
object: 'Ticket',
type: 'update',
object_id: 123,
interface_handle: 'application_server', # application_server|websocket|scheduler
2016-07-10 22:47:21 +00:00
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 > 2.days.ago
2016-07-10 22:47:21 +00:00
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
2016-07-10 22:47:21 +00:00
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']
2016-07-10 22:47:21 +00:00
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|
2016-07-10 22:47:21 +00:00
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
2016-07-10 22:47:21 +00:00
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
2017-11-23 08:09:44 +00:00
true
2016-07-10 22:47:21 +00:00
end
def ticket_article_karma(user)
return if !@item[:article_id]
2016-07-10 22:47:21 +00:00
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)
2016-07-10 22:47:21 +00:00
if articles.count > 1
last_sender_customer = nil
last_customer_contact = nil
articles.each do |local_article|
2016-07-10 22:47:21 +00:00
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
2016-07-12 09:00:32 +00:00
next if local_sender.name == 'System'
2016-07-10 22:47:21 +00:00
2017-11-23 08:09:44 +00:00
last_sender_customer = local_sender.name == 'Customer'
2016-07-10 22:47:21 +00:00
next if local_sender.name != 'Customer'
2016-07-10 22:47:21 +00:00
last_customer_contact = local_article.created_at
end
2016-07-10 22:47:21 +00:00
if last_sender_customer && last_customer_contact
diff = article.created_at - last_customer_contact
if diff >= 0
2016-07-10 22:47:21 +00:00
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
2017-11-23 08:09:44 +00:00
if article.preferences[:text_module_ids].present?
2016-07-10 22:47:21 +00:00
Karma::ActivityLog.add('text module', user, 'Ticket', @item[:object_id])
end
2017-11-23 08:09:44 +00:00
true
2016-07-10 22:47:21 +00:00
end
def tagging(user)
return if @item[:type] != 'create'
2016-07-10 22:47:21 +00:00
tag = Tag.lookup(id: @item[:object_id])
return if !tag
2016-07-10 22:47:21 +00:00
Karma::ActivityLog.add('tagging', user, tag.tag_object.name, tag.o_id)
end
end