Reporting

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.

Module first, then period. Only the modules you are permitted to report on are listed; when there is exactly one, it is chosen for you.

The Two Kinds

KindModulesHow its columns are decided
QuerySales, PurchasesA declared list of columns, compiled into a query over your documents. Columns can be filtered and sorted; the grain lock applies.
ProducerInventory, Employees, Payroll, Customers, Vendors, Banking, FinancialThe 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.

ColumnGrainFilterNotes
DateBothDate rangeThe document's own business date — invoice date, receipt date — never the moment it was saved
Document numberBothSearch onlyThe posted number, or the draft number for a draft
Document typeBothMulti-selectInvoice, Sales receipt, Receipt, Sales order, Credit note
CustomerBothMulti-selectFalls back to General where no party is set
UserBothMulti-selectThe person who raised it
LocationBothMulti-selectFalls back to No location
StatusBothMulti-selectDraft or posted. Retired documents never appear at all
Payment methodBothMulti-selectHow the money arrived
Account collected toBothMulti-selectThe account from your own chart that received it
Total amountDocumentNeitherAggregated from the lines after the page is chosen — see the grain lock
ItemLineMulti-selectFalls back to the line description, then Unspecified item
QuantityLineMin–maxSums
RateLineMin–maxNever summed — a total of unit prices means nothing
DiscountLineNoneSums
TaxLineNoneSums
Line amountLineMin–maxNet of discount and of inclusive tax. Sums
Sales accountLineMulti-selectThe 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.

✅Where a column's value comes from

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

ModuleWhat it publishesFilters it acceptsGated as
InventoryWhat you hold and what it is worth, from the engine every stock screen readsLocationInventory Summary
EmployeesYour people directory — names, departments, locations, start dates, statusPeriod onlyEmployee Directory
PayrollPay by employee for the period, from the pay schedules themselvesPeriod onlyPayroll
CustomersWhat each customer owes you, aged, from the one party-balance producerLocation · Balance range · Due-date rangeReceivables Aging
VendorsWhat you owe each vendor, aged, from the same producerLocation · Balance range · Due-date rangePayables Aging
BankingBalances by bank and cash account, from the ledgerLocationBank Account Summary
FinancialTrial balance — every account, from the ledger producerLocationTrial Balance

A producer module behaves differently in five visible ways:

BehaviourWhy
Every column starts tickedThe 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-sortedThe 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 facetsFiltering means passing the producer its own parameters, which differ per engine. Only the verified ones are offered.
Totals cover every row, not just the pageThe producer computes its own totals over the whole set. Query modules total the page on screen and say so.
No Include draft documents switchA producer reads posted state; there are no drafts to include.
🚨A filter is passed INTO the producer, never applied to its answer

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.

⚠️Finance, Inventory and Banking are read-only views of their producers

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.