Skip to main content

Putaway: what SKU, pack, lot, zone and location settings change

This page covers the master data that the "Capacity" and "Landing" checks of putaway read. Each diagram answers one question: "if I change this field, which refusal does an operator or the dry run see?" Policy and step settings are on 22-putaway-influence-step-settings.md. Only fields that code reads are drawn. Fields that nothing reads are listed at the end under "Stored only. It has no effect today."

Diagram 1. The capacity check, in order​

What this shows: the order of the capacity gates on one candidate location, and the refusal code of each.

Reading notes:

  • The section test and the "held" test run whatever the step says. The five switches belong to the step (fit_by_pallet_dims, fit_by_stack_limit, fit_by_quantity, fit_by_weight, fit_by_cube).
  • The zone part runs only when the destination zone differs from the zone where the pallet stands now.
  • A limit of 0 (or empty) means "not set". The check is not run and the candidate is still offered. The trace reports it as <limit>:no_limit. It is not a refusal.
  • Missing data also skips a check and is reported: no_product_dims (the pack does not describe the pallet), no_location_dims (the location has no length, width or height), no_stock_weight (no weight known for the stock).
  • A free section means: every position has status Ok, flag None, no stock, no pallet standing in it and no live reservation of another pallet. Section width is the sum of the positions. Depth and height are the lowest value of the positions.

Where it comes from​

ItemSource
Order of the switches and the zone partcrates/libs/wms-inventory/src/putaway/space.rs:640-835
Section testcrates/libs/wms-inventory/src/putaway/space.rs:1052-1102, crates/libs/wms-lib-core/src/model/location.rs:2295-2365
Capacity rule, section_promisedcrates/libs/wms-inventory/src/putaway/predicate.rs:282-447
Limits of 0 are "not checked"crates/libs/wms-inventory/src/putaway/space.rs:1156-1195
Switches of a stepcrates/libs/wms-inventory/src/putaway/space.rs:496-545

Diagram 2. Physical fit: pallet size, stacking, quantity​

What this shows: which fields feed the three physical switches.

