9e63f90527
With this option, you can select which fields do you want to compare for updating. Use case: you have specific accounts in taxes, and you don't want to lose them, but you want to update their groups through the wizard. Before this, the update was all or nothing. Now, you have total control!
358 lines
15 KiB
Python
358 lines
15 KiB
Python
# -*- coding: utf-8 -*-
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
|
|
from odoo import fields
|
|
from odoo.tests import common
|
|
from odoo.tools import mute_logger
|
|
|
|
|
|
class TestAccountChartUpdate(common.HttpCase):
|
|
at_install = False
|
|
post_install = True
|
|
|
|
def _create_xml_id(self, record):
|
|
return self.env['ir.model.data'].create({
|
|
'module': 'account_chart_update',
|
|
'name': "%s-%s" % (record._table, record.id),
|
|
'model': record._name,
|
|
'res_id': record.id,
|
|
})
|
|
|
|
def _create_account_tmpl(self, name, code, user_type, chart_template):
|
|
record = self.env['account.account.template'].create({
|
|
'name': name,
|
|
'code': code,
|
|
'user_type_id': user_type.id,
|
|
'chart_template_id': chart_template and chart_template.id,
|
|
})
|
|
self._create_xml_id(record)
|
|
return record
|
|
|
|
def _create_tax_tmpl(self, name, chart_template):
|
|
record = self.env['account.tax.template'].create({
|
|
'name': name,
|
|
'amount': 0,
|
|
'chart_template_id': chart_template.id,
|
|
'tax_group_id': self.env.ref('account.tax_group_taxes').id,
|
|
})
|
|
self._create_xml_id(record)
|
|
return record
|
|
|
|
def _create_fp_tmpl(self, name, chart_template):
|
|
record = self.env['account.fiscal.position.template'].create({
|
|
'name': name,
|
|
'chart_template_id': chart_template.id,
|
|
})
|
|
self._create_xml_id(record)
|
|
return record
|
|
|
|
def setUp(self):
|
|
super(TestAccountChartUpdate, self).setUp()
|
|
# Make sure user is in English
|
|
self.env.user.lang = 'en_US'
|
|
self.account_type = self.env['account.account.type'].create({
|
|
'name': 'Test account_chart_update account type',
|
|
})
|
|
self.account_template = self._create_account_tmpl(
|
|
'Test', '100000', self.account_type, False,
|
|
)
|
|
self.chart_template = self.env['account.chart.template'].create({
|
|
'name': 'Test account_chart_update chart',
|
|
'currency_id': self.env.ref('base.EUR').id,
|
|
'code_digits': 6,
|
|
'transfer_account_id': self.account_template.id,
|
|
})
|
|
self.account_template.chart_template_id = self.chart_template.id
|
|
self.account_template_pl = self._create_account_tmpl(
|
|
'Undistributed Profits/Losses', '999999',
|
|
self.env.ref("account.data_unaffected_earnings"),
|
|
self.chart_template,
|
|
)
|
|
self.tax_template = self._create_tax_tmpl(
|
|
'Test tax', self.chart_template,
|
|
)
|
|
self.fp_template = self._create_fp_tmpl('Test fp', self.chart_template)
|
|
self.fp_template_tax = self.env[
|
|
'account.fiscal.position.tax.template'
|
|
].create({
|
|
'tax_src_id': self.tax_template.id,
|
|
'position_id': self.fp_template.id,
|
|
})
|
|
self._create_xml_id(self.fp_template_tax)
|
|
self.fp_template_account = self.env[
|
|
'account.fiscal.position.account.template'
|
|
].create({
|
|
'account_src_id': self.account_template.id,
|
|
'account_dest_id': self.account_template.id,
|
|
'position_id': self.fp_template.id,
|
|
})
|
|
self._create_xml_id(self.fp_template_account)
|
|
self.tax_group = self.env['account.tax.group'].create({
|
|
'name': 'Test tax group',
|
|
})
|
|
self.account_tag_1 = self.env['account.account.tag'].create({
|
|
'name': 'Test account tag 1',
|
|
})
|
|
self.account_tag_2 = self.env['account.account.tag'].create({
|
|
'name': 'Test account tag 2',
|
|
})
|
|
self.company = self.env['res.company'].create({
|
|
'name': 'Test account_chart_update company',
|
|
'currency_id': self.chart_template.currency_id.id,
|
|
})
|
|
# Load chart of template into company
|
|
wizard = self.env['wizard.multi.charts.accounts'].create({
|
|
'company_id': self.company.id,
|
|
'chart_template_id': self.chart_template.id,
|
|
'code_digits': self.chart_template.code_digits,
|
|
'transfer_account_id': self.account_template.id,
|
|
'currency_id': self.chart_template.currency_id.id,
|
|
'bank_account_code_prefix': '572',
|
|
'cash_account_code_prefix': '570',
|
|
})
|
|
wizard.onchange_chart_template_id()
|
|
wizard.execute()
|
|
self.tax = self.env['account.tax'].search([
|
|
('name', '=', self.tax_template.name),
|
|
('company_id', '=', self.company.id),
|
|
])
|
|
self.account = self.env['account.account'].search([
|
|
('code', '=', self.account_template.code),
|
|
('company_id', '=', self.company.id),
|
|
])
|
|
self.fp = self.env['account.fiscal.position'].search([
|
|
('name', '=', self.fp_template.name),
|
|
('company_id', '=', self.company.id),
|
|
])
|
|
# Prepare wizard values
|
|
self.wizard_obj = self.env['wizard.update.charts.accounts']
|
|
self.wizard_vals = {
|
|
'company_id': self.company.id,
|
|
'chart_template_id': self.chart_template.id,
|
|
'code_digits': 6,
|
|
'lang': 'en_US'
|
|
}
|
|
|
|
@mute_logger('odoo.sql_db')
|
|
def test_chart_update(self):
|
|
wizard = self.wizard_obj.create(self.wizard_vals)
|
|
wizard.action_find_records()
|
|
# Test ir.model.fields name_get
|
|
field = wizard.fp_field_ids[:1]
|
|
name = field.with_context(account_chart_update=True).name_get()[0]
|
|
self.assertEqual(name[0], field.id)
|
|
self.assertEqual(
|
|
name[1], "%s (%s)" % (field.field_description, field.name),
|
|
)
|
|
name = field.name_get()[0]
|
|
self.assertEqual(name[0], field.id)
|
|
self.assertEqual(
|
|
name[1], "%s (%s)" % (field.field_description, field.model),
|
|
)
|
|
# Test no changes
|
|
self.assertEqual(wizard.state, 'ready')
|
|
self.assertFalse(wizard.tax_ids)
|
|
self.assertFalse(wizard.account_ids)
|
|
self.assertFalse(wizard.fiscal_position_ids)
|
|
wizard.unlink()
|
|
# Add templates
|
|
new_tax_tmpl = self._create_tax_tmpl(
|
|
'Test tax 2', self.chart_template,
|
|
)
|
|
new_account_tmpl = self._create_account_tmpl(
|
|
'Test account 2', '333333', self.account_type, self.chart_template,
|
|
)
|
|
new_fp = self._create_fp_tmpl('Test fp 2', self.chart_template)
|
|
fp_template_tax = self.env[
|
|
'account.fiscal.position.tax.template'
|
|
].create({
|
|
'tax_src_id': self.tax_template.id,
|
|
'position_id': new_fp.id,
|
|
})
|
|
self._create_xml_id(fp_template_tax)
|
|
fp_template_account = self.env[
|
|
'account.fiscal.position.account.template'
|
|
].create({
|
|
'account_src_id': self.account_template.id,
|
|
'account_dest_id': self.account_template.id,
|
|
'position_id': new_fp.id,
|
|
})
|
|
self._create_xml_id(fp_template_account)
|
|
# Check that no action is performed if the option is not selected
|
|
wizard_vals = self.wizard_vals.copy()
|
|
wizard_vals.update({
|
|
'update_tax': False,
|
|
'update_account': False,
|
|
'update_fiscal_position': False,
|
|
})
|
|
wizard = self.wizard_obj.create(wizard_vals)
|
|
wizard.action_find_records()
|
|
self.assertFalse(wizard.tax_ids)
|
|
self.assertFalse(wizard.account_ids)
|
|
self.assertFalse(wizard.fiscal_position_ids)
|
|
wizard.unlink()
|
|
# Now do the real one for detecting additions
|
|
wizard = self.wizard_obj.create(self.wizard_vals)
|
|
wizard.action_find_records()
|
|
self.assertTrue(wizard.tax_ids)
|
|
self.assertEqual(wizard.tax_ids.tax_id, new_tax_tmpl)
|
|
self.assertEqual(wizard.tax_ids.type, 'new')
|
|
self.assertTrue(wizard.account_ids)
|
|
self.assertEqual(wizard.account_ids.account_id, new_account_tmpl)
|
|
self.assertEqual(wizard.tax_ids.type, 'new')
|
|
self.assertTrue(wizard.fiscal_position_ids)
|
|
self.assertEqual(wizard.fiscal_position_ids.fiscal_position_id, new_fp)
|
|
self.assertEqual(wizard.fiscal_position_ids.type, 'new')
|
|
wizard.action_update_records()
|
|
self.assertEqual(wizard.state, 'done')
|
|
self.assertEqual(wizard.new_taxes, 1)
|
|
self.assertEqual(wizard.new_accounts, 1)
|
|
self.assertEqual(wizard.new_fps, 1)
|
|
self.assertTrue(wizard.log)
|
|
new_tax = self.env['account.tax'].search([
|
|
('name', '=', new_tax_tmpl.name),
|
|
('company_id', '=', self.company.id),
|
|
])
|
|
self.assertTrue(new_tax)
|
|
new_account = self.env['account.account'].search([
|
|
('code', '=', new_account_tmpl.code),
|
|
('company_id', '=', self.company.id),
|
|
])
|
|
self.assertTrue(new_account)
|
|
fp = self.env['account.fiscal.position'].search([
|
|
('name', '=', new_fp.name),
|
|
('company_id', '=', self.company.id),
|
|
])
|
|
self.assertTrue(fp)
|
|
self.assertTrue(fp.tax_ids)
|
|
self.assertTrue(fp.account_ids)
|
|
wizard.unlink()
|
|
# Update objects
|
|
self.tax_template.description = "Test description"
|
|
self.tax_template.tax_group_id = self.tax_group.id
|
|
self.tax_template.refund_account_id = new_account_tmpl.id
|
|
self.account_template.name = "Other name"
|
|
self.account_template.tag_ids = [
|
|
(6, 0, [self.account_tag_1.id, self.account_tag_2.id]),
|
|
]
|
|
self.fp_template.note = "Test note"
|
|
self.fp_template.account_ids.account_dest_id = new_account_tmpl.id
|
|
self.fp_template.tax_ids.tax_dest_id = self.tax_template.id
|
|
wizard = self.wizard_obj.create(self.wizard_vals)
|
|
wizard.action_find_records()
|
|
self.assertTrue(wizard.tax_ids)
|
|
self.assertEqual(wizard.tax_ids.tax_id, self.tax_template)
|
|
self.assertEqual(wizard.tax_ids.type, 'updated')
|
|
self.assertTrue(wizard.account_ids)
|
|
self.assertEqual(wizard.account_ids.account_id, self.account_template)
|
|
self.assertEqual(wizard.account_ids.type, 'updated')
|
|
self.assertTrue(wizard.fiscal_position_ids)
|
|
self.assertTrue(wizard.fiscal_position_ids.type, 'updated')
|
|
self.assertEqual(
|
|
wizard.fiscal_position_ids.fiscal_position_id, self.fp_template,
|
|
)
|
|
self.assertEqual(wizard.fiscal_position_ids.type, 'updated')
|
|
wizard.action_update_records()
|
|
self.assertEqual(wizard.updated_taxes, 1)
|
|
self.assertEqual(wizard.updated_accounts, 1)
|
|
self.assertEqual(wizard.updated_fps, 1)
|
|
self.assertEqual(self.tax.description, self.tax_template.description)
|
|
self.assertEqual(self.tax.tax_group_id, self.tax_group)
|
|
self.assertEqual(self.tax.refund_account_id, new_account)
|
|
self.assertEqual(self.account.name, self.account_template.name)
|
|
self.assertIn(self.account_tag_1, self.account.tag_ids)
|
|
self.assertIn(self.account_tag_2, self.account.tag_ids)
|
|
self.assertEqual(self.fp.note, self.fp_template.note)
|
|
self.assertEqual(self.fp.account_ids.account_dest_id, new_account)
|
|
self.assertEqual(self.fp.tax_ids.tax_dest_id, self.tax)
|
|
wizard.unlink()
|
|
# Exclude fields from check
|
|
self.tax_template.description = "Test description 2"
|
|
self.account_template.name = "Other name 2"
|
|
self.fp_template.note = "Test note 2"
|
|
wizard = self.wizard_obj.create(self.wizard_vals)
|
|
wizard.action_find_records()
|
|
wizard.tax_field_ids -= self.env['ir.model.fields'].search([
|
|
('model', '=', 'account.tax.template'),
|
|
('name', '=', 'description'),
|
|
])
|
|
wizard.account_field_ids -= self.env['ir.model.fields'].search([
|
|
('model', '=', 'account.account.template'),
|
|
('name', '=', 'name'),
|
|
])
|
|
wizard.fp_field_ids -= self.env['ir.model.fields'].search([
|
|
('model', '=', 'account.fiscal.position.template'),
|
|
('name', '=', 'note'),
|
|
])
|
|
wizard.action_find_records()
|
|
self.assertFalse(wizard.tax_ids)
|
|
self.assertFalse(wizard.account_ids)
|
|
self.assertFalse(wizard.fiscal_position_ids)
|
|
self.tax_template.description = "Test description"
|
|
self.account_template.name = "Other name"
|
|
self.fp_template.note = "Test note"
|
|
wizard.unlink()
|
|
# Remove objects
|
|
new_tax_tmpl.unlink()
|
|
wizard = self.wizard_obj.create(self.wizard_vals)
|
|
wizard.action_find_records()
|
|
self.assertTrue(wizard.tax_ids)
|
|
self.assertEqual(wizard.tax_ids.update_tax_id, new_tax)
|
|
self.assertEqual(wizard.tax_ids.type, 'deleted')
|
|
wizard.action_update_records()
|
|
self.assertEqual(wizard.deleted_taxes, 1)
|
|
self.assertFalse(new_tax.active)
|
|
wizard.unlink()
|
|
# Errors on account update
|
|
self.account_template.reconcile = True
|
|
self.env['account.move'].create({
|
|
'name': 'Test move',
|
|
'journal_id': self.env['account.journal'].search([
|
|
('company_id', '=', self.company.id),
|
|
], limit=1).id,
|
|
'date': fields.Date.today(),
|
|
'line_ids': [
|
|
(0, 0, {
|
|
'account_id': self.account.id,
|
|
'name': 'Test move line',
|
|
'debit': 10,
|
|
'credit': 0,
|
|
}),
|
|
(0, 0, {
|
|
'account_id': self.account.id,
|
|
'name': 'Test move line2',
|
|
'debit': 0,
|
|
'credit': 10,
|
|
}),
|
|
]
|
|
})
|
|
self.tax_template.description = "Other description"
|
|
wizard = self.wizard_obj.create(self.wizard_vals)
|
|
wizard.action_find_records()
|
|
with self.assertRaises(Exception):
|
|
wizard.action_update_records()
|
|
# Errors on account update - continuing after that
|
|
wizard.continue_on_errors = True
|
|
wizard.action_update_records()
|
|
self.assertFalse(self.account.reconcile)
|
|
self.assertEqual(self.tax.description, self.tax_template.description)
|
|
self.assertEqual(wizard.rejected_updated_account_number, 1)
|
|
self.assertEqual(wizard.updated_accounts, 0)
|
|
wizard.unlink()
|
|
# Errors on account_creation
|
|
self.account_template.reconcile = False
|
|
new_account_tmpl_2 = self._create_account_tmpl(
|
|
'Test account 3', '444444', self.account_type, self.chart_template,
|
|
)
|
|
wizard = self.wizard_obj.create(self.wizard_vals)
|
|
wizard.action_find_records()
|
|
self.assertEqual(wizard.account_ids.type, 'new')
|
|
new_account_tmpl_2.code = '333333' # Trick the code for forcing error
|
|
with self.assertRaises(Exception):
|
|
wizard.action_update_records()
|
|
wizard.continue_on_errors = True
|
|
wizard.action_update_records()
|
|
self.assertEqual(wizard.rejected_new_account_number, 1)
|
|
self.assertEqual(wizard.new_accounts, 0)
|
|
wizard.unlink()
|