Inventory System
Inventory System — Complete User Guide
Comprehensive guide covering inventory item setup, valuation methods (FIFO, LIFO, Moving Average), inventory systems (Perpetual, Periodic), opening balances, NRV/LCNRV, all transaction types that impact inventory, inventory reports, and accounting regulation validation.
Table of Contents
- System Overview
- Inventory Item Setup — Field-by-Field Guide
- Valuation Methods & Systems Explained
- Opening Balances for Inventory
- Transaction Types That Impact Inventory
- How Inventory Posts to the General Ledger
- LCNRV — Lower of Cost or Net Realizable Value
- Negative Inventory & Backlog Handling
- Inventory Kits & Non-Inventory Items
- Inventory Transfers Between Locations
- Inventory Write-Offs
- Goods Receipts & Delivery Notes
- Sample Data — Full Walkthrough
- Inventory Reports — Complete Guide
- Field Fallback & Edge Cases
§. Accounting Regulation Validation
1. System Overview
The inventory system tracks stock quantities and values across the entire business. It supports:
- 3 valuation methods: FIFO, LIFO, and Moving Average — settable per item
- 2 inventory systems: Perpetual (COGS at each sale) and Periodic (COGS at period-end) — settable per item
- Layer-based costing: Each purchase creates a dated cost layer; sales consume from layers
- LCNRV: Lower of Cost or Net Realizable Value write-down at period-end
- Backlog handling: Manages negative inventory with estimated costs
- Production/WIP: Manufacturing tracking with Bill of Materials
- Multi-location: Inventory transfers between warehouses
- 18 transaction types: Purchases, sales, returns, transfers, write-offs, production, LC imports etc
Key Concepts
| Concept | Meaning |
|---|---|
| Cost Layer | A dated batch of inventory with specific qty and unit cost (e.g., 100 units @ $10 purchased Jan 5) |
| QtyOnHand | Physical quantity from all transaction documents |
| QtyOwned | Accounting quantity from the costing engine (may differ from QtyOnHand) |
| COGS | Cost of Goods Sold — the cost of inventory when sold, expensed to P&L |
| Average Cost | Total cost of all layers divided by total quantity |
| LCNRV | Write-down when cost exceeds net realizable value |
| Backlog | Queue of sales that exceeded available stock (negative inventory) |
2. Inventory Item Setup — Field-by-Field Guide
Navigation: Inventory Items > New Inventory Item
General Fields
| Field | Required? | What To Enter | If Left Blank |
|---|---|---|---|
| Item Code | ❌ Optional | Unique alphanumeric identifier | Item displayed by name only |
| Item Name | ✅ Yes | Product name | Cannot create item |
| Unit Name | ❌ Optional | Unit of measure (pcs, kg, meter, etc.) | No unit shown on documents |
| Division | ❌ Optional | Operational division for this item | No division tracking on this item |
| Control Account | ❌ Optional | Custom Balance Sheet account for inventory value | Defaults to InventoryOnHand account |
| Active | ❌ Optional | Uncheck to deactivate the item | Item is active (default) |
| Hide Name on Printed Docs | ❌ Optional | Check to show only Item Code on invoices | Full name + code shown |
| Track Quantity to Receive | ❌ Optional | Check if this item is tracked against Purchase Orders | Not tracked against POs |
| Track Quantity to Deliver | ❌ Optional | Check if this item is tracked against Sales Orders | Not tracked against SOs |
| Production Stage | ❌ Optional | Manufacturing stage number (1, 2, 3...) | Defaults to stage 1 |
| Reorder Point | ❌ Optional | Check to enable reorder suggestions | Reorder suggestions disabled |
| Qty Desired | ❌ Only if Reorder checked | Target stock level when reordering | No reorder suggestion shown |
| Custom Fields | ❌ Optional | Key-value extensions | No custom fields |
Autofill Settings — For Sales Invoices
| Field | Required? | What To Enter | If Left Blank |
|---|---|---|---|
| Default Line Description | ❌ Check to enable | Description autofilled on sales/purchase lines | No default description |
| Line Description | ❌ Only if enabled | Default line text | Empty line description |
| Default Sale Price | ❌ Check to enable | Unit price autofilled on sales invoices | No default sale price |
| Sale Unit Price | ❌ Only if enabled | Price per unit | — |
| Default Purchase Price | ❌ Check to enable | Unit price autofilled on purchase invoices | No default purchase price |
| Purchase Unit Price | ❌ Only if enabled | Price per unit | — |
| Default Tax Code | ❌ Check to enable | Tax code autofilled on sales/purchase lines | No default tax code |
| Tax Code | ❌ Only if enabled | Select a configured TaxCode | — |
| Default Sales Division | ❌ Check to enable | Division autofilled on sales lines | Uses item's Division field |
| Sales Division | ❌ Only if enabled | Select a Division | Falls to item's Division → null |
Custom GL Account Overrides
| Field | Required? | What To Enter | If Left Blank |
|---|---|---|---|
| Custom Income Account | ❌ Check to override | Different revenue account when sold | Defaults to InventorySales (P&L) |
| Income Account | ❌ Only if checked | Select a P&L account | — |
| Custom Expense Account | ❌ Check to override | Different COGS account when sold | Defaults to InventoryPurchases (P&L) |
| Expense Account | ❌ Only if checked | Select a P&L account | — |
Valuation & System Fields
| Field | Required? | Options | If Left Blank |
|---|---|---|---|
| Valuation Method | ✅ Yes | MovingAverage / FIFO / LIFO | Defaults to MovingAverage |
| Inventory System | ✅ Yes | Perpetual / Periodic | Defaults to Perpetual |
These two fields determine how inventory costs are calculated when items are sold (see Section 3).
Opening Balance Fields
| Field | Required? | What To Enter | If Left Blank |
|---|---|---|---|
| Opening Inventory Qty | ❌ | Starting quantity on hand | No opening quantity |
| Opening Inventory Cost | ❌ | Total cost of opening quantity | Warning shown if qty > 0 but cost = 0 |
| Opening Inventory Date | ❌ | Date the opening balance takes effect | Uses earliest transaction date in the system |
Warning: If Opening Qty > 0 and Opening Cost = 0, the system shows a yellow warning. Sales will record COGS at zero cost until corrected.
LCNRV Fields
| Field | Required? | What To Enter | If Left Blank |
|---|---|---|---|
| Net Realizable Value Per Unit | ❌ | Expected selling price minus costs to sell | LCNRV calculation skipped |
| Apply LCNRV | ❌ | Check to enable NRV write-down | LCNRV skipped even if NRV is set |
Note: Both NRV Per Unit AND Apply LCNRV must be set for the write-down to occur.
Other Settings
| Field | Required? | What To Enter | If Left Blank |
|---|---|---|---|
| Prevent Negative Inventory | ❌ | Check to prevent selling more than available stock | Backlog allowed (negative inventory can occur) |
3. Valuation Methods & Systems Explained
The Three Valuation Methods
FIFO (First In, First Out)
The oldest purchase layers are consumed first when items are sold.
Purchase 100 units @ $10 → Layer 1: 100 @ $10
Purchase 100 units @ $12 → Layer 2: 100 @ $12
Sale 120 units → 100 from Layer 1 @ $10 + 20 from Layer 2 @ $12
→ COGS = 100×$10 + 20×$12 = $1,240
Remaining: Layer 2: 80 @ $12 = $960
Best for: Perishable goods, items with falling prices, IFRS reporting.
LIFO (Last In, First Out)
The newest purchase layers are consumed first when items are sold.
Purchase 100 units @ $10 → Layer 1: 100 @ $10
Purchase 100 units @ $12 → Layer 2: 100 @ $12
Sale 120 units → 100 from Layer 2 @ $12 + 20 from Layer 1 @ $10
→ COGS = 100×$12 + 20×$10 = $1,400
Remaining: Layer 1: 80 @ $10 = $800
Best for: US GAAP reporting, items with rising prices. Not permitted under IFRS.
Moving Average
The average cost is recalculated after each purchase. All units are valued at the current average.
Purchase 100 units @ $10 → Avg = $10.00
Purchase 100 units @ $12 → Avg = ($1,000 + $1,200) / 200 = $11.00
Sale 120 units → COGS = 120 × $11.00 = $1,320
Remaining: 80 units @ $11.00 = $880
Purchase 50 units @ $14 → Avg = ($880 + $700) / (80 + 50) = $12.15
Best for: Items with stable costs, simple accounting, IFRS reporting.
The Two Inventory Systems
Perpetual System
COGS is calculated at the time of each sale. The cost layer is immediately reduced.
Sale 100 units @ FIFO → Layer consumed immediately → COGS = $1,000
QtyOnHand reduced immediately
Inventory value updated immediately
Best for: Real-time inventory tracking, most businesses.
Periodic System
COGS is calculated at period-end (monthly/quarterly). Sales quantities are accumulated and COGS is computed once.
Month 1: Sold 300 units total
Month End: COGS = GetPeriodicCogs(300, LIFO)
= 50@$34 + 100@$32 + 100@$30 + 50@$28 = $9,500
Best for: Businesses that do physical counts at period-end, simple accounting.
Method + System Combinations
| Method | System | COGS Timing | When To Use |
|---|---|---|---|
| FIFO | Perpetual | At each sale | Standard IFRS, most businesses |
| FIFO | Periodic | At period-end | Physical inventory counts |
| LIFO | Perpetual | At each sale | US GAAP, real-time tracking |
| LIFO | Periodic | At period-end | US GAAP, physical counts |
| Moving Average | Perpetual | At each sale | Simple accounting, real-time |
| Moving Average | Periodic | At period-end | Simple accounting, physical counts |
4. Opening Balances for Inventory
Do NOT use the Opening Balance Entry form for inventory items. Inventory opening balances must be set directly on the Inventory Item form.
How To Set Opening Balances
Navigation: Inventory Items > New Inventory Item > Opening Inventory section
| Field | Example |
|---|---|
| Opening Inventory Qty | 1,000 |
| Opening Inventory Cost | 15,00,000 |
| Opening Inventory Date | 7/1/2026 |
What Happens in the General Ledger
When you save an item with opening qty and cost, the system creates 2 GL entries:
Dr InventoryOnHand (or custom ControlAccount) 15,00,000
Cr RetainedEarnings 15,00,000
The cost is divided by qty to determine the opening unit cost:
Unit Cost = 15,00,000 / 1,000 = 1,500.00
This opening layer is available for FIFO/LIFO/MA consumption when items are sold.
What Happens If Opening Cost = 0
The system shows a yellow warning on the form:
Opening inventory quantity is set but cost is zero.
Sales will record zero COGS until the cost is corrected.
5. Transaction Types That Impact Inventory
| # | Transaction Type | Qty Effect | Cost Effect | Inventory Value | COGS |
|---|---|---|---|---|---|
| 1 | PurchaseInvoice | +Qty | +Cost | Increases | None |
| 2 | GoodsReceipt | +Qty | +Cost | Increases | None |
| 3 | SalesInvoice | -Qty | -Cost | Decreases | Recorded |
| 4 | DeliveryNote | -Qty | -Cost | Decreases | Recorded |
| 5 | CreditNote (Sales Return) | +Qty | +Cost (reversal) | Increases | Reversed |
| 6 | DebitNote (Purchase Return) | -Qty | -Cost | Decreases | Recorded |
| 7 | InventoryWriteOff | -Qty | -Cost | Decreases | Recorded |
| 8 | InventoryTransfer | No net change | No net change | Same (location change) | None |
| 9 | ProductionOrder — BOM | -Qty (raw) | -Cost | WIP increases, Inv decreases | None |
| 10 | ProductionOrder — Output | +Qty (finished) | +Cost | Inv increases, WIP decreases | None |
| 11 | LetterOfCredit (Import) | +Qty | +Cost (capitalized) | Increases | None |
| 12 | JournalEntry | ±Qty | ±Cost | Changes per entry | If specified |
| 13 | OpeningBalance (Item form) | +Qty | +Cost | Increases | None |
| 14 | Payment (with Item=InventoryItem) | ±Qty | ±Cost | Increases or decreases | Recorded if outflow |
| 15 | Receipt (with Item=InventoryItem) | ±Qty | ±Cost | Increases or decreases | Recorded if outflow |
| 16 | ExpenseClaim (with InventoryItem) | +Qty | +Cost | Increases | None (purchase-side) |
| 17 | SalesQuote | No impact | No impact | None (non-posting) | None |
| 18 | PurchaseQuote | No impact | No impact | None (non-posting) | None |
Transaction Types That Do NOT Impact Inventory
| Transaction | Why |
|---|---|
| Sales Quote / Order | Non-posting — no GL entries |
| Purchase Quote / Order | Non-posting — no GL entries |
| Payment / Receipt (no Item) | Cash-only when no inventory item referenced |
| Money Transfer | Balance sheet only |
| Fixed Asset forms | Capital assets, not inventory |
6. How Inventory Posts to the General Ledger
GL Account Impact by Event
| Event | Debit | Credit | Amount Basis |
|---|---|---|---|
| Purchase / Receipt | InventoryOnHand (BS Asset) | AccountsPayable / Bank | Purchase cost |
| Sale (FIFO/LIFO Perpetual) | COGS Account (P&L Expense) | InventoryOnHand (BS Asset) | Layer cost at method |
| Sale (Moving Average Perpetual) | COGS Account (P&L Expense) | InventoryOnHand (BS Asset) | Average cost |
| Sale (Periodic any method) | Deferred; COGS at period-end | InventoryOnHand at period-end | Period-end computation |
| Credit Note (Return) | InventoryOnHand (BS Asset) | COGS Account (P&L) | Reversal of last sale cost |
| Write-Off | COGS / Expense (P&L) | InventoryOnHand (BS Asset) | Current layer cost |
| Transfer | InventoryOnHand (destination) | InventoryOnHand (source) | Quantity only (0 amount) |
| Production — BOM Consume | ProductionInProgress (BS) | InventoryOnHand (BS) | Raw material cost |
| Production — Output | InventoryOnHand (BS) | ProductionInProgress (BS) | Manufacturing cost |
| Opening Balance | InventoryOnHand (BS) | RetainedEarnings (Equity) | Entered cost |
| Payment (with Item) | InventoryOnHand (BS) | Cash/Bank (BS) or AP | Amount on line — creates cost layer |
| Receipt (with Item, outbound) | COGS Account (P&L) | InventoryOnHand (BS) | Layer cost at item's FIFO/LIFO/MA |
| Receipt (with Item, inbound) | InventoryOnHand (BS) | Cash/Bank or AR | Amount on line — creates cost layer |
| ExpenseClaim (with InvItem) | InventoryOnHand (BS) | Employee Clearing / ExpenseClaims Payable | Amount on line — creates cost layer |
| LCNRV Write-Down | InventoryImpairment (P&L) | InventoryOnHand (BS) | Cost - NRV |
| Backlog Fulfill Adj | COGS Account (P&L) | InventoryOnHand (BS) | Actual vs estimated cost diff |
DR = CR for Every Event
Each inventory movement creates balanced pairs of GL entries. For example:
Sale of 100 units @ FIFO $10:
Dr COGS Account $1,000
Cr InventoryOnHand $1,000
Purchase of 100 units @ $12:
Dr InventoryOnHand $1,200
Cr AccountsPayable $1,200
Transfer of 50 units (no financial impact):
Dr InventoryOnHand (Dest) 0 (50 units)
Cr InventoryOnHand (Source) 0 (50 units)
How Opening Balances Post
The GL constructor processes inventory opening balances:
For each item with OpeningQty > 0 AND OpeningCost > 0:
Dr InventoryOnHand OpeningCost
Cr RetainedEarnings OpeningCost
7. LCNRV — Lower of Cost or Net Realizable Value
What It Does
LCNRV is an accounting requirement (IAS 2, Sections 28-33) that inventory must be valued at the lower of cost and net realizable value. If the market value drops below cost, a write-down is recorded.
How To Enable
On the Inventory Item form:
| Field | Value |
|---|---|
| Net Realizable Value Per Unit | Expected selling price minus selling costs (e.g., 2,000) |
| Apply LCNRV | ✅ Checked |
How It's Calculated
At period-end, the system checks each item:
If NRV Per Unit is set AND Apply LCNRV is checked:
inventoryValue = Current total layer cost (e.g., 25,00,000)
nrvValue = NRV Per Unit × Current Qty (e.g., 2,000 × 1,000 = 20,00,000)
writeDown = Max(0, inventoryValue - nrvValue) = 5,00,000
GL Entry
Dr InventoryImpairment (P&L) 5,00,000
Cr InventoryOnHand (BS Asset) 5,00,000
What Happens If NRV Rises Later
The system does not automatically reverse write-downs. (IAS 2 allows reversals, but the system currently does not auto-reverse — reversal requires a manual Journal Entry.)
8. Negative Inventory & Backlog Handling
What Is Negative Inventory?
Negative inventory occurs when items are sold before they are received (e.g., a sale qty exceeds the available stock). This is common in some business models where goods are committed before physical receipt.
Two Modes
Mode 1: Prevent Negative Inventory (Recommended)
Check Prevent Negative Inventory on the item form. When stock is insufficient: - The sale is blocked — no COGS entry is created - The transaction is skipped by the costing engine - The sale must be processed after stock arrives
Mode 2: Allow Negative Inventory (Backlog)
Leave Prevent Negative Inventory unchecked (default). When stock is insufficient: - A backlog entry is created with an estimated unit cost (last known cost or default purchase price) - The sale proceeds with estimated COGS - When new stock arrives, the backlog is fulfilled - A COGS adjustment is posted: difference between estimated cost and actual cost
Backlog Example
Starting: 0 units
Sale of 100 units → Backlog created with estimate @ $10 = $1,000 COGS
Purchase 100 units @ $12 → Backlog fulfilled (100 units)
→ COGS adjustment: actual $12 - estimated $10 = $2 × 100 = $200 additional COGS
→ Total COGS = $1,000 + $200 = $1,200 (correct)
Backlog Costs Are Not Recoverable on Return
If goods are returned after a backlog sale, the sunk backlog costs remain in P&L — they are genuine costs that cannot be recovered.
9. Inventory Kits & Non-Inventory Items
Inventory Kits
Inventory Kits are sales convenience bundles — they are NOT physical inventory. A kit groups multiple inventory items into a package for easy sales invoicing.
| Aspect | Behavior |
|---|---|
| QtyOnHand | Not tracked — kits have no physical stock |
| Cost tracking | No costing — kits are not valued |
| Valuation | Not applicable |
| Sales impact | When sold, individual components are consumed from inventory |
| Purchase impact | Not applicable (kits cannot be purchased) |
Example Kit — "Starter Package":
Kit contains:
- Widget-X (2 units)
- Gadget-Y (1 unit)
- Component-Z (5 units)
When sold → 2 Widget-X, 1 Gadget-Y, 5 Component-Z are consumed from inventory
Non-Inventory Items
Non-inventory items are services or supplies that are not tracked for quantity or value on hand.
| Aspect | Behavior |
|---|---|
| QtyOnHand | Not tracked |
| Cost tracking | Not valued |
| Valuation | Not applicable |
| Sales impact | Revenue recorded, no COGS |
| Purchase impact | Expense recorded, no inventory |
10. Inventory Transfers Between Locations
What It Does
Inventory Transfers move stock from one warehouse/location to another. There is no financial impact — inventory value stays the same; only the location changes.
How To Create
Navigation: Inventory Transfers > New Inventory Transfer
| Field | Required? | What To Enter |
|---|---|---|
| Date | ✅ | Transfer date |
| Reference | ✅ | Auto-generated or manual |
| From Location | ✅ | Source warehouse |
| To Location | ✅ | Destination warehouse |
| Lines | ✅ | Items and quantities to transfer |
GL Entries
For each item transferred:
Dr InventoryOnHand (Destination Location) 0 (Qty = +X)
Cr InventoryOnHand (Source Location) 0 (Qty = -X)
Only quantity changes — no monetary value is transferred. The cost layer remains with the item.
11. Inventory Write-Offs
What It Does
Write-offs remove inventory from the books due to damage, loss, obsolescence, or theft.
How To Create
Navigation: Inventory Write-Offs > New Inventory Write-Off
| Field | Required? | What To Enter |
|---|---|---|
| Date | ✅ | Write-off date |
| Reference | ✅ | Auto-generated or manual |
| Location | ❌ | Where the inventory was located |
| Allocation Account | ✅ | Which GL account to debit (COGS, expense, or fixed asset) |
| Items | ✅ | Items and quantities to write off |
| Tax Code | ❌ | If applicable |
GL Entries
Dr COGS / Expense / Fixed Asset (allocation account) Layer cost
Cr InventoryOnHand Layer cost
The cost is determined by the item's valuation method (FIFO/LIFO/MA) using the current layer.
12. Goods Receipts & Delivery Notes
Goods Receipts
Goods Receipts record inventory received from suppliers against a Purchase Order.
| Field | Required? | What To Enter |
|---|---|---|
| Supplier | ✅ | Who sent the goods |
| Purchase Order | ❌ | If receiving against an order |
| Location | ❌ | Where to store the goods |
| Lines | ✅ | Items and quantities received |
GL Entries:
If supplier exists and item exists:
Dr InventoryOnHand (clearing) 0 (Qty = -Qty) -- removes from goods-in-transit
Dr InventoryOnHand (location) 0 (Qty = +Qty) -- adds to location
If item does not exist:
Dr Suspense 0 (Qty = Qty) -- uncategorized
Delivery Notes
Delivery Notes record inventory shipped to customers against a Sales Order.
| Field | Required? | What To Enter |
|---|---|---|
| Customer | ✅ | Who receives the goods |
| Sales Order | ❌ | If delivering against an order |
| Location | ❌ | Where the goods are shipped from |
| Lines | ✅ | Items and quantities to deliver |
GL Entries: Same as SalesInvoice — COGS is recorded at the time of delivery.
12A. Payment (with Inventory Item)
Navigation: Payments > New Payment
Payments can impact inventory when their lines reference an InventoryItem. This acts as a cash purchase without using a PurchaseInvoice.
| Field | Required? | What To Enter |
|---|---|---|
| Pay From | ✅ | Bank or cash account |
| Line — Item | ✅ | Select an InventoryItem |
| Line — Amount | ✅ | The purchase cost |
| Line — Account | ✅ | Select InventoryOnHand or expense account |
How the costing engine processes it:
Payment line with Item=InventoryItem, Account=InventoryOnHand, Qty=100, Amount=1,000
→ Creates GL entry with Qty=100, AccountAmount=1,000
→ InventoryCostDestination = null (no COGS flag)
→ COGS engine sees: InventoryCostDestination==null AND Qty>0 AND AccountAmount!=0
→ Calls AddPurchaseLayer(100, 1,000) — creates a new cost layer
→ Uses item's configured FIFO/LIFO/MA
GL entries:
Dr InventoryOnHand 1,000
Cr Cash / Bank Account / AP 1,000
Important: The item's configured Valuation Method (FIFO/LIFO/MA), Inventory System (Perpetual/Periodic), and LCNRV all apply the same way as a PurchaseInvoice.
12B. Receipt (with Inventory Item)
Navigation: Receipts > New Receipt
Receipts can impact inventory when their lines reference an InventoryItem.
| Scenario | Line — Account | Qty | Cost Engine Action |
|---|---|---|---|
| Cash sale (outbound) | InventoryOnHand | Negative | Consumes layers using item's FIFO/LIFO/MA |
| Supplier refund (inbound) | InventoryOnHand | Positive | Creates new cost layer |
| Other inbound | InventoryOnHand | Positive | Same as purchase — adds to inventory |
GL entries for a cash sale (outbound):
Dr Cash / Bank Account Sales price
Dr COGS Account Layer cost (FIFO/LIFO/MA)
Cr InventoryOnHand Layer cost
Cr Revenue Account Sales price
GL entries for a supplier refund (inbound):
Dr Cash / Bank Account Amount received
Dr InventoryOnHand Original cost
Cr COGS Account (if reversing sale) Original cost
Important: Receipts with inventory items go through the same From method path as SalesInvoice. They create inventory cost destination entries when there is no proposed COGS amount, which the costing engine processes using the item's configured valuation method.
12C. ExpenseClaim (with Inventory Item)
Navigation: Expense Claims > New Expense Claim
ExpenseClaims allow employees to purchase inventory using personal funds and claim reimbursement. When the line references an InventoryItem, it creates a cost layer just like a PurchaseInvoice.
| Field | Required? | What To Enter |
|---|---|---|
| Paid By | ✅ | Select Employee (reimbursement), Capital Account (owner), or Expense Claims Payer |
| Line — Item | ✅ | Select an InventoryItem (only shown when Account matches inventory) |
| Line — Amount | ✅ | The purchase cost |
| Line — Account | ✅ | Select InventoryOnHand for inventory items |
GL entries:
Dr InventoryOnHand 1,000
Dr Tax Receivable (if TaxCode set) 150
Cr Employee Clearing / Capital A/C 1,150
All valuation features apply:
| Feature | Applies? | How |
|---|---|---|
| FIFO / LIFO / Moving Average | ✅ | Layer is created via AddPurchaseLayer. When sold later, consumed via RemoveSaleLayers using item's method. |
| Perpetual / Periodic | ✅ | COGS engine checks item's InventorySystem setting. For Periodic, sales qty accumulated separately. |
| LCNRV | ✅ | Checked at period-end for ALL inventory, regardless of acquisition method. |
| Negative Inventory / Backlog | ✅ | Applies if PreventNegativeInventory is unchecked. |
Note: ExpenseClaim is included in QtyOnHand calculations and in the COGS engine's inventory-on-hand transaction filter. This means inventory purchased via ExpenseClaim is fully tracked in all inventory reports.
12D. How These Transactions Compare to Standard Purchase/Sales
| Aspect | PurchaseInvoice | Payment (with Item) | ExpenseClaim (with InvItem) |
|---|---|---|---|
| Supplier/vendor tracking | ✅ Full supplier record | ❌ No supplier link | ❌ Uses employee instead |
| Cost layer created | ✅ AddPurchaseLayer | ✅ AddPurchaseLayer | ✅ AddPurchaseLayer |
| Valuation method | ✅ FIFO/LIFO/MA | ✅ FIFO/LIFO/MA | ✅ FIFO/LIFO/MA |
| Perpetual/Periodic | ✅ Applied | ✅ Applied | ✅ Applied |
| LCNRV | ✅ At period-end | ✅ At period-end | ✅ At period-end |
| Included in QtyOnHand | ✅ Yes | ✅ Yes | ✅ Yes |
| Included in Inventory Reports | ✅ Yes | ✅ Yes | ✅ Yes |
13. Sample Data — Full Walkthrough
Scenario
Three items with different valuation methods and systems:
| Item | Name | Method | System | Opening |
|---|---|---|---|---|
| A | Widget-X | FIFO | Perpetual | None |
| B | Gadget-Y | Moving Average | Perpetual | None |
| C | Component-Z | LIFO | Periodic | None |
Transactions
T1: Purchase 100 Widget-X @ $10 = $1,000
T2: Purchase 100 Gadget-Y @ $20 = $2,000
T3: Purchase 100 Component-Z @ $30 = $3,000
T4: Purchase 100 Widget-X @ $12 = $1,200
T5: Purchase 100 Gadget-Y @ $22 = $2,200
T6: Purchase 100 Component-Z @ $32 = $3,200
T7: Sale 150 Widget-X
T8: Sale 50 Gadget-Y
T9: Sale 120 Component-Z
T10: Purchase 50 Widget-X @ $14 = $700
T11: Sale 30 Widget-X
T12: Sale 60 Gadget-Y
T13: Purchase 50 Component-Z @ $34 = $1,700
T14: WriteOff 5 Widget-X
T15: Transfer 10 Gadget-Y to Location B
T16: Sale 30 Component-Z
T17: Return 10 Widget-X (Credit Note)
T18: Period End (Periodic COGS for Component-Z)
Cost Layer Trace
Widget-X (FIFO, Perpetual)
After T1: Layer 1: 100 @ $10 = $1,000
After T4: Layer 1: 100 @ $10 = $1,000 Layer 2: 100 @ $12 = $1,200
After T7: FIFO consumes Layer 1 first:
Layer 1: 0 @ $10 (consumed) Layer 2: 50 @ $12 = $600
COGS T7 = 100×$10 + 50×$12 = $1,600
After T10: Layer 2: 50 @ $12 = $600 Layer 3: 50 @ $14 = $700
After T11: FIFO consumes Layer 2:
Layer 2: 20 @ $12 = $240 Layer 3: 50 @ $14 = $700
COGS T11 = 30×$12 = $360
After T14: WriteOff consumes from Layer 2:
Layer 2: 15 @ $12 = $180 Layer 3: 50 @ $14 = $700
COGS T14 = 5×$12 = $60
After T17: Return reverses last sale (from Returns Queue):
Layer 2: 25 @ $12 = $300 Layer 3: 50 @ $14 = $700
COGS reversal T17 = -$120
Final: 75 units (25@$12 + 50@$14) = $1,000
Total COGS = $1,600 + $360 + $60 - $120 = $1,900
Gadget-Y (Moving Average, Perpetual)
After T2: 100 @ $20.00 = $2,000
After T5: 200 @ $21.00 = $4,200 avg = (2000+2200)/(100+100) = 21.00
After T8: 150 @ $21.00 = $3,150 COGS T8 = 50×$21 = $1,050
After T12: 90 @ $21.00 = $1,890 COGS T12 = 60×$21 = $1,260
After T15: Transfer 10 to Loc B:
Loc A: 80 @ $21.00 = $1,680
Loc B: 10 @ $21.00 = $210
(No financial impact — only location split)
Final Loc A: 80 units @ $21.00 = $1,680
Final Loc B: 10 units @ $21.00 = $210
Total COGS = $1,050 + $1,260 = $2,310
Component-Z (LIFO, Periodic)
After T3: Layer 1: 100 @ $30 = $3,000
After T6: Layer 1: 100 @ $30 = $3,000 Layer 2: 100 @ $32 = $3,200
After T9: 120 sold (deferred)
After T13: Layer 1: 100 @ $30 = $3,000 Layer 2: 100 @ $32 = $3,200
Layer 3: 50 @ $34 = $1,700
After T16: 30 sold (deferred)
Period-End COGS (T18) — LIFO method:
Total sold: 120 + 30 = 150 units
Available layers: 100 @ $30, 100 @ $32, 50 @ $34
LIFO consumes newest first:
50 @ $34 = $1,700
100 @ $32 = $3,200
Total COGS = $4,900
Remaining: 100 @ $30 = $3,000
Complete GL Output
Dr InventoryOnHand (Widget-X) 1,000
Dr InventoryOnHand (Gadget-Y) 1,680
Dr InventoryOnHand (Gadget-Y - Loc B) 210
Dr InventoryOnHand (Component-Z) 3,000
Dr COGS (Widget-X: T7+T11+T14-T17) 1,900
Dr COGS (Gadget-Y: T8+T12) 2,310
Dr COGS (Component-Z: T18 periodic) 4,900
Cr AccountsPayable (T1+T2+T3+T4+T5+T6+T10+T13) 9,300
Cr RetainedEarnings (balancing) 4,700
─────── ───────
Total Debits: 14,790 Total Credits: 14,790 ✅ DR=CR
Trial Balance
Account Debits Credits
InventoryOnHand (Widget-X) 1,000
InventoryOnHand (Gadget-Y - Loc A) 1,680
InventoryOnHand (Gadget-Y - Loc B) 210
InventoryOnHand (Component-Z) 3,000
COGS (Widget-X) 1,900
COGS (Gadget-Y) 2,310
COGS (Component-Z) 4,900
AccountsPayable 9,300
RetainedEarnings 4,700
───────── ─────────
Total 14,790 14,790 ✅ DR = CR
Balance Sheet
Assets:
InventoryOnHand (Widget-X) 1,000
InventoryOnHand (Gadget-Y) 1,890
InventoryOnHand (Component-Z) 3,000
Total Assets 5,890
Liabilities:
AccountsPayable 9,300
Equity:
Retained Earnings (4,700)
Net Loss (COGS: 1,900+2,310+4,900) (9,110)
Total Liabilities + Equity 5,890 ✅ A = L + E
Inventory Items List View
Item QtyOnHand QtyAvailable AvgCost TotalCost FifoCost LifoCost MovingAvg
Widget-X 75 75 13.33 1,000 1,000 1,000 1,000
Gadget-Y (Loc A) 80 70 21.00 1,680 1,680 1,680 1,680
Gadget-Y (Loc B) 10 10 21.00 210 210 210 210
Component-Z 100 100 30.00 3,000 3,000 3,000 3,000
14. Inventory Reports — Complete Guide
14.1 Inventory Items List
Where: Inventory Items
Purpose: Master list of all inventory items with quantities and costs.
Parameters: None — shows all items.
Columns:
| Column | Source | Description |
|---|---|---|
| Item Code | Item master | Unique item identifier |
| Item Name | Item master | Display name |
| Control Account | Item master | GL account for this item's inventory value |
| Division | Item master | Operational division |
| Description | Item master | Item description |
| Sale Price | Item master | Default unit sales price |
| Purchase Price | Item master | Default unit purchase price |
| Unit Name | Item master | Unit of measure |
| QtyOnHand | Computed from GL + GR + DN | Physical quantity in stock |
| QtyToDeliver | SalesOrder - DeliveryNote | Unfulfilled customer orders |
| QtyAvailable | QtyOnHand - QtyToDeliver | Available for sale |
| QtyToReceive | PurchaseOrder - GoodsReceipt | Incoming stock on order |
| QtyToBeAvailable | QtyAvailable + QtyToReceive | Projected available stock |
| QtyDesired | Item master ReorderPoint | Target stock level |
| QtyToOrder | Max(0, QtyDesired - QtyToBeAvailable) | Reorder suggestion |
| QtyOwned | From COGS engine | Accounting quantity |
| TotalCost | Sum of layer amounts | Total inventory value |
| PerUnitCost | Based on valuation method | Unit cost |
| FifoCost | Method override | What cost would be under FIFO |
| LifoCost | Method override | What cost would be under LIFO |
| MovingAvgCost | Method override | What cost would be under MA |
14.2 Inventory Transactions Drill-Down
Where: Click on any item's amount/cost in the Items list.
Purpose: Detailed view of all transactions contributing to an item's total cost.
Columns: Date, Transaction, Description, InsufficientQty (negative inventory flag), Qty, TransactionCost, UnitCost, Amount, RunningBalance.
14.3 Inventory Qty On Hand Drill-Down
Where: Click on QtyOnHand column.
Purpose: Shows all transactions affecting physical quantity.
Columns: Date, Transaction, Customer, InventoryItem, Supplier, InventoryLocation, QtyOnHand.
14.4 Inventory Qty Owned Drill-Down
Where: Click on QtyOwned column.
Purpose: Shows accounting quantity from costing engine.
Columns: Date, Transaction, Reference, Item, BankAccount, Customer, Supplier, QtyOwned, RunningTotal.
14.5 Inventory Valuation Report
Where: Reports > Inventory Valuation Report
Parameters: Date range, Location (optional), Show Comparison (FIFO vs LIFO vs MA), Show LCNRV Adjustment.
Output:
Item Opening Purchases Sales Adjustments Closing Method
Widget-X 0 2,900 1,900 0 1,000 FIFO (current)
Widget-X 0 2,900 1,900 0 1,000 FIFO
Widget-X 0 2,900 2,067 0 833 LIFO
Widget-X 0 2,900 2,000 0 900 Moving Avg
How it works: The report runs the COGS engine multiple times — once with each method override — to show comparative values.
14.6 Inventory Quantity Summary
Where: Reports > Inventory Quantity Summary
Parameters: From Date, To Date.
Output:
Item Opening Purchases DNs Production WriteOffs Sales CNs JEs Closing
Widget-X 0 250 0 0 5 180 10 0 75
Gadget-Y 0 200 0 0 0 110 0 0 90
Component-Z 0 250 0 0 0 150 0 0 100
14.7 Inventory ABC Analysis
Where: Reports > Inventory ABC Analysis
Parameters: Date, Class A %, Class B %, Locations.
Output:
Item QtyOwned UnitCost TotalCost % of Total Cum % Class
Widget-X 75 13.33 1,000 17.0% 17.0% A
Gadget-Y 90 21.00 1,890 32.1% 49.1% A
Component-Z 100 30.00 3,000 50.9% 100.0% B
Logic: Items sorted by TotalCost descending. A = top X% (default 80%), B = next Y% (default 15%), C = remaining.
14.8 Inventory Profit Margin
Where: Reports > Inventory Profit Margin
Parameters: From Date, To Date, Items, Locations.
Output:
Item Sales COGS Profit Margin%
Widget-X 5,000 1,900 3,100 62.0%
Gadget-Y 3,000 2,310 690 23.0%
Component-Z 6,000 4,900 1,100 18.3%
14.9 Inventory Quantity By Location
Where: Reports > Inventory Quantity By Location
Parameters: Date, Locations.
Output:
Item Main Warehouse Overflow Returns Bay Total
Widget-X 65 0 10 75
Gadget-Y 80 10 0 90
Component-Z 100 0 0 100
14.10 Inventory Price List
Where: Reports > Inventory Price List
Purpose: Lists all items with their default sales prices.
Output:
Item Code Item Name Sale Price Unit
WDG-001 Widget-X 500.00 pcs
GDG-001 Gadget-Y 1,000.00 pcs
CMP-001 Component-Z 800.00 pcs
14.11 Inventory Value Summary
Where: Reports > Inventory Value Summary
Parameters: Date, Location (optional).
Output:
Item QtyOwned AvgCost TotalValue
Widget-X 75 13.33 1,000
Gadget-Y 90 21.00 1,890
Component-Z 100 30.00 3,000
───── ───────
Total 265 5,890
15. Field Fallback & Edge Cases
When Fields Are Left Blank
| Field | If Set | If Not Set |
|---|---|---|
| ValuationMethod | Uses selected method (FIFO/LIFO/MA) | Defaults to MovingAverage |
| InventorySystem | Uses selected system (Perpetual/Periodic) | Defaults to Perpetual |
| OpeningInventoryQty | Creates opening layer with cost | No opening balance |
| OpeningInventoryCost | Sets layer cost | Warning if qty>0 — zero COGS on sales |
| OpeningInventoryDate | Layer dated at this date | Uses earliest transaction in system |
| NRVPerUnit | Enables LCNRV write-down (if Apply checked) | LCNRV skipped |
| ApplyLCNRV | Enables write-down at period-end | LCNRV skipped |
| PreventNegativeInventory | Blocks overselling | Backlog allowed |
| ControlAccount | Custom BS account | Defaults to InventoryOnHand |
| CustomExpenseAccount | Custom COGS account | Defaults to InventoryPurchases |
| CustomIncomeAccount | Custom revenue account | Defaults to InventorySales |
| DefaultLineDescription | Autofills description on invoice lines | No default description |
| DefaultPurchaseUnitPrice | Autofills unit price on purchase invoices | No default purchase price |
| DefaultSalesUnitPrice | Autofills unit price on sales invoices | No default sales price |
| DefaultDivision | Autofills division on sales lines | Uses item's Division field → null |
| DefaultTaxCode | Autofills tax code on sales/purchase lines | No default tax code |
| TrackQuantityToReceive | Enables PO tracking for this item | Not tracked against purchase orders |
| TrackQuantityToDeliver | Enables SO tracking for this item | Not tracked against sales orders |
| HideItemNameOnPrintedDocuments | Shows only Item Code on invoices | Full name + code displayed |
| Inactive | Item hidden from autocomplete and reports | Item is active and selectable |
| ProductionStage | Manufacturing routing stage | Defaults to stage 1 |
| ReorderPoint + QtyDesired | Enables reorder suggestions | No reorder suggestion shown |
Edge Cases
| Condition | Behavior |
|---|---|
| Quantity > 0 but Cost = 0 on opening | Warning shown; cost layers created at 0; COGS = 0 on sale |
| Quantity = 0 on purchase | No layer created — AddPurchaseLayer exits early |
| All layers consumed to zero | Layers.RemoveAll(l => l.Qty <= 0m) — cleanup |
| Sale exceeds all layers + backlog | Remaining qty consumed at 0 cost; backlog reports shortage |
| FIFO with only one layer | Behaves identically to Moving Average |
| Periodic system with no sales | GetPeriodicCogs returns 0 |
| Transfer with no From/To location | GL entries created with null location |
| WriteOff with null Allocation account | Falls to Suspense account |
| GoodsReceipt with null Supplier | No GL entries created — returns empty |
| GoodsReceipt with null item | Posted to Suspense account |
| Inventory COGS overflow | Catch block recovers with fallback average cost |
| LCNRV when NRV > Cost | No write-down (only when Cost > NRV) |
§. Accounting Regulation Validation
Standards Compliance
| Standard | Requirement | How the System Satisfies It |
|---|---|---|
| IAS 2 Section 9 | Cost includes purchase price, import duties, transport, handling | All costs capitalize to inventory layers. LC module adds duties, freight, insurance to layers etc. |
| IAS 2 Section 10 | Cost formula must be applied consistently | Per-item valuation method stored and consistently applied. Method does not change automatically. |
| IAS 2 Section 25 | FIFO and weighted average permitted; LIFO permitted only under US GAAP | All three methods available. LIFO should be used only by US GAAP reporters. |
| IAS 2 Sections 28-33 | Inventory must be written down to net realizable value if lower | LCNRV via ApplyLCNRV checkbox + NetRealizableValuePerUnit. Write-down posted at period-end. |
| IAS 2 Sections 34-36 | Both perpetual and periodic systems acceptable | Both supported per-item. Periodic COGS computed via layer snapshot at period-end. |
| IAS 2 Section 36ab | Physical inventory should reconcile with GL | QtyOnHand and QtyOwned tracked separately — differences can be investigated. |
| IAS 8 | Accounting policies must be applied consistently | Valuation method and system are set per item. |
| IAS 21 | Non-monetary items at historical exchange rate | Inventory recorded at the exchange rate at time of purchase/LC. |
| IFRS 15 | Revenue matched with related COGS | COGS recorded at the time of sale (Perpetual) or at period-end (Periodic), matching revenue recognition. |
| GAAP — Full Disclosure | Valuation methods must be disclosed | Method is shown per item in the inventory list view and valuation reports. |
| Double-entry | DR = CR for every transaction | Every inventory movement creates balanced GL pairs. Guaranteed by construction. |
Why DR = CR Is Guaranteed
Every inventory-impacting transaction creates balanced pairs:
Purchase: Dr Inventory $1,000
Cr AP $1,000 ✅
Sale: Dr COGS $600
Cr Inventory $600 ✅
Write-off: Dr COGS $60
Cr Inventory $60 ✅
Transfer: Dr Inv (Dest) 0 (qty +10)
Cr Inv (Source) 0 (qty -10) ✅ (zero amount, qty only)
Opening: Dr Inventory $15,000
Cr RetainedEarnings $15,000 ✅
LCNRV: Dr Impairment $500
Cr Inventory $500 ✅
FIFO vs LIFO vs Moving Average — Compliance
| Method | IFRS | US GAAP | Best For |
|---|---|---|---|
| FIFO | ✅ Permitted | ✅ Permitted | Most businesses, perishable goods, falling prices |
| LIFO | ❌ Prohibited | ✅ Permitted | Rising prices, US tax reporting |
| Moving Average | ✅ Permitted | ✅ Permitted | Simple accounting, stable costs, small businesses |