article.rb 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. class Ticket::Article < ApplicationModel
  2. before_create :fillup
  3. after_create :attachment_check, :communicate
  4. belongs_to :ticket
  5. belongs_to :ticket_article_type, :class_name => 'Ticket::Article::Type'
  6. belongs_to :ticket_article_sender, :class_name => 'Ticket::Article::Sender'
  7. belongs_to :created_by, :class_name => 'User'
  8. after_create :cache_delete
  9. after_update :cache_delete
  10. after_destroy :cache_delete
  11. private
  12. def fillup
  13. # if sender is customer, do not change anything
  14. sender = Ticket::Article::Sender.where( :id => self.ticket_article_sender_id ).first
  15. return if sender == nil
  16. return if sender['name'] == 'Customer'
  17. type = Ticket::Article::Type.where( :id => self.ticket_article_type_id ).first
  18. ticket = Ticket.find(self.ticket_id)
  19. # set from if not given
  20. if !self.from
  21. user = User.find(self.created_by_id)
  22. self.from = "#{user.firstname} #{user.lastname}"
  23. end
  24. # set email attributes
  25. if type['name'] == 'email'
  26. # set subject if empty
  27. if !self.subject || self.subject == ''
  28. self.subject = ticket.title
  29. end
  30. # clean subject
  31. self.subject = ticket.subject_clean(self.subject)
  32. # generate message id
  33. fqdn = Setting.get('fqdn')
  34. self.message_id = '<' + DateTime.current.to_s(:number) + '.' + self.ticket_id.to_s + '.' + rand(999999).to_s() + '@' + fqdn + '>'
  35. # set sender
  36. email_address = ticket.group.email_address
  37. system_sender = "#{email_address.realname} <#{email_address.email}>"
  38. if Setting.get('ticket_define_email_from') == 'AgentNameSystemAddressName'
  39. seperator = Setting.get('ticket_define_email_from_seperator')
  40. sender = User.find(self.created_by_id)
  41. self.from = "#{sender.firstname} #{sender.lastname} #{seperator} #{system_sender}"
  42. else
  43. self.from = system_sender
  44. end
  45. end
  46. end
  47. def attachment_check
  48. # do nothing if no attachment exists
  49. return 1 if self['attachments'] == nil
  50. # store attachments
  51. article_store = []
  52. self.attachments.each do |attachment|
  53. article_store.push Store.add(
  54. :object => 'Ticket::Article',
  55. :o_id => self.id,
  56. :data => attachment.store_file.data,
  57. :filename => attachment.filename,
  58. :preferences => attachment.preferences
  59. )
  60. end
  61. self.attachments = article_store
  62. end
  63. def communicate
  64. # if sender is customer, do not communication
  65. sender = Ticket::Article::Sender.where( :id => self.ticket_article_sender_id ).first
  66. return 1 if sender == nil
  67. return 1 if sender['name'] == 'Customer'
  68. type = Ticket::Article::Type.where( :id => self.ticket_article_type_id ).first
  69. ticket = Ticket.find(self.ticket_id)
  70. # if sender is agent or system
  71. # create tweet
  72. if type['name'] == 'twitter direct-message' || type['name'] == 'twitter status'
  73. a = Channel::Twitter2.new
  74. message = a.send(
  75. {
  76. :type => type['name'],
  77. :to => self.to,
  78. :body => self.body,
  79. :in_reply_to => self.in_reply_to
  80. },
  81. Rails.application.config.channel_twitter
  82. )
  83. self.message_id = message.id
  84. self.save
  85. end
  86. # post facebook comment
  87. if type['name'] == 'facebook'
  88. a = Channel::Facebook.new
  89. a.send(
  90. {
  91. :from => 'me@znuny.com',
  92. :to => 'medenhofer',
  93. :body => self.body
  94. }
  95. )
  96. end
  97. # send email
  98. if type['name'] == 'email'
  99. # build subject
  100. subject = ticket.subject_build(self.subject)
  101. # send email
  102. a = Channel::IMAP.new
  103. message = a.send(
  104. {
  105. :message_id => self.message_id,
  106. :in_reply_to => self.in_reply_to,
  107. :from => self.from,
  108. :to => self.to,
  109. :cc => self.cc,
  110. :subject => subject,
  111. :body => self.body,
  112. :attachments => self.attachments
  113. }
  114. )
  115. # store mail plain
  116. Store.add(
  117. :object => 'Ticket::Article::Mail',
  118. :o_id => self.id,
  119. :data => message.to_s,
  120. :filename => "ticket-#{ticket.number}-#{self.id}.eml",
  121. :preferences => {}
  122. )
  123. # add history record
  124. recipient_list = ''
  125. [:to, :cc].each { |key|
  126. if self[key] && self[key] != ''
  127. if recipient_list != ''
  128. recipient_list += ','
  129. end
  130. recipient_list += self[key]
  131. end
  132. }
  133. if recipient_list != ''
  134. History.history_create(
  135. :o_id => self.id,
  136. :history_type => 'email',
  137. :history_object => 'Ticket::Article',
  138. :related_o_id => ticket.id,
  139. :related_history_object => 'Ticket',
  140. :value_from => self.subject,
  141. :value_to => recipient_list,
  142. :created_by_id => self.created_by_id,
  143. )
  144. end
  145. end
  146. end
  147. class Flag < ApplicationModel
  148. end
  149. class Sender < ApplicationModel
  150. validates :name, :presence => true
  151. end
  152. class Type < ApplicationModel
  153. validates :name, :presence => true
  154. end
  155. end