Skip to main content

Putaway zone settings

A putaway zone groups locations. Putaway searches one zone at a time. Capacity limits and a temperature range can be set on a zone. A zone can also hold lot mixing rules.

This file lists every column of the zone and of the zone lot mixing rule. Read 00-putaway-overview.md first for the order of work.

Related files: policy and steps in 01-putaway-policy-steps-and-criteria.md; locations in 03-location-settings.md.

How to read this file​

  • Screen: Sidebar > Topology > Putaway Zones. List form putawayzone_list_form. Open a row. The card has three tabs: General, Capacity, Printer Settings. Below the tabs there is a list of lot mixing rules (see section 3).
  • Roles: Admin and Manager create, change and delete zones and zone rules. Operator and Viewer can read (crates/services/app-server/src/web/rpcs/putawayzone_rpc.rs:20-26).
  • Table: putawayzone (BASELINE:4174). BASELINE is crates/libs/wms-lib-sql/sql/wms-app/migrations/001_baseline.sql.
  • Paths to code start at crates/libs/ unless they start with crates/services/.
  • "Stored only. It has no effect today." means: no code in any crate reads the value.
  • Units: stored as grams, millimetres and cubic millimetres. The screen converts to the warehouse display unit for the fields marked "physical" (weight and volume). Counts and temperatures are not converted (wms-meta-ui/migrations/004_the_physical_columns_say_what_they_measure.sql).
  • All limits: 0 means "no limit". A limit of 0 is not a block. Putaway reports the check as not run (..:no_limit) and still offers the location.

Seed values​

Two zones come with a new warehouse (BASELINE:8627):

CodeDescriptionInbound / Outbound / Picking / MissingColorLimits
DOCKDockSTAGE / STAGE / PICKTO / LOST#4A90D9all 0, no temperature
RACKRackSTAGE / STAGE / PICKTO / LOST#D97B4Aall 0, no temperature

Zone DOCK is also the default zone of a new location (location.putawayzone default 'DOCK'). Do not delete it.

1. Fields on the card​

1.1 Code​

ItemValue
UI labelCode (required). Tab General.
Columnputawayzone.code
Type and valuesText, up to 20 characters. Primary key. Unique.
DefaultNo default.
What it doesThe name of the zone. All other tables point at it.
AffectsLocations (location.putawayzone), SKU preferred zone (sku.putawayzone), putaway steps (to_zone, from_zone), allocation policy steps, work areas (which zones an operator group serves), equipment profile zone exclusions, cycle count scope. FKs: BASELINE:16751, 16891, 17073, 17479, 17507, 18109, 18249.
ExampleCOLD, BULK, PICK.
Interacts withCannot be renamed. The update command fixes code to "not changed" (putawayzone_rpc.rs:37-62).
When emptyA zone needs a code.
If you change itYou cannot. To rename: create the new zone, set Putaway Zone on the locations and SKUs, change the steps, then delete the old zone.

Delete rules: the delete is refused while any location, SKU, putaway step, allocation step, work area or equipment exclusion points at the zone. Zone lot rules go with the zone (CASCADE). The error is a database foreign-key error that names the constraint, for example fk_location_putawayzone.

1.2 Description​

ItemValue
UI labelDescription. Tab General.
Columnputawayzone.description
Type and valuesText, up to 60 characters. NOT NULL.
DefaultEmpty text (''). Seeds: Dock, Rack.
What it doesA readable name.
AffectsThe zone list column Description. The 3D warehouse legend (it shows the description, or the code when empty: public/assets/js/warehouse-3d.js:121-125, 1903). The zone pick list in the step editor (zones source, crates/libs/wms-lib-sql/sql/wms-meta-ui/migrations/001_baseline.sql:6357: COALESCE(description, code)).
ExampleCold store 2-8 C.
Interacts withBecause the column is never NULL, the step editor's zone list shows an empty name for a zone with an empty description. The 3D page does fall back to the code. Fill in the description.
When emptySee above.
If you change itDisplay only.

1.3 Inbound Location​

