Sorting Parcel Inbound

Sorting Parcel Inbound with LightTag navigation. Device pxx=200, pxy=200. Main flow: Start → Package Step (scan parcel) ↔ Placing Step (Pallet/Quantity/Article, Confirmed/Skip, LightTag). Options: New Pallet (numpad), New Container, Clear allocation, Pallet Info. onStopJobCode: finalizeJobData, done(true).

Main flow
REST API endpoints are documented step by step below the diagram — not on the device mockups.
Start Step
OPTION
START
onAppear: If workflow.job → Package Step. OPTION → Options Start Step. START → Package Step.
Package Step
OPTION
Scan parcel
Scan (barcode > 4 chars): create entry (parcel_article, palette from reusable or max+1), scanLog, → Placing Step. Short barcode → negative_feedback. OPTION → Options Package Step.
Placing Step
OPTION
Pallet
1
Quantity
0
Article
2545465
Confirmed
Skip
onAppear: LightTag current_palette (worker color, TRIPLE). Confirmed / DoubleTrigger / scan pallet barcode: entry.palette_quantity=1, check, scanLog → Package Step. Skip: remove entry → Package Step. Wrong scan → negative_feedback. onDisappear: disableLightTag. OPTION → Options Placing Step.
(Return from Placing: Package Step; then scan again → Placing)
Completion path (Check Done / Completion)
Check Done Step
OPTION
START
onAppear: all result.check set → Completion Step; else → Package Step. (No targetStep points to Check Done Step in the workflow.)
Completion Step
OPTION
Sortinglist complete
Please save
SAVE
SAVE: finalizeJobData(), api.workflow.done().
Options menus (via OPTION button)
Options Start Step
BACK
No OPTION available
BACK
back / back1 → Start Step
Options Package Step
BACK
New Pallet
New Container
Clear allocation
Pallet Info
back → Package Step. New Pallet → Count Step Package Step. New Container → Options Package Step 2. Clear allocation → Clear Allocation Step. Pallet Info → Pallet Info Step.
Options Placing Step
BACK
New Pallet
New Container
Clear allocation
back → Placing Step. New Pallet → Count Step Placing Step. New Container → Options Placing Step 2. Clear allocation → Clear Allocation Step.
Branch: New Container (confirmation)
Options Package Step 2
Are you sure? New Container?
No
Yes
No → Package Step. Yes → finalizeJobData(), new Job, api.workflow.done(true, newJob).
Options Placing Step 2
Are you sure? New Container?
No
Yes
No → Placing Step. Yes → finalizeJobData(), new Job, done(true, newJob) → Package Step.
Branch: Clear allocation
Clear Allocation Step
BACK
Clear allocation
Scan the Lighttag for allocation
Scan LightTag = pallet no.: entries to clearedAllocations, pallet in reusablePalettes, results filtered → Package Step. Invalid scan → negative_feedback. BACK → Package Step.
Branch: Pallet Info
Pallet Info Step
OPTION
Scan pallet for Info
Scan Pallet: load entries (current_palette, current_parcel_article, quantity) → Pallet Info 2 Step. No match → negative_feedback. OPTION → Options Pallet Info.
Pallet Info 2 Step
SKU
000002286902
Quantity
58
Done
Done → Package Step. Another pallet scan → Pallet Info 2 Step (show other pallet).
Options Pallet Info
BACK
Back to Process
back → Pallet Info Step. back_process → Package Step.
Branch: New Pallet (Numpad)
Count Step Package Step
Del
7
8
9
4
5
6
1
2
3
0
OK
0–9: set selected_palette. OK: palette_quantity=0 for all entries of this pallet → Package Step. Del: selected_palette null. onDoubleTrigger → Package Step.
Count Step Placing Step
Del
7
8
9
4
5
6
1
2
3
0
OK
Same numpad logic: OK → Placing Step (palette_quantity=0 for selected pallet). onDoubleTrigger → Placing Step.
Flow overview
Start Step: With workflow.job automatically → Package Step; else START button. OPTION → Options Start Step ("No OPTION available", BACK → Start).
Package Step: Scan parcel (barcode > 4 chars): new entry (parcel_article, palette from reusablePalettes or max+1, palette_quantity 0), scanLog "SCAN;timestamp;sku;palette", → Placing Step. Short barcode → negative_feedback. OPTION → Options Package Step (New Pallet, New Container, Clear allocation, Pallet Info).
Placing Step: Shows pallet no., quantity (sum for this pallet), article (SKU). onAppear: LightTag for current_palette (worker.additionalData, TRIPLE). "Confirmed" button or onDoubleTrigger or scan pallet LightTag barcode: entry.palette_quantity=1, entry.check, scanLog entry → Package Step. Skip: remove entry from results → Package Step. Wrong scan → negative_feedback. onDisappear: disableLightTag(current_lighttag). OPTION → Options Placing Step (New Pallet, New Container, Clear allocation).
Check Done Step / Completion Step: Present in definition; Check Done onAppear checks whether all result.check set → Completion Step, else → Package Step. No other step links to Check Done. Completion Step: SAVE → finalizeJobData(), api.workflow.done().
New Container (Options Package Step 2 / Options Placing Step 2): "Are you sure?" No → back (Package/Placing). Yes → finalizeJobData(), new job created, api.workflow.done(true, newJob) (current job completed, new open job).
Clear Allocation Step: Scan LightTag (pallet no.): all results with this pallet → clearedAllocations (with clearedAt), removed from results, pallet in reusablePalettes. Next scan can assign this pallet again. BACK → Package Step.
Pallet Info: Scan Pallet → Pallet Info 2 Step (SKU, quantity per entry). Done → Package Step. Options Pallet Info: Back to Process → Package Step, BACK → Pallet Info Step.
New Pallet (Count Step Package/Placing): Numpad selects selected_palette (digits 0–9). OK sets palette_quantity=0 for all entries of this pallet (Package: → Package Step; Placing: → Placing Step). Del clears display. onDoubleTrigger → back to previous step.
onStopJobCode: finalizeJobData(), api.workflow.done(true). finalizeJobData writes summary lines (SUMMARY;sku;palette;qty, PALETTE_SUMMARY) to scanLog/results.
Data: job.results[]: parcel_article, palette, palette_quantity, time, check. job.scanLog: SCAN;timestamp;sku;palette, SUMMARY, PALETTE_SUMMARY. job.clearedAllocations on Clear allocation. workflow.reusablePalettes for pallet reuse.

