Financial Report
Watch this as a presentation — 1 on this page, slides with narration.
Close each month and read your statements here. Know this first: a Trial Balance, Profit and Loss or Balance Sheet snapshot reads only the months Month End Processing has closed — an empty report almost always means the months were never processed, not that the journals are missing.
Overview
The Financial Report applet is where the accountant closes a month and reads the statements. It has four working screens: Month End Processing closes one month for one Set of Books (it writes the closing-day and opening-day journals and the per-account balance summary the reports are built from); Financial Report freezes a Trial Balance, Profit and Loss, Balance Sheet and MITRS view for a range of closed months; Profit Loss Report is an ad-hoc P&L straight from posted journals, grouped by branch, GL dimension, segment, profit centre or project; and Error Checking holds two diagnostic tools — the Stock Flow Report (inventory value versus accounting value per module) and Trace Document (whether a named document produced the journal, cash book line, reversal and shadow document it should have, with a Resolve button on each one that is missing).
Video walkthrough
Where it fits
| Direction | Document / applet | Relationship |
|---|---|---|
| Master data | Chart of Account | GL Sections, GL Categories and the Report Section ↔ GL Category links that decide which line of the statement a GL code lands on; Sets of Books and their ledgers; each company’s Default GL Codes and Inventory Closing Base On |
| Upstream | Ledger And Journal | Every posted journal (document postings and manual journals) is the raw material for month-end and for the Profit Loss Report |
| Upstream | Sales Invoice (Internal), Sales Return (Internal), Purchase Invoice (Internal), Purchase Return (Internal) | Their document lines feed the Profit Loss Report’s live cost-of-goods-sold row and the Stock Flow Report’s inventory side |
| Upstream | The stock ledger (what Stock Balance and Stock Report also read) | Opening and closing stock for the cost-of-goods-sold journal, read off each item’s last ledger line when Month End Processing runs, at the company’s cost basis |
| Upstream | Cashbook, Receipt Voucher (Internal), Payment Voucher (Internal) | Trace Document’s Missing Cashbook check looks for the cashbook transaction a finalised settlement document should have created |
| Downstream | Ledger And Journal | Month-end writes CD (closing) and BD (opening) journals, and the optional COGS and RETAINED_EARNINGS journals, back into the ledger |
| Sibling reports | Debtor Report, Creditor Report | Sub-ledger detail behind the trade-debtor and trade-creditor lines of the Balance Sheet |
Screens and menus
The applet menu has four entries: Financial Report, Month End Processing, Profit Loss Report and Error Checking. (A fifth, MEP, is routed but hidden from the menu.)
Financial Report
The listing shows one row per snapshot: Set of Book, Start Date, End Date, Created/Updated By and Date. Tick several rows and click Reports to open a side-by-side comparison with Trial Balance, Profit and Loss and Balance Sheet tabs — the normal way to compare periods or Sets of Books.
+ opens the create form: choose a Set of Books and a Start Year / Start Month / End Year / End Month, then Create. The snapshot is built immediately.
Screenshot withdrawn; a recapture from a demo tenant is on the list.
Opening a snapshot shows five tabs:
| Tab | Columns | Notes |
|---|---|---|
| Main | Set of Books, Start Year/Month, End Year/Month | Read-only after creation; DELETE (click twice to confirm) removes the snapshot only |
| Trial Balance | GL Section, GL Category, GL Code, Name, Description, Debit, Credit | Profit-and-loss accounts show their movement over the range; every other account shows its closing balance at the end month — see Two measures on one Trial Balance below |
| Profit And Loss | GL Section, GL Category, GL Code, Name, Description, Amount, % | Sections in P&L order with Net Sales, Gross Profit and Net Profit subtotals |
| Balance Sheet | GL Section, GL Category, GL Code, Name, Description, Amount, % | Assets, liabilities and equity with totals. The retained-earnings line is the end-month closing balance of the RetainedEarnings section, which already holds every closed month’s retained-earnings journal. There is no separate current-period profit line, so the sheet balances only when every month in the year was closed with that journal written |
| MITRS | Profit and Loss, Balance Sheet sub-tabs | Same figures restricted to GL Categories flagged Include for MITRS = YES in the Chart of Account applet. If no category on the tenant is flagged YES, nothing is filtered and the tab shows every line, so it looks exactly like the ordinary statements. The flags are read each time the tab is opened, not when the snapshot was generated |
Two measures on one Trial Balance — by design. The screen decides the measure per section: the profit-and-loss sections (SalesRevenue through TaxExpenses, and ProfitLoss) show what moved between the start and end month, and every other section shows the balance at the end month. That is the trial balance an accountant expects for a period — the period’s result beside the balance sheet as it stands — and it is intended. Two consequences to know before you foot it. Dividend is treated as profit-and-loss by the close but is not on the screen’s list, so a dividend account shows its end-month balance only, and on a range longer than one month the debit and credit totals do not agree. And an account whose section is not one of the codes the Profit And Loss or Balance Sheet tabs know appears on the Trial Balance and on neither statement.
Two buttons sit above the tabs. REPORT opens a grid of the journal lines behind every account on the selected statement, read live from the journals for the snapshot’s dates — so after a back-dated posting it disagrees with the frozen figures on the tab until you re-close and regenerate. REGENERATE throws away the snapshot’s lines and rebuilds them from the current month-end summaries — the header (Set of Books and range) is kept.
Clicking a line drills down: GL listing (Date, Doc Type, Doc No, Entity, Reference, Description, Journal Ledger, Debit, Credit) → journal view (Main, Line Items, Gross Profit) → document view (Main, Line Items, Posting).

