Skip to content

Core Concepts

Four ideas explain almost everything surprising about this module. Learn them once here and the applet pages stop being a list of screens.

1. FINAL is the only moment that matters

Every sales document has a posting status. DRAFT means nothing has happened: the document is editable, the ledger has not heard of it, and no stock has moved. FINAL is the event. In a single call BigLedger generates the running number, posts the journal, queues the stock movement, fires the webhook and queues the e-Invoice submission. VOID reverses whatever FINAL did and records a reason.

Two consequences people meet the hard way:

  • Nothing stands between a person and FINAL except having the applet installed. There is no sign-off step (see §4).
  • The work FINAL starts runs in background processors, not inside the button press. On a busy day a stock line or a journal can appear a moment after the document does. It is not instant, and a page that says “instantly” is wrong.

2. Most sales documents post nothing

Two numbers on each document type decide its effect: the amount signum (does money move, and in which direction) and the quantity signum (does stock move, and in which direction). They are carried on every line the document writes. A zero means nothing happens.

DocumentAmountQuantityEffect at FINAL
Sales Inquiry00Record only
Sales Quotation00Record only — and it does not reduce availability
Sales Order00No ledger, no stock ledger. Reduces available stock (§3)
Sales Invoice+1−1Receivable raised, stock out. Cost of sales is not posted here — month-end processing does that
Sales Return−1+1Sale reversed through Sales Return, stock back in
Sales Credit Note−10Sale reversed. No stock movement
Sales Debit Note+10Extra charge, no stock movement
Sales Refund Note−1+1Invoice entries reversed, stock back in
Sales GIN00Record only — see the warning below

The retail cash bill — the Point of Sale module’s one document — is +1 / −1 like the invoice, and the reports and commission runs in this module count it alongside invoices.

Which receivable account the +1 lands on is decided by the customer’s AR/AP type, not by the document: sell to an entity typed AP_TRADE — a supplier you also sell to — and the invoice debits the creditor account, netting against what you owe them (see Who you trade with).

A Sales GIN does not issue stock. Its document type carries quantity signum 0 and has no journal handler, so FINAL changes the posting status and nothing else. The document type that really issues stock on the sales side is a different one that no applet exposes. The same is true of the Sales GRN. If you expected a goods-issue note to empty a shelf, this is why it did not.

3. Stock balance and stock availability are different numbers

Balance is what the stock ledger says you physically hold. It changes only when a document with a non-zero quantity signum reaches FINAL.

Availability is what you can still promise. It is the balance, less the quantity on open documents that will consume it, less anything explicitly reserved. Open FINAL sales orders and sales invoices are what the availability service subtracts; quotations are not in the calculation at all.

So “available is lower than balance” is normal and usually means open sales orders. Close or void the lines that will never ship.

Reservation is opt-in, and it is a separate applet

There is no hard and soft allocation. A sales order line may hold a reservation over specific quantities, serials or bins; you see it on the Reserved Stock tab, and it shows who reserved it. Voiding the order does not release it — none of the jobs a void starts touches a reservation — so whoever voids the order releases its reservations in the Stock Reservation applet as well, or the stock stays held. Holding stock is an action somebody takes, not a state a FINAL order enters.

The reservation record has its own statuses — TMP, DRAFT, RESERVED, RELEASED — documented on the Stock Reservation applet page, along with a known defect in the bin-pinned path. Treat a reservation as a note to your colleagues, not as a lock the system enforces.

4. Nothing here is approved, and the credit limit does not stop anyone

BigLedger’s document-approval engine exists, but it covers three document types only — Purchase Order, Purchase Requisition and Stock Requisition — it is off until a tenant configures it, and even when configured it causes FINAL rather than gating it. No sales document consults it. Treat any diagram showing a sales order “awaiting approval” as wrong. A discount on a line is released by a permission, not by a routed request.

Credit limit is close to the same. Switching on the credit-limit filter makes the Sales Order and Sales Invoice screens work out the customer’s available credit (limit, less what they owe this company, less open delivery-queue amounts) and refuse FINAL when it is used up. It is a check in the screen, not on the server: a document that arrives any other way, a cash bill and a delivery order are never measured, and no figure adds up what the customer owes the whole group. The only hard stop on the server is the blacklist, which rejects a sales invoice, sales order, cash bill or outbound delivery order with ENTITY_BLACKLISTED. It is not checked on quotations, returns, credit notes or debit notes. The person who decides credit has three guides of their own: Deciding on Credit, Stopping Supply to a Customer and Chasing Overdue Accounts.

5. How a sale is reversed — pick the right document

    flowchart TD
  Q{"What went wrong?"}
  Q -->|"The whole invoice was a mistake<br/>and nothing has moved yet"| V["VOID the invoice<br/>(reverses everything)"]
  Q -->|"Goods are coming back"| R["Sales Return<br/>stock in, sale reversed"]
  Q -->|"Price or charge was wrong,<br/>no goods move"| CN["Sales Credit Note<br/>no stock effect"]
  Q -->|"We undercharged"| DN["Sales Debit Note"]
  Q -->|"Money back and goods back"| RN["Sales Refund Note"]
  

Two traps worth knowing before you need them:

  • A credit note does not put stock back. Its quantity signum is 0. If the goods returned, you need a Sales Return or a Refund Note as well, or your shelf and your ledger will disagree.
  • When e-Invoice is switched on, the VOID button disappears from a Sales Refund Note’s edit screen and the Cancellation tab replaces it. The refusal goes further than the button: while e-Invoice is enabled for the company, a sales return, refund note, invoice, credit note or debit note cannot be voided from any Void button or through the void API, whether or not it has been submitted to LHDN (why). The one route to a void is the e-invoice cancellation’s Void original document, which voids the document once LHDN accepts the cancellation; after the 72-hour window the correction is a credit note (Cancelling and correcting a validated e-invoice).

Where this leads