Financial Accounting Module
Nothing in this module is typed into a ledger by hand except a manual journal. The General Ledger is the running total of journals, and almost every journal is written by the server the moment a document somewhere else reaches FINAL. Everything in this module either writes those journals, settles the customer and supplier balances they create, proves the bank agrees, or reads the result back as a statement.
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. Financial Accounting owns
18 registry applets; 16 are documented. The two undocumented rows are migration connectors
whose status is an open question (see the last table).
The ledger
| Applet | What it is for |
|---|---|
| Ledger And Journal | Where the General Ledger lives. Every AUTO journal the documents write, the manual journals you key or import, the ledgers and sub-ledgers per company, and the Error Checking workspace (unbalanced journals, FINAL documents with no journal, missing forex and card-charge entries). Manual journals are validated balanced on the server and are live the moment they save — there is no draft, no posting step and no approval |
| Financial Report | Closes a month per Set of Books (Month End Processing), freezes Trial Balance / Profit and Loss / Balance Sheet / MITRS snapshots, runs the ad-hoc Profit Loss Report by branch or dimension, and holds the two diagnostics — Stock Flow Report and Trace Document — that explain why a figure is wrong |
Money in, money out
| Applet | What it is for |
|---|---|
| Receipt Voucher (Internal) | Money received from a customer. FINAL writes one cashbook line per settlement line and the journal Dr cashbook GL / Cr debtor; contra links clear the customer’s open invoices |
| Payment Voucher (Internal) | Money paid to a supplier or other payee, or an expense paid directly. FINAL writes the cashbook lines and Dr creditor (or expense) / Cr cashbook GL; contra links settle the supplier’s open invoices |
| Reimbursement Payment Voucher (Internal) | Paying someone back for money spent on the company’s behalf. A near-twin of the Payment Voucher, but its document type has no entry in the posting handler: it never raises a creditor line or a tax line, so every expense line needs its own GL code |
| Purchase Invoice (Internal) | The supplier’s bill. FINAL posts Dr purchase, Dr input tax / Cr creditor and books the invoiced quantity into stock (quantity signum +1). Filed here because it is the accounts-payable document; the reader in a purchasing process will find it from the Purchasing module too |
Proving the bank
| Applet | What it is for |
|---|---|
| Bank Reconciliation | One session per cashbook and period: import the bank statement, link each statement line to the cashbook line it settles (by hand or with the weighted auto-matcher), and produce Reports 1–3 as the close evidence. It posts nothing — it reads the cashbook lines that vouchers, POS settlements and cash transfers created at FINAL, and writes reconciliation links |
Who owes whom
| Applet | What it is for |
|---|---|
| Debtor Report | Customers who owe you: outstanding documents with an aging strip, aging, statement of account, historical snapshots, AR transactions and the salesman collection report. The one thing it writes is a contra between two open customer documents |
| Creditor Report | The same for suppliers you owe, plus settlement detail. Writes only contras between open supplier documents |
| Debtor and Creditor Report | Both sides in one menu — fifteen reports — for a team that reviews AR and AP together. Reads only; no contra can be created from it |
| Statement of Account | Batch customer statements: a run per period expands into one PDF per company-and-customer pair, printed or e-mailed. Reports the receivable position; changes no balance |
Assets, treasury, budget
| Applet | What it is for |
|---|---|
| Fixed Asset | The asset register, categories, per-asset depreciation configuration and schedule, the monthly depreciation run, CSV import and the asset report. Not a generic document — it has no FINAL and no posting handler; the Transactions tab sends journals directly. The depreciation run currently writes journals with no lines (see What does not post) |
| Deposit | Money-market placements: a requisition that invites quotations, the live register with its interest schedule, and categories. A treasury register — it posts no journal; the ledger effect comes from the Payment Voucher that places the money and the Receipt Voucher that receives it back |
| Budgetary | Budget items, categories, profit centres and votebooks; opening a fiscal year creates one register per item per month; virements and adjustments move allocation; Purchase Invoice and Sales Invoice lines that carry a register consume it at FINAL. Posts no journal, and there is no budget check on the server — an over-budget line is coloured in the editor and still saves |
| Cashflow Projection | Despite the name, not a treasury forecast. A billing-and-collection planning register: programs hold engagements, engagements hold lines, and for each line and fiscal month someone types in the open balance, the target and actual billing and the target and actual collection. The dashboard and the two reports (Cashflow Projection, Collection Delay) are sums over those typed rows. It reads no document, posts no journal and moves no stock — and today one of its two reports can only ever come back empty (see its page) |
Tax
| Applet | What it is for |
|---|---|
| MY-SST | Malaysian Sales and Service Tax: tax years, filing cycles, tariff codes and tax codes; filing copies the taxed lines of posted documents into a frozen snapshot, and the SST-02 return is computed from that snapshot only. The three on-screen SST reports read the live documents, so the report and the return diverge the moment a filed document changes |
Migration connectors — status open
| Registry row | What is known |
|---|---|
Autocount (AccountConnector_Autocount_Applet) | ACTIVE in the registry, no page. Its bundle is served from the senwave/ CDN prefix and its element is a customer-profile applet, not an accounting connector — the same family the exclusion question Q-0261 covers |
SQLAccount (AccountConnector_SQLAccount_Applet) | Same prefix, same element, staging bundle. Whether these two are product or a customer build (Q-0309) decides whether this module reads 16 of 16 or 16 of 18 |
Until that is decided, no page in this module describes an AutoCount or SQL Account import.
Applets it depends on
Finance has no master data of its own. Everything below is owned by the Core module and read at FINAL by the documents in this one.
| Applet | What this module takes from it |
|---|---|
| Chart of Account | GL sections, categories and codes; each company’s ledgers and Default GL Codes (the 41 keys that tell a document which account to hit); Sets of Books; fiscal periods and their locks; opening balances on the primary ledger; the Closing Stock Balance figures the P&L uses |
| Cashbook | Bank and cash accounts, each pointing at one GL code; settlement methods (which cashbook a card, cash or transfer line lands in); Cash Transfer and Cash Adjustment; the enquiry screens Query Cashbook Transaction and Cash Level; the auto-matcher weightage for Bank Reconciliation |
| Organisation | Companies, branches, locations; the company timezone every date filter uses; the company E-Invoice Status |
| Customer Maintenance, Supplier | The entity’s AR/AP type, which decides whether a document posts to DEBTOR or DEBTOR_NON_TRADE, CREDITOR or CREDITOR_NON_TRADE |
| Tax Configuration | Tax codes and rates; the tax portion of a line posts to the company’s OUTPUT_TAX / INPUT_TAX default |
| Doc Item Maintenance | The item-company GL link — the third step of the GL precedence line → header → item link → company default |
| Forex | Exchange rates; a foreign-currency document is finalised as a base-currency shadow that carries the posting, and settlement differences go to FOREX_GAIN / FOREX_LOSS |
The documents that post into this module from other modules are listed under What posts to the ledger.
What posts to the ledger — and what does not
The server builds a document’s journal from one table, JournalPostingTypeHandler.handlers, which has
seven entries. If a document type is not in that table — or does not fall through to one by name —
it does not post through this path, whatever a page elsewhere says.
flowchart LR
subgraph docs["Document reaches FINAL"]
SI["Sales Invoice, Cash Bill,<br/>Sales Return, Credit/Debit Note"]
PI["Purchase Invoice,<br/>Purchase Return, Debit/Credit Note"]
GRN["Purchase GRN Stock In"]
RV["Receipt Voucher"]
PV["Payment Voucher"]
CON["Consignment purchase documents"]
ADJ["Stock Adjustment"]
end
H["JournalPostingTypeHandler<br/>SALES · PURCHASE · INTERNAL_PURCHASE_GRN_STOCK_IN<br/>INTERNAL_RECEIPT_VOUCHER · INTERNAL_PAYMENT_VOUCHER<br/>PURCHASE_CONSIGNMENT · INTERNAL_STOCK_ADJUSTMENT"]
J["AUTO journal in<br/>Ledger And Journal"]
docs --> H --> J
MJ["Manual journal / CSV import"] --> J
CT["Cash Transfer (FINAL)"] --> J
FA["Fixed Asset Transactions tab"] --> J
ME["Month End Processing:<br/>closing-day and opening-day journals"] --> J
| Handler | Documents that use it | Journal at FINAL (net) |
|---|---|---|
SALES | Sales Invoice, POS cash bill, Sales Return, Sales Credit / Debit Note, Sales Refund Note, and anything else whose type name contains SALES | Dr DEBTOR / Cr SALES, Cr OUTPUT_TAX (discounts to SALES_DISCOUNT; return lines to SALES_RETURN — except the Refund Note, whose lines land in SALES, P-0241). No cost-of-sales line: the handler has no stock entry, so a sale does not post COGS or reduce inventory value in the ledger |
PURCHASE | Purchase Invoice, Purchase Return, Purchase Debit / Credit Note, and anything whose type name contains PURCHASE | Dr PURCHASE, Dr INPUT_TAX / Cr CREDITOR; returns to PURCHASE_RETURN, discounts to PURCHASE_DISCOUNT |
INTERNAL_PURCHASE_GRN_STOCK_IN | Purchase GRN Stock In only — the plain Purchase GRN is signum 0/0 and posts nothing | Dr INVENTORY_NOT_INVOICED / Cr CREDITOR_NOT_INVOICED — the GR/IR (Goods Received / Invoice Received) accrual |
INTERNAL_RECEIPT_VOUCHER | Receipt Voucher (Internal) | Dr cashbook GL (one line per settlement) / Cr DEBTOR; charges to SETTLEMENT_CHARGES |
INTERNAL_PAYMENT_VOUCHER | Payment Voucher (Internal) | Dr CREDITOR or the expense lines / Cr cashbook GL; charges to SETTLEMENT_CHARGES |
PURCHASE_CONSIGNMENT | The consignment purchase documents in the Purchasing module | CONSIGNMENT_STOCK against CONSIGNMENT_LIABILITY |
INTERNAL_STOCK_ADJUSTMENT | Stock Adjustment | Adjust-out: Dr STOCK_ADJUSTMENT / Cr stock (STOCK_BALANCE); adjust-in the reverse |
Every handler resolves the GL code the same way — GL code on the line → GL code on the header →
item-company link → company default — and every journal is checked before it is written: unequal
debits and credits throw TOTAL_DEBITS_AND_TOTAL_CREDITS_NOT_BALANCES, an empty journal throws
NO_JOURNAL_CREATED, and a missing entity default (DEBTOR*, CREDITOR*) throws
MISSING_DEFAULT_GL_CODE: <key>. In all three cases the document does not finalise. VOID of a
posted document writes a mirror journal with every debit and credit swapped, carrying the
original document’s transaction date — only the posting timestamp is today, so voiding a January
invoice in March moves January. See What a Void Undoes.
Three more things write journals without a handler: a manual journal (keyed or imported in Ledger And Journal, validated balanced on the server), a Cash Transfer at FINAL (Dr the receiving cashbook’s GL / Cr the sending one’s), and the Fixed Asset Transactions tab (acquisition, adjustment, disposal), which assembles the lines in the browser and posts them directly.
What does not post
Say this to anyone who tells you otherwise:
- A sale posts no cost of goods sold. The
SALEShandler has no stock line. The only code that writes aCOGSjournal is the month-end cost-of-goods-sold processor — and its button is commented out of the Month End Processing screen, so it is reachable only by API. The ad-hoc Profit Loss Report computes cost of sales live from the sales lines instead; the frozen snapshot shows only what has been journalled. - The depreciation run writes journals with no lines. The processor adds each line only when the asset’s depreciation sub-ledger columns are set, and nothing in the applet or the backend ever sets them. The run completes, the journal header exists, and the ledger does not move. Until that is fixed, monthly depreciation is a manual journal — see the Journal Entries Guide.
- A Reimbursement Payment Voucher raises no creditor and no tax line — its type is not in the handler table and does not fall through by name.
- Bank Reconciliation, Statement of Account, the three debtor/creditor report applets, Budgetary, Deposit and MY-SST post nothing. They read FINAL documents and write their own tables (links, runs, registers, tax snapshots).
- A plain Purchase GRN, a Sales GIN and a Sales GRN post nothing (amount signum 0). The plain GRN records receipt; the Purchase Invoice books the stock.
- A claim posts nothing — the claims domain has no handler and no signums; money leaves through a Payment Voucher or a payroll file. See the Claims module.
- Nothing in this module routes for approval. There is no approval engine for journals, receipt vouchers or payment vouchers; the generic engine covers Purchase Order, Purchase Requisition and Stock Requisition only, and is off until configured. Segregation of duties on a Payment Voucher is a permissions decision — give the create right and the finalise right to different roles.
Month-end, in the order the system expects
- Finalise everything. A
DRAFTdocument is not in the ledger, not in the debtor or creditor reports, not in the cashbook and not in any statement. Manual journals are live on save. - Reconcile the cashbooks. One Bank Reconciliation session per cashbook and month; Report 3 is the evidence. Bank charges and interest you find on the statement are entered as a Payment or Receipt Voucher (which creates the cashbook line the matcher needs) — a manual journal does not create a cashbook line and will never match.
- Month End Processing in Financial Report, once per Set of Books per month. It writes the closing-day and opening-day journals and the per-account monthly summaries. The Financial Report snapshot reads only those summaries — an empty Trial Balance almost always means the month was never processed, not that the journals are missing.
- Create or regenerate the Financial Report snapshot. Snapshots are frozen when created; after any back-dated posting, PROCESS the month again, then REGENERATE.
- Lock the period in Chart of Account > Fiscal Year.
LOCK_GLstops manual journals (auto journals still post);LOCK_TXNstops operational documents being dated into the month;LOCK_ALLstops both. Anyone who can open Chart of Account can set a period back toOPEN— there is no approval on reopening.
The Financial Reporting Guide walks this through for the running example, and the Month-end closing tutorial is the short version.
Where the balances come from
| Balance | Source of truth | Read by |
|---|---|---|
| A customer’s or supplier’s outstanding amount | arap_doc_open + arap_contra on each FINAL document header; contras from receipt/payment vouchers, credit notes and the report applets reduce it | Debtor Report, Creditor Report, Debtor and Creditor Report, Statement of Account, and the contra screens on a receipt or payment voucher |
| A cashbook’s balance | The cashbook transaction lines written when a Receipt Voucher, Payment Voucher, POS settlement, Cash Transfer or Cash Adjustment reached FINAL (VOID lines excluded) | Query Cashbook Transaction, Cash Level, Bank Reconciliation |
| A GL account’s balance | ACTIVE journal lines in Ledger And Journal | Sub Ledger, the Profit Loss Report (live), Financial Report snapshots (via month-end summaries) |
| A budget register’s balance | latest_allocated_amt − actual_used_amt on the register, moved by virements, adjustments and invoice lines | Budget Report |
Each of those is worked out live, from the rows underneath it. The figures on your reports mostly are not — the Trial Balance, Profit and Loss and Balance Sheet read a stored monthly summary, and the historical aging reads a monthly photograph. Which figures BigLedger stores, and which it works out fresh explains which is which across all five subsystems that make that trade-off, and how to tell a stale figure from a wrong one. If you already have a figure that will not tally, start instead from the symptom: when two numbers don’t tally.
The three are maintained separately. A receipt voucher moves all of the first three at once; a manual journal moves only the third. That is why “the GL bank balance is right but the cashbook is wrong” and “the customer’s statement is right but the debtor control account is wrong” are different problems with different fixes.
Reports in this module
| Question | Report | Applet |
|---|---|---|
| Do the books balance, and what is the position at month-end? | Trial Balance, Profit And Loss, Balance Sheet, MITRS (frozen snapshot per Set of Books and month range) | Financial Report |
| How did branch A do against branch B this quarter? | Profit Loss Report — grouped by branch, GL dimension, segment, profit centre or project; cost of sales computed live at the chosen cost basis | Financial Report |
| Why does stock value not equal the stock accounts? | Stock Flow Report — inventory value versus accounting value per module, with a per-document listing and a repost action | Financial Report |
| Why did this document not post? | Trace Document — six checks on one document, each with a Resolve button | Financial Report |
| Which journals are wrong or missing? | Journal Not Balance, Missing Journal, Missing Journal Forex Gain Loss, Missing Credit Card Charge | Ledger And Journal |
| Who owes us, how old is it, and what did the position look like at a past month-end? | Outstanding Document (with aging strip), Aging, Statement of Account, historical snapshots, AR Transaction, Collection Invoice with Aging | Debtor Report |
| Whom do we owe, and how were the invoices settled? | The supplier-side equivalents plus settlement detail | Creditor Report |
| Both sides for one reviewer | Fifteen reports, debtor and creditor versions of each | Debtor and Creditor Report |
| Does the cashbook agree with the bank? | Report 1 (which side the variance sits on), Report 2 (reconciling items), Report 3 (the sectioned overview to keep as evidence) | Bank Reconciliation |
| What has each cashbook done this month? | Query Cashbook Transaction, Cash Level | Cashbook (core) |
| How much of the budget is used? | Budget Report — allocated, utilised, balance per register | Budgetary |
| What goes on the SST-02? | SST Service Tax Report, SST Sales Tax Report, SST Tax Code Summary (live), and the SST-02 itself (from the filed snapshot) | MY-SST |
| What do we own and how is it depreciating? | The asset report and each asset’s depreciation schedule | Fixed Asset |
What has no report. There is no cash flow statement, no consolidated group statement (one snapshot
per Set of Books; combine outside BigLedger), no cost-of-sales-by-item report other than the Gross
Profit listing behind the Profit Loss Report, and no budget commitment or reserved-amount report
(the reserved_amt column exists and nothing writes to it).
Guides for this module
- Chart of Accounts Setup Guide — sections, categories, codes, default GL codes, the first fiscal year.
- Set of Books, Fiscal Years and Fiscal Periods — which ledgers a report reads, which dates a document is still accepted for, and how to set them up for a group of companies.
- Financial Report Structure — which profit and loss or balance sheet line a GL code lands on, and how to add a category so its figures appear.
- Opening Balance Migration — stock, AR, AP, cashbook and GL balances, in the order the dependencies require.
- Journal Entries Guide — accruals, the monthly depreciation journal, corrections, cloning.
- Bank Reconciliation Guide — one month, one cashbook, one variance found and booked.
- Financial Reporting Guide — month-end processing, snapshots, the branch comparison, locking the period.
Related documentation
- Core module — the master data every posting reads.
- Sales module, Point of Sale module, Purchasing module, Inventory module — the documents that post into this ledger.
- E-Invoice module — what happens to a finalised invoice after it posts.
- Document approvals — the one generic approval engine, and why nothing in finance uses it.