1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/account_consolidation/tests/test_consolidation_journal.py
2024-12-10 09:04:09 +07:00

345 lines
14 KiB
Python

# -*- coding: utf-8 -*-
from odoo.tests import tagged
from odoo.addons.account_consolidation.tests.account_consolidation_test_classes import AccountConsolidationTestCase
from odoo.exceptions import ValidationError, UserError
from unittest.mock import patch, Mock
@tagged('post_install', '-at_install')
class TestAccountConsolidationJournal(AccountConsolidationTestCase):
# TESTS
def test_balance(self):
JournalLine = self.env['consolidation.journal.line']
journal = self.env['consolidation.journal'].create({
'name': "blah",
'chart_id': self.chart.id,
})
amount = 100.0
initial_count = JournalLine.search_count([])
count = 100
JournalLine.create([{
'account_id': self._create_consolidation_account().id,
'journal_id': journal.id,
'amount': amount
} for i in range(count)])
# Will not be considered
JournalLine.create({
'account_id': self._create_consolidation_account().id,
'journal_id': self.env['consolidation.journal'].create({
'name': "bluh",
'chart_id': self.chart.id,
}).id,
'amount': 6942
})
self.assertEqual(JournalLine.search_count([]), initial_count + count + 1)
self.assertEqual(JournalLine.search_count([('journal_id', '=', journal.id)]), count)
self.assertAlmostEqual(journal.balance, amount * count)
@patch(
'odoo.addons.account_consolidation.models.consolidation_period.ConsolidationPeriodComposition._get_journal_lines_values')
@patch(
'odoo.addons.account_consolidation.models.consolidation_period.ConsolidationCompanyPeriod._get_journal_lines_values')
def test_action_generate_journal_lines_when_origin_is_company_period(self, patched_company_period_method,
patched_conso_method):
Journal = self.env['consolidation.journal']
accounts = [
self._create_consolidation_account('First', 'end'),
self._create_consolidation_account('Second', 'avg')
]
expected = []
for account in accounts:
expected.append({'account_id': account.id, 'amount': 42 * (account.id + 1)})
patched_company_period_method.return_value = expected
ap = self._create_analysis_period()
cps = (self._create_company_period(ap, self.default_company),
self._create_company_period(ap, self.us_company))
journals = []
for i, cp in enumerate(cps):
journals.append(Journal.create({
'name': cp.mapped('company_id.name')[0],
'company_period_id': cp.id,
'period_id': ap.id,
'chart_id': self.chart.id,
'line_ids': [(0, 0, {'account_id': accounts[0].id, 'amount': (i + 1) * 4242})]
}))
journals[0].action_generate_journal_lines()
patched_company_period_method.assert_called_once()
patched_conso_method.assert_not_called()
self.assertEqual(journals[1].line_ids.amount, 8484)
self.assertEqual(len(journals[0].line_ids), 2)
self.assertRecordValues(journals[0].line_ids, expected)
@patch(
'odoo.addons.account_consolidation.models.consolidation_period.ConsolidationPeriodComposition._get_journal_lines_values')
@patch(
'odoo.addons.account_consolidation.models.consolidation_period.ConsolidationCompanyPeriod._get_journal_lines_values')
def test_action_generate_journal_lines_when_origin_is_composition(self, patched_company_period_method,
patched_conso_method):
cap = self._create_analysis_period()
uap = self._create_analysis_period()
compo = self.env['consolidation.period.composition'].create({
'composed_period_id': cap.id,
'using_period_id': uap.id
})
journal = self.env['consolidation.journal'].create({
'name': 'blah',
'composition_id': compo.id,
'chart_id': self.chart.id,
})
journal.action_generate_journal_lines()
patched_company_period_method.assert_not_called()
patched_conso_method.assert_called_once()
def test__check_unique_origin(self):
cap = self._create_analysis_period()
uap = self._create_analysis_period()
cp = self._create_company_period()
compo = self.env['consolidation.period.composition'].create({
'composed_period_id': cap.id,
'using_period_id': uap.id
})
with self.assertRaises(ValidationError):
self.env['consolidation.journal'].create({
'name': 'blah',
'composition_id': compo.id,
'company_period_id': cp.id,
'chart_id': self.chart.id,
})
journal = self.env['consolidation.journal'].create({
'name': 'blah',
'composition_id': compo.id,
'chart_id': self.chart.id,
})
with self.assertRaises(ValidationError):
journal.write({'company_period_id': cp.id})
journal.write({'composition_id': False})
journal.write({'company_period_id': cp.id})
with self.assertRaises(ValidationError):
journal.write({'composition_id': compo.id})
@tagged('post_install', '-at_install')
class TestAccountConsolidationJournalLine(AccountConsolidationTestCase):
def setUp(self):
super().setUp()
self.dummy_account = self.env['consolidation.account'].create({'name': 'DUMMY'})
# TESTS
def test__check_conditional_unicity(self):
account = self._create_consolidation_account()
account2 = self._create_consolidation_account()
editable_journal = self.env['consolidation.journal'].create({'name': 'BLAH', 'chart_id': self.chart.id})
not_editable_journal = self.env['consolidation.journal'].create({
'name': 'BLAH',
'auto_generated': True,
'chart_id': self.chart.id
})
self.env['consolidation.journal.line'].create({
'journal_id': editable_journal.id,
'account_id': account.id,
'amount': 42,
})
# Can create multiple lines in an editable journal with the same account
self.env['consolidation.journal.line'].create({
'journal_id': editable_journal.id,
'account_id': account.id,
'amount': 42,
})
editable_journal_line = self.env['consolidation.journal.line'].create({
'journal_id': editable_journal.id,
'account_id': account2.id,
'amount': 42,
})
# Can update a journal line to set same account and not editable journal
editable_journal_line.write({'account_id': account.id})
self.env['consolidation.journal.line'].create({
'journal_id': not_editable_journal.id,
'account_id': account.id,
'amount': 42,
})
# Cannot create a journal line for same account and not editable journal
with self.assertRaises(ValidationError):
self.env['consolidation.journal.line'].create({
'journal_id': not_editable_journal.id,
'account_id': account.id,
'amount': 84,
})
not_editable_journal_line = self.env['consolidation.journal.line'].create({
'journal_id': not_editable_journal.id,
'account_id': account2.id,
'amount': 126
})
# Cannot update a journal line to set same account and not editable journal
with self.assertRaises(UserError):
not_editable_journal_line.write({'account_id': account.id})
def test_grid_update_cell_editable_journal(self):
journal = self.env['consolidation.journal'].create({'name': 'blah', 'chart_id': self.chart.id})
account = self._create_consolidation_account()
initial_amount = 42.0
change_amount = 14.0
journal_line = self.env['consolidation.journal.line'].create({
'journal_id': journal.id,
'account_id': account.id,
'amount': initial_amount
})
params = {
'row_domain': [('id', '=', journal_line.id)],
'cell_field': 'amount',
'change': change_amount
}
journal_line \
.with_context(default_account_id=journal_line.account_id.id, default_journal_id=journal.id) \
.grid_update_cell(*params.values())
created_lines = self.env['consolidation.journal.line'].search([
("id", "!=", journal_line.id),
("account_id", "=", journal_line.account_id.id),
("journal_id", "=", journal_line.journal_id.id),
])
self.assertAlmostEqual(journal_line.amount, initial_amount)
self.assertAlmostEqual(journal.balance, initial_amount + change_amount)
self.assertEqual(len(created_lines), 1)
self.assertAlmostEqual(created_lines.amount, change_amount)
self.assertEqual(created_lines.note, 'Trial balance adjustment')
self.assertEqual(created_lines.account_id.id, account.id)
self.assertEqual(created_lines.journal_id.id, journal.id)
def test_grid_update_cell(self):
journal_line = self._create_journal_line(True)
JournalLine = self.env['consolidation.journal.line']
params = {
'domain': [('id', '=', journal_line.id)],
'cell_field': 'amount',
'change': 14.0
}
journal_line = journal_line.with_context(
default_account_id=journal_line.account_id.id,
default_journal_id=journal_line.journal_id.id,
)
# JUST EDITED (no journal line created)
# GIVEN
# WHEN
journal_line.grid_update_cell(*params.values())
created_journal_line = JournalLine.search([
('id', '!=', journal_line.id),
('account_id', '=', journal_line.account_id.id),
('journal_id', '=', journal_line.journal_id.id),
])
# THEN
self.assertEqual(len(created_journal_line), 1, 'A journal line has been created')
self.assertAlmostEqual(created_journal_line.amount, params['change'],
msg='Newly create journal line has the change amount as amount')
# CANNOT EDIT AS LINKED TO COMPANY
# GIVEN
self._make_journal_line_not_editable(journal_line)
amount_before = journal_line.amount
# WHEN
with self.assertRaises(UserError):
journal_line.grid_update_cell(*params.values())
# THEN
self.assertAlmostEqual(journal_line.amount, amount_before, msg='Old journal line did not change')
# CANNOT CREATE AS JOURNAL LINKED TO COMPANY (no journal line created)
# GIVEN
journal = self.env['consolidation.journal'].create({'name': 'bluh', 'auto_generated': True, 'chart_id': self.chart.id})
# THEN
with self.assertRaises(UserError):
journal_line.with_context(default_journal_id=journal.id).grid_update_cell(*params.values())
# CAN CREATE AS JOURNAL NOT AUTO-GENERATED
# GIVEN
journal.write({'auto_generated': False})
params['change'] = 999.42
amount_before = journal_line.amount
# WHEN
journal_line.with_context(default_journal_id=journal.id).grid_update_cell(*params.values())
created_journal_line = JournalLine.search([
('id', 'not in', [journal_line.id, created_journal_line.id]),
('account_id', '=', journal_line.account_id.id),
('journal_id', '=', journal.id),
])
# THEN
self.assertAlmostEqual(journal_line.amount, amount_before, msg='Old journal line did not change')
self.assertEqual(len(created_journal_line), 1, 'A journal line has been created')
self.assertAlmostEqual(created_journal_line.amount, params['change'],
msg='Newly create journal line has the change amount as amount')
def test_write(self):
account = self._create_consolidation_account()
journal = self.env['consolidation.journal'].create({'name': 'BLAH', 'auto_generated': True, 'chart_id': self.chart.id})
journal_line = self.env['consolidation.journal.line'].create({
'journal_id': journal.id,
'account_id': account.id,
'amount': 42
})
with self.assertRaises(UserError):
journal_line.write({'amount': 84})
journal.write({'auto_generated': False})
journal_line.write({'amount': 84})
def test_unlink(self):
account = self._create_consolidation_account()
journal = self.env['consolidation.journal'].create({'name': 'BLAH', 'auto_generated': True, 'chart_id': self.chart.id})
journal_line = self.env['consolidation.journal.line'].create({
'journal_id': journal.id,
'account_id': account.id,
'amount': 42
})
with self.assertRaises(UserError):
journal_line.unlink()
journal.write({'auto_generated': False})
journal_line.unlink()
def test__journal_is_editable(self):
journal = self.env['consolidation.journal'].create({'name': 'blah', 'chart_id': self.chart.id})
journal_line = self.env['consolidation.journal.line'].create({
'journal_id': journal.id,
'account_id': self.dummy_account.id
})
params = {
'domain': [('id', '=', journal_line.id)],
'column_field': 'journal_id',
'column_value': journal.id
}
# Should be True as journal created
self.assertTrue(journal_line._journal_is_editable(*params.values()))
# Should be False as journal is linked to a company
journal.auto_generated = True
self.assertFalse(journal_line._journal_is_editable(*params.values()))
# PRIVATES
def _create_journal_line(self, editable=True):
journal = self.env['consolidation.journal'].create({'name': 'blah', 'chart_id': self.chart.id})
record = self.env['consolidation.journal.line'].create({
'journal_id': journal.id,
'account_id': self.dummy_account.id
})
if not editable:
self._make_journal_line_not_editable(record)
return record
def _make_journal_line_not_editable(self, journal_line):
journal_line.journal_id.write({'auto_generated': True})