FieldDecision it changesWhat you see
pack_item.pallet_wood_length, pallet_wood_width (largest base on the SKU's packs)Pallet base. It must fit the location length and width, in either direction.loc_footprint
pack_item.pallet_wood_height, pallet_hi and the height of the child pack itemPallet height = base height + pallet_hi x tier height. A pallet exactly as tall as the location fits.loc_height
location.length, width, height (0 means unknown)Location size for the test above.no_location_dims in the trace when unknown
location.footprint ("Pallet positions on floor") and location.stack_limitLimit = footprint x stack limit. Used = pallets standing plus pallets promised, then this one.loc_positions
sku.stack_limitIf it is above 0 and lower than the location's stack limit, it wins. If the location has stack limit 0, the SKU value is used.item_positions
location.max_qty_capacityLimit for the quantity already there plus the quantity arriving. It does not count quantity promised by reservations.loc_qty

Where it comes from​

ItemSource
Pallet size from packscrates/libs/wms-inventory/src/putaway/space.rs:287-340
Location size, either direction, height testcrates/libs/wms-inventory/src/putaway/space.rs:218-286, :875-918
Stack limit choicecrates/libs/wms-inventory/src/putaway/space.rs:704-727, :149-155
Quantity checkcrates/libs/wms-inventory/src/putaway/space.rs:732-742
What "used" containscrates/libs/wms-inventory/src/putaway/space.rs:920-1000

Diagram 3. Weight, cube and zone limits​

What this shows: which fields feed the weight and cube checks, and the extra zone totals when the pallet changes zone.

FieldDecision it changesWhat you see
step.fit_by_weight, step.fit_by_cubeTurn the weight and cube checks on or off, for the location and for the zone.Without the switch the check does not run.
location.max_weight_capacity, location.max_cube_capacityLimits. Attempted = stock there + promised + this pallet.loc_weight, loc_cube
sku.gross_wgt and the weights of the active pack revisionWeight of the pallet. If it is unknown the weight check is not run.loc_weight:no_stock_weight in the trace
sku.cubeCube of the pallet is the sum of cube x quantity over the lines. A cube of 0 adds nothing.loc_cube
putawayzone.max_weight, putawayzone.max_cubeZone totals. Used only when the destination zone differs from the zone where the pallet stands, and only with the matching switch on.zone_weight, zone_cube
putawayzone.max_cases_countNumber of stock-bearing containers in the pallet against the zone limit. Used only for a different zone. No switch turns it off.zone_cases_count

The move itself checks location and zone weight and cube, and the zone case count, whatever the step switches say (crates/libs/wms-inventory/src/movement/validation.rs:920-1000). If a step switches Cube or Weight off, putaway can suggest a place that the move then refuses (the operator is asked for a supervisor, see 20-putaway-journey.md).

Where it comes from​

ItemSource
Location weight and cube; zone partcrates/libs/wms-inventory/src/putaway/space.rs:745-835
Zone totals and limitscrates/libs/wms-inventory/src/putaway/space.rs:1104-1150
Pallet weight from SKU and packcrates/libs/wms-lib-core/src/model/pack/weight.rs:255-335
Pallet cube, quantity, stack limit, positions requiredcrates/libs/wms-inventory/src/putaway/mod.rs:1449-1480
Number of stock-bearing containerscrates/libs/wms-inventory/src/putaway/space.rs:56-82
Move checks the same limitscrates/libs/wms-inventory/src/movement/validation.rs:920-1000

Diagram 4. The landing rules (mixing)​

What this shows: the order in which the landing check looks at the location's flags, the lot rules and the pallet's own lots, and which field causes each refusal.

FieldDecision it changesWhat you see
location.mix_sku (default on)When off, the location may hold only the incoming SKU of that owner. It counts stock only, not reservations.mix_sku
location.mix_lot (default on)When off, the location may hold only the incoming lot. It counts stock only. When off, the lot attribute rules below are not asked at all.mix_lot
location_lot_commingle (location, attribute code, allow_mix)For each attribute of the SKU's lot policy, a rule on the location wins over the zone rule. allow_mix on is a deliberate exception.mix_attribute
putawayzone_lot_commingle (zone, attribute code, allow_mix)Used when the location has no rule for that attribute.mix_attribute
lot_policy_attribute of sku.lot_policy_idNames the attributes the rules above are asked about. A rule for another attribute is ignored.none
lot_attributes value of the incoming lotThe rule compares it with the other lots standing on the same pallet. If the lot has no value for the attribute there is nothing to conflict with.mix_attribute
sku.allow_multi_lot_on_lpn (column default off)If the SKU does not allow several lots on one LPN, a pallet that carries another lot of that SKU fails everywhere.lpn_multi_lot
sku.force_separate_lpn_per_lot (column default off)Same effect for the incoming SKU.lpn_multi_lot

Reading notes:

  • The mix_attribute rule compares lots on the same pallet. It does not compare the pallet with what stands in the location.
  • lpn_multi_lot is a property of the pallet, not of the location. It gives the same answer at every location, so the step ends with no location.
  • Putaway compares the incoming SKUs and lots with what is already in the location. It does not compare the pallet's own mix with the location flags, so a pallet with two SKUs or two lots can be offered an empty location with Mix SKU or Mix Lot off. The move does make that comparison (validate_batch_self_consistency). In a directed move it comes back as a supervisor approval for sku_mixing or lot_mixing.
  • The step switches Mixed SKU and Mixed lot (diagram 4 of the other page) are a different check. They also see live reservations. The location flags here do not.
  • The owner setting owner_config.allow_mixed_lpn is not read by putaway. It applies when stock enters an existing pallet (DepositInto), and putaway relocates the whole pallet.

Where it comes from​

ItemSource
Landing check called by putawaycrates/libs/wms-inventory/src/putaway/predicate.rs:852-942
Order of the violationscrates/libs/wms-inventory/src/inventory_service.rs:838-940
mix_sku, mix_lotcrates/libs/wms-inventory/src/inventory_service.rs:999-1105
Lot attribute rules, location before zonecrates/libs/wms-inventory/src/inventory_service.rs:1433-1610, :2512-2519
Compared with the pallet's other lotscrates/libs/wms-inventory/src/inventory_service.rs:1613-1700, crates/libs/wms-lib-core/src/model/inventory/lot_attributes.rs:213-240
Lot policy of the SKUcrates/libs/wms-inventory/src/inventory_service.rs:1705-1735
lpn_multi_lotcrates/libs/wms-inventory/src/inventory_service.rs:1163-1290
Pallet's own mix is checked by the move, not by putawaycrates/libs/wms-inventory/src/movement/validation.rs:788-835, crates/libs/wms-inventory/src/inventory_service.rs:943-985
Defaultscrates/libs/wms-lib-core/src/model/location.rs:38-39, crates/libs/wms-lib-core/src/model/sku.rs:22, :35, crates/libs/wms-lib-sql/sql/wms-app/migrations/001_baseline.sql:2167, :2181
Code mapping to refusal stringscrates/libs/wms-inventory/src/putaway/predicate.rs:944-985

What putaway does not read​

AreaResult
Receipt policy (receipt_policy, sku.receipt_policy_id, owner_config.default_receipt_policy_id)The putaway engine and the move do not read any receipt policy field. Receiving only supplies the pallet: its LPN, lots and where it stands. Receiving also publishes the event process.receipt.ready_for_putaway, but no code in the repository starts a putaway from it. Putaway starts when the operator scans the pallet.
location.route_sequenceNot used by putaway. The order is aisle, bay, level, code.
location.processing_type, location.category, location.abcRead only by the matching step conditions.
sku.putaway_classRead only by a Putaway class condition.

Stored only. It has no effect today.​

These fields are stored and shown, but no code reads them to make a decision (searched in crates/ and clients/rf-go).

ObjectFields
Putaway zoneinbound_loc, outbound_loc, rf_pick_strategy, replenishment_allowed, replenishment_threshold, default_label_printer, default_report_printer, auto_print_addr_label, auto_print_carton_label
Locationcube (the location's own volume; the checks read max_cube_capacity), check_digit (written once when a location is created)
Receipt policyreceipt_without_po, receipt_without_asn, no_sku_on_po, asn_po_qty_discrepancy, po_qty_validation, excess_message, shortage_message and the po_* fields. See 13-receive-checks-and-policy.md.

Not confirmed by code​

  • Whether location.footprint is the field labelled "Pallet positions on floor" on every screen. The column name and the stack formula are in code. To verify: open a location card, tab Dimensions.