57 lines
2.0 KiB
Python
57 lines
2.0 KiB
Python
"""Reports data adapter.
|
|
|
|
Routes report-data lookups across:
|
|
- FUSION: fusion.account.report (added by fusion_accounting_reports, Phase 2)
|
|
- ENTERPRISE: account.report from account_reports
|
|
- COMMUNITY: raw aggregations on account.move.line
|
|
"""
|
|
|
|
from .base import DataAdapter
|
|
from ._registry import register_adapter
|
|
|
|
|
|
class ReportsAdapter(DataAdapter):
|
|
FUSION_MODEL = 'fusion.account.report'
|
|
ENTERPRISE_MODULE = 'account_reports'
|
|
|
|
def trial_balance(self, date_to=None, company_ids=None):
|
|
return self._dispatch('trial_balance', date_to=date_to, company_ids=company_ids)
|
|
|
|
def trial_balance_via_fusion(self, date_to=None, company_ids=None):
|
|
# Phase 2 will implement; for now defer to community.
|
|
return self.trial_balance_via_community(date_to=date_to, company_ids=company_ids)
|
|
|
|
def trial_balance_via_enterprise(self, date_to=None, company_ids=None):
|
|
# Enterprise account_reports has rich filters; for AI-tool consumption,
|
|
# the community shape suffices and avoids brittle coupling to Odoo's
|
|
# report-line internals.
|
|
return self.trial_balance_via_community(date_to=date_to, company_ids=company_ids)
|
|
|
|
def trial_balance_via_community(self, date_to=None, company_ids=None):
|
|
domain = [('parent_state', '=', 'posted')]
|
|
if date_to:
|
|
domain.append(('date', '<=', date_to))
|
|
if company_ids:
|
|
domain.append(('company_id', 'in', list(company_ids)))
|
|
|
|
Line = self.env['account.move.line'].sudo()
|
|
groups = Line._read_group(
|
|
domain=domain,
|
|
groupby=['account_id'],
|
|
aggregates=['debit:sum', 'credit:sum'],
|
|
)
|
|
return [
|
|
{
|
|
'account_id': account.id,
|
|
'account_code': account.code,
|
|
'account_name': account.name,
|
|
'debit': debit_sum,
|
|
'credit': credit_sum,
|
|
'balance': debit_sum - credit_sum,
|
|
}
|
|
for account, debit_sum, credit_sum in groups
|
|
]
|
|
|
|
|
|
register_adapter('reports', ReportsAdapter)
|