From 395731572eec45dcf557fa0cc0eb0327e1f3c65c Mon Sep 17 00:00:00 2001 From: Lanto R <124650562+lanto-razafindrabe@users.noreply.github.com> Date: Tue, 2 Jul 2024 21:56:06 +0300 Subject: [PATCH] TA#66818 [16.0][MIG] account_move_unique_reversal (#193) * TA#66818 [16.0][MIG] account_move_unique_reversal --------- Co-authored-by: Majda EL MARIOULI --- .docker_files/main/__manifest__.py | 1 + Dockerfile | 1 + account_move_unique_reversal/README.rst | 27 +++++ account_move_unique_reversal/__init__.py | 4 + account_move_unique_reversal/__manifest__.py | 15 +++ account_move_unique_reversal/i18n/fr.po | 33 ++++++ .../models/__init__.py | 4 + .../models/account_move.py | 33 ++++++ .../static/description/icon.png | Bin 0 -> 7982 bytes .../description/reverse_reversal_move.png | Bin 0 -> 17851 bytes .../description/reverse_reversed_move.png | Bin 0 -> 18352 bytes .../tests/__init__.py | 4 + .../test_account_move_unique_reversal.py | 109 ++++++++++++++++++ 13 files changed, 231 insertions(+) create mode 100644 account_move_unique_reversal/README.rst create mode 100644 account_move_unique_reversal/__init__.py create mode 100644 account_move_unique_reversal/__manifest__.py create mode 100644 account_move_unique_reversal/i18n/fr.po create mode 100644 account_move_unique_reversal/models/__init__.py create mode 100644 account_move_unique_reversal/models/account_move.py create mode 100644 account_move_unique_reversal/static/description/icon.png create mode 100644 account_move_unique_reversal/static/description/reverse_reversal_move.png create mode 100644 account_move_unique_reversal/static/description/reverse_reversed_move.png create mode 100644 account_move_unique_reversal/tests/__init__.py create mode 100644 account_move_unique_reversal/tests/test_account_move_unique_reversal.py diff --git a/.docker_files/main/__manifest__.py b/.docker_files/main/__manifest__.py index 7c50ec22..ead53acc 100644 --- a/.docker_files/main/__manifest__.py +++ b/.docker_files/main/__manifest__.py @@ -17,6 +17,7 @@ "account_fiscalyear_end_on_company", "account_invoice_constraint_chronology_forced", "account_move_reversal_access", + "account_move_unique_reversal", "account_negative_debit_credit", "account_payment_cancel_group", "account_show_full_features", diff --git a/Dockerfile b/Dockerfile index 61e1a02b..b99d767d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,6 +20,7 @@ COPY account_closing_journal /mnt/extra-addons/account_closing_journal COPY account_fiscalyear_end_on_company /mnt/extra-addons/account_fiscalyear_end_on_company COPY account_invoice_constraint_chronology_forced /mnt/extra-addons/account_invoice_constraint_chronology_forced COPY account_move_reversal_access /mnt/extra-addons/account_move_reversal_access +COPY account_move_unique_reversal /mnt/extra-addons/account_move_unique_reversal COPY account_negative_debit_credit /mnt/extra-addons/account_negative_debit_credit COPY account_payment_cancel_group /mnt/extra-addons/account_payment_cancel_group COPY account_show_full_features /mnt/extra-addons/account_show_full_features diff --git a/account_move_unique_reversal/README.rst b/account_move_unique_reversal/README.rst new file mode 100644 index 00000000..a9ddd577 --- /dev/null +++ b/account_move_unique_reversal/README.rst @@ -0,0 +1,27 @@ +============================ +Account Move Unique Reversal +============================ + +This module blocks the users from reversing the Journal Entries if they have already +been reversed or they are the reversal of another Entry except in cases where the journal is related to sales or purchases. + +- Reversed Entry: + +.. image:: static/description/reverse_reversed_move.png + +- Reversal Entry: + +.. image:: static/description/reverse_reversal_move.png + +Configuration +------------- +No configuration required apart from module installation. + +Contributors +------------ +* Numigi (tm) and all its contributors (https://bit.ly/numigiens) +* Komit (https://komit-consulting.com) + +More information +---------------- +* Meet us at https://bit.ly/numigi-com diff --git a/account_move_unique_reversal/__init__.py b/account_move_unique_reversal/__init__.py new file mode 100644 index 00000000..d6a63ca0 --- /dev/null +++ b/account_move_unique_reversal/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2024-today Numigi and all its contributors (https://bit.ly/numigiens) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models diff --git a/account_move_unique_reversal/__manifest__.py b/account_move_unique_reversal/__manifest__.py new file mode 100644 index 00000000..f9e69be7 --- /dev/null +++ b/account_move_unique_reversal/__manifest__.py @@ -0,0 +1,15 @@ +# Copyright 2024-today Numigi and all its contributors (https://bit.ly/numigiens) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Account Move Unique Reversal", + "summary": "Blocks the users from reversing the Journal Entries if they have " + "already been reversed or they are the reversal of the other Entries", + "version": "16.0.1.0.0", + "website": "https://bit.ly/numigi-com", + "author": "Numigi", + "maintainer": "Numigi", + "license": "AGPL-3", + "depends": ["account"], + "installable": True, +} diff --git a/account_move_unique_reversal/i18n/fr.po b/account_move_unique_reversal/i18n/fr.po new file mode 100644 index 00000000..e104c0f0 --- /dev/null +++ b/account_move_unique_reversal/i18n/fr.po @@ -0,0 +1,33 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_move_unique_reversal +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-06-14 10:18+0000\n" +"PO-Revision-Date: 2024-06-14 10:18+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_move_unique_reversal +#: model:ir.model,name:account_move_unique_reversal.model_account_move_reversal +msgid "Account Move Reversal" +msgstr "Renversement de la pièce comptable" + +#. module: account_move_unique_reversal +#: code:addons/account_move_unique_reversal/models/account_move_reversal.py:18 +#, python-format +msgid "The accounting entry {} is already reversed (by entry {}). You can only reverse an accounting entry once." +msgstr "La pièce comptable {} est déjà renversée (pièce {}). Vous ne pouvez renverser une pièce qu’une seule fois." + +#. module: account_move_unique_reversal +#: code:addons/account_move_unique_reversal/models/account_move_reversal.py:28 +#, python-format +msgid "The accounting entry {} is the reversal of another entry ({}). You can not reverse a reversal accounting entry." +msgstr "La pièce comptable {} est le renversement d’une autre pièce comptable ({}). Vous ne pouvez pas renverser une pièce comptable qui est le renversement d’une autre pièce." diff --git a/account_move_unique_reversal/models/__init__.py b/account_move_unique_reversal/models/__init__.py new file mode 100644 index 00000000..1f6ed9aa --- /dev/null +++ b/account_move_unique_reversal/models/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2024-today Numigi and all its contributors (https://bit.ly/numigiens) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import account_move diff --git a/account_move_unique_reversal/models/account_move.py b/account_move_unique_reversal/models/account_move.py new file mode 100644 index 00000000..fc505718 --- /dev/null +++ b/account_move_unique_reversal/models/account_move.py @@ -0,0 +1,33 @@ +# Copyright 2024-today Numigi and all its contributors (https://bit.ly/numigiens) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, models +from odoo.exceptions import UserError + + +class AccountMove(models.Model): + _inherit = "account.move" + + def _reverse_moves(self, default_values_list=None, cancel=False): + for move in self: + if move.reversal_move_id and move.journal_id.type not in ( + "sale", + "purchase", + ): + raise UserError( + _( + "The accounting entry {} is already reversed (by entry {}). " + "You can only reverse an accounting entry once." + ).format(move.display_name, move.reversal_move_id.display_name) + ) + if move.reversed_entry_id and move.journal_id.type not in ( + "sale", + "purchase", + ): + raise UserError( + _( + "The accounting entry {} is the reversal of another entry " + "({}). You can not reverse a reversal accounting entry." + ).format(move.display_name, move.reversed_entry_id.display_name) + ) + return super()._reverse_moves(default_values_list, cancel) diff --git a/account_move_unique_reversal/static/description/icon.png b/account_move_unique_reversal/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..92a86b10ed6e2f6a40b286805c8c92c5dc775111 GIT binary patch literal 7982 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 literal 0 HcmV?d00001 diff --git a/account_move_unique_reversal/static/description/reverse_reversed_move.png b/account_move_unique_reversal/static/description/reverse_reversed_move.png new file mode 100644 index 0000000000000000000000000000000000000000..5bfa72344f4a010c5ae024555cf4643a34a36f5f GIT binary patch literal 18352 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 literal 0 HcmV?d00001 diff --git a/account_move_unique_reversal/tests/__init__.py b/account_move_unique_reversal/tests/__init__.py new file mode 100644 index 00000000..365bf5dc --- /dev/null +++ b/account_move_unique_reversal/tests/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2024-today Numigi and all its contributors (https://bit.ly/numigiens) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import test_account_move_unique_reversal diff --git a/account_move_unique_reversal/tests/test_account_move_unique_reversal.py b/account_move_unique_reversal/tests/test_account_move_unique_reversal.py new file mode 100644 index 00000000..e5b2a4eb --- /dev/null +++ b/account_move_unique_reversal/tests/test_account_move_unique_reversal.py @@ -0,0 +1,109 @@ +# Copyright 2024-today Numigi and all its contributors (https://bit.ly/numigiens) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields +from odoo.exceptions import UserError +from odoo.tests import common + + +class TestAccountMoveUniqueReversal(common.SavepointCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.journal = cls.env["account.journal"].create( + {"name": "Test", "code": "TEST", "type": "general"} + ) + cls.journal_sale = cls.env["account.journal"].create( + { + "name": "Test Sales Journal", + "code": "tSAL", + "type": "sale", + } + ) + cls.journal_purchase = cls.env["account.journal"].create( + { + "name": "Test Purchase Journal", + "code": "tPO", + "type": "purchase", + } + ) + cls.today = fields.date.today() + cls.account_1 = cls.env["account.account"].create( + { + "name": "Account 1", + "code": "501001", + "account_type": "expense", + } + ) + cls.account_2 = cls.env["account.account"].create( + { + "name": "Account 2", + "code": "101001", + "account_type": "asset_fixed", + } + ) + cls.move = cls._create_invoice(cls.journal) + cls.move.action_post() + + cls.move_sale = cls._create_invoice(cls.journal_sale) + cls.move_sale.action_post() + + cls.move_purchase = cls._create_invoice(cls.journal_purchase) + cls.move_purchase.action_post() + + @classmethod + def _create_invoice(cls, journal): + move = cls.env["account.move"].create( + { + "journal_id": journal.id, + "date": cls.today, + "line_ids": [ + (0, 0, {"account_id": cls.account_1.id, "name": "/", "debit": 75}), + (0, 0, {"account_id": cls.account_1.id, "name": "/", "debit": 25}), + ( + 0, + 0, + {"account_id": cls.account_2.id, "name": "/", "credit": 100}, + ), + ], + } + ) + return move + + def test_reverse_reversed_entry_fail(self): + self._reverse_move(self.move) + with self.assertRaises(UserError): + self._reverse_move(self.move) + + def test_reverse_reversed_entry_sale_pass(self): + self._reverse_move(self.move_sale) + assert self._reverse_move(self.move_sale) + + def test_reverse_reversed_entry_purchase_pass(self): + self._reverse_move(self.move_purchase) + assert self._reverse_move(self.move_purchase) + + def test_reverse_reversal_entry_fail(self): + self._reverse_move(self.move) + reversal_move = self.move.reversal_move_id + with self.assertRaises(UserError): + self._reverse_move(reversal_move) + + def test_reverse_reversal_entry_sale_pass(self): + self._reverse_move(self.move_sale) + reversal_move = self.move_sale.reversal_move_id + assert self._reverse_move(reversal_move) + + def test_reverse_reversal_entry_purchase_pass(self): + self._reverse_move(self.move_purchase) + reversal_move = self.move_purchase.reversal_move_id + assert self._reverse_move(reversal_move) + + def _reverse_move(self, move): + wizard_env = self.env["account.move.reversal"] + wizard_env = wizard_env.with_context( + active_ids=[move.id], active_model="account.move" + ) + return wizard_env.create( + {"date": self.today, "journal_id": move.journal_id.id} + ).reverse_moves()