Table Report Modules
The nine sources a table report can be built from, the columns each publishes, and why two of them behave differently from the other seven.
A table report starts with a module. The module decides which columns exist; you decide which of them appear, and in what order. Changing the module clears every column, filter and sort — a column key only means something inside the module it came from.
The Two Kinds
| Kind | Modules | How its columns are decided |
|---|---|---|
| Query | Sales, Purchases | A declared list of columns, compiled into a query over your documents. Columns can be filtered and sorted; the grain lock applies. |
| Producer | Inventory, Employees, Payroll, Customers, Vendors, Banking, Financial | The engine that owns those figures is called, and its own columns are discovered by running it. No re-sorting, no column facets, one grain. |
The split is not arbitrary. Sales and Purchases are lists of documents, and the reporting layer already owns how documents are read. Inventory value, party balances, payroll and ledger balances each have exactly one engine that computes them — building a second query over the same tables would create a second answer to a question that must have one.
Query Modules
Sales
Invoices, sales receipts, customer receipts, sales orders and credit notes.
| Column | Grain | Filter | Notes |
|---|---|---|---|
| Date | Both | Date range | The document's own business date — invoice date, receipt date — never the moment it was saved |
| Document number | Both | Search only | The posted number, or the draft number for a draft |
| Document type | Both | Multi-select | Invoice, Sales receipt, Receipt, Sales order, Credit note |
| Customer | Both | Multi-select | Falls back to General where no party is set |
| User | Both | Multi-select | The person who raised it |
| Location | Both | Multi-select | Falls back to No location |
| Status | Both | Multi-select | Draft or posted. Retired documents never appear at all |
| Payment method | Both | Multi-select | How the money arrived |
| Account collected to | Both | Multi-select | The account from your own chart that received it |
| Total amount | Document | Neither | Aggregated from the lines after the page is chosen — see the grain lock |
| Item | Line | Multi-select | Falls back to the line description, then Unspecified item |
| Quantity | Line | Min–max | Sums |
| Rate | Line | Min–max | Never summed — a total of unit prices means nothing |
| Discount | Line | None | Sums |
| Tax | Line | None | Sums |
| Line amount | Line | Min–max | Net of discount and of inclusive tax. Sums |
| Sales account | Line | Multi-select | The revenue account the line posts to: the item's own account, or the business's default sales account |
Purchases
Bills, expenses, vendor payments, purchase orders and debit notes. The same seventeen columns from the other side of the ledger, with four renamed: Vendor for Customer, Account paid from for Account collected to, Purchase account for Sales account, and the document types become Bill, Expense, Payment, Purchase order, Debit note.
Sales account and Purchase account reproduce the posting rule the ledger itself uses — the item's own account where one is configured, otherwise the business's default account. The column can therefore never disagree with the journal the document actually made.
Producer Modules
| Module | What it publishes | Filters it accepts | Gated as |
|---|---|---|---|
| Inventory | What you hold and what it is worth, from the engine every stock screen reads | Location | Inventory Summary |
| Employees | Your people directory — names, departments, locations, start dates, status | Period only | Employee Directory |
| Payroll | Pay by employee for the period, from the pay schedules themselves | Period only | Payroll |
| Customers | What each customer owes you, aged, from the one party-balance producer | Location · Balance range · Due-date range | Receivables Aging |
| Vendors | What you owe each vendor, aged, from the same producer | Location · Balance range · Due-date range | Payables Aging |
| Banking | Balances by bank and cash account, from the ledger | Location | Bank Account Summary |
| Financial | Trial balance — every account, from the ledger producer | Location | Trial Balance |
A producer module behaves differently in five visible ways:
| Behaviour | Why |
|---|---|
| Every column starts ticked | The catalog is discovered by running the report, so "nothing chosen" means "everything the producer publishes" — which is also a sensible report. |
| No column can be re-sorted | The producer returns rows in the order it computed them — running balances, aging bands, account hierarchy. Re-ordering them would misalign every derived figure. |
| No per-column facets | Filtering means passing the producer its own parameters, which differ per engine. Only the verified ones are offered. |
| Totals cover every row, not just the page | The producer computes its own totals over the whole set. Query modules total the page on screen and say so. |
| No Include draft documents switch | A producer reads posted state; there are no drafts to include. |
When you filter a producer module by location, the request goes to the engine, which recomputes its totals with the filter applied. Filtering the returned rows instead would leave a footer describing a wider set than the table shows — a total that quietly disagrees with the rows above it.
When a producer accepts nothing beyond the period, the Filters panel says so — This report is filtered by period only — rather than showing an empty panel and leaving you wondering whether something failed to load.
Permission
Each module is gated on the same reporting permission as the built-in report that reads the same data. A table report can never reach data its catalog equivalent would refuse you, and the module list you see is already filtered to what you may report on. If only one module is available, it is selected for you — a picker with one option is a question you should not have to answer.
You are choosing which of the engine's columns to keep and in what order. The figures themselves are never recalculated here. That is the whole reason these modules exist as producers rather than as queries.
Related
- Building one: Building a table report.
- Why some columns grey out: The grain lock.
- The built-in reports behind the producer modules: Operations reports, People & admin reports, Aging reports, Financial statements.