Map Handling State
Map raw rows into the scenario's handling state table: the outcome of handling, the total handling cost realized at each facility.
This is the output side of handling. Pair it with Map Handling Policy, the per-unit rule, on baselines.
When to use this¶
- The scenario is a baseline that should preserve observed handling cost
- Cost to Serve allocates the realized cost on this table, so a per-customer breakdown needs it
Network Optimization does not read this table. It recomputes handling cost from handling policy times throughput on every run. Optimization-only workflows can skip this node.
What you need¶
- An upstream Import Data node with one row per (location, product) you have observations for
- A realized-cost column
Field mapping¶
Fields are matched by name unless you set them. When the workflow runs, every field you have not set a column for is matched against the headers listed below, case-insensitively and ignoring spaces around the header, and a space inside your header reads as an underscore, so Site Name matches site_name. Setting a column for one field fixes that field only; the others keep following your file's headers, so a renamed column is still found. A required field that no column supplies — no header matched, or you set none or one your table lacks — is reported once, with the headers your table does have.
Set mappings in the node's panel. Connect an upstream table and select the mapping node. A field matched by name is marked Matched by name; pick a column to set it yourself, and Match by name puts it back. Match all by name clears every field you set. Required fields without a match are marked in the panel.
Reshape rows in a Script first. A mapping node only says which column is which field. To drop rows, recode values, or split or combine columns, connect a Script node before it and map the columns the Script returns.
| Field | Type | Required | Example | What it is | Auto-detected headers |
|---|---|---|---|---|---|
| Location | text | Yes | Warehouse A |
Where handling occurred. Must match a Location name. | location, loc, name, id, location_id, loc_id |
| Product | text | Yes | Widget |
Product or SKU, or ALL for one total over every product at this location. Any other value must match a Product name. | product, sku, item, material, product_id |
| Realized Handling Cost | number | No | 400.0 |
Total handling cost actually incurred in the baseline (unit cost × throughput) — what working the goods in and out of this site costs, not moving them between sites. Negative amounts record credits against this cost. | realized_cost, supply_cost, handling_cost, total_supply_cost, production_cost, total_handling_cost |
How it works¶
Each row becomes a handling state record. The scenario stores the realized
totals so dashboards and side-by-side comparisons can read handling cost
directly. A location-wide (ALL) row is a single total for the location. It is
split across the products flowing through it in proportion to their throughput,
never duplicated onto each. An ALL row beside a row naming a product at the
same location is refused, since the product's total would be counted twice.
Workflow wiring¶
Pair with Map Handling Policy when building a baseline:
flowchart LR
n1["Import Data (handling.csv)"] --> n2["Map Handling Policy"]
n1 --> n3["Map Handling State"]
n4["Import Data (locations.csv)"] --> n5["Map Locations"]
n6["Import Data (products.csv)"] --> n7["Map Products"]
n2 & n3 & n5 & n7 --> n8["Create Scenario"]
Common mistakes¶
- Wiring only this node and expecting it to drive the optimizer. The optimizer reads the per-unit rate on Map Handling Policy and recomputes handling itself. It never reads this table. Cost to Serve is the other way round: this table is the one it allocates, and it reads no policy at all.
- Mapping a per-unit cost here. Realized Handling Cost is a total.
Messages this node can show¶
- Field matches several columns
- Mapped table empty
- Number outside its allowed bound
- Required field absent
- Row doesn’t fit its table
- Text padded with spaces
- Value not a plain number
The table this node makes is checked again with the rest of the scenario when Create Scenario assembles it: see messages about the scenario.
A run gives this node 5 minutes. A node that takes longer stops with Time limit reached.
Like every node, it can also stop on the checks before a run and the run's limits.