--- title: "Stock Assignment" type: concept sources: - sources/archives/24_Process_assignation_stock.md related: - concepts/stock.md - concepts/order-outbound.md - concepts/picking.md - concepts/replenishment.md - concepts/kits.md - concepts/crossdocking.md - concepts/cutting-stock.md - concepts/task.md - concepts/tense-flow.md last_compiled: "2026-04-17" --- # Stock Assignment ## Overview **Stock assignment** is the engine that binds concrete stock to outbound work. Given an outbound order line (and its `OutboundOrderLineDetails`), it decides **which stock lines** will fulfil the demand and **what type of task** will be created to physically move them (picking, container shipping, replenishment, virtual picking). Every line detail is assigned independently - a line can have several details either because the requested item is a **non-assembled kit** (one detail per component) or because **alternative items** have been configured (if the main item is short, the WMS adds an extra detail with the substitute item and zeroes the main item's quantity). The assignment engine is a chain of workflows all prefixed `StockAssignProcess_*`. The main entry point is `StockAssignProcess_AssignOutboundLine_PR`, which loops over the line's details through `StockAssignProcess_AssignOutboundOrderLineDetails_PR`. ## Engine pipeline ### 1. Fetch and lock the detail Workflow: `StockAssignProcess_GetLockAndUpdateDetail_PR` Loads the outbound line detail, locks it for the assignment run, and reads the minimum data needed for stock search. To expose additional detail fields to downstream steps, extend the `Select` of the query in this workflow. ### 2. Search candidate stock Workflow: `StockAssignProcess_GetAvailableStockForOutboundOrderLineDetails_PR` Calls the query **`Stocks_AssignableForProductOutboundOrderLineDetailsAndStockAssignStrategy`**. Additional filters on assignable stock (e.g., custom-attribute filtering, reservations, supplier constraints) are added as extra `where` clauses on this query - once they are in place, SmartUI surfaces them under the **"Trace d'assignations de stock"** button for auditability. ### 3. Apply assignment strategy Two branches: - **Kits, manufacturing orders, TenseFlow** - the WMS prioritises stock already sitting in the dedicated consumption zone (assembly zone, production supply zone, TenseFlow supply zone) through `StockAssignProcess_CalculateByAssignmentManufacturingAndKits_PR`. This avoids pulling stock across zones when an in-zone alternative exists. - **Standard details** - applies the outbound priorities (preferred status, preferred UoM…) and then: - `Stocks_ApplyOutboundLogic_PR` - applies the shipping logic of the item (FIFO, FEFO, LIFO, custom). - `StockAssignProcess_CalculateEfficiencyMode_PR` - applies the efficiency mode (see [concepts/replenishment.md](replenishment.md#efficiency-modes) and the outbound efficiency settings on the shipping profile). The candidate list is narrowed and finally validated by `StockAssignProcess_ValidateStockList_PR`. ### 4. Persist assignments and build tasks Two sibling workflows: - `StockAssignProcess_CreateAssignments_PR` - writes the assignment rows (visible in SmartUI under **Allocations de stock**). - `Outbound_StockAssignCreateOrderLineDetailsTasks_PR` - translates each assignment into a task of the appropriate type (see below). ## Assignment types | Type | Description | |---|---| | **PickingLocations** | Classical picking task on a location flagged as picking. The stock is already at a pickable place. | | **ReplenishmentAssignment** | The candidate location permits replenishment but the on-hand quantity is insufficient. The engine creates a **picking task and a parallel replenishment task** - covers both static (PDL-driven) and dynamic replenishment scenarios. | | **ShippingContainer** | The full container (mono-reference) is needed and the location allows container shipping. A container-shipping task is created instead of a picking task. | | **PickingContainer** | Specific to **TenseFlow**. A `BufferReplenishment` task is created first, moving the container to the supply zone ; during virtual picking, virtual picking tasks are generated against the buffered stock. | ## Interactions with other features ### Kits If **any component** of a non-assembled kit cannot be assigned, **no component is assigned** - the engine rolls back and leaves the line short so the operator does not start half-kits. The matching behaviour for assembled kits (ready-made component) is standard. ### Crossdocking When the item allows crossdocking, an inbound expected to arrive shortly will block the engine from re-assigning the outbound line to existing stock - it will wait for the crossdocking candidate. Customers who do not want this behaviour comment out the crossdocking branch in the stock search query. ### Alternatives When the main item cannot cover the line quantity, the engine inserts a new detail with the alternative item and sets the main item's remaining quantity to zero. The alternative detail goes through the same pipeline - it may itself fall back to another alternative if further shortage occurs. ## Customisation points | Need | Workflow / query to touch | |---|---| | Expose more line-detail fields to the engine | Extend `Select` in `StockAssignProcess_GetLockAndUpdateDetail_PR` | | Filter candidate stock on a new criterion | Add `where` clauses in `Stocks_AssignableForProductOutboundOrderLineDetailsAndStockAssignStrategy` (visible in SmartUI "Trace d'assignations de stock") | | Generate **only picking tasks** (e.g., for waves - wave mode only consumes picking tasks) | Modify `StockAssignProcess_GetStockToAssignForStrategy_PR` ; if the WMS version has the assignment-merge feature, also modify `Outbound_CreatePickingLocationsTasks_PR` | | Disable crossdocking blocking | Comment out the crossdocking predicate in the stock search query | ## Observability - **SmartUI → Allocations de stock** - shows which stock line is reserved for which outbound line detail, with the assignment type. - **"Trace d'assignations de stock"** button - exposes the extra filters added to `Stocks_AssignableForProductOutboundOrderLineDetailsAndStockAssignStrategy` so support can see why a candidate was rejected. ## Common issues | Symptom | Likely cause | |---|---| | Outbound line stays in `StockFailure` despite visible stock | Filter on the assignment query (custom clause), preferred status rejecting everything, or logistic attribute mismatch | | Kit line assigned with some components but not all | Should not happen - rollback rule is absolute. Check if components were split across two details by an alternative cascade | | Expected replenishment-plus-picking not generated | Picking location does not actually permit replenishment, or all candidate reserves are locked | | Container shipping task created when picking was expected | Line quantity equals full container quantity **and** location allows container shipping - disable the container-shipping branch on the location if not desired | ## Related - [[stock]] - the data model assignment writes against - [[order-outbound]] - outbound lines and their `OutboundOrderLineDetails` are the inputs of the engine - [[picking]] - most assignment outputs are consumed as picking tasks - [[replenishment]] - `ReplenishmentAssignment` type materialises the replenishment-plus-picking pairing - [[kits]] - kit handling special case (all-or-nothing rollback, dedicated assembly-zone preference) - [[crossdocking]] - assignment waits for inbound crossdocking candidates unless disabled - [[cutting-stock]] - cutting items use the same pipeline with cut-specific post-processing - [[task]] - tasks are the tangible output of each assignment - [[tenseflow]] - the PickingContainer assignment type is the TenseFlow-specific path