# 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 ```bash # 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 ```python 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