Covers thirteen screens across four areas:
| Area | Screens | Primary audience |
|---|---|---|
| Order & item setup (Part 2, Part 3) | Order Type Maintenance · Item Allowed by Order Type · Item Availability · Store Availability · Stock Import and Log | HQ / System Admin · PPIC Admin |
| Delivery timing & store governance (Part 4) | Order Cut-off Day · Store Blocking · Store Batch Maintenance | System Admin · Credit Dept · PPIC |
| Placing an order (Part 5) | New Forecast Order · New Ad-Hoc Order · Order Listing · Order Details | Store User · PPIC |
| Processing & receiving (Part 6, Part 7) | Order Posting · Auto-GRN | PPIC (Plant) · Store User |
Internal appendix: Xilnex CS & Implementation — Appendix A.
TL;DR. Configuration decides what is possible; the order screens decide what actually happens. Configure in this order: Order Type → Item Allowed by Order Type → Item Availability → Store Availability → Order Cut-off Day → Store Batch. Then orders flow New Forecast / Ad-Hoc Order → Order Listing → Order Posting → Auto-GRN.
Two facts save the most support time: an order type with no cut-off rule configured is never blocked (section 4.1), and the posting daemon polls every 30 minutes against those same cut-off rules — manual posting is exception handling (Part 6). If a store says "I can't find this item," work through Recipe 6.
Each configuration module is an independent gate. An order line is only possible when all gates pass. They operate at different levels, which is the source of most confusion:
| # | Gate | Module | Configured at | What a failure looks like |
|---|---|---|---|---|
| 1 | Does this order type exist and is it selectable? | Order Type Maintenance | Company | The order type does not appear at order creation |
| 2 | Is the store inside its operating window? | Store Availability | Store | Store cannot create new orders; orders already in flight are unaffected and continue to process normally |
| 3 | Is the store credit-blocked? | Store Blocking (4.2) | Store | Store cannot create new orders, and existing in-flight orders move to BLOCKED status — this is the only store-level mechanism that hard-stops in-flight orders |
| 4 | Is this item's category permitted under this order type? | Item Allowed by Order Type | Company (by item category) | The whole category is missing from the item list |
| 5 | Is this specific item requestable by this store, today, from its vendor? | Item Availability | Item + Store | A single item is missing from the list, or the post is rejected |
| 6 | Is the delivery date still before its cut-off? | Order Cut-off Day (4.1) | Company or Plant, by order type | The item is visible but its date cell is locked, or the order will not post |
Gates 1–5 decide whether the line can exist. Gate 6 decides whether it can still be changed — it is a timing gate, and unlike the others it is opt-in: an order type with no rule is never blocked.
Gate flow: Store user starts an order → check order type is Active (else type not selectable) → check store is within opening/closing dates (else no new orders — existing orders still process) → check store is not credit-blocked (else blocked by Credit Dept, and in-flight orders move to BLOCKED) → check item category is ticked for this order type (else category hidden) → check item is allowed for this store within date window (else item hidden / rejected at post) → check delivery date is before cut-off (else date cell locked, read-only) → item can be ordered.
Two moments of enforcement. Gates are checked when the store browses items (soft — failing items are simply not shown) and again when the store posts the order (hard — the post is rejected and the offending lines are named). An item can therefore pass at creation and fail at posting if configuration changed in between.
Changes apply to the next order, not to orders already in flight. Editing any of these configuration screens does not retroactively alter orders that already exist.
Note — source of downstream behaviour. Every screen in this guide except Auto-GRN (Part 7) is described from the built UI. What happens downstream of a failed gate — orders moving to BLOCKED, no PO being generated, the soft-hide-then-hard-reject pattern above — is drawn from the Phase 2 PRD §4.7 and the ordering engine design §6.1, not observed in the build. Statements of this kind are marked (spec) throughout. Verify them before the guide is released.
Warning — Store Blocking is the only store-level source of BLOCKED. Store Blocking is a separate module operated by the Credit Department for overdue franchisee payments. Unlike Store Availability — which only prevents new orders and lets in-flight orders continue to process — Store Blocking additionally drives existing confirmed-unposted orders to BLOCKED and stops PO generation. If a store's opening/closing dates look correct but existing orders have gone to BLOCKED, check Store Blocking first — section 4.2 sets the two modules side by side.
The screen is a wizard with lettered sections. All of them feed the Validation panel at the bottom; Activate stays disabled until every check passes.
A · Archetype — pick the base behaviour the type maps onto. This is the most consequential choice on the screen and it maps to engine code, not configuration:
| Archetype | Use when |
|---|---|
| Forecast / Replenishment | Store-initiated, recurring order placed against a forecast or standing need |
| Ad-hoc / Custom | One-off, event- or exception-driven order with no recurring cadence |
| Allocation | Warehouse or DC pushes stock to an outlet on its own initiative — the outlet does not request it |
| Inter-location Transfer | Warehouse-to-warehouse movement to source stock a receiving location cannot supply itself |
If none of the four fit, the type needs engineering work — stop and raise it rather than forcing the closest match.
B · Identity & labeling
C · Quantity model — tick which quantity tiers an order of this type carries. Tiers must be contiguous — you cannot have Delivery qty without Actual qty.
D · Location & direction — Outlet → Warehouse (standard store request), Warehouse → Outlet (allocation), or Warehouse → Warehouse (transfer). Selectable options depend on the archetype chosen in A, so set A first.
E · Creation access — tap + on each permission group that may create orders of this type. At least one is required.
F · Document & integration
G · Custom fields — optional. + Add custom field for data this type needs beyond the standard set. Every custom field must be named or validation fails.
Validation — the panel lists each blocking check with its current state. Clear all ! items, then press ✓ Activate.
| Check | Passes when |
|---|---|
| Type code — alphanumeric, ≤10 chars, unique | A valid, unused code is entered |
| Display label present | Label filled in |
| Archetype selected | Section A chosen |
| Quantity tiers — at least one, contiguous | Section C valid |
| At least one permission group can create | Section E has ≥1 group |
| All custom fields named | Every custom field has a name |
Note — after activation. Type code and archetype are locked. Everything else remains editable, and edits affect only orders created after the change.
This is the recipe that spans two modules. Both must pass — allowing the category is not enough on its own, and enabling the item for the store is not enough either.
Step 1 — Allow the category under the order type
SEQ – — drag one upward to assign it a sequence.Step 2 — Enable the item for the specific store
Screen: Item Availability · Who: PPIC Admin · Level: Item + Store
Important — leaving the dates blank. A blank date range (–) means no date restriction — availability is governed by the Allow to Request toggle alone. Fill the dates only when the item has a genuine launch or discontinuation date.
Step 1 — Open the store
Step 2 — Give the store its item list
Step 3 — Verify
Have the store attempt a test order of each type it will use. If items are missing, run Recipe 6.
Retire one item for one store — Item Availability → Edit the row → either set Allow Request Date To to the last orderable date (preferred — it is self-documenting and reversible), or switch Allow to Request to Inactive for an immediate stop. Done → Save.
Retire a whole category from an order type — Item Allowed by Order Type → tap the ✓ cell to turn it to – → Save. This affects every store, so confirm the scope before saving.
To retire a category everywhere, untoggle its cell under every order type column rather than using Delete. Untoggling is reversible and leaves the row's sequence intact; Delete removes the row outright, and whether it is blocked when orders exist against that category is unverified (see Appendix B, gap #10).
Close a store — Store Availability → Edit → set Closing Date → Done → Save. Once the date passes, STATUS flips to Closed and the closing date renders in red. From that point the store cannot create new orders — but existing in-flight orders are unaffected and continue to process through to completion. Closing a store does not drive any order to BLOCKED; only Store Blocking does that. To hard-stop a store's in-flight orders as well, apply a Credit block (Recipe 8).
Caution — orders already in flight. Retiring an item or closing a store does not cancel orders that already exist, and closing a store does not stop them either — they will run through to completion under the closed store's account. Check for open orders before setting a closing date and coordinate with PPIC; if you need those in-flight orders halted rather than allowed to complete, escalate to Credit for a Store Blocking action.
Three mechanisms on three different screens. Choosing the wrong one is the most common mistake here, so start from what you are changing:
| What you are changing | Use | Where |
|---|---|---|
| Store opening / closing dates, in bulk | Export → edit → Import | Store Availability — buttons above the grid |
| Item availability data, in bulk | Export from Item Availability → Stock Import | Item Availability (Export) → Product information management → Stock import and log (Import) |
| One outlet's stock data, copied to another outlet | Copy stock data | Stock import and log → MORE → Copy stock data |
Note — Item Availability now supports Export. The Export button on Item Availability downloads the current filtered set in the StockTemplate CSV format, which is directly re-importable through Stock Import and Log with no reformatting. This closes the round-trip that previously required rebuilding the file by hand. Item Availability itself still has no Import button — the upload always goes through Stock Import and Log.
Path A — Store Availability export / import
Always export first and use that file as the template — do not build an import file from scratch.
Path B — Stock Import (item availability)
… menu to inspect that run.Caution — Processed does not mean every row succeeded. A file with failures still reports Status Processed. In the shipped log, a run showing Total 2 / Success 1 / Failed 1 sits alongside zero-failure runs, all labelled Processed. Read the Failed record(s) column, not the Status column, to know whether an import actually landed. A run with failures needs the failed rows corrected and re-imported. Whether it is safe to re-import the whole file rather than only the corrected rows was not observed — re-import the failed rows alon.
Path C — Copy stock data between outlets
Use this when a new outlet should start from an existing outlet's data. It replaces the export-edit-import round trip entirely.
Go to Product information management → Stock import and log.
Press MORE → Copy stock data.
Select From outlet and To outlet.
Choose the copy mode:
| Button | Copies |
|---|---|
| COPY | Stock data only |
| COPY (INCLUDE BRANCH ASSORTMENT) | Stock data plus the source outlet's branch assortment |
DISMISS closes the dialog without copying.
Confirm before relying on any of the three paths. Open behaviours, all of which change how you would use these on live data: whether Store Availability's Export covers the filtered set or all records and whether Import updates matched rows or replaces the set; exactly what branch assortment adds to a copy; and whether Copy stock data merges into the destination outlet or overwrites it. Test each on a sandbox outlet first.
Work down the list. Stop at the first failure.
| # | Check | Where | What you are looking for |
|---|---|---|---|
| 1 | Is the store open? | Store Availability → search the store | STATUS = Opened. If Closed, check the closing date — a red date means it has passed. If dates are blank, the store is unrestricted. A closed store cannot create new orders, but this alone does not drive existing orders to BLOCKED. |
| 2 | Is the store credit-blocked? | Store Blocking (4.2) — check the CREDIT DEPARTMENT count on the screen header | STATUS = Blocked, with an effective date and reason. This is the only store-level check that also hard-stops in-flight orders (drives them to BLOCKED). Only the Credit Dept can Unblock. |
| 3 | Is the order type active and permitted? | Order Type Maintenance → open the type | Active toggle on, and the user's permission group listed under E · Creation access. |
| 4 | Is the item's category allowed for that order type? | Item Allowed by Order Type | A ✓ at the intersection of the category row and the order type column. A – hides the whole category. Also check SEQ is assigned — unsequenced categories sit below the divider. |
| 5 | Is the item enabled for that store? | Item Availability → select the store → search the item | Allow to Request = Allowed, not Inactive. |
| 6 | Is today inside the item's date window? | Same row, expanded | Today must be on/after Allow Request Date From and on/before Allow Request Date To. Blank = no restriction. |
| 7 | Is the preferred vendor set correctly? | Same row, expanded | A store can only order from its assigned plant. A blank or wrong Preferred Vendor will stop the item. |
| 8 | Has the cut-off passed? | Order Cut-off Day (4.1) — filter by the order type | If the item is visible but the order will not post, the ETA date's cut-off may have closed. Check every rule on that order type — one type can carry several, each triggering on a different status. No rule at all means no block, so look elsewhere. |
If the item was visible when the store built the order but the post was rejected: configuration changed between creation and posting. Check the journal log on Item Availability for a recent edit to that item/store pair.
A different question — the order exists but has not advanced
The ladder above diagnoses item visibility. If the store can see and enter the item but the order is not moving through its lifecycle, start here instead:
| Check | Where | What you are looking for |
|---|---|---|
| Is it sitting in the Blocked stage? | Order Posting (Part 6) → Blocked filter | The fastest triage available — it lists exactly what failed a check, which tells you which of gates 1–6 above to open. Start here. |
| Does a cut-off rule cover it? | Order Cut-off Day (4.1) — filter by that order type | The daemon polls every 30 minutes and advances orders by matching cut-off rules on order type + order status. No matching rule means no automatic advancement, so the order sits indefinitely. Do not read run times from the on-screen Daemon Lifecycle strip — it is example content, not live state. |
| Has a cut-off locked it? | Order Cut-off Day (4.1) | A cut-off locks editing rather than blocking the order, so it will not appear under Blocked. See A.5. |
Order type codes, permissions, and access groups.
Entry point is a list of existing order types; New order type opens the wizard, and ← Back to order types returns to the list.
| Section | Field | Notes |
|---|---|---|
| A · Archetype | Forecast / Replenishment · Ad-hoc / Custom · Allocation · Inter-location Transfer | Single select. Determines which options are selectable in D. |
| B · Identity & labeling | Type code | Alphanumeric, max 10 · immutable after activation |
| Display label | Shown to admins and end users | |
| Description | Shown in the type list and as end-user help text | |
| Active (toggle) | Controls selectability at order creation | |
| C · Quantity model | Forecast qty · Actual qty · Delivery qty · Received qty | Multi-select checkboxes. Tiers must be contiguous. |
| D · Location & direction | Outlet → Warehouse · Warehouse → Outlet · Warehouse → Warehouse | Single select. Available options depend on A. |
| E · Creation access | Permission group chips | Tap + to grant. ≥1 required. |
| F · Document & integration | Generates PO (toggle) | Creates a PO to the source on posting |
| Requires reference field (toggle) | Forces an external document reference on every order | |
| G · Custom fields | + Add custom field | Optional. All must be named to pass validation. |
| Validation | 6 checks + ✓ Activate | Activate is disabled until all checks pass |
Which item categories can be requested under each order type. — badge: COMPANY LEVEL
| Element | Behaviour |
|---|---|
| Item Category filter + Apply filter | Narrows the visible rows |
| + Add Item Category | Adds a category row to the grid |
| ITEM CATEGORY column | One row per category |
| SEQ column | Display sequence shown to store users; set by dragging the row handle |
| Order type columns | One column per order type (grid scrolls horizontally). Tap a cell to toggle ✓ (allowed) / – (not allowed) |
| "NOT YET SEQUENCED" divider | Categories below it have no sequence; drag a row above the divider to assign one |
| ACTION → Delete | Removes the category row entirely, across all order types |
| Save | Commits all cell and sequence changes |
Item availability and preferred-vendor rules per store. — badge: CONFIG LEVEL — ITEM + STORE
| Element | Behaviour |
|---|---|
| Query Item by Outlet | Required. Scopes the whole screen to one store; header then reads "Showing for " |
| ITEM search · Item Category · Preferred Vendor · Period filters + Apply filter | Narrow the list before editing — a single store can carry hundreds of items |
| Export | Downloads the current filtered set in StockTemplate CSV format. The output is directly re-importable through Stock Import and Log (Product information management) — no reformatting required |
| (no Import on this screen) | Import runs through Stock Import and Log — see Recipe 5, Path B, and 3.5 |
| ITEM column | Item name over item code |
| CATEGORY | Item category (ties to Item Allowed by Order Type) |
| PREFERRED VENDOR / PREFERRED VENDOR CODE | The servicing plant for this item at this store |
| ALLOW REQUEST DATE FROM / TO | Requestable window; – = no restriction |
| ALLOW TO REQUEST (toggle) | Allowed / Inactive |
| ACTION → Edit / Done | Edit expands an inline panel with Preferred Vendor, Allow Request Date From, Allow Request Date To; Done collapses it |
| Pagination | 10 / 25 / 50 / 100 per page; footer shows Total records and Total of filtered records |
| Save | Commits all row edits on the screen |
Store opening / closing dates.
| Element | Behaviour |
|---|---|
| STORE search · STATUS filter + Apply filter | Narrow the store list |
| Export / Import | Bulk maintenance — see Recipe 5, Path A. This is the only screen in the guide carrying Export / Import |
| STORE / CODE | Store name and store code |
| OPENING DATE | Store cannot order before this date |
| CLOSING DATE | Store cannot order on or after this date. Rendered red once passed |
| STATUS | Opened / Closed — derived from the dates, not directly editable |
| ACTION → Edit / Done | Edit expands an inline panel with Opening Date and Closing Date pickers |
| Pagination | 10 / 25 / 50 / 100 per page |
| Save | Commits all row edits |
Product information management → Stock import and log. Not part of the Store Ordering Configuration screens — it is the bulk-maintenance route for item availability data, and the home of Copy stock data.
| Element | Behaviour |
|---|---|
| IMPORT | Uploads a StockTemplate CSV; creates a new run in the log. Accepts files exported directly from Item Availability without reformatting |
| REFRESH | Re-reads the log — a run is not final until Status shows Processed |
| MORE → Copy stock data | Opens the outlet-to-outlet copy dialog (Recipe 5, Path C) |
| File name | The uploaded file, as named on upload. Not unique — repeat uploads of the same file produce identically named rows, so identify a run by its Date and counts |
| Date | Run date |
| Status | Processed when the run has finished. Says nothing about whether rows succeeded |
| Total / Success / Failed record(s) | Row counts for the run. Failed is the column that matters |
More → … |
Per-run actions |
| Pagination | 10 / 25 / 50 / 100 per page; footer shows Total records and Total of filtered records |
| Copy stock data dialog | From outlet + To outlet dropdowns; COPY, COPY (INCLUDE BRANCH ASSORTMENT), DISMISS |
The three modules in this part do not decide whether an order can exist. They decide when it stops being editable (Order Cut-off Day), which stores are suspended for credit (Store Blocking), and in what sequence orders are processed (Store Batch Maintenance).
All three sit under Supply chain → Store Ordering → Configuration, alongside the four modules in Part 2. The left-hand nav groups them as Delivery Timing (Order Cut-off Day) and Store Governance (Store Availability, Store Blocking); Store Batch Maintenance is a separate top-level screen.
A cut-off rule locks order editing once its threshold passes. Each rule answers three questions:
Important — cut-off is opt-in. An order type with no rule configured is never blocked. Orders of that type stay editable indefinitely. This is stated on the screen's own info banner and is the single most important fact about the module — a missing rule is silent, not an error.
Each order type may hold one rule per option, and a single rule can carry multiple dates (e.g. first + third Wednesday).
These same rules drive the posting daemon, which polls every 30 minutes and checks orders by order type and status against them (Part 6). A missing rule therefore has two consequences, not one: nothing is blocked, and nothing advances automatically.
The three cut-off types
| Cut-off type | Cut-off date(s) fields | Renders in the grid as | Use for |
|---|---|---|---|
| Cut off by weekday | recurrence (Every week) + weekday + time | Every week Thursday 05:00 |
A recurring weekly deadline — the RSO pattern |
| Cut off by date | day of month + time | Day 7 14:00 |
A fixed monthly calendar deadline |
| Cut off by ETA − X | ETA − n day(s) + time |
ETA − 1 day(s), 15:00 |
A deadline that moves with each order's own delivery date — the AO pattern |
ETA − X is the only type without a blocking condition. Its summary line reads "orders in saved status are affected" rather than "blocked for n day(s)" — the lock has no release window. The other two types must state how long the block lasts.
Blocking condition
| Option | Meaning | Available on |
|---|---|---|
| Days count to block | Orders stay blocked for n day(s) after cut-off | Weekday · By date |
| Block until date of month | Blocked through a nominated day of the month | By date |
| Block until end of month | Blocked through month end | By date |
| (none) | Hard lock, no release | ETA − X |
Level and trigger status
A worked reading of the shipped configuration, showing how the three axes combine for one order type:
| Type | Level | Order type | Cut-off date(s) | Triggers on | Block until |
|---|---|---|---|---|---|
| Weekday | Company · All plants | TRSO | Every week Thursday 05:00 | Saved | 10 day(s) |
| ETA − X | Company · All plants | TRSO | ETA − 1 day(s), 15:00 | Confirmed | — |
| Fixed date | Company · All plants | TRSO | Day 7 14:00 | Posted | 5 day(s) |
TRSO carries three rules — a weekly RSO deadline on Saved, a monthly deadline on Posted, and a per-order AO deadline on Confirmed. They coexist because each triggers on a different status.
Caution — defaults are zero, and zero is a valid rule. The form opens with time
00:00and0 day(s). A rule saved on those defaults cuts off at midnight and blocks for zero days. Nothing warns you — the summary panel will say so plainly, which is why step 7 matters.
Screen reference — Order Cut-off Day
| Element | Behaviour |
|---|---|
| Order Type · Triggers On · Level filters + Apply filter | Narrow the rule list |
| + Add cut-off rule | Opens the Add cut-off rule panel (Recipe 7) |
| TYPE | Weekday / Fixed date / ETA − X |
| LEVEL | Company (All plants) or Plant (plant GUID shown beneath) |
| ORDER TYPE | The order type code the rule governs |
| CUT-OFF DATE(S) | The rendered threshold; multiple dates appear in one cell |
| TRIGGERS ON | Saved / Posted / Confirmed |
| BLOCK UNTIL | Release window, or — for ETA − X |
ACTION → … |
Row actions menu |
Owner: Credit Department. This is the only store-level source of BLOCKED — Store Availability closes a store to new orders but leaves in-flight orders alone.
Store Blocking and Store Availability both stop new orders, but they differ sharply on what happens to orders already in flight. Check both before escalating:
| Store Availability | Store Blocking | |
|---|---|---|
| Owner | HQ / System Admin | Credit Department |
| Reason | Store not yet open, or permanently closed | Overdue franchisee payment |
| Driven by | Opening / Closing dates | An explicit Block action + effective date |
| Status values | Opened / Closed — derived from dates | Active / Blocked — set by action |
| Effect on new orders | Cannot be created | Cannot be created |
| Effect on in-flight orders | Unaffected — orders continue to process to completion | Driven to BLOCKED — PO generation stops |
| Reversible by | Editing the dates | Unblock |
| Carries a reason | No | Yes — free-text Block Reason |
The screen header carries a live count — "6 stores currently blocked for overdue payment" — under a CREDIT DEPARTMENT chip. Use it as the at-a-glance check before working through a store's problem.
Who: Credit Department
To block:
To unblock: press Unblock on the row, then Save. Status returns to Active and the effective date and reason clear to —.
Caution — Save is a separate step. Block, Unblock, and Done only stage the change on screen. Nothing is committed until Save is pressed. Navigating away first discards the edit.
Screen reference — Store Blocking
Credit-department store blocks and unblocks.
| Element | Behaviour |
|---|---|
| STORE search · STATUS filter + Apply filter | Narrow the store list |
| CREDIT DEPARTMENT chip | Live count of stores currently blocked for overdue payment |
| STORE | Store name over store code (GUID) |
| EFFECTIVE DATE | Date the block takes effect; — when not blocked |
| REASON | Free-text block reason; — when not blocked |
| STATUS | Blocked / Active — set by the Block / Unblock action, not derived |
| ACTION → Edit / Done | Expands an inline panel with Effective Block Date and Block Reason |
| ACTION → Block / Unblock | Block (red) on Active rows; Unblock on Blocked rows |
| Pagination | 10 / 25 / 50 / 100 per page |
| Save | Commits all staged blocks, unblocks, and row edits |
Organize stores into batch profiles for delivery scheduling.
A batch is a named group of outlets serviced by one plant, held in a user-defined delivery sequence. Batches exist for one downstream purpose: they are the primary filter on Order Posting (Part 6), so PPIC can advance a whole delivery wave in one action rather than order by order.
Two rules govern membership:
Who: PPIC
CREATE BATCH stays disabled until both conditions are met — the footer states which is missing: "Batch name and at least one outlet required."
To delete a batch: use the trash icon in the batch panel header.
Confirm before relying on this. Whether deletion is blocked when a batch is referenced by orders already in flight is not established, and neither is whether its outlets return to the unassigned pool. The batch is a posting filter, so the likely risk is a posting run that silently returns nothing rather than data loss. Confirm both before deleting a batch on live data — see Appendix B, gap #17.
Screen reference — Store Batch Maintenance
| Element | Behaviour |
|---|---|
| BATCH PROFILES tile | Count of batches |
| BATCH PROFILES list (left) | One row per batch; select to load it into the right panel |
| + New Batch | Opens the New Batch modal |
| Panel header | " · n outlets" over "Serviced by · drag rows to set delivery sequence" |
| Numbered rows | Delivery sequence; drag handle to reorder, × to remove |
| + Add outlets | Opens the outlet picker |
| BATCH NAME (modal) | Required |
| OUTLETS IN THIS BATCH (modal) | Draggable, numbered, with running count |
| AVAILABLE OUTLETS (modal) | Unassigned outlets only; checkbox or Add link |
| Trash icon | Deletes the batch |
| Save / SAVE BATCH / CREATE BATCH | Commits; CREATE BATCH disabled until name + ≥1 outlet |
Two creation screens cover every order type. Which one you get is decided by the order type's archetype (Recipe 1, section A):
| Archetype | Creation screen | Delivery date | Volume limit |
|---|---|---|---|
| Forecast / Replenishment | New Forecast Order | Date range, ≤ 14 days | 1 per plant / day |
| Everything else | New Ad-Hoc Order | Single date | Multiple per store / day |
Both are reached from Order Listing → + New Order.
Note — order type codes differ from the PRD. The build ships TRSO, CAD, ALO, and INTERPLANT. The PRD names these RSO, CAD, ALO, and INP. Read TRSO as the PRD's RSO throughout. See A.4.
Enter requested quantities per delivery date across the 14-day window. Each date locks independently at its RSO cut-off.
The defining property of this screen: it is one order spanning up to 14 delivery dates, and each date locks on its own. A single TRSO document can have some dates locked and others still open at the same time. The order-level status shown elsewhere is reference-only — enforcement is per date.
Check the Order Type info panel. It shows the type's Archetype, Type code, Display label, and ACTIVE state — read-only, and marked "Configured in Order Type Maintenance — read-only here." If something is wrong, fix it in Recipe 1, not here.
Set the Value Filter, then press Generate. This builds the grid; nothing appears until you do.
Read the four tiles before entering anything:
| Tile | Meaning |
|---|---|
| TOTAL UNITS | Sum of all quantities on the order |
| TOTAL ORDER VALUE | Units × effective price on the order date |
| OPEN DATES | Dates still editable, out of the total in the window — 14/14 means nothing has cut off yet |
| LINES WITH QTY | Item rows carrying a quantity, out of rows generated |
Enter quantities in the grid. Rows are grouped under category headers and show item name over item code. Columns are one per delivery date, labelled with weekday and day number.
12 🔒). The number is the quantity already committed on that date; the icon marks that it can no longer be edited.Use the Listing Filter (Search item name or SKU…) to narrow a long grid. It filters the rows on screen; it does not re-generate. Clear restores the full generated set.
Check the DAILY TOTAL row at the foot of the grid — per-date totals plus a grand total. This is the fastest check that quantities landed on the dates you intended.
Press Submit Order.
Note — reading locked cells and the row TOTAL. Each locked cell now shows the committed quantity next to the 🔒 icon, so the row's TOTAL reconciles against what you can see: TOTAL = sum of open-cell inputs + sum of locked-cell quantities. An item showing
1and5in open cells with locked cells of3,3, and3carries a TOTAL of15. This replaces the previous behaviour, where locked cells rendered asCLOSEDand the balance in TOTAL was not directly visible.
Note — what the earliest open date drives. The screen states: "Dates past their RSO cut-off display as CLOSED and lock independently. The earliest open date drives the AO cut-off and PO delivery date." Shrinking the window from the front therefore moves the AO cut-off — relevant when a store asks why the AO deadline shifted without a config change.
Screen reference — New Forecast Order
| Element | Behaviour |
|---|---|
| Order Type chip + strapline | Type code and its rule summary — "Regular Store Order — 1 per plant / day" |
| Order Type info panel | Archetype · Type code · Display label · Active state. Read-only |
| Value Filter → Source Plant · ETA Range (≤14 days) · Category + Generate | Builds the grid. Required before any entry |
| Listing Filter → search + Search / Clear | Filters generated rows; shows "Showing n rows" |
| Tiles | Total Units · Total Order Value · Open Dates · Lines with Qty |
| Quantity by delivery date grid | Rows grouped by category; one column per date. Open cells accept a numeric input capped at 9999. Locked cells (past cut-off) render as <quantity> 🔒 — the committed quantity is shown next to the lock icon, read-only |
| TOTAL column | Row total = sum of open-cell inputs + sum of locked-cell committed quantities |
| DAILY TOTAL row | Per-date totals + grand total |
| Pagination | 10 / 20 / 50 / 100 rows |
| Submit Order | Creates the order |
One standardized form for every non-RSO order type. Pick a type — the form adapts its rules and fields.
One form serves every non-forecast archetype. Selecting the order type chip reshapes the form — the Additional Details section renders that type's custom fields (Recipe 1, section G), and the required-field set changes with it.
Who: Store User or PPIC, depending on the type's creation access
Pick the order type chip. Chips render as CODE · label — e.g. CAD · Cake accessories, ALO · allocation, INTERPLANT · Inter-plant. The info panel beneath shows the type's description. Set this first — everything below adapts to it.
The chip set you see depends on where you are logged in. The screen filters order types by the Location & direction configured on each type (Recipe 1, section D), against the location class of the logged-in user:
| Logged in as | Order types shown |
|---|---|
| Outlet | Types with direction Outlet → Warehouse only |
| Warehouse | Types with direction Warehouse → Outlet and Warehouse → Warehouse |
A type you expected but cannot see is usually a login-scope mismatch, not a permission or activation problem — verify the user's location before opening Order Type Maintenance.
Complete Order details. All four are required:
Complete Additional Details. These are the order type's custom fields and vary by type — for CAD the build shows Client Name and Birthday, both required.
Add line items with + Add item. Each line carries Code, Item Name, Category, Unit Price, AO Qty, and Line Total. The header shows a running count ("Line items · 0").
Press Submit Order.
Warning — External Document Ref is marked required but reads as optional. The field carries a required marker while its placeholder text says "Optional reference." Treat it as required — the marker governs. This is a UI inconsistency, logged as Appendix B gap #14.
Note — ad-hoc orders enter at AO, not RSO. Line items capture AO Qty — there is no RSO tier on this form. This matches the PRD's order-type matrix: only RSO/TRSO carries an RSO quantity; every other type starts at AO. (PRD §6.2.)
Screen reference — New Ad-Hoc Order
| Element | Behaviour |
|---|---|
| Strapline | "Single delivery date · multiple per store / day" |
| ORDER TYPE chips | One per non-forecast active type, as CODE · label. Filtered by the logged-in user's location — outlet users see Outlet → Warehouse types; warehouse users see Warehouse → Outlet and Warehouse → Warehouse types. Selecting reshapes the form |
| Type info panel | Code, name, description of the selected type |
| Order details | Source Plant (Vendor) · ETA / Delivery Date · Sub-type · External Document Ref — all required |
| Additional Details | The selected type's custom fields; varies by type |
| Line items + + Add item | Code · Item Name · Category · Unit Price · AO Qty · Line Total, with running count |
| Submit Order | Creates the order |
Order headers across all types and plants. Status is reference-only; RSO locks per ETA date.
Order Listing is the entry point to everything in this part — it carries the + New Order button and is the only route to Order Details.
Important — "Status is reference-only". The header states it, and it is the rule that explains most confusion on this screen. For TRSO, a header-level status does not tell you what is editable — each ETA date locks independently at its own cut-off. Read the status as a summary, not as an enforcement statement. Actual enforcement is the 🔒 state in the forecast grid and the BLOCKED LINES tile in Order Details.
Who: PPIC (AO entry happens while the order is in Posted status — PRD §5)
Filter the list by ETA Date Range, Order Type, and Source Plant, then Apply filter.
Identify the order by Order ID, or by Purchase ID once the order has generated a PO. The Lines column shows how many item lines it holds — useful for spotting an order that generated fewer lines than expected.
Press … in the More column and choose Edit. This opens Order Details.
Read the tiles first:
| Tile | Meaning |
|---|---|
| TOTAL RSO QTY | What the store requested |
| TOTAL AO QTY | What is actually being ordered to production |
| TOTAL AD QTY | What was actually delivered from source. Populated once the order reaches the Delivery stage; blank earlier |
| NET DIFFERENCE | AO − RSO. Non-zero means PPIC has adjusted the store's request |
| BLOCKED LINES | Lines failing an availability or governance check. Red-outlined — any value above 0 needs action before posting |
Edit RSO Qty, AO Qty, and (once delivery is recorded) AD Qty in the highlighted band. Quantities carry 4 decimal places — fractional quantities are accepted.
Check the per-line Status chip. It reflects that line's lifecycle stage (SAVED, and so on).
Press Save.
Caution — which quantity is editable depends on status. RSO qty locks at Posted; AO qty locks at Confirmed; AD qty locks at Completed (spec — PRD §5). The tiles remain visible at every stage, so a value being displayed is not evidence it is editable. If an edit will not stick, check the order's stage on Order Posting before raising a defect.
Screen reference — Order Listing
| Element | Behaviour |
|---|---|
| + New Order (dropdown) | Routes to New Forecast Order or New Ad-Hoc Order |
| ETA Date Range · Order Type · Source Plant + Apply filter | Narrow the list |
| Order ID | System-assigned; the reference used everywhere downstream |
| Purchase ID | The PO number generated when the order posts. Blank until a PO exists — useful for reconciling against warehouse or finance systems |
| Order Type | Type code — TRSO, CAD, … |
| To Location / From Location | Receiving store / source plant |
| ETA Date | Delivery date. For TRSO, the header date — individual dates still lock independently |
| Lines | Count of item lines |
More → … → Edit |
Opens Order Details |
Screen reference — Order Details
| Element | Behaviour |
|---|---|
| Title | "Order Details - " |
| Tiles | Total RSO Qty · Total AO Qty · Total AD Qty · Net Difference · Blocked Lines (red-outlined) |
| Item Code / Item Name / Category / UOM | Line identity. UOM may be blank where the item has none configured |
| Unit Price | Effective price on the order date |
| RSO Qty / AO Qty / AD Qty | Editable band, 4 decimal places. AD Qty is the actual delivered quantity — populated at the Delivery stage and blank earlier |
| Total Price | Line value |
| Status | Per-line lifecycle chip |
| Save | Commits all line edits |
Posting advances orders one stage at a time — Saved → Posted → Confirmed → Completed. Pick a lifecycle stage below to view those orders and post them to the next stage.
Who: PPIC, at plant level. Access is restricted to Plant users (per product owner; the underlying permission is PRD §6.10 — the exact permission name is Appendix B gap #15).
Important — the daemon does this work; the screen is for exceptions. Saved → Posted and Posted → Confirmed run automatically on a daemon. The screen states it on the stage banner: "Normally automated by the daemon — manual posting is for exception handling." Only Confirmed → Completed is manual by design.
Post manually when the daemon has nothing to act on, has failed, or a specific order must move ahead of its schedule. Manual posting is not the routine path, and using it as one hides the underlying cause — most often a missing cut-off rule.
How the daemon decides what to advance
The daemon polls every 30 minutes. It does not fire once per transition at a fixed clock time — every run re-evaluates what has become due since the last one.
On each run it reads the Order Cut-off Day rules (4.1) and checks orders by order type and order status. An order advances when a rule matching its order type and its current status has passed its cut-off.
| Cadence | Every 30 minutes — current setting; treat the interval as configurable, not fixed |
| What it reads | Order Cut-off Day rules (4.1) |
| What it matches on | Order type + order status |
| What it does | Advances orders whose matching cut-off has passed |
| Stages it drives | Saved → Posted and Posted → Confirmed |
| Stage it does not drive | Confirmed → Completed — manual by design |
Important — no cut-off rule means the daemon has nothing to act on. Cut-off configuration is what tells the daemon which order types and statuses to check. An order type with no cut-off rule is never blocked (4.1) — and by the same mechanism its orders are never advanced automatically. They sit where they are until someone posts them by hand.
This is the first thing to check when a whole order type is stuck in one stage and nobody can say why. (Consequence of the cut-off-driven design — confirm the exact behaviour before relying on it: Appendix B, gap #28.)
Warning — the on-screen Daemon Lifecycle strip is illustrative. The strip showing per-stage times — "fired 06:00", "next run 14:00" — is example content, added at user request to explain the lifecycle. It is not live scheduling state. Do not read a last-run or next-run time from it, and do not use it to decide whether the daemon has run.
Diagnose from the orders instead: check the Blocked stage filter, then check the cut-off rules configured for that order type.
Who: PPIC (Plant)
Important — rows are order-items, not orders. Each row is one order × category, labelled
TRSO-90024: Order Item ID (90042). A two-category order occupies two rows and can be posted one row at a time. Selecting an order ID does not select the whole order — check the count on Post Selected (n) against what you intended to move.
Note — reading the RSO / AO columns before posting. A row where AO Qty is 0 while RSO Qty is populated has not had its AO quantity entered. Posting Saved → Posted locks RSO qty and opens the AO window; posting Posted → Confirmed locks AO qty. Sweep for
AO Qty = 0rows before advancing past Posted, or the order confirms at zero.
The Blocked stage filter is the troubleshooting entry point for Recipe 6. It shows what has failed an item-availability, store-availability, or store-blocking check, which tells you which of those three modules to open.
Screen reference — Order Posting
| Element | Behaviour |
|---|---|
| Filter by lifecycle stage | Saved · Posted · Confirmed · Completed · Blocked |
| Stage banner | Names the transition, its driver (DAEMON / MANUAL), and the exception-handling note |
| Daemon Lifecycle strip | Illustrative example content — not live daemon state. See the warning above; do not diagnose from it |
| Store Batch · ETA Date Range · Category · Order Type + Apply filter | Narrow the working set |
| Row count | " orders — n in view" |
| ORDER | <TYPE>-<Order ID>: Order Item ID (<line ID>) — one row per order × category |
| FROM STORE / TO STORE | Source plant / receiving store |
| CATEGORY · ETA | Line category and delivery date |
| RSO QTY / AO QTY | Quantities at this stage; fractional values supported |
| STAGE | Current lifecycle chip |
| ACTION → Post → | Advances that single row |
| Post Selected (n) | Advances every ticked row; count is live |
| Pagination | 10 / 25 / 50 / 100 |
Scan-to-receive. Desktop and mobile share the same screen — the mobile view reflows automatically.
The last step in the chain: the store confirms what physically arrived, and inventory updates in real time. The header carries a MOBILE badge and the strapline: "Scan-to-receive on a mobile device. Sign-in is handled by the Xilnex Portal session — no separate identity step. Phase 2 is confirmation-only: the store user confirms the stated AD quantity; discrepancies are flagged for manual handling."
Screen layout. On desktop the screen is a two-panel view — the phone preview on the left (the exact screen a store user sees on a device) and the RECEIVING FLOW panel on the right showing the four numbered steps, plus the USER ACCOUNTABILITY and TRACEABILITY tiles and the EDGE CASES TO HANDLE list. On a phone the layout reflows to the phone preview only.
Two properties define the Phase-2 scope:
Signed In chip in the header confirms the inherited session. User accountability comes from the Portal session; traceability comes from the QR code.
Who: Store User
Before you start: have the physical Delivery Receipt in hand and verify the goods against it. The scan records a confirmation — it is not the check itself.
| Step-- | Screen | What happens |
| 1 |
Scan DR — "Scan the Delivery Receipt" | Camera armed, no PO resolved yet. Point the camera at the QR code printed on the DR to pull up its purchase order. Press Open phone scanner, or Enter PO ID manually if the code will not read |
| 2 | Receive for PO | Confirm the resolved order is the one you are receiving |
| 3 | Receipt Details | Review the DR line items — scrollable |
| 4 | GRN Confirmed | Inventory updates in real time; the screen shows an animated tick |
Right-panel tiles (desktop only)
| Tile | Value |
|---|---|
| USER ACCOUNTABILITY | Portal session |
| TRACEABILITY | QR-validated |
On the web build the Open phone scanner button hands off to the device camera; in a browser this is the browser's camera prompt. The flow is otherwise identical.
Edge cases to handle
| Situation | Behaviour |
|---|---|
| Code scans but the PO belongs to another plant | Blocked with a plant-mismatch sheet |
| DR already received | Routed to the existing GRN rather than creating a new one |
| Camera permission denied | Manual PO entry field opens by default |
| Open phone scanner on the web build | Hands off to the device camera; in a browser this is the browser camera prompt |
| ConfirmGRN API failure | Toast error; stays on Screen 3 with the button re-enabled — safe to retry |
Note — where a discrepancy goes. If the physical count does not match the DR, the device gives you nowhere to record it — that is by design for Phase 2. Confirm nothing, and raise the discrepancy through manual exception handling. Confirming a DR you know to be wrong posts an inventory movement that does not match what arrived.
| Date | Changes descriptions |
| 15/9/2026 | - Added Import and Export to Item Availability - Replenishment Order UI adjustment - Ad-Hoc Order add filter to type selection with location type - Add AD Qty and PO ID to the Order listing details page |