Skip to content

Multi-Level Approval

Prefer ApprovalWorkflowDefinition from cdx_workflow_templates over hand-building a chain. For a custom chain, loop over a recorded level list with stable IDs.

dart
execute: (flow, input) async {
  final plan = await flow.serviceTask(initialize, input, id: 'initialize');

  for (final level in plan.levels) {
    final decision = await flow.userTask(
      approveLevel,
      level,
      id: 'approve-${level.index}',
      title: 'Approve level ${level.index + 1}',
      assignment: level.assignment,
    );
    if (decision.rejected) return ApprovalResult.rejected();
    if (decision.revisionRequested) {
      await flow.userTask(
        revision,
        plan,
        id: 'revision-${level.index}',
        title: 'Revise request',
        assignment: Assignment(userIds: [plan.submittedBy]),
      );
    }
  }

  await flow.serviceTask(applyApproved, plan, id: 'apply');
  return ApprovalResult.approved();
}

Level IDs must be stable across replay. Do not generate IDs from DateTime.now() or a random UUID.

The canonical template already handles revision loops, cancellation, and domain effects. See Approvals.

See Also