feat(fusion_accounting_reports): top-level report_viewer OWL component
Made-with: Cursor
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
'name': 'Fusion Accounting Reports',
|
'name': 'Fusion Accounting Reports',
|
||||||
'version': '19.0.1.0.23',
|
'version': '19.0.1.0.24',
|
||||||
'category': 'Accounting/Accounting',
|
'category': 'Accounting/Accounting',
|
||||||
'summary': 'AI-augmented financial reports (P&L, balance sheet, trial balance, GL).',
|
'summary': 'AI-augmented financial reports (P&L, balance sheet, trial balance, GL).',
|
||||||
'description': """
|
'description': """
|
||||||
@@ -43,6 +43,9 @@ menu hides; the engine and AI tools remain available for the chat.
|
|||||||
'fusion_accounting_reports/static/src/scss/reports.scss',
|
'fusion_accounting_reports/static/src/scss/reports.scss',
|
||||||
'fusion_accounting_reports/static/src/scss/dark_mode.scss',
|
'fusion_accounting_reports/static/src/scss/dark_mode.scss',
|
||||||
'fusion_accounting_reports/static/src/services/reports_service.js',
|
'fusion_accounting_reports/static/src/services/reports_service.js',
|
||||||
|
'fusion_accounting_reports/static/src/views/report_viewer/report_viewer.js',
|
||||||
|
'fusion_accounting_reports/static/src/views/report_viewer/report_viewer.xml',
|
||||||
|
'fusion_accounting_reports/static/src/views/report_viewer/report_viewer_view.js',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'installable': True,
|
'installable': True,
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
/** @odoo-module **/
|
||||||
|
|
||||||
|
import { Component, useState, onWillStart } from "@odoo/owl";
|
||||||
|
import { useService } from "@web/core/utils/hooks";
|
||||||
|
import { ReportTable } from "../../components/report_table/report_table";
|
||||||
|
import { PeriodFilter } from "../../components/period_filter/period_filter";
|
||||||
|
import { DrillDownDialog } from "../../components/drill_down_dialog/drill_down_dialog";
|
||||||
|
import { AiCommentaryPanel } from "../../components/ai_commentary_panel/ai_commentary_panel";
|
||||||
|
import { AnomalyStrip } from "../../components/anomaly_strip/anomaly_strip";
|
||||||
|
|
||||||
|
export class ReportViewer extends Component {
|
||||||
|
static template = "fusion_accounting_reports.ReportViewer";
|
||||||
|
static props = { "*": true };
|
||||||
|
static components = {
|
||||||
|
ReportTable, PeriodFilter, DrillDownDialog,
|
||||||
|
AiCommentaryPanel, AnomalyStrip,
|
||||||
|
};
|
||||||
|
|
||||||
|
setup() {
|
||||||
|
this.reports = useService("fusion_reports");
|
||||||
|
this.state = useState(this.reports.state);
|
||||||
|
|
||||||
|
const ctx = this.props.action?.context || {};
|
||||||
|
const reportType = ctx.default_report_type || 'pnl';
|
||||||
|
const companyId = this.env.services.user?.context?.allowed_company_ids?.[0];
|
||||||
|
|
||||||
|
onWillStart(async () => {
|
||||||
|
await this.reports.loadAvailableReports(companyId);
|
||||||
|
const today = new Date();
|
||||||
|
const year = today.getFullYear();
|
||||||
|
await this.reports.runReport(
|
||||||
|
reportType, `${year}-01-01`, `${year}-12-31`, 'none');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onDrillDown(accountId, label) {
|
||||||
|
this.reports.drillDown(accountId, label);
|
||||||
|
}
|
||||||
|
|
||||||
|
onCloseDrill() {
|
||||||
|
this.reports.closeDrillDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
async onGenerateCommentary() {
|
||||||
|
await this.reports.generateCommentary({ forceRegenerate: false });
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<templates xml:space="preserve">
|
||||||
|
|
||||||
|
<t t-name="fusion_accounting_reports.ReportViewer">
|
||||||
|
<div class="o_fusion_reports">
|
||||||
|
<div class="o_fusion_reports_header">
|
||||||
|
<div>
|
||||||
|
<h1>
|
||||||
|
<t t-esc="state.currentResult?.report_name || 'Financial Reports'"/>
|
||||||
|
</h1>
|
||||||
|
<div class="text-muted" t-if="state.currentResult">
|
||||||
|
<t t-esc="state.currentResult.period?.label"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button class="btn_report primary"
|
||||||
|
t-on-click="onGenerateCommentary"
|
||||||
|
t-att-disabled="state.isGeneratingCommentary">
|
||||||
|
<t t-if="state.isGeneratingCommentary">Generating...</t>
|
||||||
|
<t t-else="">AI Commentary</t>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<PeriodFilter />
|
||||||
|
|
||||||
|
<AnomalyStrip t-foreach="state.currentAnomalies" t-as="anomaly"
|
||||||
|
t-key="anomaly.row_id" anomaly="anomaly"/>
|
||||||
|
|
||||||
|
<AiCommentaryPanel t-if="state.currentCommentary" commentary="state.currentCommentary"/>
|
||||||
|
|
||||||
|
<ReportTable t-if="state.currentResult" result="state.currentResult"
|
||||||
|
onDrillDown="onDrillDown.bind(this)"/>
|
||||||
|
|
||||||
|
<DrillDownDialog t-if="state.drillDown and state.drillDown.isOpen"
|
||||||
|
drill="state.drillDown"
|
||||||
|
onClose="onCloseDrill.bind(this)"/>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
|
||||||
|
</templates>
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
/** @odoo-module **/
|
||||||
|
|
||||||
|
import { registry } from "@web/core/registry";
|
||||||
|
import { ReportViewer } from "./report_viewer";
|
||||||
|
|
||||||
|
export const fusionReportsView = {
|
||||||
|
type: "fusion_reports",
|
||||||
|
Controller: ReportViewer,
|
||||||
|
display_name: "Fusion Financial Reports",
|
||||||
|
icon: "fa-line-chart",
|
||||||
|
multiRecord: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
registry.category("views").add("fusion_reports", fusionReportsView);
|
||||||
Reference in New Issue
Block a user