2
0
account-financial-tools/account_chart_update/tests/test_account_chart_update.py
Pedro M. Baeza 9e63f90527 [IMP] account_chart_update: Include field selection
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!
2023-01-17 08:54:49 +01:00

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()