123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
- class Job < ApplicationModel
- store :timeplan
- store :condition
- store :execute
- validates :name, presence: true
- before_create :updated_matching
- before_update :updated_matching
- notify_clients_support
- def self.run
- time = Time.zone.now
- day_map = {
- 0 => 'sun',
- 1 => 'mon',
- 2 => 'tue',
- 3 => 'wed',
- 4 => 'thu',
- 5 => 'fri',
- 6 => 'sat',
- }
- jobs = Job.where( active: true )
- jobs.each do |job|
- # only execute jobs, older then 1 min, to give admin posibility to change
- next if job.updated_at > Time.zone.now - 1.minute
- # check if jobs need to be executed
- # ignore if job was running within last 10 min.
- next if job.last_run_at && job.last_run_at > Time.zone.now - 10.minutes
- # check day
- next if !job.timeplan['days'].include?( day_map[time.wday] )
- # check hour
- next if !job.timeplan['hours'].include?( time.hour.to_s )
- # check min
- next if !job.timeplan['minutes'].include?( match_minutes(time.min.to_s) )
- # find tickets to change
- tickets = Ticket.where( job.condition.permit! )
- .order( '`tickets`.`created_at` DESC' )
- .limit( 1_000 )
- job.processed = tickets.count
- tickets.each do |ticket|
- logger.debug "CHANGE #{job.execute.inspect}"
- changed = false
- job.execute.each do |key, value|
- changed = true
- attribute = key.split('.', 2).last
- logger.debug "-- #{Ticket.columns_hash[ attribute ].type}"
- #value = 4
- #if Ticket.columns_hash[ attribute ].type == :integer
- # logger.debug "to i #{attribute}/#{value.inspect}/#{value.to_i.inspect}"
- # #value = value.to_i
- #end
- ticket[attribute] = value
- logger.debug "set #{attribute} = #{value.inspect}"
- end
- next if !changed
- ticket.updated_by_id = 1
- ticket.save
- end
- job.last_run_at = Time.zone.now
- job.save
- end
- true
- end
- private
- def updated_matching
- count = Ticket.where( condition.permit! ).count
- self.matching = count
- end
- def self.match_minutes(minutes)
- minutes.gsub!(/(\d)\d/, '\\1')
- minutes.to_s + '0'
- end
- private_class_method :match_minutes
- end
|