ItemValue
UI labelInbound Location (list column: Inbound Loc). Tab General. Pick list of locations.
Columnputawayzone.inbound_loc
Type and valuesLocation code. NOT NULL. FK to location(code), RESTRICT (fk_putawayzone_inbound_loc).
DefaultSTAGE (schema default and code constant DEFAULT_INBOUND_LOC, wms-lib-core/src/model/location.rs:32). Seeds: STAGE.
What it doesMeant as the waiting place for goods coming into the zone.
AffectsStored only. It has no effect today. The value is only checked when you save: the location must exist, otherwise Location XYZ not found (wms-lib-core/src/model/putawayzone.rs:182-225). I searched all crates, SQL views and the Go RF client. Nothing reads it.
ExampleSTAGE.
Interacts withYou cannot delete the location while a zone names it (RESTRICT).
When emptyOn create, an empty value is replaced by STAGE.
If you change itNothing else changes.

1.4 Outbound Location​

ItemValue
UI labelOutbound Location (list column: Outbound Loc). Tab General.
Columnputawayzone.outbound_loc
Type and valuesLocation code. NOT NULL. FK RESTRICT (fk_putawayzone_outbound_loc).
DefaultSTAGE (constant DEFAULT_OUTBOUND_LOC, location.rs:33).
What it doesMeant as the waiting place for goods leaving the zone.
AffectsStored only. It has no effect today (same search as 1.3).
ExampleSTAGE.
Interacts withSame as 1.3.
When emptyReplaced by STAGE on create.
If you change itNothing else changes.

1.5 Picking To Location​

ItemValue
UI labelPicking To Location. Tab General.
Columnputawayzone.picking_toloc
Type and valuesLocation code. NOT NULL. FK RESTRICT (fk_putawayzone_picking_toloc).
DefaultPICKTO (DEFAULT_PICKING_TOLOC, location.rs:34).
What it doesThe place picked goods are taken to. It is the "to location" of a pick task when the task is made.
AffectsTask generation: each pick task gets to_location = the picking_toloc of the zone of the pick's source location (wms-outbound/src/picking/infrastructure/tasks.rs:70, PutawayZoneBmc::picking_toloc_for_location, putawayzone.rs:354). Also the delivery place of a pick that has lost its task (wms-lib-core/src/model/outbound/pick_assignment.rs:365-366).
ExampleZone PICK picks go to PICKTO. Zone COLD picks go to COLD-OUT.
Interacts withThe owner's Pick drop location (owners.picking_toloc) comes first for closing a pick pallet. The zone value is used only when the owner has none. The owner's location must be of type Pickto, Stage or Door. This zone field has no type rule.
When emptyReplaced by PICKTO on create.
If you change itApplies to tasks made after the change. Existing tasks keep their to_location.

1.6 Missing To Location​

ItemValue
UI labelMissing To Location. Tab General.
Columnputawayzone.missing_toloc
Type and valuesLocation code. NOT NULL. FK RESTRICT (fk_putawayzone_missing_toloc).
DefaultLOST (DEFAULT_MISSING_TOLOC, location.rs:35).
What it doesWhere the rest of the stock goes when a short pick says "relocate the rest to the missing location".
Affectswms-outbound/src/picking/remediation.rs:431 (PutawayZoneBmc::missing_toloc_for_location), used only by the short-reason action with target mode ZoneMissingToLoc.
ExampleA pick of 10 finds 6. The short reason moves the 6 left to the zone's LOST.
Interacts withA short reason can use a fixed location instead. Then this field is not read. If the source location has no zone row, the error is source location X has no zone missing location.
When emptyReplaced by LOST on create.
If you change itApplies to shorts that happen after the change.

1.7 RF Pick Strategy​

ItemValue
UI labelRF Pick Strategy. Tab General.
Columnputawayzone.rf_pick_strategy
Type and valuesText, up to 10 characters. NULL allowed.
DefaultNULL.
What it doesNothing today.
AffectsStored only. It has no effect today. I searched all crates, the Go RF client and SQL. Only the zone model and the API carry it.
ExampleFIFO. It changes nothing.
Interacts withNothing.
When emptyAllowed. Clearing it sets NULL.
If you change itNothing else changes.

1.8 Replenishment Allowed​

ItemValue
UI labelReplenishment Allowed (checkbox). Tab General.
Columnputawayzone.replenishment_allowed
Type and valuestrue or false. NOT NULL.
Defaultfalse. Seeds: false.
What it doesNothing today.
AffectsStored only. It has no effect today. The form only enables the field Replenishment Threshold when this box is ticked (wms-meta-ui/migrations/069_form_fields_use_typed_gates.sql:89-91). No engine reads it.
ExampleTicked. Nothing happens.
Interacts withPairs with 1.9 in the form. Replenishment is a placeholder in the product (wms-meta-ui migration 048).
When emptyNot possible. NOT NULL.
If you change itNothing else changes.

