Skip to content

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

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.