# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/ require 'event_buffer' require 'notification_factory' class Observer::Ticket::Notification < ActiveRecord::Observer observe :ticket, 'ticket::_article' def self.transaction # return if we run import mode return if Setting.get('import_mode') # get buffer list = EventBuffer.list # reset buffer EventBuffer.reset list.each { |event| # get current state of objects if event[:name] == 'Ticket::Article' article = Ticket::Article.lookup( :id => event[:id] ) # next if article is already deleted next if !article ticket = article.ticket elsif event[:name] == 'Ticket' ticket = Ticket.lookup( :id => event[:id] ) # next if ticket is already deleted next if !ticket article = ticket.articles[-1] next if !article else raise "unknown object for notification #{event[:name]}" end # send new ticket notification to agents if event[:name] == 'Ticket' && event[:type] == 'create' puts 'send new ticket notify to agent' send_notify( { :event => event, :recipient => 'to_work_on', # group|owner|to_work_on|customer :subject => 'New Ticket (#{ticket.title})', :body => 'Hi #{recipient.firstname}, a new Ticket (#{ticket.title}) via i18n(#{article.type.name}). Group: #{ticket.group.name} Owner: #{ticket.owner.firstname} #{ticket.owner.lastname} State: i18n(#{ticket.state.name}) From: #{article.from} #{article.body} #{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}/#{article.id} ' }, ticket, article, 'new ticket' ) end # send new ticket notification to customers if event[:name] == 'Ticket' && event[:type] == 'create' # only for incoming emails next if article.type.name != 'email' puts 'send new ticket notify to customer' send_notify( { :event => event, :recipient => 'customer', # group|owner|to_work_on|customer :subject => 'New Ticket has been created! (#{ticket.title})', :body => 'Thanks for your email. A new ticket has been created. You wrote: #{article.body} Your email will be answered by a human ASAP Have fun with Zammad! :-) Your Zammad Team ' }, ticket, article, 'new ticket' ) end # send follow up notification if event[:name] == 'Ticket::Article' && event[:type] == 'create' # only send article notifications after init article is created (handled by ticket create event) next if ticket.articles.count.to_i <= 1 puts 'send new ticket::article notify' if article.sender.name == 'Customer' send_notify( { :event => event, :recipient => 'to_work_on', # group|owner|to_work_on|customer :subject => 'Follow Up (#{ticket.title})', :body => 'Hi #{recipient.firstname}, a follow Up (#{ticket.title}) via i18n(#{article.type.name}). Group: #{ticket.group.name} Owner: #{ticket.owner.firstname} #{ticket.owner.lastname} State: i18n(#{ticket.state.name}) From: #{article.from} #{article.body} #{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}/#{article.id} ' }, ticket, article, 'follow up' ) end # send new note notification to owner # if agent == created.id if article.sender.name == 'Agent' && article.created_by_id != article.ticket.owner_id send_notify( { :event => event, :recipient => 'owner', # group|owner|to_work_on :subject => 'Updated (#{ticket.title})', :body => 'Hi #{recipient.firstname}, updated (#{ticket.title}) via i18n(#{article.type.name}). Group: #{ticket.group.name} Owner: #{ticket.owner.firstname} #{ticket.owner.lastname} State: i18n(#{ticket.state.name}) From: #{article.from} #{article.body} #{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}/#{article.id} ' }, ticket, article, 'follow up', ) end end } end def self.send_notify(data, ticket, article, type) # send background job params = { :ticket_id => ticket.id, :article_id => article.id, :type => type, :data => data, } Delayed::Job.enqueue( Observer::Ticket::Notification::BackgroundJob.new( params ) ) end def after_create(record) # return if we run import mode return if Setting.get('import_mode') # puts 'CREATED!!!!' # puts record.inspect e = { :name => record.class.name, :type => 'create', :data => record, :id => record.id, } EventBuffer.add(e) end def before_update(record) # return if we run import mode return if Setting.get('import_mode') #puts 'before_update' current = record.class.find(record.id) # do not send anything if nothing has changed return if current.attributes == record.attributes # puts 'UPDATE!!!!!!!!' # puts 'current' # puts current.inspect # puts 'record' # puts record.inspect e = { :name => record.class.name, :type => 'update', :data => record, :id => record.id, } EventBuffer.add(e) end def after_update(record) # return if we run import mode return if Setting.get('import_mode') # puts 'after_update' # puts record.inspect # puts '-----' # puts @a.inspect # AuditTrail.new(record, "UPDATED") end end