# 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) 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