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 posted
Sales Return−1+1Sale reversed through Sales Return, stock back in
Sales Credit Note−10Sale reversed. No stock movement, no cost reversal
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.

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 with no applet registry row of its own. The same is true of the registered 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, it shows who reserved it, and voiding the order releases it. That 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 behaves the same way. Switching on the credit-limit filter shows the customer’s available credit — limit, less receivable balance, less open amounts. It does not block FINAL. The only hard stop on a customer is the blacklist, which rejects a sales invoice, sales order or outbound delivery order with ENTITY_BLACKLISTED. It is not checked on quotations, returns, credit notes or debit notes.

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 and the Cancellation tab replaces it; and a return that has already been submitted to LHDN cannot be voided until the e-Invoice side is dealt with.

Where this leads