forked from Mapan/odoo17e
345 lines
14 KiB
Python
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})
|