61 lines
2.2 KiB
Python
61 lines
2.2 KiB
Python
from odoo import api, fields, models
|
|
from odoo.tools import Query, SQL
|
|
|
|
|
|
class AccountAnalyticLine(models.Model):
|
|
_inherit = 'account.analytic.line'
|
|
|
|
analytic_coverage = fields.Float(
|
|
string="Analytic Coverage",
|
|
compute='_compute_analytic_coverage',
|
|
)
|
|
|
|
def _field_to_sql(self, alias: str, fname: str, query: (Query | None) = None) -> SQL:
|
|
if fname == 'analytic_coverage':
|
|
plan_id = self.env.context.get('selected_analytic_plan')
|
|
if not plan_id:
|
|
return SQL("0.0")
|
|
|
|
move_line_alias = query.left_join(
|
|
alias, 'move_line_id',
|
|
'account_move_line', 'id',
|
|
'move_line_id',
|
|
)
|
|
|
|
column_name = self.env['account.analytic.plan'].browse(plan_id)._column_name()
|
|
account_alias = query.left_join(
|
|
alias, column_name,
|
|
'account_analytic_account', 'id',
|
|
column_name,
|
|
)
|
|
|
|
plan_alias = query.left_join(
|
|
account_alias, 'plan_id',
|
|
'account_analytic_plan', 'id',
|
|
'plan_id',
|
|
)
|
|
|
|
amount_sql = SQL(
|
|
"CASE WHEN %s = %s THEN %s ELSE 0 END",
|
|
SQL.identifier(plan_alias, 'id'),
|
|
plan_id,
|
|
SQL.identifier(alias, 'amount'),
|
|
)
|
|
return SQL(
|
|
"COALESCE(-(%(amount)s / NULLIF(%(balance)s, 0)), 0)",
|
|
amount=amount_sql,
|
|
balance=SQL.identifier(move_line_alias, 'balance'),
|
|
)
|
|
|
|
return super()._field_to_sql(alias, fname, query)
|
|
|
|
@api.depends('amount', 'move_line_id.balance', 'auto_account_id')
|
|
def _compute_analytic_coverage(self):
|
|
plan_id = self.env.context.get('selected_analytic_plan')
|
|
self.analytic_coverage = 0.0
|
|
if plan_id:
|
|
for line in self:
|
|
analytic_account = line.with_context(analytic_plan_id=plan_id).auto_account_id
|
|
if analytic_account and analytic_account.plan_id.id == plan_id:
|
|
line.analytic_coverage = - line.amount / line.move_line_id.balance if line.move_line_id.balance else 0.0
|