20250217145700_issue_5191_ensure_single_merged_state.rb 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. # Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
  2. class Issue5191EnsureSingleMergedState < ActiveRecord::Migration[7.2]
  3. def change
  4. # return if it's a new setup
  5. return if !Setting.exists?(name: 'system_init_done')
  6. if !merged_named_and_type_state
  7. rename_oldest_merged_state
  8. end
  9. change_later_merged_to_closed
  10. end
  11. private
  12. def merged_type_states
  13. Ticket::State.joins(:state_type).where(state_type: { name: 'merged' })
  14. end
  15. def target_state_type
  16. Ticket::StateType.find_by name: 'closed'
  17. end
  18. def merged_named_and_type_state
  19. merged_type_states.find_by(name: 'merged')
  20. end
  21. def change_later_merged_to_closed
  22. merged_type_states
  23. .where.not(name: 'merged')
  24. .each do |record|
  25. record.update! state_type: target_state_type
  26. end
  27. end
  28. def rename_oldest_merged_state
  29. Ticket::State.without_callback(:update, :before, :prevent_merged_state_editing) do
  30. merged_type_states
  31. .where.not(name: 'merged')
  32. .reorder('id ASC')
  33. .first
  34. .tap do |elem|
  35. elem.name = 'merged'
  36. elem.save! validate: false
  37. end
  38. end
  39. end
  40. end