Class: LcpRuby::Workflow::Approval::Engine

Inherits:
Object
  • Object
show all
Defined in:
lib/lcp_ruby/workflow/approval/engine.rb

Class Method Summary collapse

Class Method Details

.activate(record, workflow_def, state_name, user:) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/lcp_ruby/workflow/approval/engine.rb', line 5

def self.activate(record, workflow_def, state_name, user:)
  approval_def = workflow_def.approval_for(state_name)
  return nil unless approval_def

  request_model = Registry.request_model
  step_model = Registry.step_model
  task_model = Registry.task_model

  # Evaluate bypass
  if approval_def.bypass? && bypass_satisfied?(approval_def, record, user)
    return bypass_approval(approval_def, record, workflow_def, user)
  end

  # Cancel any existing active request for this record+state (idempotency)
  cancel_active_requests(record, state_name, request_model, step_model, task_model)

  # Check rework
  previous_request = find_previous_request(record, state_name, request_model)
  restart_count = previous_request ? (previous_request.restart_count + 1) : 0

  # Create approval request
  approval_request = request_model.create!(
    record_type: model_name_for(record),
    record_id: record.id,
    workflow_name: workflow_def.name,
    workflow_version: workflow_def.version,
    state_name: state_name,
    strategy: approval_def.strategy,
    status: "pending",
    initiated_by_id: user.id,
    initiated_by_snapshot: UserSnapshot.capture(user),
    previous_request_id: previous_request&.id,
    restart_count: restart_count
  )

  # Create steps
  reset_mode = previous_request ? approval_def.rework_reset_mode : "all"
  create_steps(approval_def, approval_request, record, user, step_model, task_model,
               reset_mode: reset_mode, previous_request: previous_request)

  approval_request
end

.cancel(record, workflow_def, state_name) ⇒ Object



48
49
50
51
52
53
54
55
56
# File 'lib/lcp_ruby/workflow/approval/engine.rb', line 48

def self.cancel(record, workflow_def, state_name)
  return unless Registry.available?

  request_model = Registry.request_model
  step_model = Registry.step_model
  task_model = Registry.task_model

  cancel_active_requests(record, state_name, request_model, step_model, task_model)
end