Class: LcpRuby::Workflow::Approval::StepEvaluator

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

Class Method Summary collapse

Class Method Details

.evaluate(step, approval_request) ⇒ 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
# File 'lib/lcp_ruby/workflow/approval/step_evaluator.rb', line 5

def self.evaluate(step, approval_request)
  approval_def = find_approval_def(approval_request)
  task_model = Registry.task_model
  step_model = Registry.step_model

  tasks = task_model.where(approval_step_id: step.id)
  approved_count = tasks.where(status: "approved").count
  rejected_tasks = tasks.where(status: "rejected")
  returned_tasks = tasks.where(status: "returned")

  # Check for return first
  if returned_tasks.any?
    resolve(approval_request, outcome: :returned, step: step, tasks: tasks)
    return
  end

  # Check for rejection
  if approval_def.on_reject == "any" && rejected_tasks.any?
    resolve(approval_request, outcome: :rejected, step: step, tasks: tasks)
    return
  end

  # Check if all tasks are decided (for on_reject: all)
  if approval_def.on_reject == "all"
    decided_count = tasks.where(status: %w[approved rejected]).count
    total_actionable = tasks.where.not(status: %w[delegated cancelled]).count
    if decided_count == total_actionable && rejected_tasks.any? && approved_count < step.required_approvals
      resolve(approval_request, outcome: :rejected, step: step, tasks: tasks)
      return
    end
  end

  # Check if step is completed (enough approvals)
  if approved_count >= step.required_approvals
    step.update!(status: "completed", completed_at: Time.current)
    advance(approval_request, approval_def, step_model, task_model)
  end
end