diff --git a/series b/series index c72155f..e780e0c 100644 --- a/series +++ b/series @@ -57,3 +57,5 @@ issue7672.diff # [stock] Always fill product and template of cost price revision issue12678.diff # [account_statement] Not delete statement lines when statament is not draft state account_statement_second_currency.diff # [account_statement] Support second currency on statement line + +update_trees_chart_accounts.diff # [account_account] Update trees of chart of accounts with 2 passes diff --git a/update_trees_chart_accounts.diff b/update_trees_chart_accounts.diff new file mode 100644 index 0000000..2804523 --- /dev/null +++ b/update_trees_chart_accounts.diff @@ -0,0 +1,151 @@ +diff --git a/tryton/modules/account/account.py b/tryton/modules/account/account.py +index 05730d5b6e..c418aa0227 100644 +--- a/tryton/modules/account/account.py ++++ b/tryton/modules/account/account.py +@@ -434,8 +434,11 @@ class Type( + if child.template: + if not child.template_override: + if child.template.parent: ++ # Fallback to current parent ++ # to keep under the same root + parent = template2type.get( +- child.template.parent.id) ++ child.template.parent.id, ++ child.parent) + else: + parent = None + old_parent = ( +@@ -3309,6 +3312,8 @@ class UpdateChart(Wizard): + account.type.template.create_type( + company.id, + template2type=template2type) ++ # Update again to set new parent ++ account.type.update_type(template2type=template2type) + + # Update accounts + template2account = {} +@@ -3333,6 +3338,11 @@ class UpdateChart(Wizard): + account.template.id, account.company.id, + template2account=template2account, + template2tax=template2tax) ++ # Update again to set new parent ++ Tax.update_tax( ++ company.id, ++ template2account=template2account, ++ template2tax=template2tax) + + # Update tax codes + template2tax_code = {} +@@ -3344,6 +3354,10 @@ class UpdateChart(Wizard): + TaxCodeTemplate.create_tax_code( + account.template.id, company.id, + template2tax_code=template2tax_code) ++ # Update again to set new parent ++ TaxCode.update_tax_code( ++ company.id, ++ template2tax_code=template2tax_code) + + # Update tax code lines + template2tax_code_line = {} +@@ -3360,7 +3374,7 @@ class UpdateChart(Wizard): + template2tax_code=template2tax_code, + template2tax_code_line=template2tax_code_line) + +- # Update taxes and replaced_by on accounts ++ # Update parent, taxes and replaced_by on accounts + account.update_account2(template2account, template2tax) + + # Update tax rules +diff --git a/tryton/modules/account/tax.py b/tryton/modules/account/tax.py +index 5c13e8e53e..4528d58aa0 100644 +--- a/tryton/modules/account/tax.py ++++ b/tryton/modules/account/tax.py +@@ -292,8 +292,8 @@ class TaxCode( + if child.template: + if not child.template_override: + if child.template.parent: +- parent = template2tax_code[ +- child.template.parent.id] ++ parent = template2tax_code.get( ++ child.template.parent.id) + else: + parent = None + old_parent = ( +@@ -1172,7 +1172,7 @@ class Tax(sequence_ordered(), ModelSQL, ModelView, DeactivableMixin): + if child.template: + if not child.template_override: + if child.template.parent: +- parent = template2tax[child.template.parent.id] ++ parent = template2tax.get(child.template.parent.id) + else: + parent = None + old_parent = ( +diff --git a/tryton/modules/account/tests/test_module.py b/tryton/modules/account/tests/test_module.py +index 5ce6b9da79..56cd49fb5b 100644 +--- a/tryton/modules/account/tests/test_module.py ++++ b/tryton/modules/account/tests/test_module.py +@@ -1861,5 +1861,64 @@ class AccountTestCase( + Account.search([('name', '=', 'Main Cash')], count=True), + 1) + ++ @with_transaction() ++ def test_update_chart_new_parent(self): ++ "Test update chart of accounts with new parent" ++ pool = Pool() ++ ModelData = pool.get('ir.model.data') ++ TypeTemplate = pool.get('account.account.type.template') ++ Type = pool.get('account.account.type') ++ AccountTemplate = pool.get('account.account.template') ++ Account = pool.get('account.account') ++ UpdateChart = pool.get('account.update_chart', type='wizard') ++ ++ company = create_company() ++ with set_company(company): ++ create_chart(company, True) ++ ++ with Transaction().set_user(0): ++ root_type_template = TypeTemplate(ModelData.get_id( ++ 'account', 'account_type_template_minimal_en')) ++ ++ type_template, = TypeTemplate.search([ ++ ('parent', '!=', None), ++ ('parent', 'child_of', [root_type_template.id]), ++ ], limit=1) ++ new_type_template, = TypeTemplate.copy([type_template]) ++ type_template.parent = new_type_template ++ type_template.save() ++ ++ root_template = AccountTemplate(ModelData.get_id( ++ 'account', 'account_template_root_en')) ++ ++ account_template, = AccountTemplate.search([ ++ ('parent', '!=', None), ++ ('parent', 'child_of', [root_template.id]), ++ ], limit=1) ++ new_account_template, = AccountTemplate.copy([account_template]) ++ account_template.parent = new_account_template ++ account_template.save() ++ ++ with set_company(company): ++ account, = Account.search([('parent', '=', None)]) ++ session_id, _, _ = UpdateChart.create() ++ update_chart = UpdateChart(session_id) ++ update_chart.start.account = account ++ update_chart.transition_update() ++ ++ new_type, = Type.search( ++ [('template', '=', new_type_template.id)]) ++ type, = Type.search( ++ [('template', '=', type_template.id)]) ++ ++ self.assertEqual(type.parent, new_type) ++ ++ new_account, = Account.search( ++ [('template', '=', new_account_template.id)]) ++ account, = Account.search( ++ [('template', '=', account_template.id)]) ++ ++ self.assertEqual(account.parent, new_account) ++ + + del ModuleTestCase