Inventory Transfer — Bulk Upload

← Hub

Step 1 — Upload

Spreadsheet columns: stockid (or sku / item) + qty (or quantity / transfer qty). Pick the FROM and TO locations below — all rows in this upload move between those two locations.

For each row we classify against the source's on-hand and masterpack composition:

  • ok_exact qty equals source on-hand (whole-location move)
  • ok_whole_masterpacks qty is the sum of one or more whole masterpacks (no split needed)
  • warn_partial_split qty doesn't align — one masterpack will be split
  • warn_below_min_pack qty is smaller than the smallest single masterpack — a split is forced
  • error_exceeds_source qty > source on-hand — by default the available qty moves and the excess goes in the skip log; tick "Skip whole row" on Step 2 to skip the entire row instead
  • error_not_at_source stockid has zero on-hand at the source location — always skipped (logged to skip report)
  • error_unknown_sku spreadsheet value didn't match any stockmaster.stockid (exact / case-insensitive) or stockmaster.description (case-insensitive) — always skipped

SKU resolution order: exact stockid → case-insensitive stockid → case-insensitive description (only when unambiguous). If none match the row is flagged error_unknown_sku and skipped from the commit. The resolved stockid (and the tier used) is shown in the preview, with "from raw value" appearing underneath when the resolution differs.

What gets created in the database when I commit?

One TrfID is reserved (systypes.typeid=16 +1). Then per row:

  1. masterpacksUPDATE loccode = TO for each masterpack that moves whole.
  2. masterpacks / innerpacks — when a partial split is required:
    • Original at FROM: innerpacks.packcount shrunk to the remaining qty, cartoncount=1.
    • New masterpack inserted at TO (cartoncount=1) + matching innerpack (packcount = the taken qty).
  3. locstock — decrement FROM, upsert TO (ON DUPLICATE KEY UPDATE quantity = quantity + VALUES(quantity)).
  4. stockmoves — two rows per transfer line, type=16, transno=TrfID: one at FROM with qty=-X, one at TO with qty=+X.
  5. loctransfers — audit row, shipqty = recqty (immediate receive).
  6. loctransfermasterpacks — one row per masterpack involved in this line, received=1.

NOT touched: gltrans (skipped — most migration locations don't have a stockact configured, and a transfer between two inventory locations is debit + credit on the same GL account = net zero), debtortrans, supptrans.