result.rb 3.7 KB

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