state.rb 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
  2. class Ticket::State < ApplicationModel
  3. include HasDefaultModelUserRelations
  4. include CanBeImported
  5. include ChecksHtmlSanitized
  6. include HasCollectionUpdate
  7. include HasSearchIndexBackend
  8. belongs_to :state_type, class_name: 'Ticket::StateType', inverse_of: :states, optional: true
  9. belongs_to :next_state, class_name: 'Ticket::State', optional: true
  10. after_create :ensure_defaults
  11. after_update :ensure_defaults
  12. after_destroy :ensure_defaults
  13. after_destroy :update_object_manager_attribute
  14. after_save :update_object_manager_attribute
  15. validates :name, presence: true, uniqueness: { case_sensitive: false }
  16. validates :note, length: { maximum: 250 }
  17. sanitized_html :note
  18. attr_accessor :callback_loop
  19. =begin
  20. looks up states for a given category
  21. 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
  22. returns:
  23. state object list
  24. =end
  25. scope :by_category, lambda { |category|
  26. joins(:state_type)
  27. .where(ticket_state_types: { name: Ticket::StateType.names_in_category(category) })
  28. }
  29. def self.by_category_ids(category)
  30. by_category(category).pluck(:id)
  31. end
  32. def ensure_defaults
  33. return if callback_loop
  34. %w[default_create default_follow_up].each do |default_field|
  35. states_with_default = Ticket::State.where(default_field => true)
  36. next if states_with_default.count == 1
  37. if states_with_default.count.zero?
  38. state = Ticket::State.where(active: true).reorder(id: :asc).first
  39. state[default_field] = true
  40. state.callback_loop = true
  41. state.save!
  42. next
  43. end
  44. Ticket::State.all.each do |local_state|
  45. next if local_state.id == id
  46. next if local_state[default_field] == false
  47. local_state[default_field] = false
  48. local_state.callback_loop = true
  49. local_state.save!
  50. next
  51. end
  52. end
  53. end
  54. private
  55. def update_object_manager_attribute
  56. return if !Setting.get('system_init_done')
  57. return if callback_loop
  58. attr = ObjectManager::Attribute.get(
  59. object: 'Ticket',
  60. name: 'state_id',
  61. )
  62. attr.data_option[:filter] = Ticket::State.by_category_ids(:viewable)
  63. attr.screens[:create_middle]['ticket.agent'][:filter] = Ticket::State.by_category_ids(:viewable_agent_new)
  64. attr.screens[:create_middle]['ticket.customer'][:filter] = Ticket::State.by_category_ids(:viewable_customer_new)
  65. attr.screens[:edit]['ticket.agent'][:filter] = Ticket::State.by_category_ids(:viewable_agent_edit)
  66. attr.screens[:edit]['ticket.customer'][:filter] = Ticket::State.by_category_ids(:viewable_customer_edit)
  67. attr.screens[:overview_bulk]['ticket.agent'][:filter] = Ticket::State.by_category_ids(:viewable_agent_edit)
  68. attr.save!
  69. end
  70. end