diff --git a/account_advanced_protection_features/README.rst b/account_advanced_protection_features/README.rst index a172b41..9d72191 100644 --- a/account_advanced_protection_features/README.rst +++ b/account_advanced_protection_features/README.rst @@ -3,9 +3,12 @@ account_advanced_protection_features ==================================== This module adds several protection features about accounting : -* Forbid to delete an invoice that has already been validated -* Forbid to reset to draft an invoice that has already been sent by email -* Allow bank statements and bank statement lines deletion + +* Forbid bank statements and bank statement lines deletion. You can allow it per journal. +* Forbid manual bank statement lines creation. You can allow it per journal. + +* Per journal, add the option to forbid to delete an invoice that has already been validated. +* Per journal, add the option to forbid to reset to draft an invoice that has already been sent by email. Installation ============ diff --git a/account_advanced_protection_features/__manifest__.py b/account_advanced_protection_features/__manifest__.py index ac5740f..184e833 100644 --- a/account_advanced_protection_features/__manifest__.py +++ b/account_advanced_protection_features/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { - "name": "account_advanced_protection_features", + "name": "Account advanced protection features", "version": "16.0.1.0.0", "author": "Elabore", "website": "https://elabore.coop", diff --git a/account_advanced_protection_features/i18n/fr.po b/account_advanced_protection_features/i18n/fr.po index 67d8167..8e18afa 100644 --- a/account_advanced_protection_features/i18n/fr.po +++ b/account_advanced_protection_features/i18n/fr.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-08-29 08:28+0000\n" -"PO-Revision-Date: 2025-08-29 08:28+0000\n" +"POT-Creation-Date: 2026-01-20 16:50+0000\n" +"PO-Revision-Date: 2026-01-20 16:50+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -25,6 +25,11 @@ msgstr "Accès aux fonctionnalités avancées de protection des journaux" msgid "Allow bank statements deletion" msgstr "Autoriser la suppression de relevé bancaire" +#. module: account_advanced_protection_features +#: model:ir.model.fields,field_description:account_advanced_protection_features.field_account_journal__allow_bank_statement_line_creation +msgid "Allow manual bank statement lines creation" +msgstr "Autoriser l'ajout manuelle des lignes de relevé bancaire" + #. module: account_advanced_protection_features #: model:ir.model,name:account_advanced_protection_features.model_account_bank_statement msgid "Bank Statement" @@ -35,6 +40,13 @@ msgstr "Relevé bancaire" msgid "Bank Statement Line" msgstr "Ligne de relevé de compte" +#. module: account_advanced_protection_features +#: model:ir.model.fields,help:account_advanced_protection_features.field_account_journal__allow_bank_statement_line_creation +msgid "" +"If unchecked, users will not be allowed to manually create bank statement " +"lines for this journal." +msgstr "Si décoché, les utilisateurs ne seront pas autorisés à créer des lignes de relevé bancaire pour ce journal." + #. module: account_advanced_protection_features #: model:ir.model,name:account_advanced_protection_features.model_account_journal msgid "Journal" @@ -45,6 +57,16 @@ msgstr "" msgid "Journal Entry" msgstr "Pièce comptable" +#. module: account_advanced_protection_features +#. odoo-python +#: code:addons/account_advanced_protection_features/models/account_bank_statement.py:0 +#: code:addons/account_advanced_protection_features/models/account_bank_statement.py:0 +#, python-format +msgid "" +"Manual creation of bank statement lines is not allowed for the journal %s." +msgstr "" +"La création manuelle de lignes de relevé bancaire n'est pas autorisée pour le journal %s." + #. module: account_advanced_protection_features #: model:ir.model.fields,field_description:account_advanced_protection_features.field_account_journal__prevent_deletion_of_posted_account_move msgid "Prevent to delete an already posted account move" @@ -66,15 +88,18 @@ msgstr "" #. module: account_advanced_protection_features #. odoo-python #: code:addons/account_advanced_protection_features/models/account_bank_statement.py:0 +#: code:addons/account_advanced_protection_features/models/account_bank_statement.py:0 #, python-format msgid "" "The deletion of bank statement lines is not allowed for the journal %s." msgstr "" -"La suppression des lignes de relevé bancaire n'est pas autorisée pour le journal %s." +"La suppression des lignes de relevé bancaire n'est pas autorisée pour le " +"journal %s." #. module: account_advanced_protection_features #. odoo-python #: code:addons/account_advanced_protection_features/models/account_bank_statement.py:0 +#: code:addons/account_advanced_protection_features/models/account_bank_statement.py:0 #, python-format msgid "The deletion of bank statements is not allowed for the journal %s." msgstr "" @@ -93,8 +118,10 @@ msgstr "" #. module: account_advanced_protection_features #. odoo-python #: code:addons/account_advanced_protection_features/models/account_move.py:0 +#: code:addons/account_advanced_protection_features/models/account_move.py:0 #, python-format -msgid "You cannot delete this account move because it has already been posted." +msgid "" +"You cannot delete this account move because it has already been posted." msgstr "" "Vous ne pouvez pas supprimer cette pièce comptable car elle à déjà été " "confirmée." @@ -102,6 +129,7 @@ msgstr "" #. module: account_advanced_protection_features #. odoo-python #: code:addons/account_advanced_protection_features/models/account_move.py:0 +#: code:addons/account_advanced_protection_features/models/account_move.py:0 #, python-format msgid "" "You cannot reset to draft this invoice because it has been sent by email." diff --git a/account_advanced_protection_features/models/account_bank_statement.py b/account_advanced_protection_features/models/account_bank_statement.py index 79093b3..3f5c472 100644 --- a/account_advanced_protection_features/models/account_bank_statement.py +++ b/account_advanced_protection_features/models/account_bank_statement.py @@ -1,4 +1,4 @@ -from odoo import models, _ +from odoo import api, models, _ from odoo.exceptions import UserError class AccountBankStatement(models.Model): @@ -19,6 +19,32 @@ class AccountBankStatement(models.Model): class AccountBankStatementLine(models.Model): _inherit = "account.bank.statement.line" + @api.model + def default_get(self, fields_list): + res = super().default_get(fields_list) + journal_id = self._context.get('default_journal_id') or res.get('journal_id') + if journal_id: + journal = self.env["account.journal"].browse(journal_id) + if not journal.allow_bank_statement_line_creation: + raise UserError( + _("Manual creation of bank statement lines is not allowed for the journal %s.") + % journal.display_name + ) + return res + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + journal_id = vals.get("journal_id") + if journal_id: + journal = self.env["account.journal"].browse(journal_id) + if not journal.allow_bank_statement_line_creation: + raise UserError( + _("Manual creation of bank statement lines is not allowed for the journal %s.") + % journal.display_name + ) + return super().create(vals_list) + def unlink(self): for line in self: if not line.journal_id.allow_bank_statement_deletion: diff --git a/account_advanced_protection_features/models/account_journal.py b/account_advanced_protection_features/models/account_journal.py index 94755d2..8c3a0b9 100644 --- a/account_advanced_protection_features/models/account_journal.py +++ b/account_advanced_protection_features/models/account_journal.py @@ -10,3 +10,7 @@ class AccountJournal(models.Model): help="Users with group Show Full Accounting Features (id: group_account_user) will be allowed to delete account bank statements " "and bank statement lines." ) + allow_bank_statement_line_creation = fields.Boolean( + "Allow manual bank statement lines creation", + help="If unchecked, users will not be allowed to manually create bank statement lines for this journal." + ) diff --git a/account_advanced_protection_features/tests/__init__.py b/account_advanced_protection_features/tests/__init__.py index f15da20..22c6cf9 100644 --- a/account_advanced_protection_features/tests/__init__.py +++ b/account_advanced_protection_features/tests/__init__.py @@ -1 +1,2 @@ from . import test_account_move +from . import test_account_bank_statement diff --git a/account_advanced_protection_features/tests/test_account_bank_statement.py b/account_advanced_protection_features/tests/test_account_bank_statement.py new file mode 100644 index 0000000..ba547b2 --- /dev/null +++ b/account_advanced_protection_features/tests/test_account_bank_statement.py @@ -0,0 +1,60 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.tests.common import TransactionCase +from odoo.exceptions import UserError + + +class TestBankStatementLineCreation(TransactionCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.bank_journal = cls.env["account.journal"].search( + [("type", "=", "bank")], limit=1 + ) + cls.partner = cls.env["res.partner"].create({"name": "Test Partner"}) + + def test_default_get_blocks_creation_when_not_allowed(self): + """Test that default_get raises UserError when creation is not allowed.""" + self.bank_journal.allow_bank_statement_line_creation = False + + with self.assertRaises(UserError): + self.env["account.bank.statement.line"].with_context( + default_journal_id=self.bank_journal.id + ).default_get(["journal_id", "amount", "payment_ref"]) + + def test_create_blocks_creation_when_not_allowed(self): + """Test that create raises UserError when creation is not allowed.""" + self.bank_journal.allow_bank_statement_line_creation = False + + with self.assertRaises(UserError): + self.env["account.bank.statement.line"].create({ + "journal_id": self.bank_journal.id, + "amount": 100.0, + "payment_ref": "Test", + "date": "2024-01-01", + }) + + def test_default_get_allows_creation_when_allowed(self): + """Test that default_get works when creation is allowed.""" + self.bank_journal.allow_bank_statement_line_creation = True + + # Should not raise + result = self.env["account.bank.statement.line"].with_context( + default_journal_id=self.bank_journal.id + ).default_get(["journal_id", "amount", "payment_ref"]) + + self.assertIsInstance(result, dict) + + def test_create_allows_creation_when_allowed(self): + """Test that create works when creation is allowed.""" + self.bank_journal.allow_bank_statement_line_creation = True + + line = self.env["account.bank.statement.line"].create({ + "journal_id": self.bank_journal.id, + "amount": 100.0, + "payment_ref": "Test", + "date": "2024-01-01", + }) + + self.assertTrue(line.exists()) diff --git a/account_advanced_protection_features/views/account_journal_views.xml b/account_advanced_protection_features/views/account_journal_views.xml index 4e3b367..f3b8e35 100644 --- a/account_advanced_protection_features/views/account_journal_views.xml +++ b/account_advanced_protection_features/views/account_journal_views.xml @@ -20,6 +20,11 @@ groups="account_advanced_protection_features.group_account_protection_manager" attrs="{'invisible': [('type', 'not in', ['bank', 'cash'])]}" /> +