Field meaning
Field meaning is data, not prose. It is authored in JSON per family and joined to the live column list at request time, so it cannot claim a column that does not exist.
Field definitions are authored as data and joined to the live schema. The generated Markdown reference makes those same definitions readable without database access. Neither code inspection nor an authored definition proves that a column has been migrated into a particular environment.
Where to look
| For | Go to |
|---|---|
| A classification column | /dictionary/classifications |
| Transaction, impact and customer fields | /dictionary/fields, see the fields dictionary |
| A business term rather than a column | The glossary |
| What an object is | Objects |
| How the tables relate | Data model |
Other table families are not yet part of the field-dictionary UI. Their source and object pages explain their purpose; the current schema is visible at /system/database/showcreate.
How it is stored
| Family | Tables it covers | Authored in |
|---|---|---|
| Transaction headers | The seven <type>s tables | config/dictionary/fields/transactionheaders.json |
| Transaction lines | Existing <type>lines tables; prepayments have no lines | config/dictionary/fields/transactionlines.json |
| Impacts | Per-group cm_impact_*, realised order totals and cm_expectedimpact_salesorders | config/dictionary/fields/impacts.json |
| Customers | The customer* identity, fingerprint and sequence tables | config/dictionary/fields/customers.json |
Classification columns are separate, in config/dictionary/transactionclassifications.json, keyed by classification-table column and read by /dictionary/classifications.
A family is a fixed list in app/models/dictionaryfields.php, not something a request can supply, because the family name lands in an identifier position in the query that reads the schema. The _old and _new tables a swap leaves behind are excluded, so a prefix family does not list the same columns three times.
A definition is keyed on the column name, not on the table. One entry covers that column wherever it appears in the family, which is what makes seven transaction types cost one definition rather than seven.
Adding a definition
Add the column and its description to the family's JSON file, and reload /dictionary/fields. There is no loader and no install step: config/dictionary/ is request-time lookup data and is never seeded into a table.
The page shows three states, and all three matter: documented, undocumented, and authored-but-absent. The last one means a definition exists for a column this environment does not have, which is either a typo or a column not yet migrated here.
Reading the definitions without the application
app/jobs/system/showfieldreference.php prints every authored definition as Markdown, and its output is committed as the generated field reference. That file exists so a reader outside the application, and a future retrieval, can see the same definitions the screen joins to the live schema.
It is generated, so it is never edited by hand: change the family's JSON and run the job again. It also carries only the authored side, never the live column list, which is why it is a companion to /dictionary/fields rather than a replacement for it.
What this page is not
It is not a field list, and adding one here would be the mistake this arrangement exists to prevent.
Related
Evidence
Families, the fixed list and the _old/_new exclusion from app/models/dictionaryfields.php. File locations from config/dictionary/fields/. The classification mechanism from app/data/dictionary/classifications.php and config/dictionary/transactionclassifications.json. config/dictionary/ being request-time rather than seeded from AGENTS.md, Configuration and .env. Basis: code-checked against the current implementation.
- Type
reference - Status
active - Updated
2026-09-14 - Created
2026-09-13