article_changes.rb 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class Observer::Ticket::ArticleChanges < ActiveRecord::Observer
  3. observe 'ticket::_article'
  4. def after_create(record)
  5. changed = false
  6. if article_count_update(record)
  7. changed = true
  8. end
  9. if first_response_at_update(record)
  10. changed = true
  11. end
  12. if sender_type_update(record)
  13. changed = true
  14. end
  15. if last_contact_update_at(record)
  16. changed = true
  17. end
  18. # save ticket
  19. if !changed
  20. record.ticket.touch
  21. return
  22. end
  23. record.ticket.save
  24. end
  25. def after_destroy(record)
  26. changed = false
  27. if article_count_update(record)
  28. changed = true
  29. end
  30. # save ticket
  31. if !changed
  32. record.ticket.touch
  33. return
  34. end
  35. record.ticket.save!
  36. end
  37. # get article count
  38. def article_count_update(record)
  39. current_count = record.ticket.article_count
  40. sender = Ticket::Article::Sender.lookup(name: 'System')
  41. count = Ticket::Article.where(ticket_id: record.ticket_id).where('sender_id NOT IN (?)', sender.id).count
  42. return false if current_count == count
  43. record.ticket.article_count = count
  44. true
  45. end
  46. # set frist response
  47. def first_response_at_update(record)
  48. # return if we run import mode
  49. return false if Setting.get('import_mode')
  50. # if article in internal
  51. return false if record.internal
  52. # if sender is not agent
  53. sender = Ticket::Article::Sender.lookup(id: record.sender_id)
  54. return false if sender.name != 'Agent'
  55. # if article is a message to customer
  56. type = Ticket::Article::Type.lookup(id: record.type_id)
  57. return false if !type.communication
  58. # check if first_response_at is already set
  59. return false if record.ticket.first_response_at
  60. # set first_response_at
  61. record.ticket.first_response_at = record.created_at
  62. true
  63. end
  64. # set sender type
  65. def sender_type_update(record)
  66. # ignore if create channel is already set
  67. count = Ticket::Article.where(ticket_id: record.ticket_id).count
  68. return false if count > 1
  69. record.ticket.create_article_type_id = record.type_id
  70. record.ticket.create_article_sender_id = record.sender_id
  71. true
  72. end
  73. # set last contact
  74. def last_contact_update_at(record)
  75. # if article in internal
  76. return false if record.internal
  77. # if sender is system
  78. sender = Ticket::Article::Sender.lookup(id: record.sender_id)
  79. return false if sender.name == 'System'
  80. # if article is a message to customer
  81. return false if !Ticket::Article::Type.lookup(id: record.type_id).communication
  82. # if sender is customer
  83. sender = Ticket::Article::Sender.lookup(id: record.sender_id)
  84. ticket = record.ticket
  85. if sender.name == 'Customer'
  86. # if customer is sending agains, ignore update of last contact (usecase of update escalation)
  87. return false if ticket.last_contact_customer_at &&
  88. ticket.last_contact_at &&
  89. ticket.last_contact_customer_at == ticket.last_contact_at
  90. # check if last communication is done by agent, else do not set last_contact_customer_at
  91. if ticket.last_contact_customer_at.nil? ||
  92. ticket.last_contact_agent_at.nil? ||
  93. ticket.last_contact_agent_at.to_i > ticket.last_contact_customer_at.to_i
  94. # set last_contact_at customer
  95. record.ticket.last_contact_customer_at = record.created_at
  96. # set last_contact
  97. record.ticket.last_contact_at = record.created_at
  98. end
  99. return true
  100. end
  101. # if sender is not agent
  102. return false if sender.name != 'Agent'
  103. # set last_contact_agent_at
  104. record.ticket.last_contact_agent_at = record.created_at
  105. # set last_contact
  106. record.ticket.last_contact_at = record.created_at
  107. true
  108. end
  109. end