38 lines
1.1 KiB
Python
38 lines
1.1 KiB
Python
|
|
from itertools import accumulate
|
|
|
|
from odoo import api, fields, models
|
|
from odoo.tools import Query
|
|
|
|
|
|
class AccountRoot(models.Model):
|
|
_name = 'account.root'
|
|
_description = 'Account codes first 2 digits'
|
|
_auto = False
|
|
_table_query = '0'
|
|
|
|
name = fields.Char(compute='_compute_root')
|
|
parent_id = fields.Many2one('account.root', compute='_compute_root')
|
|
|
|
def browse(self, ids=()):
|
|
if isinstance(ids, str):
|
|
ids = (ids,)
|
|
return super().browse(ids)
|
|
|
|
def _search(self, domain, offset=0, limit=None, order=None) -> Query:
|
|
match domain:
|
|
case [('id', 'in', ids)]:
|
|
return self.browse(sorted(ids))._as_query()
|
|
case [('id', 'parent_of', ids)]:
|
|
return self.browse(sorted({s for _id in ids for s in accumulate(_id)}))._as_query()
|
|
raise NotImplementedError
|
|
|
|
@api.model
|
|
def _from_account_code(self, code):
|
|
return self.browse(code and code[:2])
|
|
|
|
def _compute_root(self):
|
|
for root in self:
|
|
root.name = root.id
|
|
root.parent_id = self.browse(root.id[:-1] if len(root.id) > 1 else False)
|