Approval Workflow
A multi-stage approval process using state machines.
Example 063 of the basic Soma programs: a small, commented program that teaches one thing. Every output below was printed by soma 3.2.4 when this page was built.
How it is built
The cell ApprovalWorkflow keeps 2 memory slots: requests (Map<String, String>, persistent and consistent) and status (Map<String, String>, persistent and consistent). Its state machine approval_status starts in pending and allows 7 transitions: pending -> manager_review, manager_review -> finance_review, finance_review -> approved, manager_review -> rejected, finance_review -> rejected, rejected -> pending and * -> cancelled. approved and cancelled are terminal. Handlers: submit (line 35) and demo (line 44).
The source
063_approval_workflow.cell
// ============================================================================
// 063 — Approval Workflow
// ============================================================================
// A multi-stage approval process using state machines.
//
// Run: soma run 063_approval_workflow.cell demo
// Expect:
// Created request: New laptop for dev team
// Status: pending
// Manager reviewing
// Finance reviewing
// Approved!
// Final status: approved
cell ApprovalWorkflow {
memory {
requests: Map<String, String> [persistent, consistent]
// Dedicated map for state tracking
status: Map<String, String> [persistent, consistent]
}
state approval_status {
initial: pending
pending -> manager_review
manager_review -> finance_review
finance_review -> approved
manager_review -> rejected
finance_review -> rejected
rejected -> pending
* -> cancelled
}
on submit(title: String, amount: Int) {
let id = to_string(next_id())
let req = map("id", id, "title", title, "amount", amount)
requests.set(id, to_json(req))
// Initialize state
status.set(id, "pending")
return req
}
on demo() {
let req = submit("New laptop for dev team", 2000)
print("Created request: {req.title}")
let st = get_status("1")
print("Status: {st}")
transition("1", "manager_review")
print("Manager reviewing")
transition("1", "finance_review")
print("Finance reviewing")
transition("1", "approved")
print("Approved!")
let final_st = get_status("1")
print("Final status: {final_st}")
return "done"
}
}What the toolchain says
$ soma check 063_approval_workflow.cell
✓ All checks passed.$ soma run 063_approval_workflow.cell demo
Created request: New laptop for dev team
Status: pending
Manager reviewing
Finance reviewing
Approved!
Final status: approved
done