1.9 Replenishment Threshold​

ItemValue
UI labelReplenishment Threshold. Tab General.
Columnputawayzone.replenishment_threshold
Type and valuesWhole number, 0 or more (CHECK putawayzone_replenishment_threshold_check). NOT NULL.
Default0.
What it doesNothing today.
AffectsStored only. It has no effect today.
Example20. Nothing happens.
Interacts withEnabled in the form only while 1.8 is ticked. A negative number is refused by the database.
When emptyNot possible. NOT NULL.
If you change itNothing else changes.

1.10 Color​

ItemValue
UI labelColor. Tab General. Plain text input.
Columnputawayzone.color
Type and valuesText, up to 7 characters. NOT NULL. Use a hex color such as #D97B4A.
Default#888888. Seeds: DOCK #4A90D9, RACK #D97B4A.
What it doesThe color of the zone on the 3D warehouse page and in its legend.
AffectsSidebar > Topology > 3D Warehouse. The page reads the zone list (crates/services/web-ui-server/src/routes/warehouse_3d_handler.rs:215-230) and draws each location in its zone color (warehouse-3d.js:121-125, 431). Also the list column Color.
Example#2E8B57.
Interacts withThe form does not check the format. A text that is not a color is passed to the 3D library and does not draw as expected.
When emptyNot possible. NOT NULL. A blank in the update is not accepted as a clear.
If you change itDisplay only.

2. Capacity tab and printer tab​

2.1 Max Cube​

ItemValue
UI labelMax Cube. Tab Capacity. Physical: volume.
Columnputawayzone.max_cube
Type and valuesDecimal, 0 or more. NOT NULL. Stored in cubic millimetres.
Default0 = no limit.
What it doesThe total volume of all stock in all locations of the zone, plus volume promised by active reservations, may not exceed this.
AffectsPutaway: ZoneCapacity (wms-inventory/src/putaway/space.rs:1116-1143) and the zone block of fits (space.rs:782-847). Enforced whatever the step's Cube switch says (the move enforces it too). Refusal capacity with the detail zone_cube: limit L, attempted A. The move itself: validate_destination_capacity (wms-inventory/src/movement/validation.rs:920-1005), error capacity exceeded (zone_cube): limit=L, attempted=A.
ExampleZone limit 100 m³ = 100,000,000,000 mm³. Stock + promised = 98.5 m³. A pallet of 1.8 m³ arrives from another zone. 100.3 m³ is above 100: refused.
Interacts withOnly when the pallet comes from another zone. A move inside one zone adds nothing to the zone, so the zone limit is skipped (space.rs:782, validation.rs). The volume of a pallet is sum of SKU cube x quantity. A SKU with cube 0 adds 0.
When empty0 = no limit. The step reports zone_cube:no_limit and still offers the location.
If you change itNext suggestion and next move only. Stock already in the zone stays even if it is now over the limit. Only new arrivals are refused.

2.2 Max Weight​

ItemValue
UI labelMax Weight. Tab Capacity. Physical: weight.
Columnputawayzone.max_weight
Type and valuesDecimal, 0 or more. NOT NULL. Stored in grams.
Default0 = no limit.
What it doesSame as 2.1 for weight.
Affectsspace.rs:829-834. Detail zone_weight: limit L, attempted A. The move: capacity exceeded (zone_weight). Enforced whatever the step's Weight switch says.
ExampleLimit 20,000 kg = 20,000,000 g. In zone 19,400,000 g. Pallet 720,000 g. Attempted 20,120,000 g. Refused.
Interacts withSame as 2.1. If the pallet has no known weight, the check is not run (zone_weight:no_stock_weight).
When empty0 = no limit.
If you change itSame as 2.1.

2.3 Max Cases Count​

ItemValue
UI labelMax Cases Count. Tab Capacity. A count, not converted.
Columnputawayzone.max_cases_count
Type and valuesDecimal, 0 or more. NOT NULL.
Default0 = no limit.
What it doesA limit on how many containers (pallets and cases) that hold stock may stand in the zone.
AffectsPutaway: space.rs:813-821 (always on, no switch turns it off). Detail zone_cases_count: limit L, attempted A. The move: validation.rs:990-1000.
ExampleLimit 50. 49 stock-bearing containers stand in the zone. A pallet whose stock is on 3 cases arrives: 49 + 3 = 52. Refused: zone_cases_count: limit 50, attempted 52.
Interacts withThe count is the number of different containers that have a stock row in the zone, including child cases (inventory_balances.rs:1561-1584). Promised pallets are not counted here. The pallet adds one per stock-bearing container in its subtree. Skipped when the pallet is already in this zone. Loose stock adds none.
When empty0 = no limit.
If you change itNext suggestion and move only.

