-
Notifications
You must be signed in to change notification settings - Fork 24.5k
/
account_account_tag.py
79 lines (67 loc) · 3.54 KB
/
account_account_tag.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
from odoo import osv
from odoo.exceptions import UserError
class AccountAccountTag(models.Model):
_name = 'account.account.tag'
_description = 'Account Tag'
name = fields.Char('Tag Name', required=True)
applicability = fields.Selection([('accounts', 'Accounts'), ('taxes', 'Taxes'), ('products', 'Products')], required=True, default='accounts')
color = fields.Integer('Color Index')
active = fields.Boolean(default=True, help="Set active to false to hide the Account Tag without removing it.")
tax_negate = fields.Boolean(string="Negate Tax Balance", help="Check this box to negate the absolute value of the balance of the lines associated with this tag in tax report computation.")
country_id = fields.Many2one(string="Country", comodel_name='res.country', help="Country for which this tag is available, when applied on taxes.")
def name_get(self):
if not self.env.company.multi_vat_foreign_country_ids:
return super().name_get()
res = []
for tag in self:
name = tag.name
if tag.applicability == "taxes" and tag.country_id and tag.country_id != self.env.company.account_fiscal_country_id:
name = _("%s (%s)", tag.name, tag.country_id.code)
res.append((tag.id, name,))
return res
@api.model
def _get_tax_tags(self, tag_name, country_id):
""" Returns all the tax tags corresponding to the tag name given in parameter
in the specified country.
"""
domain = self._get_tax_tags_domain(tag_name, country_id)
original_lang = self._context.get('lang', 'en_US')
rslt_tags = self.env['account.account.tag'].with_context(active_test=False, lang='en_US').search(domain)
return rslt_tags.with_context(lang=original_lang) # Restore original language, in case the name of the tags needs to be shown/modified
@api.model
def _get_tax_tags_domain(self, tag_name, country_id, sign=None):
""" Returns a domain to search for all the tax tags corresponding to the tag name given in parameter
in the specified country.
"""
escaped_tag_name = tag_name.replace('\\', '\\\\').replace('%', r'\%').replace('_', r'\_')
return [
('name', '=like', (sign or '_') + escaped_tag_name),
('country_id', '=', country_id),
('applicability', '=', 'taxes')
]
def _get_related_tax_report_expressions(self):
if not self:
return self.env['account.report.expression']
or_domains = []
for record in self:
expr_domain = [
'&',
('report_line_id.report_id.country_id', '=', record.country_id.id),
('formula', '=', record.name[1:]),
]
or_domains.append(expr_domain)
domain = osv.expression.AND([[('engine', '=', 'tax_tags')], osv.expression.OR(or_domains)])
return self.env['account.report.expression'].search(domain)
@api.ondelete(at_uninstall=False)
def _unlink_except_master_tags(self):
master_xmlids = [
"account_tag_operating",
"account_tag_financing",
"account_tag_investing",
]
for master_xmlid in master_xmlids:
master_tag = self.env.ref(f"account.{master_xmlid}", raise_if_not_found=False)
if master_tag and master_tag in self:
raise UserError(_("You cannot delete this account tag (%s), it is used on the chart of account definition.", master_tag.name))