1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/l10n_be_soda/models/soda_account_mapping.py
2024-12-10 09:04:09 +07:00

68 lines
2.8 KiB
Python

from odoo import api, fields, models
class SodaAccountMapping(models.Model):
_name = 'soda.account.mapping'
_description = 'SODA Account Mapping'
_order = 'code, company_id'
_check_company_auto = True
company_id = fields.Many2one('res.company', required=True, default=lambda self: self.env.company)
code = fields.Char('SODA Account', required=True)
name = fields.Char('SODA Label', required=True)
account_id = fields.Many2one(
'account.account',
string='Mapped Account',
compute='_compute_account_id',
readonly=False,
store=True,
check_company=True
)
_sql_constraints = [
('code_company_uniq', 'unique (code, company_id)', 'The code of the SODA account must be unique per company')
]
@api.depends('code', 'company_id')
def _compute_account_id(self):
for mapping in self:
mapping.account_id = self.env['account.account'].search([
*self.env['account.account']._check_company_domain(self.company_id),
('code', '=like', f'{mapping.code}%'),
], limit=1)
@api.depends('code', 'name')
def _compute_display_name(self):
for mapping in self:
mapping.display_name = f"{mapping.code} {mapping.name}"
@api.model
def find_or_create_mapping_entries(self, soda_code_to_name_mapping, company_id):
"""Find account mappings for the provided SODA codes and/or create new ones when mappings for some SODA codes
do not exist yet.
:param soda_code_to_name_mapping: a dict mapping SODA codes to their names
:param company_id: the company for which to find or create the entries
:return: a recordset of soda.account.mapping entries for the given SODA codes
"""
soda_code_to_name_mapping = soda_code_to_name_mapping or {}
soda_account_codes = list(soda_code_to_name_mapping.keys())
# Find existing account mappings for the provided SODA codes
domain = [*self._check_company_domain(company_id)]
if soda_account_codes:
domain.append(('code', 'in', soda_account_codes))
soda_account_mappings = self.search(domain)
soda_account_mapping_codes = set(soda_account_mappings.mapped('code'))
new_soda_account_mappings = []
for code, name in soda_code_to_name_mapping.items():
# For each SODA code where there's not mapping yet, we create a new one
if code not in soda_account_mapping_codes:
soda_account_mapping_codes.add(code)
new_soda_account_mappings.append({
'code': code,
'name': name or "",
'company_id': company_id.id,
})
soda_account_mappings |= self.create(new_soda_account_mappings)
return soda_account_mappings