ari/jobsworth

View on GitHub
app/models/trigger.rb

Summary

Maintainability
A
45 mins
Test Coverage
# encoding: UTF-8
class Trigger < ActiveRecord::Base

  belongs_to :company
  belongs_to :task_filter
  has_many :actions

  validates_presence_of :company
  validates_presence_of :event_id

  attr_accessor :trigger_type, :count, :period, :tz

  def actions_attributes=(params)
    (action_ids - params.map { |attr| attr[:id].to_i }).each { |id| actions.destroy(id) }
    params.each do |attr|
      if attr[:id].blank?
        actions << ActionFactory.find(attr.delete(:factory_id)).build(attr)
      else
        attr.delete(:factory_id)
        actions.find(attr[:id]).update_attributes(attr)
      end
    end
  end

  # Fires any triggers that apply to the given task and
  # fire_on time (create, update, etc)
  def self.fire(task, fire_on)
    triggers = task.company.triggers.where(:event_id => fire_on)
    match = "tasks.id = #{ task.id }"

    triggers.each do |trigger|
      if trigger.task_filter
        trigger.task_filter.user = task.creator if task.creator
        apply = (trigger.task_filter.count(match) > 0)
      else
        apply = true
      end
      if apply
        executes = trigger.actions.collect { |action| action.execute(task) }
        worklog = WorkLog.new
        worklog.for_task(task)
        worklog.body = I18n.t('triggers.updated_by_trigger')
        worklog.body << executes.join(' ')
        worklog.save!

      end
    end
  end

  def task_filter_name
    task_filter.nil? ? I18n.t('shared.none') : task_filter.name
  end

  def event_name
    Event.find(event_id).name
  end
end


# == Schema Information
#
# Table name: triggers
#
#  id             :integer(4)      not null, primary key
#  company_id     :integer(4)
#  task_filter_id :integer(4)
#  created_at     :datetime
#  updated_at     :datetime
#  event_id       :integer(4)
#