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.
Stage nodes must link a stage (resolve-or-create)
A stage node always carriesdata.stageId pointing to a stage (a reusable, Department-scoped shop station). On POST /concepts/deliverables:
- if
data.stageIdis 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
stageIdnor a resolvable Department is rejected (a stage is Department-scoped, so a Department is required to find/create one).
data.shopId, else the nearest ancestor’s (exposed as computed.shopId). null = cross-Department.
Apply / compose
SettingoriginTemplateId (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).