2.4 Min Temperature and Max Temperature​

ItemValue
UI labelMin Temperature, Max Temperature. Tab Capacity.
Columnputawayzone.min_temperature, putawayzone.max_temperature
Type and valuesDecimal, can be negative. NULL allowed. CHECK: min must not be above max (chk_putawayzone_temperature_order). Use the same unit as the SKU fields (Min Temperature (°C) on the SKU form).
DefaultNULL (no limit). Seeds: NULL.
What it doesThe temperature range this zone holds.
AffectsPutaway only, and only for steps with Temperature on: step::zone_suits_temperature (step.rs:438-469). A step whose zone does not suit is skipped (skipped:temperature).
ExampleCOLD: min 2, max 8. SKU A: 0 to 4: overlaps (2 to 4), step runs. SKU B: 10 to 20: no overlap, step skipped. A pallet with both A and B: the step is skipped (all lines must fit).
Interacts withThe test is overlap, not containment. An empty bound is unlimited on that side, for the zone and the SKU. A SKU with no range always fits. Receiving and moves do not check temperature.
When emptyNULL = no constraint. Clear the field to set NULL.
If you change itNext suggestion only. Stock is not moved.

2.5 Default Label Printer and Default Report Printer​

ItemValue
UI labelDefault Label Printer, Default Report Printer. Tab Printer Settings.
Columnputawayzone.default_label_printer, putawayzone.default_report_printer
Type and valuesText, up to 45 characters. NULL allowed.
DefaultNULL.
What it doesNothing today.
AffectsStored only. It has no effect today. Label printing picks a printer from the table printer_assignments. Its "Zone" tier uses scope_id = the zone id (wms-lib-core/src/model/printer_assignments.rs:198), not these text fields. The comment there names the old rule "DefaultLabelPrinter of the zone", but the code does not read the column.
ExampleP01. Printing ignores it.
Interacts withTo send a zone's labels to a printer, create a printer assignment with scope Zone for this zone (API printer_assignments_rpc). The order is Zone, then User, then Owner, then Warehouse.
When emptyAllowed. Clearing sets NULL.
If you change itNothing else changes.

To verify (the screen for printer assignments): I found no sidebar entry for printer assignments in the menu metadata. Steps: sign in as Admin, open the sidebar and look for a printers or assignments item; if none, call the API method list_printer_assignments and check whether rows with scope_type = Zone exist.

2.6 Auto Print Addr Label and Auto Print Carton Label​

ItemValue
UI labelAuto Print Addr Label, Auto Print Carton Label (checkboxes). Tab Printer Settings.
Columnputawayzone.auto_print_addr_label, putawayzone.auto_print_carton_label
Type and valuestrue or false. NOT NULL.
Defaultfalse.
What it doesNothing today.
AffectsStored only. It has no effect today. The only automatic label print on receiving is controlled by the owner setting auto_print_lpn_on_receive (wms-inbound/src/service/receipt/shared/auto_print.rs:54). Packing prints use packing code. No code reads the zone flags.
ExampleTicked. No label prints.
Interacts withNothing.
When emptyNot possible. NOT NULL.
If you change itNothing else changes.

3. Zone lot mixing rules​

Screen: the list Lot Commingle Rules under the zone card (list columns Attribute, Allow Mix, Putawayzone Code; buttons New, Delete, Refresh). Edit form: Putaway Zone Code (read-only), Attribute Code (picker, required), Allow Mix. Table: putawayzone_lot_commingle (BASELINE:4236). Unique per (zone, attribute) (BASELINE:11439). Roles: Admin, Manager.

A rule answers one question: "may lots with different values of this attribute stand together on one pallet that lands in this zone?" (wms-inventory/src/inventory_service.rs:1433-1592).

3.1 Putaway Zone Code (rule)​

ItemValue
UI labelPutaway Zone Code (list header Putawayzone Code).
Columnputawayzone_lot_commingle.putawayzone_code
Type and valuesZone code. FK to the zone, CASCADE (deleting the zone deletes its rules).
DefaultTaken from the open zone.
What it doesWhich zone the rule belongs to.
AffectsRules are read per destination location's zone (inventory_service.rs:1537-1555).
ExampleFOOD.
Interacts withA location rule for the same attribute wins over the zone rule (3.3).
When emptyNot allowed. Unknown zone: Putaway Zone 'X' not found (putawayzone_lot_commingle_rpc.rs).
If you change itThe form blocks it.

