186 lines
11 KiB
Python
186 lines
11 KiB
Python
from odoo.addons.documents_account.tests.common import DocumentsAccountTestCommon
|
|
from odoo.tests.common import RecordCapturer, tagged
|
|
|
|
|
|
@tagged('post_install', '-at_install', 'test_document_bridge')
|
|
class TestJournalSyncAutoConfig(DocumentsAccountTestCommon):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
FolderSettings = cls.env['documents.account.folder.setting']
|
|
cls.setup_other_company()
|
|
|
|
# Delete existing settings to test their creation except for cash journal
|
|
existing_settings = FolderSettings.search([('journal_id', 'any', [('type', 'in', ['bank', 'general'])])])
|
|
auto_configured_folders = existing_settings.folder_id
|
|
existing_settings.unlink()
|
|
auto_configured_folders.action_archive()
|
|
|
|
# Setup translation to test the translation
|
|
cls.env['res.lang']._activate_lang('fr_FR')
|
|
journal_type_sel_by_value = cls.env['ir.model.fields']._get(
|
|
'account.journal', 'type').selection_ids.grouped('value')
|
|
for journal_type, default_tr, fr_FR_tr in (
|
|
('general', 'Miscellaneous', 'Divers'),
|
|
('bank', 'Bank', 'Banque'),
|
|
('cash', 'Cash', 'Espèces'),
|
|
):
|
|
journal_type_sel_by_value[journal_type].name = default_tr
|
|
journal_type_sel_by_value[journal_type].with_context(lang='fr_FR').name = fr_FR_tr
|
|
|
|
# Setup journals which will automatically create the synchronization settings
|
|
cls.company_2 = cls.env['res.company'].search([('name', '=', 'company_2')])[0]
|
|
with cls._freeze_time('2022-08-22 09:16'):
|
|
cls.journals = cls.env['account.journal'].create([
|
|
{'name': 'Misc company 1', 'type': 'general', 'company_id': cls.env.company.id},
|
|
{'name': 'Misc company 2', 'type': 'general', 'company_id': cls.company_2.id},
|
|
{'name': 'Bank company 2', 'type': 'bank', 'company_id': cls.company_2.id},
|
|
{'name': 'Cash company 1', 'type': 'cash', 'company_id': cls.env.company.id},
|
|
])
|
|
for journal, translation in zip(cls.journals, (
|
|
'Divers companie 1', 'Divers companie 2', 'Banque companie 2', 'Espèce companie 1'
|
|
)):
|
|
journal.with_context(lang='fr_FR').name = translation
|
|
settings = FolderSettings.search([('journal_id', 'in', cls.journals.ids)])
|
|
cls.settings_by_name = settings.grouped(lambda j: j.journal_id.name)
|
|
cls.unused_folder_with_misc_name = cls.env['documents.document'].create({
|
|
'name': 'Miscellaneous', 'type': 'folder',
|
|
'folder_id': cls.env.company.account_folder_id.id, 'company_id': cls.env.company.id})
|
|
cls.misc_journal = cls.journals[0]
|
|
cls.misc_setting = FolderSettings.search([('journal_id', '=', cls.misc_journal.id)])
|
|
cls.misc_folder = cls.misc_setting.folder_id
|
|
|
|
def test_initial_data(self):
|
|
self.assertEqual(len(self.settings_by_name), 4)
|
|
self.assertNotEqual(self.env.lang, 'fr_FR')
|
|
|
|
def test_auto_creation_of_settings(self):
|
|
"""Test the creation of the documents synchronization settings when creating journals."""
|
|
for name, expected_folder_name, expected_folder_name_fr, expected_company in (
|
|
('Misc company 1', 'Miscellaneous', 'Divers', self.env.company),
|
|
('Misc company 2', 'Miscellaneous', 'Divers', self.company_2),
|
|
('Bank company 2', 'Bank', 'Banque', self.company_2),
|
|
# The name of the folder is only in English as it was created before the language activation
|
|
('Cash company 1', 'Cash', 'Cash', self.env.company),
|
|
):
|
|
setting = self.settings_by_name[name]
|
|
folder = setting.folder_id
|
|
self.assertEqual(folder.name, expected_folder_name)
|
|
self.assertEqual(folder.with_context(lang='fr_FR').name, expected_folder_name_fr)
|
|
self.assertEqual(folder.company_id, expected_company)
|
|
self.assertFalse(folder.owner_id)
|
|
self.assertEqual(folder.access_internal, 'edit')
|
|
self.assertEqual(folder.access_via_link, 'none')
|
|
self.assertFalse(folder.access_ids.filtered(lambda a: a.role))
|
|
self.assertEqual(setting.company_id, expected_company)
|
|
self.assertEqual(setting.mapped('tag_ids.name'), [name])
|
|
self.assertEqual(setting.with_context(lang='fr_FR').mapped('tag_ids.name'), [name])
|
|
|
|
def test_create_journal_without_base_folder(self):
|
|
"""Test that we can still create journal without account_folder_id set on the company."""
|
|
self.env.company.account_folder_id = False
|
|
journal = self.env['account.journal'].create(
|
|
{'name': 'Test without base folder', 'type': 'general', 'company_id': self.env.company.id})
|
|
self.assertFalse(self.env['documents.account.folder.setting'].search([('journal_id', '=', journal.id)]))
|
|
|
|
def test_folder_creation(self):
|
|
"""Test that a folder is created if there are no settings for the journal type nor existing suitable folder."""
|
|
FolderSettings = self.env['documents.account.folder.setting']
|
|
self.misc_setting.unlink()
|
|
(self.misc_folder | self.unused_folder_with_misc_name).unlink()
|
|
|
|
with RecordCapturer(self.env['documents.document'], []) as capture:
|
|
misc = self.env['account.journal'].create({'name': 'Misc', 'type': 'general'})
|
|
created_folder = capture.records.filtered(lambda d: d.name == 'Miscellaneous')
|
|
self.assertEqual(len(created_folder), 1)
|
|
self.assertEqual(FolderSettings.search([('journal_id', '=', misc.id)]).folder_id, created_folder)
|
|
|
|
def test_folder_creation_existing_folder_with_wrong_company(self):
|
|
"""Test that a folder with the wrong company is not used when creating journals."""
|
|
FolderSettings = self.env['documents.account.folder.setting']
|
|
self.misc_setting.unlink()
|
|
self.misc_folder.unlink()
|
|
self.unused_folder_with_misc_name.company_id = False
|
|
|
|
with RecordCapturer(self.env['documents.document'], []) as capture:
|
|
misc = self.env['account.journal'].create({'name': 'Misc', 'type': 'general'})
|
|
created_folder = capture.records.filtered(lambda d: d.name == 'Miscellaneous')
|
|
self.assertEqual(len(created_folder), 1)
|
|
self.assertEqual(FolderSettings.search([('journal_id', '=', misc.id)]).folder_id, created_folder)
|
|
|
|
def test_folder_reuse_from_settings(self):
|
|
"""Test the reuse of folder from existing settings with the same journal type (and company)."""
|
|
FolderSettings = self.env['documents.account.folder.setting']
|
|
self.misc_setting.folder_id.name = 'renamed'
|
|
|
|
with self._freeze_time('2024-08-22 09:16'):
|
|
new_misc_journal = self.env['account.journal'].create({'name': 'Misc 2', 'type': 'general'})
|
|
new_misc_setting = FolderSettings.search([('journal_id', '=', new_misc_journal.id)])
|
|
self.assertEqual(new_misc_setting.folder_id, self.misc_setting.folder_id,
|
|
"The folder of the configuration with the same journal type is used (same comapny).")
|
|
# If multiple configurations for the journal type exist we take the folder of the more recent one
|
|
replaced_folder = self.env['documents.document'].create({
|
|
'name': 'replaced', 'type': 'folder',
|
|
'folder_id': self.env.company.account_folder_id.id, 'company_id': self.env.company.id})
|
|
new_misc_setting.folder_id = replaced_folder
|
|
with self._freeze_time('2025-08-22 10:16'):
|
|
another_misc_journal = self.env['account.journal'].create({'name': 'Misc 3', 'type': 'general'})
|
|
another_misc_setting = FolderSettings.search([('journal_id', '=', another_misc_journal.id)])
|
|
self.assertEqual(another_misc_setting.folder_id.name, 'replaced')
|
|
self.assertEqual(new_misc_setting.folder_id.name, 'replaced')
|
|
self.assertEqual(self.misc_setting.folder_id.name, 'renamed')
|
|
self.assertFalse(
|
|
FolderSettings.search([('folder_id', '=', self.unused_folder_with_misc_name.id)]),
|
|
"The folder with the journal type name is not used as existing configured folder are preferred.")
|
|
|
|
def test_folder_reuse_no_setting(self):
|
|
"""Test that an existing folder with the right name is used if there are no settings for the journal type."""
|
|
FolderSettings = self.env['documents.account.folder.setting']
|
|
self.misc_setting.unlink()
|
|
self.misc_folder.unlink()
|
|
|
|
misc_journal_no_pre_config = self.env['account.journal'].create({'name': 'Misc', 'type': 'general'})
|
|
misc_journal_no_pre_config_setting = FolderSettings.search([('journal_id', '=', misc_journal_no_pre_config.id)])
|
|
self.assertEqual(misc_journal_no_pre_config_setting.folder_id.name, 'Miscellaneous')
|
|
self.assertEqual(misc_journal_no_pre_config_setting.folder_id, self.unused_folder_with_misc_name)
|
|
|
|
def test_post_init(self):
|
|
"""Simulate the creation of the documents synchronization settings in the post init of documents_account."""
|
|
# Remove all settings and related folders/tags as if we were installing documents_account
|
|
FolderSettings = self.env['documents.account.folder.setting']
|
|
settings = FolderSettings.search([])
|
|
folders = settings.folder_id
|
|
tags = settings.tag_ids
|
|
self.unused_folder_with_misc_name.unlink()
|
|
settings.unlink()
|
|
folders.unlink()
|
|
tags.unlink()
|
|
|
|
for lang in (self.env.lang, 'fr_FR'):
|
|
with self.subTest(lang=lang):
|
|
self.env['account.journal'].with_context(lang=lang).search(
|
|
[('id', 'not in', FolderSettings._search([]).select("journal_id"))]
|
|
)._documents_configure_sync()
|
|
settings_by_name = FolderSettings.search(
|
|
[('journal_id', 'in', self.journals.ids)]).grouped(lambda j: j.journal_id.name)
|
|
for name, expected_tag_name_fr, expected_folder_name, expected_folder_name_fr, expected_company in (
|
|
('Misc company 1', 'Divers companie 1', 'Miscellaneous', 'Divers', self.env.company),
|
|
('Misc company 2', 'Divers companie 2', 'Miscellaneous', 'Divers', self.company_2),
|
|
('Bank company 2', 'Banque companie 2', 'Bank', 'Banque', self.company_2),
|
|
('Cash company 1', 'Espèce companie 1', 'Cash', 'Espèces', self.env.company),
|
|
):
|
|
expected_tag_name = name
|
|
setting = settings_by_name[name]
|
|
folder = setting.folder_id
|
|
self.assertEqual(folder.name, expected_folder_name)
|
|
self.assertEqual(folder.with_context(lang='fr_FR').name, expected_folder_name_fr)
|
|
self.assertEqual(folder.company_id, expected_company)
|
|
self.assertFalse(folder.owner_id)
|
|
self.assertEqual(folder.access_internal, 'edit')
|
|
self.assertEqual(folder.access_via_link, 'none')
|
|
self.assertFalse(folder.access_ids.filtered(lambda a: a.role))
|
|
self.assertEqual(setting.company_id, expected_company)
|
|
self.assertEqual(setting.mapped('tag_ids.name'), [expected_tag_name])
|
|
self.assertEqual(setting.with_context(lang='fr_FR').mapped('tag_ids.name'), [expected_tag_name_fr])
|