trytond-patches/account_chart_speedup.diff

1151 lines
47 KiB
Diff

# HG changeset patch
# User Cédric Krier <ced@b2ck.com>
# Date 1458600296 -3600
# Node ID 532fd5a46527a0c2f5b96f062b34f5bda18e88b5
# Parent 6d37f343013df686a8875aaa7b234ddedcdf05ff
Improve create/update chart of accounts
We create in one call all the records of the same tree level and we update all
the record in one call.
Side effect, as there is no more recursion, the depth of the chart can be
higher than the maximum depth of the Python interpreter stack.
issue5400
review23991002
diff -r 6d37f343013d -r 532fd5a46527 trytond/trytond/modules/account/account.py
--- a/trytond/trytond/modules/account/account.py Sun Mar 20 22:58:02 2016 +0100
+++ b/trytond/trytond/modules/account/account.py Mon Mar 21 23:44:56 2016 +0100
@@ -115,35 +115,42 @@
res['template'] = self.id
return res
- def create_type(self, company_id, template2type=None, parent_id=None):
+ def create_type(self, company_id, template2type=None):
'''
Create recursively types based on template.
template2type is a dictionary with template id as key and type id as
value, used to convert template id into type. The dictionary is filled
with new types.
- Return the id of the type created
'''
pool = Pool()
Type = pool.get('account.account.type')
+ assert self.parent is None
if template2type is None:
template2type = {}
- if self.id not in template2type:
- vals = self._get_type_value()
- vals['company'] = company_id
- vals['parent'] = parent_id
+ def create(templates):
+ values = []
+ created = []
+ for template in templates:
+ if template.id not in template2type:
+ vals = template._get_type_value()
+ vals['company'] = company_id
+ if template.parent:
+ vals['parent'] = template2type[template.parent.id]
+ else:
+ vals['parent'] = None
+ values.append(vals)
+ created.append(template)
- new_type, = Type.create([vals])
+ types = Type.create(values)
+ for template, type_ in zip(created, types):
+ template2type[template.id] = type_.id
- template2type[self.id] = new_type.id
- new_id = template2type[self.id]
-
- new_childs = []
- for child in self.childs:
- new_childs.append(child.create_type(company_id,
- template2type=template2type, parent_id=new_id))
- return new_id
+ childs = [self]
+ while childs:
+ create(childs)
+ childs = sum((c.childs for c in childs), ())
class Type(ModelSQL, ModelView):
@@ -269,19 +276,22 @@
value, used to convert template id into type. The dictionary is filled
with new types
'''
-
if template2type is None:
template2type = {}
- if self.template:
- vals = self.template._get_type_value(type=self)
- if vals:
- self.write([self], vals)
-
- template2type[self.template.id] = self.id
-
- for child in self.childs:
- child.update_type(template2type=template2type)
+ values = []
+ childs = [self]
+ while childs:
+ for child in childs:
+ if child.template:
+ vals = child.template._get_type_value(type=child)
+ if vals:
+ values.append([child])
+ values.append(vals)
+ template2type[child.template.id] = child.id
+ childs = sum((c.childs for c in childs), ())
+ if values:
+ self.write(*values)
class OpenType(Wizard):
@@ -419,7 +429,7 @@
return res
def create_account(self, company_id, template2account=None,
- template2type=None, parent_id=None):
+ template2type=None):
'''
Create recursively accounts based on template.
template2account is a dictionary with template id as key and account id
@@ -427,10 +437,10 @@
filled with new accounts
template2type is a dictionary with type template id as key and type id
as value, used to convert type template id into type.
- Return the id of the account created
'''
pool = Pool()
Account = pool.get('account.account')
+ assert self.parent is None
if template2account is None:
template2account = {}
@@ -438,24 +448,32 @@
if template2type is None:
template2type = {}
- if self.id not in template2account:
- vals = self._get_account_value()
- vals['company'] = company_id
- vals['parent'] = parent_id
- vals['type'] = (template2type.get(self.type.id) if self.type
- else None)
+ def create(templates):
+ values = []
+ created = []
+ for template in templates:
+ if template.id not in template2account:
+ vals = template._get_account_value()
+ vals['company'] = company_id
+ if template.parent:
+ vals['parent'] = template2account[template.parent.id]
+ else:
+ vals['parent'] = None
+ if template.type:
+ vals['type'] = template2type.get(template.type.id)
+ else:
+ vals['type'] = None
+ values.append(vals)
+ created.append(template)
- new_account, = Account.create([vals])
+ accounts = Account.create(values)
+ for template, account in zip(created, accounts):
+ template2account[template.id] = account.id
- template2account[self.id] = new_account.id
- new_id = template2account[self.id]
-
- new_childs = []
- for child in self.childs:
- new_childs.append(child.create_account(company_id,
- template2account=template2account, template2type=template2type,
- parent_id=new_id))
- return new_id
+ childs = [self]
+ while childs:
+ create(childs)
+ childs = sum((c.childs for c in childs), ())
def update_account_taxes(self, template2account, template2tax,
template_done=None):
@@ -477,17 +495,25 @@
if template_done is None:
template_done = []
- if self.id not in template_done:
- if self.taxes:
- Account.write([Account(template2account[self.id])], {
- 'taxes': [
- ('add', [template2tax[x.id] for x in self.taxes])],
- })
- template_done.append(self.id)
+ def update(templates):
+ to_write = []
+ for template in templates:
+ if template.id not in template_done:
+ if template.taxes:
+ tax_ids = [template2tax[x.id] for x in template.taxes]
+ to_write.append([Account(template2account[template.id])])
+ to_write.append({
+ 'taxes': [
+ ('add', tax_ids)],
+ })
+ template_done.append(template.id)
+ if to_write:
+ Account.write(to_write)
- for child in self.childs:
- child.update_account_taxes(template2account, template2tax,
- template_done=template_done)
+ childs = [self]
+ while childs:
+ update(childs)
+ childs = sum((c.childs for c in childs), ())
class Account(ModelSQL, ModelView):
@@ -846,28 +872,33 @@
template2type is a dictionary with type template id as key and type id
as value, used to convert type template id into type.
'''
-
if template2account is None:
template2account = {}
if template2type is None:
template2type = {}
- if self.template:
- vals = self.template._get_account_value(account=self)
- current_type = self.type.id if self.type else None
- template_type = (template2type.get(self.template.type.id)
- if self.template.type else None)
- if current_type != template_type:
- vals['type'] = template_type
- if vals:
- self.write([self], vals)
-
- template2account[self.template.id] = self.id
-
- for child in self.childs:
- child.update_account(template2account=template2account,
- template2type=template2type)
+ values = []
+ childs = [self]
+ while childs:
+ for child in childs:
+ if child.template:
+ vals = child.template._get_account_value(account=child)
+ current_type = child.type.id if child.type else None
+ if child.template.type:
+ template_type = template2type.get(
+ child.template.type.id)
+ else:
+ template_type = None
+ if current_type != template_type:
+ vals['type'] = template_type
+ if vals:
+ values.append([child])
+ values.append(vals)
+ template2account[child.template.id] = child.id
+ childs = sum((c.childs for c in childs), ())
+ if values:
+ self.write(*values)
def update_account_taxes(self, template2account, template2tax):
'''
@@ -883,23 +914,30 @@
if template2tax is None:
template2tax = {}
- if self.template:
- if self.template.taxes:
- tax_ids = [template2tax[x.id] for x in self.template.taxes
- if x.id in template2tax]
- old_tax_ids = [x.id for x in self.taxes]
+ values = []
+ childs = [self]
+ while childs:
+ for child in childs:
+ if not child.template:
+ continue
+ if not child.template.taxes:
+ continue
+ tax_ids = [template2tax[x.id] for x in child.template.taxes
+ if x.id in template2tax]
+ old_tax_ids = [x.id for x in child.taxes]
for tax_id in tax_ids:
if tax_id not in old_tax_ids:
- self.write([self], {
- 'taxes': [
+ values.append([child])
+ values.append({
+ 'taxes': [
('add', template2tax[x.id])
for x in self.template.taxes
if x.id in template2tax],
})
break
-
- for child in self.childs:
- child.update_account_taxes(template2account, template2tax)
+ childs = sum((c.childs for c in childs), ())
+ if values:
+ self.write(*values)
class AccountDeferral(ModelSQL, ModelView):
@@ -1685,38 +1723,34 @@
with Transaction().set_context(language=Config.get_language(),
company=self.account.company.id):
account_template = self.account.account_template
+ company = self.account.company
# Create account types
template2type = {}
- account_template.type.create_type(self.account.company.id,
+ account_template.type.create_type(
+ company.id,
template2type=template2type)
# Create accounts
template2account = {}
- account_template.create_account(self.account.company.id,
- template2account=template2account, template2type=template2type)
+ account_template.create_account(
+ company.id,
+ template2account=template2account,
+ template2type=template2type)
# Create tax codes
template2tax_code = {}
- tax_code_templates = TaxCodeTemplate.search([
- ('account', '=', account_template.id),
- ('parent', '=', None),
- ])
- for tax_code_template in tax_code_templates:
- tax_code_template.create_tax_code(self.account.company.id,
- template2tax_code=template2tax_code)
+ TaxCodeTemplate.create_tax_code(
+ account_template.id, company.id,
+ template2tax_code=template2tax_code)
# Create taxes
template2tax = {}
- tax_templates = TaxTemplate.search([
- ('account', '=', account_template.id),
- ('parent', '=', None),
- ])
- for tax_template in tax_templates:
- tax_template.create_tax(self.account.company.id,
- template2tax_code=template2tax_code,
- template2account=template2account,
- template2tax=template2tax)
+ TaxTemplate.create_tax(
+ account_template.id, company.id,
+ template2tax_code=template2tax_code,
+ template2account=template2account,
+ template2tax=template2tax)
# Update taxes on accounts
account_template.update_account_taxes(template2account,
@@ -1724,21 +1758,15 @@
# Create tax rules
template2rule = {}
- tax_rule_templates = TaxRuleTemplate.search([
- ('account', '=', account_template.id),
- ])
- for tax_rule_template in tax_rule_templates:
- tax_rule_template.create_rule(self.account.company.id,
- template2rule=template2rule)
+ TaxRuleTemplate.create_rule(
+ account_template.id, company.id,
+ template2rule=template2rule)
# Create tax rule lines
template2rule_line = {}
- tax_rule_line_templates = TaxRuleLineTemplate.search([
- ('rule.account', '=', account_template.id),
- ])
- for tax_rule_line_template in tax_rule_line_templates:
- tax_rule_line_template.create_rule_line(template2tax,
- template2rule, template2rule_line=template2rule_line)
+ TaxRuleLineTemplate.create_rule_line(
+ account_template.id, template2tax, template2rule,
+ template2rule_line=template2rule_line)
return 'properties'
def default_properties(self, fields):
@@ -1829,13 +1857,15 @@
pool.get('account.tax.rule.line.template')
account = self.start.account
+ company = account.company
# Update account types
template2type = {}
account.type.update_type(template2type=template2type)
# Create missing account types
if account.type.template:
- account.type.template.create_type(account.company.id,
+ account.type.template.create_type(
+ company.id,
template2type=template2type)
# Update accounts
@@ -1844,82 +1874,57 @@
template2type=template2type)
# Create missing accounts
if account.template:
- account.template.create_account(account.company.id,
- template2account=template2account, template2type=template2type)
+ account.template.create_account(
+ company.id,
+ template2account=template2account,
+ template2type=template2type)
# Update tax codes
template2tax_code = {}
- tax_codes = TaxCode.search([
- ('company', '=', account.company.id),
- ('parent', '=', None),
- ])
- for tax_code in tax_codes:
- tax_code.update_tax_code(template2tax_code=template2tax_code)
+ TaxCode.update_tax_code(
+ company.id,
+ template2tax_code=template2tax_code)
# Create missing tax codes
if account.template:
- tax_code_templates = TaxCodeTemplate.search([
- ('account', '=', account.template.id),
- ('parent', '=', None),
- ])
- for tax_code_template in tax_code_templates:
- tax_code_template.create_tax_code(account.company.id,
- template2tax_code=template2tax_code)
+ TaxCodeTemplate.create_tax_code(
+ account.template.id, company.id,
+ template2tax_code=template2tax_code)
# Update taxes
template2tax = {}
- taxes = Tax.search([
- ('company', '=', account.company.id),
- ('parent', '=', None),
- ])
- for tax in taxes:
- tax.update_tax(template2tax_code=template2tax_code,
- template2account=template2account,
- template2tax=template2tax)
+ Tax.update_tax(
+ company.id,
+ template2tax_code=template2tax_code,
+ template2account=template2account,
+ template2tax=template2tax)
# Create missing taxes
if account.template:
- tax_templates = TaxTemplate.search([
- ('account', '=', account.template.id),
- ('parent', '=', None),
- ])
- for tax_template in tax_templates:
- tax_template.create_tax(account.company.id,
- template2tax_code=template2tax_code,
- template2account=template2account,
- template2tax=template2tax)
+ TaxTemplate.create_tax(
+ account.template.id, account.company.id,
+ template2tax_code=template2tax_code,
+ template2account=template2account,
+ template2tax=template2tax)
# Update taxes on accounts
account.update_account_taxes(template2account, template2tax)
# Update tax rules
template2rule = {}
- tax_rules = TaxRule.search([
- ('company', '=', account.company.id),
- ])
- for tax_rule in tax_rules:
- tax_rule.update_rule(template2rule=template2rule)
+ TaxRule.update_rule(company.id, template2rule=template2rule)
# Create missing tax rules
if account.template:
- tax_rule_templates = TaxRuleTemplate.search([
- ('account', '=', account.template.id),
- ])
- for tax_rule_template in tax_rule_templates:
- tax_rule_template.create_rule(account.company.id,
- template2rule=template2rule)
+ TaxRuleTemplate.create_rule(
+ account.template.id, account.company.id,
+ template2rule=template2rule)
# Update tax rule lines
template2rule_line = {}
- tax_rule_lines = TaxRuleLine.search([
- ('rule.company', '=', account.company.id),
- ])
- for tax_rule_line in tax_rule_lines:
- tax_rule_line.update_rule_line(template2tax, template2rule,
- template2rule_line=template2rule_line)
+ TaxRuleLine.update_rule_line(
+ company.id, template2tax, template2rule,
+ template2rule_line=template2rule_line)
# Create missing tax rule lines
if account.template:
- tax_rule_line_templates = TaxRuleLineTemplate.search([
- ('rule.account', '=', account.template.id),
- ])
- for tax_rule_line_template in tax_rule_line_templates:
- tax_rule_line_template.create_rule_line(template2tax,
- template2rule, template2rule_line=template2rule_line)
+ TaxRuleLineTemplate.create_rule_line(
+ account.template.id, template2tax, template2rule,
+ template2rule_line=template2rule_line)
return 'succeed'
diff -r 6d37f343013d -r 532fd5a46527 trytond/trytond/modules/account/tax.py
--- a/trytond/trytond/modules/account/tax.py Sun Mar 20 22:58:02 2016 +0100
+++ b/trytond/trytond/modules/account/tax.py Mon Mar 21 23:44:56 2016 +0100
@@ -88,14 +88,13 @@
res['template'] = self.id
return res
- def create_tax_code(self, company_id, template2tax_code=None,
- parent_id=None):
+ @classmethod
+ def create_tax_code(cls, account_id, company_id, template2tax_code=None):
'''
Create recursively tax codes based on template.
template2tax_code is a dictionary with tax code template id as key and
tax code id as value, used to convert template id into tax code. The
dictionary is filled with new tax codes.
- Return the id of the tax code created
'''
pool = Pool()
TaxCode = pool.get('account.tax.code')
@@ -103,24 +102,31 @@
if template2tax_code is None:
template2tax_code = {}
- if self.id not in template2tax_code:
- vals = self._get_tax_code_value()
- vals['company'] = company_id
- vals['parent'] = parent_id
+ def create(templates):
+ values = []
+ created = []
+ for template in templates:
+ if template.id not in template2tax_code:
+ vals = template._get_tax_code_value()
+ vals['company'] = company_id
+ if template.parent:
+ vals['parent'] = template2tax_code[template.parent.id]
+ else:
+ vals['parent'] = None
+ values.append(vals)
+ created.append(template)
- new_tax_code, = TaxCode.create([vals])
+ tax_codes = TaxCode.create(values)
+ for template, tax_code in zip(created, tax_codes):
+ template2tax_code[template.id] = tax_code.id
- prev_data = {}
- for field_name, field in self._fields.iteritems():
- prev_data[field_name] = getattr(self, field_name)
- template2tax_code[self.id] = new_tax_code.id
- new_id = template2tax_code[self.id]
-
- new_childs = []
- for child in self.childs:
- new_childs.append(child.create_tax_code(company_id,
- template2tax_code=template2tax_code, parent_id=new_id))
- return new_id
+ childs = cls.search([
+ ('account', '=', account_id),
+ ('parent', '=', None),
+ ])
+ while childs:
+ create(childs)
+ childs = sum((c.childs for c in childs), ())
class TaxCode(ModelSQL, ModelView):
@@ -232,25 +238,33 @@
])
super(TaxCode, cls).delete(codes)
- def update_tax_code(self, template2tax_code=None):
+ @classmethod
+ def update_tax_code(cls, company_id, template2tax_code=None):
'''
Update recursively tax code based on template.
template2tax_code is a dictionary with tax code template id as key and
tax code id as value, used to convert template id into tax code. The
dictionary is filled with new tax codes
'''
-
if template2tax_code is None:
template2tax_code = {}
- if self.template:
- vals = self.template._get_tax_code_value(code=self)
- if vals:
- self.write([self], vals)
- template2tax_code[self.template.id] = self.id
-
- for child in self.childs:
- child.update_tax_code(template2tax_code=template2tax_code)
+ values = []
+ childs = cls.search([
+ ('company', '=', company_id),
+ ('parent', '=', None),
+ ])
+ while childs:
+ for child in childs:
+ if child.template:
+ vals = child.template._get_tax_code_value(code=child)
+ if vals:
+ values.append([child])
+ values.append(vals)
+ template2tax_code[child.template.id] = child.id
+ childs = sum((c.childs for c in childs), ())
+ if values:
+ cls.write(*values)
class OpenChartTaxCodeStart(ModelView):
@@ -454,8 +468,9 @@
res['template'] = self.id
return res
- def create_tax(self, company_id, template2tax_code, template2account,
- template2tax=None, parent_id=None):
+ @classmethod
+ def create_tax(cls, account_id, company_id, template2tax_code,
+ template2account, template2tax=None):
'''
Create recursively taxes based on template.
@@ -467,7 +482,6 @@
template2tax is a dictionary with tax template id as key and tax id as
value, used to convert template id into tax. The dictionary is filled
with new taxes.
- Return id of the tax created
'''
pool = Pool()
Tax = pool.get('account.tax')
@@ -475,52 +489,63 @@
if template2tax is None:
template2tax = {}
- if self.id not in template2tax:
- vals = self._get_tax_value()
- vals['company'] = company_id
- vals['parent'] = parent_id
- if self.invoice_account:
- vals['invoice_account'] = \
- template2account[self.invoice_account.id]
- else:
- vals['invoice_account'] = None
- if self.credit_note_account:
- vals['credit_note_account'] = \
- template2account[self.credit_note_account.id]
- else:
- vals['credit_note_account'] = None
- if self.invoice_base_code:
- vals['invoice_base_code'] = \
- template2tax_code[self.invoice_base_code.id]
- else:
- vals['invoice_base_code'] = None
- if self.invoice_tax_code:
- vals['invoice_tax_code'] = \
- template2tax_code[self.invoice_tax_code.id]
- else:
- vals['invoice_tax_code'] = None
- if self.credit_note_base_code:
- vals['credit_note_base_code'] = \
- template2tax_code[self.credit_note_base_code.id]
- else:
- vals['credit_note_base_code'] = None
- if self.credit_note_tax_code:
- vals['credit_note_tax_code'] = \
- template2tax_code[self.credit_note_tax_code.id]
- else:
- vals['credit_note_tax_code'] = None
+ def create(templates):
+ values = []
+ created = []
+ for template in templates:
+ if template.id not in template2tax:
+ vals = template._get_tax_value()
+ vals['company'] = company_id
+ if template.parent:
+ vals['parent'] = template2tax[template.parent.id]
+ else:
+ vals['parent'] = None
+ if template.invoice_account:
+ vals['invoice_account'] = \
+ template2account[template.invoice_account.id]
+ else:
+ vals['invoice_account'] = None
+ if template.credit_note_account:
+ vals['credit_note_account'] = \
+ template2account[template.credit_note_account.id]
+ else:
+ vals['credit_note_account'] = None
+ if template.invoice_base_code:
+ vals['invoice_base_code'] = \
+ template2tax_code[template.invoice_base_code.id]
+ else:
+ vals['invoice_base_code'] = None
+ if template.invoice_tax_code:
+ vals['invoice_tax_code'] = \
+ template2tax_code[template.invoice_tax_code.id]
+ else:
+ vals['invoice_tax_code'] = None
+ if template.credit_note_base_code:
+ vals['credit_note_base_code'] = \
+ template2tax_code[
+ template.credit_note_base_code.id]
+ else:
+ vals['credit_note_base_code'] = None
+ if template.credit_note_tax_code:
+ vals['credit_note_tax_code'] = \
+ template2tax_code[template.credit_note_tax_code.id]
+ else:
+ vals['credit_note_tax_code'] = None
- new_tax, = Tax.create([vals])
+ values.append(vals)
+ created.append(template)
- template2tax[self.id] = new_tax.id
- new_id = template2tax[self.id]
+ taxes = Tax.create(values)
+ for template, tax in zip(created, taxes):
+ template2tax[template.id] = tax.id
- new_childs = []
- for child in self.childs:
- new_childs.append(child.create_tax(company_id, template2tax_code,
- template2account, template2tax=template2tax,
- parent_id=new_id))
- return new_id
+ childs = cls.search([
+ ('account', '=', account_id),
+ ('parent', '=', None),
+ ])
+ while childs:
+ create(childs)
+ childs = sum((c.childs for c in childs), ())
class Tax(ModelSQL, ModelView):
@@ -869,7 +894,8 @@
taxes = cls.sort_taxes(taxes)
return cls._reverse_unit_compute(price_unit, taxes, date)
- def update_tax(self, template2tax_code, template2account,
+ @classmethod
+ def update_tax(cls, company_id, template2tax_code, template2account,
template2tax=None):
'''
Update recursively taxes based on template.
@@ -882,81 +908,88 @@
value, used to convert template id into tax. The dictionary is filled
with new taxes.
'''
-
if template2tax is None:
template2tax = {}
- if self.template:
- vals = self.template._get_tax_value(tax=self)
- invoice_account_id = (self.invoice_account.id
- if self.invoice_account else None)
- if (self.template.invoice_account and
- invoice_account_id != template2account.get(
- self.template.invoice_account.id)):
- vals['invoice_account'] = template2account.get(
- self.template.invoice_account.id)
- elif (not self.template.invoice_account
- and self.invoice_account):
- vals['invoice_account'] = None
- credit_note_account_id = (self.credit_note_account.id
- if self.credit_note_account else None)
- if (self.template.credit_note_account and
- credit_note_account_id != template2account.get(
- self.template.credit_note_account.id)):
- vals['credit_note_account'] = template2account.get(
- self.template.credit_note_account.id)
- elif (not self.template.credit_note_account
- and self.credit_note_account):
- vals['credit_note_account'] = None
- invoice_base_code_id = (self.invoice_base_code.id
- if self.invoice_base_code else None)
- if (self.template.invoice_base_code and
- invoice_base_code_id != template2tax_code.get(
- self.template.invoice_base_code.id)):
- vals['invoice_base_code'] = template2tax_code.get(
- self.template.invoice_base_code.id)
- elif (not self.template.invoice_base_code
- and self.invoice_base_code):
- vals['invoice_base_code'] = None
- invoice_tax_code_id = (self.invoice_tax_code.id
- if self.invoice_tax_code else None)
- if (self.template.invoice_tax_code
- and invoice_tax_code_id != template2tax_code.get(
- self.template.invoice_tax_code.id)):
- vals['invoice_tax_code'] = template2tax_code.get(
- self.template.invoice_tax_code.id)
- elif (not self.template.invoice_tax_code
- and self.invoice_tax_code):
- vals['invoice_tax_code'] = None
- credit_note_base_code_id = (self.credit_note_base_code.id
- if self.credit_note_base_code else None)
- if (self.template.credit_note_base_code
- and credit_note_base_code_id != template2tax_code.get(
- self.template.credit_note_base_code.id)):
- vals['credit_note_base_code'] = template2tax_code.get(
- self.template.credit_note_base_code.id)
- elif (not self.template.credit_note_base_code
- and self.credit_note_base_code):
- vals['credit_note_base_code'] = None
- credit_note_tax_code_id = (self.credit_note_tax_code.id
- if self.credit_note_tax_code else None)
- if (self.template.credit_note_tax_code
- and credit_note_tax_code_id != template2tax_code.get(
- self.template.credit_note_tax_code.id)):
- vals['credit_note_tax_code'] = template2tax_code.get(
- self.template.credit_note_tax_code.id)
- elif (not self.template.credit_note_tax_code
- and self.credit_note_tax_code):
- vals['credit_note_tax_code'] = None
+ values = []
+ childs = cls.search([
+ ('company', '=', company_id),
+ ('parent', '=', None),
+ ])
+ while childs:
+ for child in childs:
+ if child.template:
+ vals = child.template._get_tax_value(tax=child)
+ invoice_account_id = (child.invoice_account.id
+ if child.invoice_account else None)
+ if (child.template.invoice_account and
+ invoice_account_id != template2account.get(
+ child.template.invoice_account.id)):
+ vals['invoice_account'] = template2account.get(
+ child.template.invoice_account.id)
+ elif (not child.template.invoice_account
+ and child.invoice_account):
+ vals['invoice_account'] = None
+ credit_note_account_id = (child.credit_note_account.id
+ if child.credit_note_account else None)
+ if (child.template.credit_note_account and
+ credit_note_account_id != template2account.get(
+ child.template.credit_note_account.id)):
+ vals['credit_note_account'] = template2account.get(
+ child.template.credit_note_account.id)
+ elif (not child.template.credit_note_account
+ and child.credit_note_account):
+ vals['credit_note_account'] = None
+ invoice_base_code_id = (child.invoice_base_code.id
+ if child.invoice_base_code else None)
+ if (child.template.invoice_base_code and
+ invoice_base_code_id != template2tax_code.get(
+ child.template.invoice_base_code.id)):
+ vals['invoice_base_code'] = template2tax_code.get(
+ child.template.invoice_base_code.id)
+ elif (not child.template.invoice_base_code
+ and child.invoice_base_code):
+ vals['invoice_base_code'] = None
+ invoice_tax_code_id = (child.invoice_tax_code.id
+ if child.invoice_tax_code else None)
+ if (child.template.invoice_tax_code
+ and invoice_tax_code_id != template2tax_code.get(
+ child.template.invoice_tax_code.id)):
+ vals['invoice_tax_code'] = template2tax_code.get(
+ child.template.invoice_tax_code.id)
+ elif (not child.template.invoice_tax_code
+ and child.invoice_tax_code):
+ vals['invoice_tax_code'] = None
+ credit_note_base_code_id = (child.credit_note_base_code.id
+ if child.credit_note_base_code else None)
+ if (child.template.credit_note_base_code
+ and (credit_note_base_code_id
+ != template2tax_code.get(
+ child.template.credit_note_base_code.id))):
+ vals['credit_note_base_code'] = template2tax_code.get(
+ child.template.credit_note_base_code.id)
+ elif (not child.template.credit_note_base_code
+ and child.credit_note_base_code):
+ vals['credit_note_base_code'] = None
+ credit_note_tax_code_id = (child.credit_note_tax_code.id
+ if child.credit_note_tax_code else None)
+ if (child.template.credit_note_tax_code
+ and (credit_note_tax_code_id
+ != template2tax_code.get(
+ child.template.credit_note_tax_code.id))):
+ vals['credit_note_tax_code'] = template2tax_code.get(
+ child.template.credit_note_tax_code.id)
+ elif (not child.template.credit_note_tax_code
+ and child.credit_note_tax_code):
+ vals['credit_note_tax_code'] = None
- if vals:
- self.write([self], vals)
-
- template2tax[self.template.id] = self.id
-
- for child in self.childs:
- child.update_tax(template2tax_code, template2account,
- template2tax=template2tax)
+ if vals:
+ values.append([child])
+ values.append(vals)
+ template2tax[child.template.id] = child.id
+ childs = sum((c.childs for c in childs), ())
+ if values:
+ cls.write(*values)
class _TaxKey(dict):
@@ -1132,13 +1165,13 @@
res['template'] = self.id
return res
- def create_rule(self, company_id, template2rule=None):
+ @classmethod
+ def create_rule(cls, account_id, company_id, template2rule=None):
'''
Create tax rule based on template.
template2rule is a dictionary with tax rule template id as key and tax
rule id as value, used to convert template id into tax rule. The
dictionary is filled with new tax rules.
- Return id of the tax rule created
'''
pool = Pool()
Rule = pool.get('account.tax.rule')
@@ -1146,13 +1179,22 @@
if template2rule is None:
template2rule = {}
- if self.id not in template2rule:
- vals = self._get_tax_rule_value()
- vals['company'] = company_id
- new_rule, = Rule.create([vals])
+ templates = cls.search([
+ ('account', '=', account_id),
+ ])
- template2rule[self.id] = new_rule.id
- return template2rule[self.id]
+ values = []
+ created = []
+ for template in templates:
+ if template.id not in template2rule:
+ vals = template._get_tax_rule_value()
+ vals['company'] = company_id
+ values.append(vals)
+ created.append(template)
+
+ rules = Rule.create(values)
+ for template, rule in zip(created, rules):
+ template2rule[template.id] = rule.id
class TaxRule(ModelSQL, ModelView):
@@ -1192,23 +1234,30 @@
return line.get_taxes()
return tax and [tax.id] or None
- def update_rule(self, template2rule=None):
+ @classmethod
+ def update_rule(cls, company_id, template2rule=None):
'''
Update tax rule based on template.
template2rule is a dictionary with tax rule template id as key and tax
rule id as value, used to convert template id into tax rule. The
dictionary is filled with new tax rules.
'''
-
if template2rule is None:
template2rule = {}
- if self.template:
- vals = self.template._get_tax_rule_value(rule=self)
- if vals:
- self.write([self], vals)
-
- template2rule[self.template.id] = self.id
+ values = []
+ rules = cls.search([
+ ('company', '=', company_id),
+ ])
+ for rule in rules:
+ if rule.template:
+ vals = rule.template._get_tax_rule_value(rule=rule)
+ if vals:
+ values.append([rule])
+ values.append(vals)
+ template2rule[rule.template.id] = rule.id
+ if values:
+ cls.write(*values)
class TaxRuleLineTemplate(ModelSQL, ModelView):
@@ -1288,7 +1337,8 @@
res['template'] = self.id
return res
- def create_rule_line(self, template2tax, template2rule,
+ @classmethod
+ def create_rule_line(cls, account_id, template2tax, template2rule,
template2rule_line=None):
'''
Create tax rule line based on template.
@@ -1299,27 +1349,36 @@
template2rule_line is a dictionary with tax rule line template id as
key and tax rule line id as value, used to convert template id into tax
rule line. The dictionary is filled with new tax rule lines.
- Return id of the tax rule line created
'''
RuleLine = Pool().get('account.tax.rule.line')
if template2rule_line is None:
template2rule_line = {}
- if self.id not in template2rule_line:
- vals = self._get_tax_rule_line_value()
- vals['rule'] = template2rule[self.rule.id]
- if self.origin_tax:
- vals['origin_tax'] = template2tax[self.origin_tax.id]
- else:
- vals['origin_tax'] = None
- if self.tax:
- vals['tax'] = template2tax[self.tax.id]
- else:
- vals['tax'] = None
- new_rule_line, = RuleLine.create([vals])
- template2rule_line[self.id] = new_rule_line.id
- return template2rule_line[self.id]
+ templates = cls.search([
+ ('rule.account', '=', account_id),
+ ])
+
+ values = []
+ created = []
+ for template in templates:
+ if template.id not in template2rule_line:
+ vals = template._get_tax_rule_line_value()
+ vals['rule'] = template2rule[template.rule.id]
+ if template.origin_tax:
+ vals['origin_tax'] = template2tax[template.origin_tax.id]
+ else:
+ vals['origin_tax'] = None
+ if template.tax:
+ vals['tax'] = template2tax[template.tax.id]
+ else:
+ vals['tax'] = None
+ values.append(vals)
+ created.append(template)
+
+ rule_lines = RuleLine.create(values)
+ for template, rule_line in zip(created, rule_lines):
+ template2rule_line[template.id] = rule_line.id
class TaxRuleLine(ModelSQL, ModelView, MatchMixin):
@@ -1402,7 +1461,8 @@
return [self.tax.id]
return None
- def update_rule_line(self, template2tax, template2rule,
+ @classmethod
+ def update_rule_line(cls, company_id, template2tax, template2rule,
template2rule_line=None):
'''
Update tax rule line based on template.
@@ -1417,31 +1477,40 @@
if template2rule_line is None:
template2rule_line = {}
- if self.template:
- vals = self.template._get_tax_rule_line_value(rule_line=self)
- if self.rule.id != template2rule[self.template.rule.id]:
- vals['rule'] = template2rule[self.template.rule.id]
- if self.origin_tax:
- if self.template.origin_tax:
- if (self.origin_tax.id !=
- template2tax[self.template.origin_tax.id]):
- vals['origin_tax'] = template2tax[
- self.template.origin_tax.id]
- else:
- vals['origin_tax'] = None
- elif self.template.origin_tax:
- vals['origin_tax'] = template2tax[self.template.origin_tax.id]
- if self.tax:
- if self.template.tax:
- if self.tax.id != template2tax[self.template.tax.id]:
- vals['tax'] = template2tax[self.template.tax.id]
- else:
- vals['tax'] = None
- elif self.template.tax:
- vals['tax'] = template2tax[self.template.tax.id]
- if vals:
- self.write([self], vals)
- template2rule_line[self.template.id] = self.id
+ values = []
+ lines = cls.search([
+ ('rule.company', '=', company_id),
+ ])
+ for line in lines:
+ if line.template:
+ vals = line.template._get_tax_rule_line_value(rule_line=line)
+ if line.rule.id != template2rule[line.template.rule.id]:
+ vals['rule'] = template2rule[line.template.rule.id]
+ if line.origin_tax:
+ if line.template.origin_tax:
+ if (line.origin_tax.id !=
+ template2tax[line.template.origin_tax.id]):
+ vals['origin_tax'] = template2tax[
+ line.template.origin_tax.id]
+ else:
+ vals['origin_tax'] = None
+ elif line.template.origin_tax:
+ vals['origin_tax'] = template2tax[
+ line.template.origin_tax.id]
+ if line.tax:
+ if line.template.tax:
+ if line.tax.id != template2tax[line.template.tax.id]:
+ vals['tax'] = template2tax[line.template.tax.id]
+ else:
+ vals['tax'] = None
+ elif line.template.tax:
+ vals['tax'] = template2tax[line.template.tax.id]
+ if vals:
+ values.append([line])
+ values.append(vals)
+ template2rule_line[line.template.id] = line.id
+ if values:
+ cls.write(*values)
class OpenTaxCode(Wizard):