Files
Odoo-Modules/fusion_accounting_reports
gsinghpal 1817f63c67 fix(fusion_accounting_reports): engine accepts report_code to disambiguate
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
2026-04-19 23:58:29 -04:00
..

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.report overrides 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/v1
  • fusion_accounting.openai_model = your local model name
  • fusion_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 period
  • fusion_reports_mv_refresh — every 15 min, refreshes fusion.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 by report_type)
  • POST /fusion/reports/drill_down — journal items for an account+period
  • POST /fusion/reports/commentary — fetch/refresh LLM commentary
  • POST /fusion/reports/anomalies — flagged variances for a period
  • POST /fusion/reports/export_xlsx — XLSX bytes
  • POST /fusion/reports/export_pdf — PDF bytes (via wkhtmltopdf)
  • POST /fusion/reports/list_definitions — available fusion.report records
  • POST /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 without websocket-client)

See also

  • CLAUDE.md — agent context (architecture, conventions, perf baseline, Phase 2.5 backlog)
  • UPGRADE_NOTES.md — V19 anchor + migration strategy