REST API — Step by Step

Required HTTP Data Connection endpoints per workflow step (derived from step logic). Standard PoV JSONs still use CSV/local job data — these endpoints are what your ERP/WMS should expose when migrating to HTTP.

Main flow

1 Package Step
GET validate-sku Validate inbound SKU / parcel article
2 Placing Step
GET validate-palette Validate palette number (LightTag ID)
POST submit-allocation Save SKU quantity on palette
3 Check Done Step
POST complete-inbound Save inbound batch and finish job
4 Completion Step
POST complete-inbound Save inbound batch and finish job

Special steps

5 Clear Allocation Step
DELETE clear-allocation Remove allocation from palette
6 Pallet Info Step
GET get-palette-info Load palette contents and quantities
GET validate-palette Validate palette number (LightTag ID)
7 Pallet Info 2 Step
GET get-palette-info Load palette contents and quantities
8 Count Step Package Step
GET validate-palette Validate palette number (LightTag ID)
9 Count Step Placing Step
GET validate-palette Validate palette number (LightTag ID)

Options menu

10 Options Package Step 2
POST create-new-container Create new palette / container for inbound
POST complete-inbound Save inbound batch and finish job
11 Options Placing Step 2
POST create-new-container Create new palette / container for inbound
POST complete-inbound Save inbound batch and finish job

Technical Reference — Sorting Parcel Inbound

Inbound SKU → palette assignment → SAVE. See the step-by-step section above for which endpoint belongs to which workflow step.

1 · HTTP Data Connection setup

Connection type
HTTP Data Connection
Identifier
e.g. erp-system — referenced as dataConnection in the workflow
Base URL
Customer web service URL (HTTPS)
Authentication
None, Basic, Bearer, or OAuth
Endpoint identifier
Unique name per operation (must match step cards above)
Endpoint URL
Relative path, e.g. /orders/{orderId}/lines/{lineId}
Pre / post processing
Transform request and map response to NIMMSTA job format
requestOverride
Workflow can override body, headers, params, query (JavaScript)
Async rules: await works in loadData pre/post processing, onStopJobCode, and api.workflow.runActionCodeAsync(...). Step handlers (onScan, onButtonPress) are synchronous — use a loading step or workflow actions for API calls.

2 · Workflow integration patterns

loadData (Load Step)
"loadData": {
  "endpoint": "get-job",
  "dataConnection": "erp-system",
  "preProcessCode": "workflowStep.lastError = null; return request;",
  "postProcessCode": "return response.data;",
  "onSuccess": [{ "code": "job = setJob(response); ..." }]
}
Async action (confirm / complete)
"actions": [{
  "code": "api.workflow.runActionCodeAsync('confirmPickLine')
    .then(() => { ... })
    .catch((e) => { workflowStep.lastError = e; });"
}]

3 · Job object (get-jobsetJob)

{ "name": "Order or batch name", "results": [ { /* fields below */ } ] }
Field in job.results[]Description
parcel_articleScanned SKU
palettePalette number (= LightTag ID)
palette_quantityQuantity on palette
scanLogAudit log for export

4 · Request / response examples

complete-inbound
POST /inbound/batches
{ "positions": [{ "sku": "SKU-8842", "palette": 3, "quantity": 12 }] }
→ api.workflow.done(true);

Device pxx=200, pxy=200. PoVTemplates/Sorting Parcel Inbound.json