Month End Processing
The listing shows one row per processed month (Set of Book, Start Date, End Date, audit columns). + opens a three-field form — Set of Books, Year, Month — and Create runs the processing straight away for every ledger in that Set of Books.

Opening a record shows Main (the three fields plus DELETE) and Processor, which has a single row — Month End Processing with a PROCESS button. PROCESS re-runs the close for that month: it deletes the previous closing/opening journals and summary rows and rebuilds them, which is how back-dated postings get picked up. Months chain to each other: each close reads the opening journal the previous month’s close wrote on the 1st, so a month’s closing balances include everything before it. Re-processing March changes the opening of April, and April’s close — and every later closed month’s balance-sheet figures — are stale until you PROCESS each of them again, in order. Then REGENERATE the Financial Report snapshots that include those months. For the same reason, the first month you ever close must be the first month your books have entries in, or every balance before it is missing from the chain.
Profit Loss Report
An ad-hoc statement built from posted journals at query time — no month-end needed. Filters: Group By (Branch, GL Dimension, Segment, Profit Center, Project — default Branch), Branch (multi-select, narrowed in the browser to the branches your Financial Report read permission names), GL Dimension, Profit Center, Segment, Project, Date From / Date To (required), and Cost Type (MA, WA, FIFO, LIFO, Replacement, Manual). SEARCH renders one amount column per group value with the subtotal rows Net Sales, Total Cost of Goods Sold, GROSS PROFIT/(LOSS), GROSS MARGIN, PROFIT BEFORE TAXES, NET PROFIT/(LOSS) and PROFIT MARGIN.
Clicking an amount opens the journal lines behind it; clicking the cost-of-goods-sold amount opens a Gross Profit listing by document (Doc Type, Doc No, Date, Entity, Item Code, Item Name, Qty, UOM, Unit Price, Unit Cost, Amount Txn, Amount Tax, Amount Net, Cost Amt, GP, GP%).
What this report asks the server, and the four ways its total surprises you
Worth reading before anyone compares its figures against a Financial Report snapshot or a trial balance, because all four differences are by construction and none of them is visible on the screen.
1. It reports the values you ticked, and nothing else. The report is limited to exactly the values you ticked, and SEARCH stays disabled until you have ticked at least one. There is no “all branches” run. Leave one branch unticked and its revenue and its cost are simply not in any column and not in any subtotal — so the report footing to a company profit and loss is something you arrange by ticking everything, never something it does for you.
2. A journal line with no tag on the chosen dimension is dropped entirely. A line whose branch, profit centre, segment, GL dimension or project is blank matches no column and disappears. Nothing requires a branch on a manual journal line — the line form asks only for a GL code and the backend never checks it (Ledger and Journal) — so an untagged adjusting entry is invisible here while still sitting in the trial balance. This is the usual reason a branch profit and loss is short by exactly one accrual.
3. One dimension at a time, chosen by the first non-empty list. The server groups by the first of branch, GL dimension, profit centre, segment, project that has values in the request. The screen can only ever send one, because Group By switches which picker is shown. An integration asking for the report through the API with two lists filled gets the server’s order, not the one the screen implies, and the second dimension is discarded silently. There is no cross-tab: branch and profit centre in one grid is not something this report does.
4. The cost-of-goods-sold row is not your cost-of-sales journal. The revenue and expense half reads journal lines (ordinary TXN journals only, so closing,
brought-down, opening-balance and acquisition journals are excluded), and the screen then drops every line whose GL category is coded purchases or purchases returns,
so a periodic-inventory purchases account is not counted beside the computed cost — by that code only: a purchases category coded differently is counted twice; the cost half is a second calculation over document lines —
the goods lines of FINAL sales invoices, cash bills and sales returns — using whichever of the six
stored costs your Cost Type names. That is why this screen shows a cost of sales before month-end has
journalled one, and why its figure can differ from the snapshot’s: they are two different measurements of
the same month, not the same number twice.
The report multiplies the stored unit cost, and never reads the stored cost amount — on purpose. The cost amount columns on a document line do not hold the cost of that line. The stock-balance step writes the running balance onto each line, so a line’s moving-average cost amount is the value of that item’s whole company stock after the movement, and its moving-average price is the new average unit cost. FIFO is the same shape, except that FIFO also keeps this movement’s own cost, which is what the report uses for it. That is why the report multiplies the stored unit cost by the line quantity instead.
Three of the six Cost Types read a column nothing writes. The report multiplies each line’s quantity by one stored unit cost, and only three of those costs are ever filled on a document line. Moving average and weighted average are written back by the stock-balance step of the posting chain, and FIFO by the FIFO step after it (Costing Internals). LIFO and Manual are written by nothing — LIFO is not computed, and nothing fills a manual cost — so those two stay empty on the line. Replacement is the odd one: it is filled, but by the pricing subsystem rather than by costing — a line that names a pricing scheme link has the link’s replacement price copied into it on every save. So picking LIFO or Manual gives you a Total Cost of Goods Sold of zero, a gross margin of 100%, and no message; picking Replacement gives you a figure built from list prices, not from cost.
Do not expect a branch-targeted permission to narrow this report. When a user’s Financial Report grant carries a company, branch or location target, the server compares the request with it and refuses the whole report if either the branch or the company comparison comes up empty — and the screen never sends a company, so a targeted user gets not authorised rather than a narrowed report. Without a target, nothing on the server limits which branches a user may tick: the picker in the browser is the only limit. Treat the multi-select as a convenience, not as a control — and do not set a branch target on a Financial Report permission expecting it to narrow this report, because it would refuse the report outright instead.
Error Checking
Two tabs (a third, Cashbook Discrepancy, is present in code but commented out of the screen):
- Stock Flow Report — pick a Company and a date range. One row per module — Purchases, Purchase Returns, Sales, Sales Returns, Purchase Consignment, Reset MA — with Inventory (the total of the finalised document lines of that module’s types — purchase amounts on Purchases, selling amounts on Sales), Accounting (the journal lines on the module’s default sub-ledger) and Difference. It checks that documents and their journals agree. It reads neither stock value nor the stock account: the Opening Stock row is always zero and there is no Closing Stock row. For stock against the stock account, see Stock report versus the stock account on the balance sheet. Clicking a Difference opens a per-document listing (Date, Doc Type, Doc No, Amount Inv, Amount Acc, Status) where Status is
OK,MISSING_ACCOUNTING,MISSING_INVENTORYorWRONG_AMOUNT; CREATE posts the missing journal or reposts the wrong one for the selected rows and writes the result (POSTEDor the server error) back into the Status column. - Trace Document — pick a Server Doc Type and type the Server Doc No, then TRACE. The screen shows the document’s date, amount, posting status, posting journal and posting running number, and runs six checks: Missing Journal and Wrong Journal and Missing Cashbook and Missing Shadow Document (for FINAL documents), Missing Reversal Journal and Missing Reversal Queue (for VOID documents). Each failed check has a Resolve button that creates or reposts the missing artefact. A Repost button appears beside Posting Journal when the document is already
POSTEDand is not linked to a base or forex-shadow document. It has no document-type list, unlike the checks, and needs journal create, admin or owner permission. Repost deletes the document’s journal and builds it again from the document; Repost successful confirms it, and a failure shows nothing (see A failed Repost under Troubleshooting). If the document has a linked base or forex-shadow document, its number is a link to that document.
Settings and personalisation
Settings > System Configuration has Field Settings and Default Selection, plus the standard permission, webhook, release-notes and applet-log screens. Personalization > Default Selection lets each user set their own Default Branch and Default Location.
Configuration
Before you can use it
| Prerequisite | Where | Why it matters |
|---|---|---|
| A Set of Books with at least one ledger line | Chart of Account > Set Of Books > Ledgers | Month-end and snapshots iterate the Set of Books’ ledgers. A Set of Books with no ledger fails with Set of Books is missing primary ledger configuration. |
| Every GL Category linked to a Report Section | Chart of Account > GL Category > GL Section tab | All report queries inner-join GL code → category → report section. A category without a section link makes its GL codes disappear from every statement and from month-end itself — and, since July 2026, makes that month’s closing and opening journals fail to balance, so the close is refused while the screen reports success (see A failed close still says success) |
| P&L sections named as the engine expects | Report sections | The engine treats these section codes as profit-and-loss: SalesRevenue, SalesExpenses, CostOfGoodsSold, CostOfGoodsSold-Gains, CostOfGoodsSold-Expenses, GeneralExpenses, OtherRevenues, OtherExpenses, TaxExpenses, Dividend, ProfitLoss; the Balance Sheet’s retained-earnings line reads the RetainedEarnings section. Rename these and the close no longer distinguishes P&L from balance-sheet accounts |
| Company Default GL Codes for stock and closing | Chart of Account > Company > Default GL Codes | The cost-of-goods-sold journal is written on every Month End Processing Create and PROCESS whenever the company has COGS and STOCK_BALANCE mapped (it also uses PURCHASE, PURCHASE_RETURN and, optionally, COGS_RAW / COGS_WIP / COGS_FG / COGS_NSTI with matching STOCK_BALANCE_*); the retained-earnings journal whenever it has PROFIT_LOSS and RETAINED_EARNING. Without the COGS pair you get a close with no cost-of-sales journal, and no message. Post all purchases to the company’s default PURCHASE code: one purchases account per company is a prerequisite of this step, which reads only the default PURCHASE and PURCHASE_RETURN codes, so a purchase posted to an item’s or a line’s own GL code is not counted in cost of sales, and depending on that account’s GL category and report section the margin report and the P&L can disagree. With no PURCHASE default the month’s purchases count as zero while the journal still balances, again with no message. Without the retained-earnings pair it is worse: the month’s result is never moved to retained earnings, the opening journal on the 1st cannot balance and is refused, and the screen still reports success. The Stock Flow Report also uses PURCHASE, PURCHASE_RETURN, SALES, SALES_RETURN and CONSIGNMENT_STOCK to find the accounting side |
| Company Inventory Closing Base On | Company settings | Selects which cost column values closing stock: MA_COST (default), WA_COST, FIFO_COST, LIFO_COST, REPLACEMENT_COST or MANUAL_COST |
| Include for MITRS on GL Categories | Chart of Account > GL Category | Only categories flagged YES appear on the MITRS tab, as long as at least one category is flagged — with none flagged the tab shows every line. A change applies to existing snapshots the next time the tab is opened, with no regeneration. Check: open the MITRS tab and confirm one category you left at NO is absent |
Backend permission API_TNT_DM_ERP_FI_FINANCIAL_REPORT_* with company and branch targets | Permission wizard | See Feature visibility / permissions |
Applet settings
Settings > System Configuration > Default Selection (saved as the applet’s master settings):
| Setting | What it controls | Default | Effect when changed | Who can change it |
|---|---|---|---|---|
Default Branch (DEFAULT_BRANCH) | Stored, but no picker in this applet reads the applet-wide value | none | None. Only a user’s personal Default Branch pre-ticks the Profit Loss Report’s Branch picker | Applet admin |
Default Location (DEFAULT_LOCATION) | Stored for a location picker this applet does not have | none | None outside the settings screens | Applet admin |
Default Timezone (DEFAULT_TIMEZONE) | The zone the Financial Report listing formats its End Date column in | none | That one column shifts; no other date moves | Applet admin |
Settings > System Configuration > Field Settings is the applet’s own hide/show screen with eight switches — Lines: Unit Discount, SST/VAT/GST, WHT, Blanket Order; Department: Segment, G/L Dimension, Profit Center, Project (all off, except Unit Discount, which shows on until the screen is first saved). They are saved, but no screen in this applet reads them — the Profit Loss Report’s dimension filters stay visible whatever you set. Treat the screen as inert.
Document behaviour settings
Not configurable in this applet. What month-end posts, which cost basis values stock and which accounts the processors hit are all fixed by the company’s Default GL Codes, its Inventory Closing Base On, the report-section links, and the engine (see Lifecycle and effects). There is no approval flow, no printable template selection and no e-Invoice involvement.
Feature visibility / permissions
No client-side permission definitions are seeded for this applet in the registry, so nothing in the UI is hidden per role. Access is enforced by the backend permission family API_TNT_DM_ERP_FI_FINANCIAL_REPORT_{OWNER, ADMIN, MEMBER, CREATE, UPDATE, DELETE, READ}:
| Action | Backend permission checked |
|---|---|
| List / open snapshots and month-end records | READ (or OWNER / ADMIN) |
| Create a snapshot, run or re-run month-end, run the Profit Loss Report and Stock Flow Report queries, generate the MITRS view | CREATE (or OWNER / ADMIN) |
| Look a document up in Trace Document | Not this family: the lookup is a generic-document query, checked against API_TNT_DM_ERP_GEN_DOC_READ (or its OWNER / ADMIN) |
| Regenerate a snapshot | CREATE |
| Delete a snapshot or a month-end record | DELETE (or OWNER / ADMIN) |
The Profit Loss Report’s Branch picker lists the branches your API_TNT_DM_ERP_FI_FINANCIAL_REPORT_READ grant allows. The server then checks the search against the targets of the CREATE grant, and only when that grant carries targets. It wants both a permitted branch and a permitted company, and the screen never sends a company. So any branch or company target on the CREATE grant refuses every search, rather than narrowing it. Grant CREATE without targets. The Set of Books and its ledgers are also read with permission checks, so a user without read rights on a ledger cannot close it.
Fields
Financial Report — Main
| Field | Meaning | Required | Notes / validation |
|---|---|---|---|
| Set of Books | Which books (and therefore ledgers) the snapshot covers | Yes | Must exist; server error SET_OF_BOOKS_IS_NULL / SET_OF_BOOKS_GUID_DOES_NOT_EXIST otherwise |
| Start Year, Start Month | First month in the range | Yes | The picker offers 2020 to four years ahead. The debit and credit columns add up the month-end summary rows for every month from here to the end month — the rows Month End Processing writes when it closes a month — so a month in the range that was never closed adds nothing, and neither the screen nor the backend warns you. Nothing checks that the start comes before the end either: reversed, the range adds no movement at all. Close every month in the range first, and Regenerate the snapshot after you re-close one |
| End Year, End Month | Last month in the range | Yes | The end month supplies the closing balances the Balance Sheet and the Trial Balance’s balance-sheet accounts show |
Saved as a financial report snapshot; each line records the GL section, category, code, total debit and total credit, plus branch / entity / profit centre / segment / project / dimension / sub-ledger.
Month End Processing — Main
| Field | Meaning | Required | Notes / validation |
|---|---|---|---|
| Set of Books | Books whose ledgers are closed | Yes | Every ledger line is processed; a ledger you cannot read aborts the run |
| Year, Month | The month being closed | Yes | Creating the same month again rebuilds that month’s journals and summaries and adds a second record — nothing refuses a duplicate. Deleting either record then removes the month’s close that both describe, leaving the other one pointing at a close that no longer exists. Re-close a month with PROCESS on its existing record, never a second Create |
Stored on the same header table with txn_type = MONTH_END_PROCESSING.
Profit Loss Report — filters
| Field | Meaning | Required | Notes |
|---|---|---|---|
| Group By | Column split: Branch, GL Dimension, Segment, Profit Center or Project | Yes (default Branch) | One amount column per value found in the journals |
| Branch / GL Dimension / Profit Center / Segment / Project | Restrict to selected values | No | Branch list is permission-filtered |
| Date From, Date To | Journal transaction date range | Yes | Only journals with txn_type = TXN are read — closing, opening, COGS and retained-earnings journals are excluded |
| Cost Type | Cost basis for the live cost-of-goods-sold row | Yes (default MA) | MA, WA, FIFO, LIFO, Replacement or Manual, taken from each sales line’s stored cost columns. Only MA, WA and FIFO are written by the posting chain; LIFO and Manual are null on every line and Replacement is a pricing figure — see The four ways its total surprises you |
Stock Flow Report and Trace Document
| Screen | Field | Required | Notes |
|---|---|---|---|
| Stock Flow Report | Company | Yes | Single company; permission-filtered |
| Stock Flow Report | Date From, Date To | Yes | Inventory side reads finalised document lines; accounting side reads journal lines on the module’s default sub-ledger |
| Trace Document | Server Doc Type | Yes | The platform’s list of document types, sorted by code — built into BigLedger, so it lists every type whether or not your company uses it |
| Trace Document | Server Doc No | Yes | Matched exactly — the whole number, same capitals — against documents of the chosen type; no match gives Invalid Document. If more than one document of that type carries the number, Trace checks the first one it finds and does not say there were others, so compare the date and amount it shows with the document you meant |
Lifecycle and effects
Neither a snapshot nor a month-end record has a status flow; they are created, regenerated and deleted. What matters is what each action writes to the ledger.
Creating (or re-processing) a Month End Processing record
For each ledger in the Set of Books:
- Delete that ledger’s existing
CDjournal for the month, itsBDjournal dated the first of the next month, and its summary rows for the month. This runs before, and outside, the step that rebuilds them. - Read every journal line dated within the month whose journal is not itself a
CD— including theBDopening journal the previous month’s close wrote on the 1st — grouped by sub-ledger and GL code, with the GL code’s report section. The month’s first and last instants are worked out by your browser when you create the record and stored on it; PROCESS reuses them. - Post a closing-day (
CD) journal dated the last day of the month: one line per account, opposite in sign to the account’s net movement (P&L lines are described POSTING TO PROFIT AND LOSS). Transaction typeCD, description AUTO CREATED FROM MONTH END PROCESSING, marked automatic and posted, with posting running numbers. - Post an opening-day (
BD) journal dated the first day of the next month that re-opens the balance-sheet accounts only — lines in the P&L sections listed under Before you can use it are skipped. - Write one general ledger summary row per sub-ledger + GL code for the month: net debit or credit, opening (
BD) amount, closing (CD) amount, and the year/month keys.
A failed close still says success. Steps 3–5 can fail, and the screen is not told. A ledger with no journal lines in the month produces no closing journal (Journal Line is empty. is raised and thrown away). Since July 2026 every journal must balance, so a closing or opening journal that does not net to zero is refused — and it does not net to zero when one GL code’s category has no report-section link, or when the company has no PROFIT_LOSS / RETAINED_EARNING default GL code, so that the month’s result was never moved to retained earnings. In every case the month-end record is created, the screen reports success, and the close — or half of it — is simply missing. On a re-run it is worse: step 1 has already deleted the previous close.
Check after every run — it takes a minute. In Ledger And Journal, for each ledger of the Set of Books, look for two journals described AUTO CREATED FROM MONTH END PROCESSING: one dated the last day of the month, one dated the 1st of the next. Both there: the month is closed. Either missing: fix the cause (link the category to a report section, map PROFIT_LOSS and RETAINED_EARNING on the company), then PROCESS again.
DELETE on a month-end record removes the CD and BD journals and the summary rows for every ledger in the Set of Books; it does not touch the original document journals — and it leaves the month’s cost-of-goods-sold and retained-earnings journals posted. Undoing a close does not undo the cost of sales or the profit transfer; delete or reverse those yourself in Ledger And Journal if you mean to.
Cost-of-goods-sold and retained-earnings processors
These two steps run on every month-end, not on demand: both Create and the Processor tab’s PROCESS write the cost-of-goods-sold and retained-earnings journals before the close. Because the close then reads every non-CD journal line of the month, both journals are inside the CD close and the summary rows. What you cannot do is run either on its own — the Processor tab has no button for it. Each journal is written only when its company defaults exist (COGS: COGS + STOCK_BALANCE; retained earnings: PROFIT_LOSS + RETAINED_EARNING) — otherwise the step is skipped silently:
| Processor | Journal txn_type | Debit | Credit | Amount |
|---|---|---|---|---|
| Cost of goods sold | COGS | COGS default GL code | STOCK_BALANCE (inventory) | Opening stock + purchases (+ purchase returns, which carry a negative net) − closing stock, plus the month’s stock-adjustment and Reset MA amounts on accounts other than inventory; purchase and purchase-return accounts are cleared against it, and the inventory credit is opening − closing + adjustment + Reset MA. The journal keeps each of these figures with it, so the cost of sales can be traced from the journal itself |
| Closing stock by type (only when a Month End Closing Stock record exists) | COGS | STOCK_BALANCE_WIP / _NSTI / _RAW / _FG | COGS_WIP / _NSTI / _RAW / _FG | The record’s manual or system-calculated closing value per stock type; a type whose value is zero gets no journal |
| Retained earnings | RETAINED_EARNINGS | PROFIT_LOSS default GL code | RETAINED_EARNING default GL code | For a profit. The month’s result over the profit-and-loss sections (excluding CD/BD, excluding the ProfitLoss section itself, including Dividend); a loss reverses the sides — debit RETAINED_EARNING, credit PROFIT_LOSS |
Closing stock for the COGS processor is valued from stock transactions before the period end (PNS and RESET_MA rows, latest per item) using the cost column chosen by the company’s Inventory Closing Base On — quantity × unit cost for MA, WA, FIFO and LIFO, the stored amount for Replacement and Manual. The pick does not skip deleted stock lines, so an item whose latest movement was deleted is valued from that deleted line. A Month End Closing Stock record for the month or the prior month overrides opening and closing inventory when its manual flag is set and the manual value is not zero. A manual zero is ignored and the calculated figure stands, so a company whose stock really is nil still has the calculated stock taken off cost of sales. Re-running a processor first deletes the journals it created last time.
Creating and regenerating a Financial Report snapshot
Creating a snapshot reads three sets of summary rows for the Set of Books’ ledgers and stores them as fact lines: the monthly rows from start month to end month (the profit-and-loss movement), the end month’s closing amounts (the Balance Sheet, and the Trial Balance’s balance-sheet accounts), and the end month’s opening amount for the RetainedEarnings section — stored, but read by no tab. Rows whose debit equals credit are dropped. REGENERATE deletes the fact lines and repeats the read with the same header. DELETE removes the snapshot only. Nothing here posts to the ledger.
Reading order at month-end
- Post and finalise all documents and manual journals for the month.
- Create (or PROCESS) the Month End Processing record for each Set of Books — months in order, never one ahead of an unclosed earlier month.
- Check the closing and opening journals exist for every ledger (see A failed close still says success above).
- Create the Financial Report snapshot, or REGENERATE existing ones that include the month.
- If anything is back-dated later: PROCESS that month and every later closed month, in order, then REGENERATE.
Related applets
- Chart of Account — owns everything this applet depends on: sections, categories, the section links, Sets of Books, ledgers, companies’ default GL codes and inventory closing basis, and the MITRS flag.
- Ledger And Journal — where you see the
CD,BD,COGSandRETAINED_EARNINGSjournals month-end writes, and where the drill-down from a report line ends up. - Organisation — branches, profit centres, segments and projects used as Group By dimensions in the Profit Loss Report.
- Sales Invoice (Internal), Sales Return (Internal) — source of the live cost-of-goods-sold and Gross Profit listing.
- Purchase Invoice (Internal), Purchase Return (Internal) — the purchase side of the Stock Flow Report and the COGS processor.
- Stock Report — Historical Stock Balance, the figure to tie to the stock account after Month End Processing (how). The Stock Flow Report does not read it.
- Cashbook, Receipt Voucher (Internal), Payment Voucher (Internal) — settlement documents whose cashbook transactions Trace Document verifies.
- Debtor Report, Creditor Report — sub-ledger detail behind the receivable and payable lines.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| A new snapshot’s Trial Balance / P&L / Balance Sheet tabs are empty | Month End Processing has not been run for the months in the range (the snapshot reads month-end summary rows, not journals), or the wrong Set of Books was chosen | Create a Month End Processing record for each month of that Set of Books, then REGENERATE the snapshot |
| Month-end fails with Set of Books is missing primary ledger configuration. | The Set of Books has no ledger lines | Link the company ledger on the Set of Books’ Ledgers tab in Chart of Account |
| Set of Books guid cannot be empty or has no permission. or Ledger with guid … does not exist or has no permission. | The user lacks READ on the Set of Books or on one of its ledgers | Grant the financial-report permission with the right company targets, or run as an admin |
| The Profit Loss Report answers not authorised for one user and works for everybody else | That user’s Financial Report grant carries a company, branch or location target. The server compares the request’s companies with it — and the screen never sends any, so the comparison comes up empty and the whole report is refused | Remove the target from that permission and restrict the user another way. A target on a Financial Report permission does not narrow this report; it stops it |
| A branch profit and loss is short against the trial balance by the amount of an adjusting entry | The manual journal line was saved with no Branch. Nothing requires one, and an untagged line matches no branch and is dropped | Open the journal, set the Branch on the line, save. Then re-run — no repost is needed, because the report reads journal lines live |
| Cost of Goods Sold on this report and on the snapshot’s Profit And Loss tab do not agree | They are two different measurements. The snapshot reads the month-end cost-of-goods-sold journal; this report recomputes cost live from each sales line’s stored cost at the Cost Type you picked | Expect a difference whenever the cost basis differs, a sale is unposted, or month-end has not run. Use the snapshot for statutory figures and this report for the margin conversation |
| Month End Processing said success, but a statement is empty, short or does not balance for that month | The close, or half of it, was not written and the screen was not told: a ledger with no entries in the month, a GL category with no report-section link, or no PROFIT_LOSS / RETAINED_EARNING default GL code on the company (since July 2026 an unbalanced closing or opening journal is refused) | Check Ledger And Journal for the two AUTO CREATED FROM MONTH END PROCESSING journals per ledger (last day of the month, 1st of the next). Fix the cause, PROCESS the month again, then every later closed month in order, then REGENERATE. A ledger with no entries in the month cannot be closed — remove it from the Set of Books or post the month’s entries first |
| A GL code with movement is missing from every report and from the drill-down | Its GL Category is not linked to a Report Section, so the inner join drops it | Link the category to a section in Chart of Account, PROCESS the month again, then REGENERATE |
| A back-dated journal is not in the snapshot | Snapshots and month-end summaries are frozen when created | Open the Month End Processing record, Processor tab, PROCESS; then PROCESS every later closed month in order, because each one’s balances start from the month before; then REGENERATE the affected snapshots |
| Balance Sheet does not balance by roughly the period’s profit | The sheet has no current-profit line: it balances only through each month’s retained-earnings journal. That journal is not written when the company has no PROFIT_LOSS / RETAINED_EARNING default GL code — and then the month’s opening journal does not balance and is refused too. Otherwise: a month was closed before later postings, or the RetainedEarnings section is missing or renamed | Map both default GL codes on the company, PROCESS each affected month in order and REGENERATE; check the section code in Chart of Account |
| Two Month End Processing records for the same month, or deleting one emptied the month | Create does not refuse a month already closed; deleting either record removes the close both describe | Keep one record per month. After deleting a duplicate, PROCESS the remaining record to rebuild the close |
| Profit Loss Report and the snapshot’s P&L show different cost of goods sold | The Profit Loss Report computes COGS live from sales lines at the chosen Cost Type; the snapshot shows whatever was journalled | Match Cost Type to the company’s inventory closing basis; run the Stock Flow Report to find unposted or wrongly posted documents |
| Grouped by segment, GL dimension, profit centre or project, a column shows sales but little or no cost of goods sold | Revenue comes from journal lines, which take the document header’s tag when the line has none; cost of goods sold comes from the sales document lines, which do not. A sale tagged on its header only brings its revenue into the column and its cost into none | Only lines that carry the tag themselves bring their cost in. On a sales invoice line, Copy from Hdr on the Department tab puts it there — see Chart of Account |
| Profit Loss Report shows zero for a period you know has sales | Filters exclude the branches or dimensions the journals carry, or the journals are not TXN type (auto journals are excluded by design) | Clear the dimension filters and widen the dates; confirm the documents are FINAL and posted |
| Profit Loss Report refuses every search as not authorised | The user’s …FINANCIAL_REPORT_CREATE grant carries branch or company targets; the screen sends no company, so the target check can never pass | Grant CREATE without targets. Adding targets makes it worse, not better |
| A branch is missing from the Profit Loss Report’s Branch picker | The picker lists branches by the user’s …FINANCIAL_REPORT_READ grant | Add the branch to the READ grant |
| Stock Flow Report shows a Difference | A document with no journal (MISSING_ACCOUNTING), a journal with no matching document line (MISSING_INVENTORY), or unequal amounts (WRONG_AMOUNT) | Open the Difference listing, select the rows and click CREATE; a row that comes back with a server error (typically a missing default GL code on the item or company) needs the mapping fixed first |
| Trace Document reports Missing Journal on a FINAL document | The journal was never created — the posting job failed, or no job was ever queued. The check cannot tell you which: it asks the journal listing whether a journal exists and reads no job record | Click Resolve. The reason only appears now: if Resolve fails, the backend’s own message replaces the check text. Fix that cause first, or it fails the same way. This is true of Resolve only: the Repost button beside Posting Journal shows nothing when it fails |
| A failed Repost: you pressed Repost, no Repost successful appeared, and the document now has no journal | Repost deletes the document’s journal first and only then checks that it can build a new one (primary ledger, company default GL codes, a balanced journal). When the build fails, the old journal is already gone, posting_journal still reads POSTED, and the screen shows no message | After every Repost, open the document’s Journal Txn grid. If it is empty, fix the cause and press Resolve on Missing Journal, which shows the reason, or Repost again. For a type the checks call Unsupported document type, Repost again once the cause is fixed, or ask BigLedger support |
| Trace Document reports Missing glcode at ‘<item>’ | This comes from Wrong Journal’s Resolve, not from the check itself: before reposting, Resolve walks the document’s GL-code and account-code lines, writes the item’s current GL code onto each of those lines of the finalised document, and refuses if any item has none mapped. Lines it could map stay rewritten even when it refuses | Map a GL code on the named item in Chart of Account, then Resolve again. Before using Resolve on a document whose lines were deliberately posted to a different GL code than the item’s, note those codes: Resolve replaces them with the item’s |
| Trace Document reports Missing Shadow Document | A forex document was finalised without its shadow (company-currency) copy | Click Resolve — the applet creates the shadow document and finalises it |
| Company guid not exist from the COGS processor | The ledger is not linked to a company | Set the company on the ledger in Chart of Account |
| Profit Loss Report shows Total Cost of Goods Sold as 0 and Gross Margin as 100% | Cost Type is set to LIFO or Manual, and nothing writes either column on a document line (the LIFO half of the costing processor is commented out; there is no manual-cost writer at all) | Set Cost Type to MA, WA or FIFO. If your company genuinely closes on LIFO, the figure has to come from the month-end cost-of-goods-sold journal instead |
| Cost Type Replacement gives a cost close to the selling price | The replacement column is filled by the pricing subsystem from the pricing scheme link’s replacement price on every save, not by the costing chain, and it is empty on any line that names no pricing scheme link | Use it only if your company deliberately values at replacement price; otherwise pick MA, WA or FIFO |
Related documentation
- Financial reporting guide — the month-end and snapshot walkthrough for the running example.
- Month-end closing tutorial
- Financial Accounting module
- Chart of Account applet — sections, categories, Sets of Books, default GL codes.