When multiple fusion.report rows share a report_type (e.g. 4 PnL-typed reports: pnl, cash_flow, executive_summary, annual_statements), the engine's _get_report previously returned whichever matched the type filter first \u2014 so all four reports rendered the canonical P&L line_specs regardless of which report the user selected. Adds report_code kwarg to compute_pnl, compute_balance_sheet, compute_trial_balance, compute_gl. Controller /fusion/reports/run now accepts and forwards report_code. _get_report has a 3-tier resolution: 1. Exact code match (validates type) 2. Canonical (code == report_type) 3. First by sequence Two new tests assert distinct line_specs render for distinct codes and that wrong-type code raises ValidationError. Verified live on westin-v19: pnl/cash_flow/executive_summary/ annual_statements now return 3/9/7/5 rows respectively (was all 3 before). Made-with: Cursor
fusion_accounting_reports
AI-augmented financial reports for Odoo 19 Community — a Fusion-native
replacement for Enterprise's account_reports module.
What it does
- CORE reports: Income Statement (P&L), Balance Sheet, Trial Balance, General Ledger (with drill-down to journal items)
- AI augmentation: variance-based anomaly detection + LLM-generated commentary (Claude / GPT / local LM Studio / Ollama)
- Wizards: period picker (common presets — MTD, QTD, YTD, last month, custom range) + XLSX export
- Coexists with Enterprise's
account_reports(Enterprise wins by default; the Fusion menu appears only when Enterprise is uninstalled — the engine and AI tools are always available via the AI chat) - Multi-currency aware via
services/currency_conversion.py - Multi-company aware (per-company
fusion.reportoverrides fall back to global definitions)
Quick start
# Install
odoo --addons-path=... -i fusion_accounting_reports
# Open the reports menu (when Enterprise's account_reports is NOT installed)
# Apps → Reports → Open Financial Report
Configuration
LLM commentary (optional)
For LM Studio / Ollama (local):
fusion_accounting.openai_base_url=http://host.docker.internal:1234/v1fusion_accounting.openai_model= your local model namefusion_accounting.openai_api_key=lm-studio(or anything non-empty)fusion_accounting.provider.reports_commentary=openai
For OpenAI / Anthropic, set the corresponding API keys via the
fusion_accounting_ai config screen — reports_commentary will route
through whatever provider you choose.
If no provider is configured, commentary falls back to a deterministic templated summary (no LLM call).
Cron jobs
Two cron handlers live in models/fusion_reports_cron.py:
fusion_reports_commentary_refresh— daily, regenerates commentary for the most recently completed periodfusion_reports_mv_refresh— every 15 min, refreshesfusion.account.balance.mv
Public engine API
engine = env['fusion.report.engine']
# Income statement
result = engine.compute_pnl(period, comparison='previous_year')
# Balance sheet (point-in-time)
result = engine.compute_balance_sheet(date(2026, 12, 31))
# Trial balance
result = engine.compute_trial_balance(period)
# General ledger (journal items per account)
result = engine.compute_gl(period, account_ids=[1, 2, 3])
# Drill-down (one account, period)
items = engine.drill_down(account_id=1, period=period)
JSON-RPC endpoints
All under /fusion/reports/:
POST /fusion/reports/run— single entry-point (dispatches byreport_type)POST /fusion/reports/drill_down— journal items for an account+periodPOST /fusion/reports/commentary— fetch/refresh LLM commentaryPOST /fusion/reports/anomalies— flagged variances for a periodPOST /fusion/reports/export_xlsx— XLSX bytesPOST /fusion/reports/export_pdf— PDF bytes (via wkhtmltopdf)POST /fusion/reports/list_definitions— availablefusion.reportrecordsPOST /fusion/reports/period_presets— date-range presets for the picker
Test counts
- 130 logical tests, 0 failures, 0 errors
- 6 performance benchmarks (tagged
benchmark) - 1 local-LLM compat smoke (tagged
local_llm, skips without LLM) - 5 OWL tour tests (tagged
tour, skips withoutwebsocket-client)
See also
CLAUDE.md— agent context (architecture, conventions, perf baseline, Phase 2.5 backlog)UPGRADE_NOTES.md— V19 anchor + migration strategy