Skip to main content
The deliverable resource is intentionally generic — one model implements nine domain concepts via its type field. The /concepts endpoints are a concept-aware layer on top of deliverable: they speak the domain language (Orders, Routes, Phases, Stages, Steps, QC Steps, Departments) and enforce the rules the raw deliverable endpoints do not (valid nesting, required fields per concept, stage linkage, Department scoping). Prefer these over raw deliverable writes.
Terminology: a Department is a shop (data.shopId). null = cross-department.

Nesting grammar (enforced)

POST /concepts/deliverables rejects anything outside this grammar (e.g. a step under an order).

Concept reference

* = required in data. Every node also has the base deliverable columns (identifier, quantity, schedule, progress, computed, …). Identifiers may be user-set or auto-generated for any type; if omitted, the server auto-generates one. A stage node always carries data.stageId pointing to a stage (a reusable, Department-scoped shop station). On POST /concepts/deliverables:
  • if data.stageId is supplied → it’s validated (exists, and its Department matches the stage node’s resolved Department);
  • otherwise the layer resolves-or-creates a stage named after the node in the node’s Department (data.shopId, or the nearest ancestor’s Department) and links it.
  • A stage node with neither stageId nor a resolvable Department is rejected (a stage is Department-scoped, so a Department is required to find/create one).
A stage node’s effective Department is its own data.shopId, else the nearest ancestor’s (exposed as computed.shopId). null = cross-Department.

Apply / compose

Setting originTemplateId (e.g. on order create from a route) or a container’s data.linkedRouteId applies that route/template’s structure under the node. Routes compose recursively and are cycle-protected. Applying a Department-scoped route overrides the target’s Department.

Endpoints

All /concepts writes respect the caller’s record permissions (e.g. creating a stage needs stage:create; route flow edges need deliverable_dependency:create).