Files
Odoo-Modules/fusion_accounting_reports
gsinghpal 36964d6b79 feat(fusion_accounting_reports): adopt Enterprise account_reports look
User feedback: 'i like the odoo enterprise style reports, I hate our style.'

Replaces our custom 'o_fusion_reports' visual with a faithful adaptation
of Enterprise account_reports. Same .account_report root class, same
table semantics (line_name + line_cell + line_level_N), same border
treatment (1px gray-300 borders, 0.25rem radius, sticky thead), same
button hover behavior (gray-300 -> enterprise-action-color), same dense
0.8rem font-size + padded cells.

SCSS layout:
- reports.scss in web.assets_backend bundle (eager light)
- reports.dark.scss in web.assets_web_dark bundle (lazy dark mode)
- _variables.scss reduced to spacing/typography only -- colors use
  Odoo's \$o-* SCSS vars so dark mode flips automatically via the
  separate dark bundle
- old dark_mode.scss removed (was using non-Odoo [data-color-scheme]
  selector that never matched anything)

QWeb templates rewritten to mirror Enterprise's structure:
- report_viewer.xml roots at .account_report with scroll container
- report_table.xml uses Enterprise's td.line_name + td.line_cell with
  .wrapper > .content nesting; partner-grouped reports now actually
  render their aging buckets (previously showed nothing)
- period_filter.xml is now a clean Bootstrap-styled inline filter bar

Kept Fusion-only components but restyled to fit:
- anomaly_strip uses Bootstrap alert-{danger,warning,info} colors
- ai_commentary_panel is a plain bordered panel, no gradients/emojis
- drill_down_dialog unchanged (already a Bootstrap modal)

Made-with: Cursor
2026-04-20 01:41:41 -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