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.