trabajo-afectivo/app/models/ticket/state.rb

111 lines
2.9 KiB
Ruby
Raw Normal View History

2016-10-19 03:11:36 +00:00
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
class Ticket::State < ApplicationModel
include ChecksLatestChangeObserved
after_create :ensure_defaults
after_update :ensure_defaults
after_destroy :ensure_defaults
belongs_to :state_type, class_name: 'Ticket::StateType'
belongs_to :next_state, class_name: 'Ticket::State'
validates :name, presence: true
attr_accessor :callback_loop
=begin
looks up states for a given category
states = Ticket::State.by_category(:open) # :open|:closed|:work_on|:work_on_all|:viewable|:viewable_agent_new|:viewable_agent_edit|:viewable_customer_new|:viewable_customer_edit|:pending_reminder|:pending_action|:pending|:merged
returns:
state object list
=end
def self.by_category(category)
case category.to_sym
when :open
state_types = ['new', 'open', 'pending reminder', 'pending action']
when :pending_reminder
state_types = ['pending reminder']
when :pending_action
state_types = ['pending action']
when :pending
state_types = ['pending reminder', 'pending action']
when :work_on
state_types = %w(new open)
when :work_on_all
state_types = ['new', 'open', 'pending reminder']
when :viewable
state_types = ['new', 'open', 'pending reminder', 'pending action', 'closed', 'removed']
when :viewable_agent_new
state_types = ['new', 'open', 'pending reminder', 'pending action', 'closed']
when :viewable_agent_edit
state_types = ['open', 'pending reminder', 'pending action', 'closed']
when :viewable_customer_new
state_types = %w(new closed)
when :viewable_customer_edit
state_types = %w(open closed)
when :closed
state_types = %w(closed)
when :merged
state_types = %w(merged)
2014-02-03 19:23:00 +00:00
end
raise "Unknown category '#{category}'" if state_types.blank?
Ticket::State.where(
state_type_id: Ticket::StateType.where(name: state_types)
)
end
=begin
check if state is ignored for escalation
state = Ticket::State.lookup(name: 'state name')
result = state.ignore_escalation?
returns:
true/false
=end
def ignore_escalation?
return true if ignore_escalation
false
end
def ensure_defaults
return if callback_loop
%w(default_create default_follow_up).each do |default_field|
states_with_default = Ticket::State.where(default_field => true)
next if states_with_default.count == 1
if states_with_default.count.zero?
state = Ticket::State.where(active: true).order(id: :asc).first
state[default_field] = true
state.callback_loop = true
state.save!
next
end
Ticket::State.all.each { |local_state|
next if local_state.id == id
next if local_state[default_field] == false
local_state[default_field] = false
local_state.callback_loop = true
local_state.save!
next
}
end
end
end