odoo-statutory-reportslisted
Install: claude install-skill tuanle96/odoo-ai-skills
# Odoo statutory / financial reports — the `account.report` engine
The grids under **Accounting → Reporting** are not QWeb. They are data-defined
reports evaluated by the `account_reports` engine (Enterprise):
| Model | Role |
|-------|------|
| `account.report` | root: name, `country_id`, `root_report_id` (variant of), `filter_*` toggles, columns |
| `account.report.line` | one row: `code`, `name`, `hierarchy_level`, children via `parent_id`, `foldable`, `groupby` |
| `account.report.expression` | one cell per column: `label` (must match a column's `expression_label`, default `balance`), `engine`, `formula`, `subformula`, `date_scope` |
**The rule: a statutory report is a spec with legal line codes — design it to
prove its own correctness (see "Self-verifying design"), and never guess what
an existing report contains: read it from the registry first
(`odoo-introspect`; the records live in `account.report*`).**
## Engines
| Engine | `formula` | Use for |
|--------|-----------|---------|
| `domain` | a domain string over `account.move.line` | 90% of lines: `[('account_id.code', '=like', '511%')]` |
| `aggregation` | arithmetic over `LINECODE.expression_label` | totals & legal formulas: `REV01.balance - COGS11.balance` |
| `account_codes` | prefix arithmetic `511 - 5117` | quick prefix sums (less control than domain) |
| `tax_tags` | tax grid tag | tax returns |
| `external` | manual/carryover value | figures the ledger can't produce |
| `custom` | **full method name** `_r