state.rb 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class Ticket::State < ApplicationModel
  3. include ChecksLatestChangeObserved
  4. # rubocop:disable Rails/InverseOf
  5. belongs_to :state_type, class_name: 'Ticket::StateType', inverse_of: :states
  6. belongs_to :next_state, class_name: 'Ticket::State'
  7. # rubocop:enable Rails/InverseOf
  8. after_create :ensure_defaults
  9. after_update :ensure_defaults
  10. after_destroy :ensure_defaults
  11. validates :name, presence: true
  12. attr_accessor :callback_loop
  13. =begin
  14. looks up states for a given category
  15. 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
  16. returns:
  17. state object list
  18. =end
  19. def self.by_category(category)
  20. case category.to_sym
  21. when :open
  22. state_types = ['new', 'open', 'pending reminder', 'pending action']
  23. when :pending_reminder
  24. state_types = ['pending reminder']
  25. when :pending_action
  26. state_types = ['pending action']
  27. when :pending
  28. state_types = ['pending reminder', 'pending action']
  29. when :work_on
  30. state_types = %w[new open]
  31. when :work_on_all
  32. state_types = ['new', 'open', 'pending reminder']
  33. when :viewable
  34. state_types = ['new', 'open', 'pending reminder', 'pending action', 'closed', 'removed']
  35. when :viewable_agent_new
  36. state_types = ['new', 'open', 'pending reminder', 'pending action', 'closed']
  37. when :viewable_agent_edit
  38. state_types = ['open', 'pending reminder', 'pending action', 'closed']
  39. when :viewable_customer_new
  40. state_types = %w[new closed]
  41. when :viewable_customer_edit
  42. state_types = %w[open closed]
  43. when :closed
  44. state_types = %w[closed]
  45. when :merged
  46. state_types = %w[merged]
  47. end
  48. raise "Unknown category '#{category}'" if state_types.blank?
  49. Ticket::State.where(
  50. state_type_id: Ticket::StateType.where(name: state_types)
  51. )
  52. end
  53. =begin
  54. check if state is ignored for escalation
  55. state = Ticket::State.lookup(name: 'state name')
  56. result = state.ignore_escalation?
  57. returns:
  58. true/false
  59. =end
  60. def ignore_escalation?
  61. return true if ignore_escalation
  62. false
  63. end
  64. def ensure_defaults
  65. return if callback_loop
  66. %w[default_create default_follow_up].each do |default_field|
  67. states_with_default = Ticket::State.where(default_field => true)
  68. next if states_with_default.count == 1
  69. if states_with_default.count.zero?
  70. state = Ticket::State.where(active: true).order(id: :asc).first
  71. state[default_field] = true
  72. state.callback_loop = true
  73. state.save!
  74. next
  75. end
  76. Ticket::State.all.each do |local_state|
  77. next if local_state.id == id
  78. next if local_state[default_field] == false
  79. local_state[default_field] = false
  80. local_state.callback_loop = true
  81. local_state.save!
  82. next
  83. end
  84. end
  85. end
  86. end