Stock Replenishment Applet
Turn each location’s minimum and maximum stock levels into purchase orders or stock transfers, on demand or on a calendar. The reorder quantity reads only those levels and the ledger quantity, and a run started by a scheduled event raises its documents without showing any errors, so check what each scheduled run produced.
Overview
The Stock Replenishment applet turns per-location minimum / maximum stock levels into documents. A Replenishment Template fixes the scope (items, locations, suppliers) and a Fulfillment Strategy (buy from a supplier, transfer from another location of the same company, or transfer from another company in the tenant). A Replenishment Event puts a template on a calendar — optionally recurring — and a Replenishment Run is one execution: BigLedger computes, for every item × location in scope, how far the location is below its minimum (or maximum) level and writes an order quantity line and an order fulfillment line. From those lines the applet — or, for scheduled events, the run itself — creates Purchase Orders (Internal) or Internal Outbound Stock Transfers, and optionally e-mails the outcome.
It is opened by purchasing and inventory planners. Upstream are the item master (min/max levels, supplier pricing) and the stock balance; downstream are the Purchase Order and Stock Transfer applets that carry the generated documents through GRN, invoice and stock movement. The applet itself moves no stock and posts no journal.
Where it fits
| Applet / process | Why | |
|---|---|---|
| Module | Inventory, Purchasing | Stock-driven purchase and transfer generation |
| Upstream | Inventory Item Maintenance | Per-location minimum / maximum quantity on the location stock balance — the only numbers the reorder formula uses |
| Upstream | Doc Item Maintenance → Entity Pricing | Supplier link per item: supplier priority, purchase unit price, min / max order quantity, lead time |
| Upstream | Supplier | The supplier must be an active entity of type supplier, otherwise its pricing link is ignored |
| Upstream | Organization | Locations (company, branch, geolocation for Nearest location first); Branch → Intercompany Configuration for inter-company transfers |
| Upstream | Stock Balance / Stock Availability | Ledger quantity, open-PO, reserved and sales-order-open quantities that the run snapshots |
| Downstream | Purchase Order (Internal) | Generated Purchase Orders (Internal), in DRAFT or FINAL |
| Downstream | Stock Transfer | Generated Internal Outbound Stock Transfers; the inter-company variant also creates the inbound leg in the counterpart company |
| Downstream | Chart of Account | Inter-company transfers are blocked unless both companies have a chart of accounts selected on their company record in Organisation; no inter-company mapping is checked |
Screens and menus
Five menu items, plus Settings and Personalization:
| Menu | What it holds |
|---|---|
| Replenishment Runs (default) | Listing (Run Name, Status, Description, Created / Updated Date; quick search on run name; advanced search by name and created / updated date) and the run view |
| Replenishment Events | Listing (Event Name, Event Code, Created / Updated Date, Status) and the event view |
| Replenishment Template | Listing (Template Name, Created / Updated Date, Status) and the template view |
| Order Qty Reports | One flat grid over every run’s order-quantity lines: Item Code / Name, Location, Supplier, Unit Price (Inc tax), Stock Bal Qty, Reorder level, Min / Max Order Qty, Lead time (days), Sales Qty (last month), Reorder Qty User / Algo / Final, Generated Date, PO Number, Status. Four of those columns have nothing behind them and render blank on every row — Unit Price (Inc tax), Reorder level, Min Order Qty and Max Order Qty. For a reorder level you can actually read, use the run’s Min/Max Qty/Loc tab below |
| Audit Trail | Generic audit-trail listing |
Run view — eleven tabs, in this default order: Details, Locations, Items, Suppliers, Categories, Fulfillment Strategy, Min/Max Qty/Loc, Item List, Order Fulfillments, Export, Purchase Orders. Item List, Order Fulfillments and Purchase Orders load lazily. A Delete button sits under the tabs.
- Min/Max Qty/Loc — an editable grid of every item × location in the run (Item Code, Item Name, Loc. Code, Min, Max, Balance) with two buttons: Auto-Fill All (queues a fresh calculation for this run) and Reload.
- Order Fulfillments — the fulfillment lines (Item Code, Supplier Code / Name, Location Code, Quantity To FulFill, Quantity To Approve (editable), Price (editable), Min / Max Purchase Quantity, Location Balance, Fulfillment Type, Status, Blocked Reason) with four buttons: GENERATE PO, GENERATE STOCK TRANSFER, GENERATE INTER-COMPANY TRANSFER, GENERATE ORDER FULFILMENTS. Opening a line shows the underlying order-quantity line (Details tab — 30-day sales, balances, in-transit, open PO, reserved, sales-order-in-queue, reorder calculation, supplier, unit cost) and its fulfillment lines.
- Purchase Orders — the documents linked to the run (PO Number, Branch, Location, Txn Amount).
- Export — one enabled button, EXPORT AS PDF, which does nothing; CSV / DOCX / ZIP are disabled.
Template view — tabs Details, Items filter, Suppliers filter, Locations filter, Fulfillment Strategy, Category filter, Items List (a read-only expansion of the picked items and categories).
Event view — tabs Details (with the Recurring checkbox and recurrence editor), Items filter, Suppliers filter, Locations filter, Fulfillment Strategy.
Each filter tab carries a Rules Logic (AND / OR) and Negation Logic (Included / Excluded) control above its grid.
Settings — Field Settings, Default Selection, Printable Format Settings, Email Template, plus the shared Webhook, Feature Visibility and permission screens. Personalization — Sidebar and Default Selection.
No product screenshots exist for this applet; the two images previously on this page were a marketing infographic and a missing file, and have been removed.
Configuration
Before you can use it
| Prerequisite | Where | Why it matters |
|---|---|---|
| Per-location minimum / maximum quantity on each item | Inventory Item Maintenance (per-location levels, or the Min-Max import) — or the run’s Min/Max Qty/Loc tab, which edits the same levels | The reorder quantity is min level − current stock (or max level − current stock). A location with no balance record or no level is treated as 0, so nothing is ordered |
| A supplier pricing link per item (Entity Pricing) with Supplier Priority, Purchase Unit Price, Purchase Qty Min / Max Order and Lead Time | Doc Item Maintenance | BigLedger picks the highest-priority active supplier; without any link it falls back to the supplier of the last FINAL purchase invoice for the item, and if there is none the run fails with PO cannot be initiated without a supplier present. The link also supplies the PO unit price (0 if absent) and lead time (5 days if absent) |
| Suppliers are active entities of type supplier | Supplier | Links to inactive or non-supplier entities are ignored |
| Locations belong to a branch and company; geolocation set when using Nearest location first | Organization | Generated documents take company / branch from the destination location — a location with neither cannot generate a document; the nearest-location rule uses the straight-line distance between location coordinates |
| Branch Intercompany Configuration on the source location’s branch — the branch sending the stock — with the pairing Internal Outbound Stock Transfer to Internal Inbound Stock Transfer, mode AUTO, and a Transfer Counterpart Entity and Entity Branch | Organization → Branch → Edit → Intercompany Configuration | Required only for Inter-company Transfer only. The run looks up the configuration on the branch of the location the stock comes from; the counterpart entity and branch on that configuration become the receiving company and branch. The destination branch’s own configuration is never read. Missing config or missing counterpart branch marks the line BLOCKED with the reason shown in the grid |
| A chart of accounts selected on both companies’ records | Organization → Company → Edit → Chart of Account | The inter-company check is only that each company has a chart selected; a missing one blocks the line with “Chart of Accounts not configured for the source / destination company”. No GL mapping between the companies is consulted |
| A supplier pricing link for the item somewhere in the tenant | Doc Item Maintenance → Entity Pricing | Inter-company lines only: an item with no supplier / pricing link anywhere is blocked with “No supplier/pricing link configured for this item”, even though a transfer buys nothing |
| Purchase Order and Stock Transfer applets set up (numbering, posting) | Purchase Order (Internal), Stock Transfer | Generated documents are created with the same validation as a PO or transfer keyed in by hand. Leave Document Status at Draft and finalise them in their own applets: a document the run creates as FINAL is marked FINAL but never posted — see Document creation |
| An Email Template (Settings → Email Template) and a tenant e-mail sender | This applet; the tenant’s default sender address | Only when Email notification is on. Without a template BigLedger uses its built-in subject and body |
Applet settings
Anyone with access to the Settings menu can change these; there is no finer-grained authority.
Field Settings is a stub: eight unbound toggles (Unit Discount, SST/VAT/GST, WHT, Blanket Order, Segment, G/L Dimension, Profit Center, Project) and a SAVE button that does nothing. Nothing on this screen is saved or read.
Default Selection:
| Setting | What it controls | Default | Effect when changed |
|---|---|---|---|
Default Branch (DEFAULT_BRANCH) | Nothing. Rendered and saved, but no create or view screen reads it | null | None |
Default Location (DEFAULT_LOCATION) | Nothing — same as above. Selecting a branch pre-fills it from the branch’s main location. (A personal default location would pre-fill an empty Specific Locations or Surplus Destination Locations picker on the Fulfillment Strategy tab, but the personal screen cannot save one — see below) | null | None |
Details Tab Ordering (STOCK_REPLENISHMENT_DETAILS_TAB_ORDER) | Drag-and-drop order of the run view tabs. The run view follows that order and appends any tab not in the saved list | Details, Locations, Items, Suppliers, Categories, Item List, Order Fulfillments - PO, Export, Purchase Orders (nine entries — the list predates the Fulfillment Strategy and Min/Max Qty/Loc tabs, which therefore always land at the end until the setting is re-saved) | Run view tab order changes for every user on next load |
| Reset | Clears DEFAULT_BRANCH and DEFAULT_LOCATION and keeps the current tab order | — | — |
Printable Format Settings — upload .jrxml formats; the star column marks the default, which the Printable Format and Email Template listings show. No screen prints anything — the Export tab’s PDF button does nothing — so the setting has no effect on output.
Email Template — applet-level notification templates with Template Code, Email Subject and Template body, plus clickable placeholder chips. The subject is stored in the template’s description field and is used as typed; left empty, BigLedger builds one from the outcome and the document number. Supported placeholders, substituted when the e-mail is sent in ${token} or {{token}} form (unknown tokens are left verbatim): docNumber, docTypeLabel, docServerType, supplier, location, items, itemsFulfilled, itemsBlocked, reason, outcome, fulfillmentType, documentCount, lineCount, and poNumber as an older name for docNumber (the chips do not offer it). A template is used only when a Fulfillment Strategy selects it.
Personalization → Default Selection is broken in this build: selecting a branch or location fails with an error and nothing is saved.
Document behaviour settings — the Fulfillment Strategy
The Fulfillment Strategy tab is the same tab on Template, Event and Run. Each level has its own strategy and SAVE STRATEGY writes only that level. Precedence is by copying, not by lookup: creating an event copies the template’s strategy (and filters) onto the event; creating a run copies the event’s strategy if the run came from an event, otherwise the template’s. A run is processed from the run’s own strategy only. Changing a template or event afterwards does not change existing runs; a run with no strategy saved is processed with the defaults below.
| Control | Options | Default | Effect |
|---|---|---|---|
| Fulfillment Type | Purchase Order only · Internal Stock Transfer only · Inter-company Transfer only | Purchase Order only | Decides whether fulfillment lines become POs, internal transfers or inter-company transfers |
| Stock Control | Minimum stock · Maximum stock | Minimum stock | Reorder qty = min − stock or max − stock, floored at 0. Maximum stock is also the precondition for surplus redistribution |
| Document Status | Draft · Active | Draft | Draft → generated documents are created as DRAFT, to be finalised in the Purchase Order or Stock Transfer applet. Active → they are created already marked FINAL — but created, not finalised: the run writes the status and stops, and the posting run that a FINAL in the document’s own applet would start never runs. A FINAL transfer from a run moves no stock and a FINAL PO enters no posting chain, and because the document already reads FINAL its own applet will not finalise it again, so there is no way to post it afterwards (read from the code, not tried). Leave this at Draft. Applies to POs and to both transfer types |
| Block existing open PO (PO type only) | checkbox | on | A line is set BLOCKED (“Existing open purchase order found for same supplier and item”) when any Purchase Order (Internal) in DRAFT / FINAL / EDITED for the same supplier already has a line for the item — regardless of location or quantity |
| Transfer Scope (transfer types) | Same company · Same tenant | Same company | Same company keeps only source locations of the destination’s company |
| Minimum Transfer Qty (transfer types) | number | empty (treated as 0) | Source candidates must hold at least this ledger quantity |
| Source Priority (transfer types) | Highest stock first · Nearest location first · Specific locations only | Highest stock first | Candidate choice: highest ledger quantity; nearest by location coordinates; or the strategy’s chosen source locations (then highest stock among them). Nearest falls back to highest-stock when the destination has no coordinates |
| Target Scope (transfer types) | All tenant companies · Selected companies only | All tenant companies | Inter-company source search only. No company picker is rendered, so Selected companies only always resolves to an empty set and every line is left “No suitable inter-company source location found” |
| Enable surplus handling | checkbox | off | With Maximum stock control: a line whose stock − max ≥ Min Surplus becomes a Surplus Redistribution fulfillment line instead of an order |
| Send Excess To | Auto — lowest stock location · Specific locations | Auto | Destination = the location (below its own minimum) with the lowest ledger quantity, optionally restricted to the strategy’s chosen destination locations |
| Surplus Transfer Scope | Same Company only · Same Tenant | Same Company only | Restricts surplus destinations to the source’s company |
| Min Surplus Before Transfer Triggers | number | empty (0) | Surplus is the location’s ledger quantity minus its Max, and a line becomes a surplus transfer when that is above 0 and at least this figure. A location with no Max set is read as Max 0, so its whole stock counts as surplus — with this left at 0, every stocked location in the run that has no Max becomes a surplus line instead of an order. On an event-created run those surplus lines are turned into stock transfers automatically, with the internal ones, so set a Max on every location in the run before you switch surplus handling on |
| Surplus Document Type | Internal Outbound Stock Transfer (only option) | Internal Outbound Stock Transfer | Document type of the surplus transfer |
| Email notification | checkbox | off | Master switch for the notification e-mail |
| Email template picker | templates of this applet | empty | Subject / body source; built-in default when empty |
| Email Recipients | free text, comma / semicolon separated | empty | Empty → status SKIPPED_NO_RECIPIENTS on the lines |
| Notify on success / failure / partial / blocked | checkboxes | all off | One flag per outcome; an outcome whose flag is off is SKIPPED |
The two yellow banners on the tab (reorder formula; inter-company accounting impact) are informational text.
Filter logic per group (Items, Locations, Suppliers, Categories on template, event and run): Rules Logic AND / OR and Negation Logic Included / Excluded (defaults AND / Included). Effect on a run you start yourself (Auto-Fill All, or saving a run with a template): negation off → the picked set; negation on with picks → every active location / item except the picks; negation on with no picks → the whole universe. On a run a scheduled event creates, Negation Logic is not applied: the event’s picked locations and items are used as picked, whatever the switch says, so Excluded on an event orders the picks rather than everything else (read from the code, not tried). To exclude on a schedule, pick the locations and items you do want and leave negation off. AND / OR is stored and copied but does not change the result today. Event values that are left empty inherit the template’s at processing time. Category filters are copied template → event but never used to select items — only Items and Locations decide the item × location grid; Suppliers restrict which supplier is chosen first (see Troubleshooting — the filter is a preference, not a limit).
Settings in other applets that control this applet
| Setting | Where it is set | Effect here |
|---|---|---|
| Per-location Min / Max quantity | Inventory Item Maintenance, Min-Max import, or this applet’s Min/Max Qty/Loc tab (the grid rejects Max < Min) | The whole reorder calculation |
| Supplier Priority, purchase price, min / max order qty, lead time on the item’s Entity Pricing | Doc Item Maintenance | Supplier choice (highest integer wins; ties pick the first found), PO price, grid columns |
| Branch Intercompany Configuration — pairing Internal Outbound Stock Transfer → Internal Inbound Stock Transfer, mode AUTO, Transfer Counterpart Entity / Branch | Organization → Branch → Intercompany Configuration, on the source location’s branch | Inter-company lines are BLOCKED without it; the counterpart entity and branch on that configuration decide which company receives the stock, and the inbound transfer is created there |
| PO / Stock Transfer running numbers, Purchase Order applet field settings | Purchase Order (Internal), Stock Transfer | Document numbers and the form the generated documents open in |
Feature visibility / permissions
- Client-side permissions: none exist for this applet. Feature Visibility shows nothing for it; menu items cannot be hidden per role.
- Server permissions:
API_TNT_DM_STOCK_REPLENISHMENT_RUN_{CREATE,READ,UPDATE,DELETE,ADMIN,OWNER,MEMBER}, and the same seven forTEMPLATE_HDR,EVENT_HDR,RUN_FILTER_ITEM,RUN_FILTER_LOCATION,RUN_ORDER_QTY_LINE,RUN_ORDER_FULFILLMENT_LINE,RUN_DOC_LINK. OWNER and ADMIN satisfy every check on their family. - Auto-Fill All and GENERATE ORDER FULFILMENTS need only
…_RUN_READ. - All three generate buttons check the one permission
API_TNT_DM_STOCK_REPLENISHMENT_RUN_ORDER_FULFILLMENT_LINE_GENERATE_PO— there is no separate transfer permission. - Editing Min / Max on the Min/Max Qty/Loc tab is saved under the stock-take balance permission
API_TNT_DM_ERP_STOCK_TAKE_BALANCE_UPDATE, not a replenishment one — a planner who can run everything else here still needs it to change a level. - Event-created documents are created as the user who created the event.
Fields
Replenishment Template — Details
You give a template a Template Name (required) and an optional Description; Created By, Creation Date, Modified By and Modified Date are read-only. Nothing stops two templates sharing a name. The name matters more than it looks, because every run an event creates is named after it — Run for template: ‘…’ — and its description becomes the run’s description as Template description: …. Several events on one template therefore produce runs with identical names; tell them apart by the Replenishment Event Name and the run dates.
| Field | Required | Notes |
|---|---|---|
| Status | Defaults to ACTIVE | ACTIVE / INACTIVE. Nothing in the calculation, the fulfillment pass or document generation reads it — an INACTIVE template still feeds its events and runs, so switching it off is not a way to stop it being used |
The filter tabs store the picked items (from the item grid: Item Code, Item Name, UOM, Status), locations, suppliers and categories (label code / name).
Replenishment Event — Details
| Field | Required | Notes |
|---|---|---|
| Replenishment Template | Yes | Its filters and strategy are copied onto the event on save |
| Event Code | Yes | Must differ from the code of every event already saved — the check and a database constraint both refuse a repeat — and is read-only once saved. Event Name has no such rule |
| Cycle Start Date / Cycle End Date | Not on the form — always set both | Start = when the run is queued (immediately if already past, otherwise scheduled); the end sizes recurring instances, and both are copied onto the run the event creates as its Current Run Start / End. The form lets you save without either, but the queuing step needs the start date and runs after the event is already saved: a blank start saves the event, then the queuing fails with no message, and the event sits there and never runs (read from the code, not tried). A recurring event needs both dates. If you find an event with no start date, delete it and re-create it with one |
| Recurring | No | Shows the recurrence editor. BigLedger works out every occurrence (all of them for a finite rule, the first 100 for an infinite one) and saves each as its own event with the same Event Code. Because the code must be unique, only the first occurrence is saved: every later one is refused by the code check, the refusal is discarded, and the save still reports success. Check the Events listing after saving a recurring event — if you see one event where you expected a series, create the later cycles as separate events with their own codes |
| Description, Status | Status defaults to ACTIVE | The calculation an event queues does not check the event’s Status, so setting it INACTIVE does not stop a cycle that is already queued |
Editing or deleting a recurring event asks This event / This and following events / All events. A malformed rule is rejected with Invalid Recurrence Rule : ….
Replenishment Run — Details
A run carries a Run Name (required, and not checked for uniqueness) and a free-text Description. The name is copied onto the link row of each document the run generates at the moment it is generated. Runs an event creates are named and described for you from the template, as above.
| Field | Required | Notes |
|---|---|---|
| Replenishment Template | No | With a template the calculation is queued immediately on save; without one nothing runs until Auto-Fill All, and the run’s own Items / Locations tabs must be filled first |
| Current Run Start / End Date | No | Copied onto every order-quantity line, and on an event-created run taken from the event’s cycle dates. They do not set the sales window: the 30-day sales figure always counts back from the day the calculation runs, whatever dates the run carries |
| Previous Run Name / Start / End | No (read-only) | Informational; for event-created runs BigLedger sets it to the template’s latest run. The calculation does not compare runs |
| Status | Defaults to ACTIVE | ACTIVE / INACTIVE. Nothing that calculates or generates reads it: an INACTIVE run still recalculates on Auto-Fill All and still generates documents |
| Company, Sales Duration, Replenishment Event Name | — | Company and Sales Duration are not shown; Event Name shows for event-created runs |
Min/Max Qty/Loc (run)
Editable Min and Max per item × location; each edit is saved straight to the location stock balance (not to the run), under the stock-take balance update permission named under Feature visibility. The grid refuses Max < Min when both are positive and restores the old value.
Order Fulfillments (run)
| Column | Meaning | Editable |
|---|---|---|
| Quantity To FulFill / Quantity To Approve | The transfer quantity for transfer lines; 0 for PO lines until edited | Quantity To Approve: yes (saved on the line) |
| Price | The supplier’s Purchase Unit Price on the item’s entity pricing, copied when the fulfillment line is written (0 if there is no pricing link) — a later change to the supplier price does not reach an existing line. Editing it saves the line; typing it on an item’s group row sets the same price on every line of that item, across all its locations. The PO takes it as the unit price per base unit, with no discount | Yes |
| Min / Max Purchase Quantity, Lead time | From the entity pricing link (lead time defaults to 5 days) | No |
| Fulfillment Type / Status / Blocked Reason | Purchase Order, Internal Stock Transfer, Inter-company Transfer or Surplus Redistribution; PENDING → GENERATED or BLOCKED | No |
The generated document line takes Quantity To Approve as its quantity and Price as its unit price; a PO line left at 0 produces a zero-quantity PO line.
Lifecycle and effects
Templates, events and runs have only ACTIVE / INACTIVE statuses; there is no FINAL or VOID. The work happens in three stages after queueing: a calculation, a fulfillment pass and document creation.
1. Queueing. Saving a run with a template queues the calculation immediately. Saving an event queues one calculation per occurrence — immediately when the cycle start is already past, otherwise at the cycle start. Auto-Fill All and GENERATE ORDER FULFILMENTS queue the run again. A queued calculation that is not due yet waits for the platform’s background sweep, which reaches every tenant on its own clock and takes up to ten due replenishment jobs per pass; it needs no entry in the Scheduler applet, and the Scheduler applet can neither show nor stop it. If a scheduled run has not appeared a while after its start time, the sweep has not reached it yet or the job failed — see Troubleshooting.
2. Calculation. Three scenarios: an event (creates the run header, copies the event’s filters and strategy, records the previous run); a run with a template (copies template filters into the run’s Locations / Items / Suppliers tabs when the run’s own are empty); a run without a template (uses the run’s tabs only). It then resolves the effective location and item sets (negation), and for every item × location writes an order-quantity line with: location min / max / ledger quantity / open-PO; in-transit = outbound transfers to the location not yet received; company balance, reserved, sales-order-open, open-PO; last-30-days sales at location and company (sales invoices less sales returns); reorder quantity = max(0, level − ledger quantity); and the chosen supplier. Re-running does not delete earlier lines — each calculation appends a new set. Processing stops silently (logged, no error to the UI) when the effective location or item set is empty or a template has no location / item filters. An error inside the calculation is silent too: the job runs in a queue, and when it throws — most often PO cannot be initiated without a supplier present for an item with no supplier link and no past purchase invoice — the work is rolled back, the error is written to a table no screen shows, and the sweep tries the job again, up to five times. On an event-created run the run header is created before the item loop, so each attempt leaves another empty run named Run for template: ‘…’ in the Runs listing; on a manual run Auto-Fill All reports success the moment the job is queued, whatever happens to it afterwards (read from the code, not tried).
3. Fulfillment (one pass per line for manual runs, inline for event runs): reads the run’s strategy and writes one fulfillment line per order-quantity line — a PO line (status PENDING), an internal or inter-company transfer line (source location chosen by scope / priority), or a surplus redistribution line. A transfer line’s quantity is the lesser of the requested quantity and the source’s ledger quantity when the request is above zero; when the request is zero — every location already at or above its level, since the request starts as the reorder quantity — the line is given the source’s whole ledger quantity instead (read from the code, not tried). So in a transfer-type run every in-scope location gets a proposal, and the ones that needed nothing get the biggest; on an event-created run those become transfers automatically. Check the Quantity To Approve of every line whose Location Balance is already at its level before generating, and prefer manual runs for transfer strategies until you have seen one. A line with no item is skipped; a line with no usable source stays PENDING with a reason.
4. Document creation. GENERATE PO filters the selected lines to PO type with a supplier and not BLOCKED, applies the open-PO block, and merges lines with the same branch and supplier into one PO — and, inside that PO, merges lines for the same item into one line, summing the quantities. The merged line keeps the first location’s delivery store, and the run’s link to the document is written against the first matching fulfillment line only, so when two locations of one branch want the same item from the same supplier the PO shows one line addressed to the first location and the other location’s fulfillment line shows no document (read from the code, not tried). Split the PO line by hand in the Purchase Order applet, or run one location at a time. The POs are created with the same validation as the Purchase Order applet, linked to the run, the lines set to GENERATED and the notification sent. GENERATE STOCK TRANSFER does the same for internal and surplus lines; GENERATE INTER-COMPANY TRANSFER adds the branch inter-company checks (on the source location’s branch) and creates the inbound leg in the counterpart company. For event-created runs the POs and internal transfers are created automatically (errors are not surfaced); inter-company documents are never created automatically.
What Document Status: Active does and does not do. The generated document is written with posting status FINAL and the usual running number, and the webhook created event is queued — nothing else. The processing chain that moves stock for a transfer, or starts the purchase-order chain for a PO, is started only when a document is finalised through its own applet’s FINAL, and the run never calls that path. So a FINAL transfer from a run has moved nothing, Stock Balance does not change, and the Stock Transfer applet treats the document as already final and offers no FINAL to press (read from the code, not tried). Draft is the status that leads somewhere.
Posting proof block
| Server document type | None for the applet’s own records (templates, events, runs, order-quantity lines, fulfillment lines, document links, strategies). Generated: Purchase Order (Internal), Internal Outbound Stock Transfer |
| Amount signum / quantity signum | Not applicable to the applet; the generated PO line carries no sign of its own and the PO / transfer types then post per their own rules (see the Purchase Order and Stock Transfer pages) |
| Dr / Cr equation | None — no journal from this applet |
| GL precedence | Not applicable; generated lines carry no GL code (the PO applet resolves it when the PO is finalised) |
| Stock processor | None from this applet, and none for its documents either: a generated transfer or PO created as FINAL (Document Status: Active) is created, not finalised, so the Stock Transfer processing chain never runs for it and no stock moves. A DRAFT document finalised in its own applet posts as any hand-keyed one would |
| Generated document header | company / branch and location from the destination location, the supplier as the entity (PO), transaction date = now, posting status per Document Status, currency MYR at exchange rate 0 whatever the tenant’s base currency; line: the item, quantity = Qty To Approve, unit price = Price, UOM PCS at ratio 1 whatever the item’s own unit, no tax, no discount. A tenant that keeps its books in another currency, or sells an item by the carton, should open each generated PO and correct the currency, rate and unit before finalising it |
| What Delete does | Run: removes the run header; generated documents and links are not touched. Event: this / following / all occurrences as chosen. Template: header only |
| Notification | Per document batch: outcome SUCCESS (no blocked lines), PARTIAL (some blocked), BLOCKED (all blocked), FAILURE (error — then reported to the caller). Each line records SENT, FAILED, SKIPPED or SKIPPED_NO_RECIPIENTS |
Validation. Saving checks only structure (status, audit fields). The business rules are the errors listed under Troubleshooting.
Related applets
- Purchase Order (Internal) — receives the generated Purchase Orders (Internal); its own PO Replenishment menu is a separate, older screen family.
- Stock Transfer — receives generated outbound transfers (internal, inter-company and surplus).
- Inventory Item Maintenance — per-location minimum / maximum levels.
- Doc Item Maintenance — Entity Pricing supplier links, supplier priority, purchase price, order quantity bands, lead time.
- Supplier — the supplier entity on the generated PO.
- Organization — locations, branches, geolocation, Branch Intercompany Configuration.
- Chart of Account — inter-company GL mapping check.
- Stock Balance, Stock Availability, Stock Balance overview — the balance rows the run snapshots and whose min / max it edits.
- Stock Level Monitoring — the same template / event / run shape and the same Rules Logic and Negation Logic controls, but it only e-mails the breach instead of creating documents.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Order Fulfillments tab is empty after creating a run | The run was created without a template (nothing is queued), or its Items / Locations tabs are empty, or the template has no location / item filter — the calculation stops without an on-screen error | Fill the run’s Locations and Items tabs (or pick a template that has them) and press Auto-Fill All |
| Every order quantity is 0 | No minimum / maximum level on the location balance, or the location has no balance record at all (treated as 0) | Set levels on the Min/Max Qty/Loc tab or in Inventory Item Maintenance, then re-run |
| A run never gets its order-quantity lines, and an event has left several empty runs named Run for template: ‘…’ in the listing | An item in scope has no active supplier pricing link and no FINAL purchase invoice to fall back on, so the calculation throws PO cannot be initiated without a supplier present. The error is never shown: the job is rolled back, written to an error table no screen shows, and retried up to five times, and on an event run each attempt creates another empty run header first. Auto-Fill All’s success toast only means the job was queued | Add the supplier under Doc Item Maintenance → Entity Pricing with a priority for every item in scope; make sure the entity is active and of type supplier. Delete the empty runs. When a run stays empty with no obvious cause, send support the run name and time — the error table holds the message |
| Wrong supplier chosen | Highest Supplier Priority wins; equal priorities pick the first found. The Suppliers filter is a preference, not a limit: when none of the filtered suppliers has a pricing link for the item, the run takes the highest-priority link outside the filter, then the supplier on the last FINAL purchase invoice, and only then the first filtered supplier without a link | Set distinct priorities, and give every filtered supplier a pricing link for the items it should win |
| Line BLOCKED “Existing open purchase order found for same supplier and item” | Block existing open PO is on and any DRAFT / FINAL / EDITED PO for that supplier already contains the item — at any location | Finalise or receive the open PO, or turn the checkbox off on the run’s strategy |
| PO created with quantity 0 | PO fulfillment lines start with Qty To Approve = 0 | Enter Quantity To Approve on each line before GENERATE PO |
| Toast “No purchase order was created - check the selected line’s Fulfillment Type, Status, and Blocked Reason” | Selected lines are not PO lines, have no supplier, or are BLOCKED / already GENERATED | Select PENDING PO lines only; use the matching button for transfer lines |
| Line PENDING “No suitable source location found for internal stock transfer” | No other location holds ≥ Minimum Transfer Qty, or Transfer Scope = Same company excludes the only stocked locations, or Specific locations only has no locations saved | Widen the scope, lower the minimum, or add source locations |
| Inter-company line PENDING “No suitable inter-company source location found” although another company has stock | Target Scope = Selected companies only — the UI has no company picker, so the allowed set is empty | Use All tenant companies |
| Inter-company line BLOCKED “No inter-company configuration found for this branch” / “…missing ‘Auto Purchase Stock Entity Branch’” / “Chart of Accounts not configured…” / “No supplier/pricing link configured for this item” | The run reads the Intercompany Configuration of the source location’s branch (the branch sending the stock), and needs the stock-transfer pairing in AUTO mode with a counterpart entity and branch there; or one of the two companies has no chart of accounts selected on its company record; or the item has no supplier pricing link anywhere in the tenant | Configure the pairing on the source location’s branch in the Organization applet — the counterpart entity and branch on it name the receiving company; select a chart of accounts on both companies’ records; give the item a supplier pricing link |
| Strategy edited on the template but the run still behaves the old way | A run is processed from its own strategy; template → event → run copies happen at creation | Edit the strategy on the run (or recreate the run) |
| Filter set to Excluded processes everything | Negation with an empty pick list means “whole universe” | Pick at least one value, or set Included |
| Filter set to Excluded on an event orders exactly the picked locations or items | Negation is not applied on event-created runs; the event’s picks are used as picked | On events, pick what you want included and leave negation off; use Excluded only on runs you start by hand |
| A transfer-type run proposes the source’s entire stock for a location that was not short | A location at or above its level has a request of 0, and a zero request takes the source’s whole ledger quantity | Set Quantity To Approve on those lines (or delete them) before generating; do not let an event generate transfers for a transfer-type template until you have checked one run by hand |
| A PO shows one line for an item that two locations of the branch asked for, and one of the fulfillment lines shows no document | Lines for the same item within one PO are merged into one line with the summed quantity, addressed to the first location; only the first fulfillment line is linked | Split the line in the Purchase Order applet before finalising, or run one location at a time |
| Transfer or PO generated with Document Status: Active reads FINAL but stock has not moved, and its own applet offers no FINAL | The run creates the document already marked FINAL; the posting chain starts only from a FINAL pressed in the document’s own applet, which this document never gets | Set Document Status to Draft on the run’s strategy and finalise the generated documents in the Stock Transfer / Purchase Order applet. For the FINAL ones already created, record the movement with a hand-keyed transfer or PO, and leave the generated document as the record of what the run proposed |
| A scheduled event never produced a run | No Cycle Start Date was saved (the event saves, the queuing fails silently); or the sweep has not reached the job; or the job failed five times (see the empty-runs row) | Delete and re-create the event with a start date; if the dates are right, wait one more sweep, then send support the event code and start time |
| Categories filter has no effect | Category picks are copied but not used to select items | Pick items (or exclude items) directly |
| No e-mail although notification is on | The outcome’s Notify on … checkbox is off (SKIPPED), recipients empty (SKIPPED_NO_RECIPIENTS), or the send failed (FAILED) | Tick the outcome flags, enter recipients; check the applet’s Email Template exists and has a body — older templates may have been saved with an empty one |
| Placeholders appear literally in the e-mail | Token not in the supported list | Use only the placeholders listed under Email Template |
| Recurring event creates far fewer occurrences than expected | Infinite rules are capped at 100 instances; Invalid Recurrence Rule rejects a malformed rule | Give the rule an end date or count |
| Order Fulfillments shows duplicate lines | Every Auto-Fill / GENERATE ORDER FULFILMENTS appends a new set of order-quantity and fulfillment lines | Select only the newest lines; delete the extra ones from the grid |
| Personalization → Default Selection throws on selecting a branch | Broken in this build (see Configuration) | Use Settings → Default Selection; the values have no effect anyway |
| Export as PDF does nothing | The button has no output behind it; printable formats are stored but never rendered | Use the Purchase Orders tab to open the generated documents and print from the PO applet |
Related documentation
- Inventory module · Purchasing module
- Stock Balance overview — where the min / max levels live and how balances are maintained
- Purchase Order (Internal) — what happens to a generated PO
- Stock Transfer — what a FINAL outbound transfer does to stock