zammad/app/models/core_workflow.rb

127 lines
4.2 KiB
Ruby

# Copyright (C) 2012-2026 Zammad Foundation, https://zammad-foundation.org/
class CoreWorkflow < ApplicationModel
include ChecksClientNotification
include ChecksCoreWorkflow
include HasSearchIndexBackend
include CanSelector
include CanSearch
include CoreWorkflow::Assets
include CoreWorkflow::Search
core_workflow_screens 'create', 'edit'
default_scope { order(:priority, :id) }
scope :active, -> { where(active: true) }
scope :changeable, -> { where(changeable: true) }
scope :object, ->(object) { where(object: [object, nil]) }
store :preferences
store :condition_saved
store :condition_selected
store :perform
validates :name, presence: true, uniqueness: { case_sensitive: false }
def self.classes
Models.all.keys.select { |m| m.include?(ChecksCoreWorkflow) }
end
def self.config
classes.each_with_object({ configuration: {}, execution: {} }) do |config_class, result|
if config_class.try(:core_workflow_screens).present?
result[:execution][config_class.to_s] = config_class.try(:core_workflow_screens)
end
if config_class.try(:core_workflow_admin_screens).present?
result[:configuration][config_class.to_s] = config_class.try(:core_workflow_admin_screens)
end
end
end
=begin
Runs the core workflow engine based on the current state of the object.
perform_result = CoreWorkflow.perform(payload: {
'event' => 'core_workflow',
'request_id' => 'ChecksCoreWorkflow.validate_workflows',
'class_name' => 'Ticket',
'screen' => 'edit',
'params' => Ticket.first.attributes,
}, user: User.find(3), assets: false)
=end
def self.perform(payload:, user:, assets: {}, assets_in_result: true, result: {}, form_updater: false)
CoreWorkflow::Result.new(payload: payload, user: user, assets: assets, assets_in_result: assets_in_result, result: result, form_updater: form_updater).run
rescue => e
return {} if e.is_a?(ArgumentError)
raise e if !Rails.env.production?
Rails.logger.error 'Error performing Core Workflow engine.'
Rails.logger.error e
{}
end
=begin
Checks if the object matches a specific condition.
Match saved data:
CoreWorkflow.matches_selector?(
id: Ticket.first.id,
user: User.find_by(login: 'admin@example.com'),
selector: { 'ticket.state_id'=>{ 'operator' => 'is', 'value' => ['2'] } },
)
Match payload selected data:
CoreWorkflow.matches_selector?(
check: 'selected',
user: User.find_by(login: 'admin@example.com'),
params: {
'group_id' => '1',
'owner_id' => '',
'state_id' => '2',
'priority_id' => '2',
'article' => {
'body' => '',
'type' => 'note',
'internal' => true,
'form_id' => 'd8416050-0987-4ae4-b36f-c488b3b9b333',
'shared_draft_id' => '',
'subtype' => '',
'in_reply_to' => '',
'to' => '',
'cc' => '',
'subject' => ''
},
},
selector: { 'ticket.state_id'=>{ 'operator' => 'is', 'value' => ['2'] } },
)
=end
def self.matches_selector?(user:, selector:, id: nil, class_name: 'Ticket', params: {}, screen: 'edit', request_id: 'ChecksCoreWorkflow.validate_workflows', event: 'core_workflow', check: 'saved')
if id.present?
params['id'] = id
end
CoreWorkflow::Result.new(payload: {
'event' => event,
'request_id' => request_id,
'class_name' => class_name,
'screen' => screen,
'params' => params,
}, user: user, assets: false, assets_in_result: false).matches_selector?(selector: selector, check: check)
rescue => e
return {} if e.is_a?(ArgumentError)
raise e if !Rails.env.production?
Rails.logger.error 'Error performing Core Workflow engine.'
Rails.logger.error e
false
end
end