Inventory Module
Stock balance is not typed in anywhere. It is the running total of a signed stock ledger that the server appends to whenever a document with a non-zero quantity signum is finalised. Everything in this module either writes to that ledger, reads it, or prepares the paperwork around it.
Applets in this module
Membership is an editorial judgement — the product has no module↔applet relationship in its data —
and it is written down in planning/specs/module-applet-membership.md rather than left to the folder
each page happens to sit in. Inventory owns 22 applets and all 22 are documented.
Looking at stock
| Applet | What it is for |
|---|---|
| Stock Balance | The enquiry grid: item × company × location, with ledger quantity, the location’s moving-average cost and the company’s last purchase cost. Reads only |
| Stock Availability | The same balance plus the open documents that will change it, down to bin, serial and batch. This is where “why can I only promise 12?” is answered |
| Stock Report | Twelve reports over the ledger and the balance tables — movement, aging, summary by location, balance as at a past date, sales versus purchase, value by category level, batch expiry |
| Stock Level Monitoring | Watches quantity on hand against optimal and maximum levels per item category and e-mails a list of people. It only tells you; it changes nothing |
Moving stock
| Applet | What it is for |
|---|---|
| Stock Transfer | Two-step movement between two locations of the same company. Transfer Out empties the sending location into a queue; Transfer In knocks the queue off and fills the receiving location. Between the two, the goods are counted at neither branch location: the processor moves them to the company’s stock-in-transit location (L-STOCK-IN-TRANSIT…, InventoryTransactionLineProcessorService L96–L135), where Stock Balance shows them until the inbound is finalised |
| Stock Adjustment | Corrects what the system thinks you have, up or down, and posts the journal that moves the value with it (STOCK_ADJUSTMENT against the stock account). Also holds the Reset Moving Average tools — a Reset MA posts STOCK_BALANCE against the RESET_MA default (JournalPostingService L1136–L1240); neither touches cost of goods sold, which is only ever the period-end journal from Financial Report (FinancialReportService L473–L640) |
| Stock Conversion | Re-packing, re-labelling and simple kitting at one location: input lines and output lines on one header. Not a generic document — it has its own tables and its own processor |
| Consignee Stock Transfer | Moves stock you still own to a partner showroom, dealer shelf or customer site. Single-document, no in-transit queue |
| Consignment GRN (Internal) | Stock a consignor places with you and still owns, arriving |
| Consignment GIN (Internal) | The same stock leaving again |
Asking for stock, and planning it
| Applet | What it is for |
|---|---|
| Stock Requisition (Internal) | A branch’s request for stock from another location. Records the request only — the movement is a Stock Transfer raised against it |
| Stock Reservation | A promise: this quantity, at this location, held for this customer until this date. It moves no stock; it writes the reserved column that availability subtracts |
| Stock Replenishment | Turns per-location minimum and maximum levels into documents: a template fixes the scope and strategy, an event puts it on a calendar, a run creates Purchase Orders or Outbound Stock Transfers |
| Pdg | Head office’s recommended display quantity per product category per outlet type, and each outlet’s adjusted version of it. Planning master data — writes no document |
The warehouse floor
| Applet | What it is for |
|---|---|
| Warehouse Management System | The physical layer: receiving docs, processing queue, putaway, container-to-space allocation, picking queue, picking lists and packing lists. It converts a packing list into a document at the end; it writes no ledger line itself |
| Stock Take | Counting. A session per location, devices attached, records captured by scan or by hand, and a report comparing counted against system with a tolerance band. It never changes a balance |
| Barcode Generator | Designs and prints label sheets. A standalone printing tool — it reads nothing from inventory and writes nothing back |
Getting it to the customer
| Applet | What it is for |
|---|---|
| Delivery Installation | The dispatch console: turns lines due for delivery into Jobs, groups them onto a Trip with a driver and a vehicle, and rolls the status back to the source document |
| Delivery And Installation Driver | The driver’s half: their own trips only, start job, confirm delivery with proof, or cancel |
| Driver Delivery Order | A simpler, older driver view: edits vehicle number, delivery date and time slot on delivery orders assigned to that driver. Nothing else |
| Goods Delivery Note (Internal) | The document handed over with the goods. It knocks off the upstream order — and moves no stock |
| Non Stock and Trade In | Trade-in units and non-stock items, tracked one serial at a time in their own tables, outside the inventory ledger |
Which documents actually move stock
A document moves stock only if its server document type carries a non-zero quantity signum. That number is fixed in the backend; it is not an applet setting, and the applet’s own copy of it is overwritten by the server on every save. Twenty-five document types have one.
flowchart LR
subgraph IN["Stock in (+1)"]
PI["Purchase Invoice"]
GRNSI["Purchase GRN <b>Stock In</b>"]
SR["Sales Return"]
SRN["Sales Refund Note"]
TIN["Transfer In"]
CGRN["Consignment GRN"]
end
subgraph OUT["Stock out (−1)"]
SI["Sales Invoice"]
CB["Cash Bill"]
GINSO["Sales GIN <b>Stock Out</b>"]
PR["Purchase Return"]
TOUT["Transfer Out"]
CGIN["Consignment GIN"]
end
ADJ["Stock Adjustment<br/>direction from the line"]
CONV["Stock Conversion<br/>direction from the tab"]
IN --> LEDGER[["Stock ledger<br/>bl_inv_txn_line"]]
OUT --> LEDGER
ADJ --> LEDGER
CONV --> LEDGER
LEDGER --> BAL["Stock balance<br/>item × company × location"]
NONE["Sales Order · Purchase Order · Quotation<br/>Stock Requisition · Delivery Order<br/>Goods Delivery Note · Packing Order · Jobsheet<br/>Credit Note · Debit Note<br/>plain GRN · plain GIN<br/>Invoice No Stock In / No Stock Out"] -.->|"quantity signum 0"| NOTHING(["nothing reaches the ledger"])
These do not move stock, whatever their name suggests. Sales and Purchase Credit Notes and Debit Notes; the plain Sales and Purchase GRN and GIN as opposed to GRN Stock In and GIN Stock Out; Sales and Purchase Invoice No Stock Out / No Stock In; Sales Order; Purchase Order; Purchase Requisition; Stock Requisition; Quotation; Packing Order; Delivery Order; Goods Delivery Note; Jobsheet; and Job Order. All carry quantity signum 0. Finalising them changes nothing on the balance — they knock off, reserve or bill.
This matters most for receiving. If your process is purchase order → GRN → purchase invoice, the stock arrives on the invoice. If it is purchase order → GRN Stock In → invoice, the stock arrives on the receipt and the invoice books only the money. Pick one pair. Using a document from each double-counts.
What reaches the general ledger
Only one document this module owns posts a journal.
| Document | Journal | GL codes |
|---|---|---|
| Stock Adjustment | Yes | STOCK_ADJUSTMENT against STOCK_BALANCE, or the GL code on the line |
| Consignment GRN / GIN | Yes, through the consignment handler | CONSIGNMENT_LIABILITY against CONSIGNMENT_STOCK |
| Stock Transfer (out and in) | No | Quantity only. Value stays on the balance sheet, at the company’s cost |
| Consignee Stock Transfer | No | Quantity only |
| Stock Conversion | No | No amount is written at all — see the warning below |
| Stock Take, Stock Reservation, Stock Requisition, Replenishment, Monitoring, WMS, Barcode, PDG, the delivery applets | No | They create no ledger line and no journal |
The general ledger is reached through exactly seven journal handlers in the whole product. The
one this module uses is INTERNAL_STOCK_ADJUSTMENT; the cost of goods sold on a sale is posted by
the sales handler, not by anything here.
Four things this module is often believed to do, and does not
A stock take does not adjust anything. It counts, it compares, it shows you a tolerance band and the cost of the difference — and it writes nothing to the balance. The gap is closed by a Stock Adjustment that somebody raises afterwards. There is no “post variance” button, and no shrinkage journal comes out of a count on its own.
There is no approval on a transfer, an adjustment or a count. BigLedger’s approval engine covers three document types — Purchase Order, Purchase Requisition and Stock Requisition — it is off until a tenant configures it, and it causes FINAL rather than gating it. Worse for this module: the Stock Requisition applet offers Approval Settings screens but has no approval tab on the document, no request screen and no history screen, so a setting created there has no effect today. Control transfers, adjustments and write-offs with permissions, not with an imagined workflow.
Stock Conversion does not re-allocate cost. It writes quantity and no value at all. An input line enters stock at zero value and drags the location’s moving-average cost down; an output line leaves at the running average. If you kit, expect the cost of the kitted item to be wrong and correct it with Reset Moving Average. Also read the tabs literally: Input means into stock, Output means out of stock, which is the opposite of what most people assume from a bill-of-materials tool.
Available is not “balance minus reservations”. It is the balance plus a signed adjustment for open documents, and the adjustment can be positive. Open sales orders push it down; goods received but not yet invoiced push it up. A location can show more available than it physically holds, and that is correct.
Costing
Every balance row carries moving average and weighted average cost, plus last purchase cost and
landed cost; FIFO is written only where the FIFO/LIFO subscriber job is enabled and by the rebuild
(LifoCostingHelper L74–L78 fills the FIFO columns). The LIFO, manual and replacement columns exist
on the tables and are not maintained — nothing writes them (StockBalancePropertiesCalculator L88–L98
sets them null), and they are null on every ledger line in every tenant (aggregate, 2026-09-16). They are
columns, not a mode you choose; each screen decides which one it shows.
In practice moving average is the one most screens use, and it is the one that bites:
- The Stock Take report values a variance at the location’s latest moving-average price. A FIFO tenant never sees FIFO cost there.
- A Stock Conversion input line enters at zero value and dilutes the average.
- A transfer never changes the company’s unit cost — the receiving location takes the company-level cost.
Reset Moving Average, in the Stock Adjustment applet, is how a wrong average is corrected. It changes inventory value on the balance sheet and cost of sales on the income statement, so restrict it to finance.
What this module needs from others
| Module | What it supplies |
|---|---|
| Core | Inventory Item Maintenance — the stock-keeping record, its tracking type (serial, batch, bin) and its per-location minimum and maximum levels. Doc Item Maintenance — the sellable item and its link to an inventory item; only lines whose item resolves to an inventory item reach the ledger. Organization — companies, locations, and the branch’s default location, which is the last fallback when a line has no location of its own |
| Purchasing | Everything that brings stock in: Purchase Order, Purchase GRN and GRN Stock In, Purchase Invoice, Purchase Return and Refund Note |
| Sales and Point of Sale | Everything that takes stock out: Sales Invoice, cash bill, Sales GIN Stock Out, Sales Return, Sales Refund Note — and the sales orders that reduce availability without touching the balance |
| Financial Accounting | The Chart of Account company defaults the adjustment journal resolves against — STOCK_ADJUSTMENT, STOCK_BALANCE, COGS — and the General Ledger where it lands |
| E-Commerce | The marketplace quantity, derived from this balance minus open marketplace orders and written to a separate marketplace table — never back into the stock balance |