result.rb 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. # Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
  2. class CoreWorkflow::Result
  3. include ::Mixin::HasBackends
  4. attr_accessor :payload, :user, :assets, :assets_in_result, :result, :rerun, :form_updater
  5. def initialize(payload:, user:, assets: {}, assets_in_result: true, result: {}, form_updater: false)
  6. raise ArgumentError, __("The required parameter 'payload->class_name' is missing.") if !payload['class_name']
  7. raise ArgumentError, __("The required parameter 'payload->screen' is missing.") if !payload['screen']
  8. @payload = payload
  9. @user = user
  10. @assets = assets
  11. @assets_in_result = assets_in_result
  12. @result = result
  13. @form_updater = form_updater
  14. @rerun = false
  15. end
  16. def attributes
  17. @attributes ||= CoreWorkflow::Attributes.new(result_object: self)
  18. end
  19. def workflows
  20. CoreWorkflow.active.object(payload['class_name'])
  21. end
  22. def set_default
  23. @rerun = false
  24. @result[:restrict_values] = {}
  25. %i[request_id visibility mandatory readonly select fill_in eval matched_workflows rerun_count].each do |group|
  26. @result[group] = attributes.send(:"#{group}_default")
  27. end
  28. if form_updater
  29. @result[:all_options] = attributes.all_options_default
  30. end
  31. # restrict init defaults to make sure param values to removed if not allowed
  32. attributes.restrict_values_default.each do |field, values|
  33. # skip initial rerun to improve performance
  34. # priority e.g. would trigger a rerun because its not set yet
  35. # but we skip rerun here because the initial values have no logic which
  36. # are dependent on form changes
  37. run_backend_value('set_fixed_to', field, values, skip_rerun: true)
  38. end
  39. set_default_only_shown_if_selectable
  40. end
  41. def set_default_only_shown_if_selectable
  42. # only_shown_if_selectable should not work on bulk feature
  43. return if @payload['screen'] == 'overview_bulk'
  44. auto_hide = {}
  45. attributes.auto_select_default.each do |field, state|
  46. result = run_backend_value('auto_select', field, state)
  47. next if result.compact.blank?
  48. auto_hide[field] = true
  49. end
  50. auto_hide.each do |field, state|
  51. run_backend_value('hide', field, state)
  52. end
  53. end
  54. def run
  55. set_default
  56. workflows.each do |workflow|
  57. condition = CoreWorkflow::Condition.new(result_object: self, workflow: workflow)
  58. next if !condition.match_all?
  59. run_workflow(workflow)
  60. run_custom(workflow, condition)
  61. match_workflow(workflow)
  62. break if workflow.stop_after_match
  63. end
  64. consider_rerun
  65. end
  66. def run_workflow(workflow)
  67. Array(workflow.perform).each do |field, config|
  68. run_backend(field, config)
  69. end
  70. end
  71. def run_custom(workflow, condition)
  72. Array(workflow.perform.dig('custom.module', 'execute')).each do |module_path|
  73. custom_module = module_path.constantize.new(condition_object: condition, result_object: self)
  74. custom_module.perform
  75. end
  76. end
  77. def run_backend(field, perform_config, skip_rerun: false)
  78. result = []
  79. Array(perform_config['operator']).each do |backend|
  80. result << "CoreWorkflow::Result::#{backend.classify}".constantize.new(result_object: self, field: field, perform_config: perform_config, skip_rerun: skip_rerun).run
  81. end
  82. result
  83. end
  84. def run_backend_value(backend, field, value, skip_rerun: false)
  85. perform_config = {
  86. 'operator' => backend,
  87. backend => value,
  88. }
  89. run_backend(field, perform_config, skip_rerun: skip_rerun)
  90. end
  91. def match_workflow(workflow)
  92. @result[:matched_workflows] |= Array(workflow.id)
  93. end
  94. def assets_in_result?
  95. return false if assets == false
  96. return false if !@assets_in_result
  97. @result[:assets] = assets
  98. true
  99. end
  100. def consider_rerun
  101. if @rerun && @result[:rerun_count] < 25
  102. @result[:rerun_count] += 1
  103. return run
  104. end
  105. assets_in_result?
  106. @result
  107. end
  108. end