core_workflow.rb 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
  2. class CoreWorkflow < ApplicationModel
  3. include ChecksClientNotification
  4. include CoreWorkflow::Assets
  5. default_scope { order(:priority, :id) }
  6. scope :active, -> { where(active: true) }
  7. scope :changeable, -> { where(changeable: true) }
  8. scope :object, ->(object) { where(object: [object, nil]) }
  9. store :preferences
  10. store :condition_saved
  11. store :condition_selected
  12. store :perform
  13. validates :name, presence: true
  14. =begin
  15. Runs the core workflow engine based on the current state of the object.
  16. perform_result = CoreWorkflow.perform(payload: {
  17. 'event' => 'core_workflow',
  18. 'request_id' => 'ChecksCoreWorkflow.validate_workflows',
  19. 'class_name' => 'Ticket',
  20. 'screen' => 'edit',
  21. 'params' => Ticket.first.attributes,
  22. }, user: User.find(3), assets: false)
  23. =end
  24. def self.perform(payload:, user:, assets: {}, assets_in_result: true, result: {}, form_updater: false)
  25. CoreWorkflow::Result.new(payload: payload, user: user, assets: assets, assets_in_result: assets_in_result, result: result, form_updater: form_updater).run
  26. rescue => e
  27. return {} if e.is_a?(ArgumentError)
  28. raise e if !Rails.env.production?
  29. Rails.logger.error 'Error performing Core Workflow engine.'
  30. Rails.logger.error e
  31. {}
  32. end
  33. =begin
  34. Checks if the object matches a specific condition.
  35. CoreWorkflow.matches_selector?(
  36. id: Ticket.first.id,
  37. user: User.find(3),
  38. selector: {"ticket.state_id"=>{"operator"=>"is", "value"=>["4", "5", "1", "2", "7", "3"]}}
  39. )
  40. =end
  41. def self.matches_selector?(id:, user:, selector:, class_name: 'Ticket', params: {}, screen: 'edit', request_id: 'ChecksCoreWorkflow.validate_workflows', event: 'core_workflow', check: 'saved')
  42. if id.present?
  43. params['id'] = id
  44. end
  45. CoreWorkflow::Result.new(payload: {
  46. 'event' => event,
  47. 'request_id' => request_id,
  48. 'class_name' => class_name,
  49. 'screen' => screen,
  50. 'params' => params,
  51. }, user: user, assets: false, assets_in_result: false).matches_selector?(selector: selector, check: check)
  52. rescue => e
  53. return {} if e.is_a?(ArgumentError)
  54. raise e if !Rails.env.production?
  55. Rails.logger.error 'Error performing Core Workflow engine.'
  56. Rails.logger.error e
  57. false
  58. end
  59. end