3.2 Attribute Code (rule)​

ItemValue
UI labelAttribute Code (list header Attribute).
Columnputawayzone_lot_commingle.attrib_code
Type and valuesText, up to 20 characters. Must be the code of a lot policy attribute (lot_policy_attribute.attrib_code).
DefaultNo default.
What it doesThe lot attribute the rule is about.
AffectsThe rule is applied only to SKUs whose lot policy contains this attribute (inventory_service.rs:1455-1457, 1505). For other SKUs it is ignored.
ExampleALLERGEN.
Interacts withOne rule per zone and attribute. A second one is refused as a duplicate key.
When emptyNot allowed. Unknown attribute: Lot attribute 'X' not found.
If you change itAllowed in the API (the new code is checked).

3.3 Allow Mix​

ItemValue
UI labelAllow Mix (checkbox).
Columnputawayzone_lot_commingle.allow_mix
Type and valuestrue or false. NOT NULL.
Defaulttrue.
What it doesfalse: a pallet may not land in this zone if the lots on it have different values of the attribute. true or no rule: no restriction.
AffectsThe 4th check of putaway (LandingRule, predicate.rs:855-905), every move landing (validate_stock_landing) and receiving (deposit.rs). Refusal code mix_attribute, text attribute ALLERGEN=YES mixing not allowed for lot L2 on lpn Some("LPN1") [Some("putawayzone_lot_commingle rule on zone FOOD")].
ExampleZone FOOD, ALLERGEN, Allow Mix off. Pallet LPN1 has lot L1 (ALLERGEN=NO) and lot L2 (ALLERGEN=YES). LPN1 cannot land in any FOOD location.
Interacts withSee below.
When emptyNo rule = mixing allowed.
If you change itNext landing only. Stock already in the zone is not touched.

How the rule is chosen (inventory_service.rs:1495-1592):

  1. For each attribute of the SKU's lot policy, the system looks for a location rule (Lot Commingle on the location card). If one exists for the attribute, it decides. This is also true when it says Allow Mix = on: that is a deliberate exception to a zone ban.
  2. If there is none, it uses the zone rule of the location's zone.
  3. If there is none, mixing is allowed.
  4. If the location's Mix Lot flag is off, the attribute rules are skipped. The plain lot rule is stricter and already decides (inventory_service.rs:1449-1453).

What "mixing" means here: the system counts stock rows in the landing container (the pallet) that belong to a different lot with a different value of the attribute (wms-lib-core/src/model/inventory/lot_attributes.rs:213-240). It does not compare with stock already standing in the location. A loose landing (no pallet) and a lot with no recorded value for the attribute pass.

To verify (pallets whose stock is on child cases): the count above matches inventory_balances.container_id to the landing LPN exactly. Elsewhere the code says a real pallet keeps its stock on child cases (space.rs:51-61). If so, the rule may not see those lots. Steps: (1) Give SKU W1 a lot policy with attribute ALLERGEN. (2) Add zone rule FOOD / ALLERGEN / Allow Mix off. (3) Receive a pallet LPN whose stock is on two child cases with lots L1 (ALLERGEN=NO) and L2 (ALLERGEN=YES). (4) Run the Dry run on a policy whose step searches FOOD, with TraceDetail full. (5) If FOOD locations show no mix_attribute refusal, the rule did not see the child cases.

4. How the zone is used by putaway (summary)​

StepWhat happensZone setting read
Search spaceZone named on this step or Zone from the SKU picks the zone.Code
TemperatureOnly with the step switch Temperature.Min Temperature, Max Temperature
CandidatesLocations of the zone, sorted by aisle, bay, level, code.none
Fit (zone part)Only if the pallet comes from another zone.Max Cube, Max Weight, Max Cases Count
LandingLocation and zone lot rules.lot mixing rules

5. Count of zone settings​

20 columns on the zone (plus the id and audit stamps) and 3 on the zone rule. Of the 20, these are stored only: Inbound Location, Outbound Location, RF Pick Strategy, Replenishment Allowed, Replenishment Threshold, Default Label Printer, Default Report Printer, Auto Print Addr Label, Auto Print Carton Label.