From 9965a7587aa69089efe2894b6dc67d1592226b4d Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Fri, 1 May 2015 17:24:17 +0200 Subject: [PATCH] Merged article changes on ticket into one observer to do ticket.save only once. --- app/models/observer/ticket/article_changes.rb | 103 ++++++++++++++++++ app/models/observer/ticket/article_counter.rb | 14 --- .../observer/ticket/article_sender_type.rb | 18 --- app/models/observer/ticket/first_response.rb | 34 ------ app/models/observer/ticket/last_contact.rb | 47 -------- config/application.rb | 5 +- 6 files changed, 104 insertions(+), 117 deletions(-) create mode 100644 app/models/observer/ticket/article_changes.rb delete mode 100644 app/models/observer/ticket/article_counter.rb delete mode 100644 app/models/observer/ticket/article_sender_type.rb delete mode 100644 app/models/observer/ticket/first_response.rb delete mode 100644 app/models/observer/ticket/last_contact.rb diff --git a/app/models/observer/ticket/article_changes.rb b/app/models/observer/ticket/article_changes.rb new file mode 100644 index 000000000..838a01e2d --- /dev/null +++ b/app/models/observer/ticket/article_changes.rb @@ -0,0 +1,103 @@ +# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/ + +class Observer::Ticket::ArticleChanges < ActiveRecord::Observer + observe 'ticket::_article' + + def after_create(record) + + article_count_update(record) + + first_response_update(record) + + sender_type_update(record) + + last_contact_update(record) + + # save ticket + record.ticket.save + end + + # get article count + def article_count_update(record) + record.ticket.article_count = record.ticket.articles.count + end + + # set frist response + def first_response_update(record) + # puts 'check first response' + + # return if we run import mode + return if Setting.get('import_mode') + + # if article in internal + return true if record.internal + + # if sender is not agent + sender = Ticket::Article::Sender.lookup( id: record.sender_id ) + type = Ticket::Article::Type.lookup( id: record.type_id ) + return true if sender.name != 'Agent' && type.name !~ /^phone/ + + # if article is a message to customer + return true if !type.communication + + # check if first_response is already set + return true if record.ticket.first_response + + # set first_response + record.ticket.first_response = record.created_at + + true + end + + # set sender type + def sender_type_update(record) + + # ignore if create channel is already set + count = Ticket::Article.where( ticket_id: record.ticket_id ).count + return if count > 1 + + record.ticket.create_article_type_id = record.type_id + record.ticket.create_article_sender_id = record.sender_id + end + + # set last contact + def last_contact_update(record) + # puts 'check last contact' + + # if article in internal + return true if record.internal + + # if article is a message to customer + return true if !Ticket::Article::Type.lookup( id: record.type_id ).communication + + # if sender is customer + sender = Ticket::Article::Sender.lookup( id: record.sender_id ) + if sender.name == 'Customer' + + # check if last communication is done by agent, else do not set last_contact_customer + if record.ticket.last_contact_customer == nil || + record.ticket.last_contact_agent == nil || + record.ticket.last_contact_agent.to_i > record.ticket.last_contact_customer.to_i + + # set last_contact customer + record.ticket.last_contact_customer = record.created_at + + # set last_contact + record.ticket.last_contact = record.created_at + + end + return true + end + + # if sender is not agent + return if sender.name != 'Agent' + + # set last_contact_agent + record.ticket.last_contact_agent = record.created_at + + # set last_contact + record.ticket.last_contact = record.created_at + + true + end +end diff --git a/app/models/observer/ticket/article_counter.rb b/app/models/observer/ticket/article_counter.rb deleted file mode 100644 index 839dae22b..000000000 --- a/app/models/observer/ticket/article_counter.rb +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/ - -class Observer::Ticket::ArticleCounter < ActiveRecord::Observer - observe 'ticket::_article' - - def after_create(record) - - # get article count - record.ticket.article_count = record.ticket.articles.count - - # save ticket - record.ticket.save - end -end diff --git a/app/models/observer/ticket/article_sender_type.rb b/app/models/observer/ticket/article_sender_type.rb deleted file mode 100644 index df37de539..000000000 --- a/app/models/observer/ticket/article_sender_type.rb +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/ - -class Observer::Ticket::ArticleSenderType < ActiveRecord::Observer - observe 'ticket::_article' - - def after_create(record) - - # get article count - count = Ticket::Article.where( ticket_id: record.ticket_id ).count - return if count > 1 - - record.ticket.create_article_type_id = record.type_id - record.ticket.create_article_sender_id = record.sender_id - - # save ticket - record.ticket.save - end -end diff --git a/app/models/observer/ticket/first_response.rb b/app/models/observer/ticket/first_response.rb deleted file mode 100644 index 3ab0fd15d..000000000 --- a/app/models/observer/ticket/first_response.rb +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/ - -class Observer::Ticket::FirstResponse < ActiveRecord::Observer - observe 'ticket::_article' - - def after_create(record) - # puts 'check first response' - - # return if we run import mode - return if Setting.get('import_mode') - - # if article in internal - return true if record.internal - - # if sender is not agent - sender = Ticket::Article::Sender.lookup( id: record.sender_id ) - type = Ticket::Article::Type.lookup( id: record.type_id ) - if sender.name != 'Agent' && type.name !~ /^phone/ - return true - end - - # if article is a message to customer - return true if !type.communication - - # check if first_response is already set - return true if record.ticket.first_response - - # set first_response - record.ticket.first_response = record.created_at - - # save ticket - record.ticket.save - end -end diff --git a/app/models/observer/ticket/last_contact.rb b/app/models/observer/ticket/last_contact.rb deleted file mode 100644 index f7418b05e..000000000 --- a/app/models/observer/ticket/last_contact.rb +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/ - -class Observer::Ticket::LastContact < ActiveRecord::Observer - observe 'ticket::_article' - - def after_create(record) - # puts 'check last contact' - - # if article in internal - return true if record.internal - - # if article is a message to customer - return true if !Ticket::Article::Type.lookup( id: record.type_id ).communication - - # if sender is not customer - sender = Ticket::Article::Sender.lookup( id: record.sender_id ) - if sender.name == 'Customer' - - # check if last communication is done by agent, else do not set last_contact_customer - if record.ticket.last_contact_customer == nil || - record.ticket.last_contact_agent == nil || - record.ticket.last_contact_agent.to_i > record.ticket.last_contact_customer.to_i - - # set last_contact customer - record.ticket.last_contact_customer = record.created_at - - # set last_contact - record.ticket.last_contact = record.created_at - - # save ticket - record.ticket.save - end - end - - # if sender is not agent - return if sender.name != 'Agent' - - # set last_contact_agent - record.ticket.last_contact_agent = record.created_at - - # set last_contact - record.ticket.last_contact = record.created_at - - # save ticket - record.ticket.save - end -end diff --git a/config/application.rb b/config/application.rb index 807c61867..a6086ae7e 100644 --- a/config/application.rb +++ b/config/application.rb @@ -26,12 +26,9 @@ module Zammad # config.active_record.observers = :cacher, :garbage_collector, :forum_observer config.active_record.observers = 'observer::_session', - 'observer::_ticket::_first_response', - 'observer::_ticket::_last_contact', 'observer::_ticket::_close_time', 'observer::_ticket::_user_ticket_counter', - 'observer::_ticket::_article_counter', - 'observer::_ticket::_article_sender_type', + 'observer::_ticket::_article_changes', 'observer::_ticket::_article::_fillup_from_general', 'observer::_ticket::_article::_fillup_from_email', 'observer::_ticket::_article::_communicate_email',