From cc8c6fc19315c0cd84057757dfd4289e4e8038da Mon Sep 17 00:00:00 2001 From: Danny de Jong Date: Thu, 31 Aug 2023 17:02:30 +0200 Subject: [PATCH] [ADD] account_move_default_journal: A module to have more meaningful default journals in account move forms. --- account_move_default_journal/__init__.py | 1 + account_move_default_journal/__manifest__.py | 15 ++++ .../models/__init__.py | 3 + .../models/account_config_settings.py | 23 ++++++ .../models/account_move.py | 31 ++++++++ .../models/res_company.py | 17 ++++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 3 + .../tests/__init__.py | 1 + .../tests/test_defaults.py | 79 +++++++++++++++++++ .../views/account_config_settings.xml | 63 +++++++++++++++ .../views/res_company_views.xml | 27 +++++++ 12 files changed, 264 insertions(+) create mode 100644 account_move_default_journal/__init__.py create mode 100644 account_move_default_journal/__manifest__.py create mode 100644 account_move_default_journal/models/__init__.py create mode 100644 account_move_default_journal/models/account_config_settings.py create mode 100644 account_move_default_journal/models/account_move.py create mode 100644 account_move_default_journal/models/res_company.py create mode 100644 account_move_default_journal/readme/CONTRIBUTORS.rst create mode 100644 account_move_default_journal/readme/DESCRIPTION.rst create mode 100644 account_move_default_journal/tests/__init__.py create mode 100644 account_move_default_journal/tests/test_defaults.py create mode 100644 account_move_default_journal/views/account_config_settings.xml create mode 100644 account_move_default_journal/views/res_company_views.xml diff --git a/account_move_default_journal/__init__.py b/account_move_default_journal/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/account_move_default_journal/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/account_move_default_journal/__manifest__.py b/account_move_default_journal/__manifest__.py new file mode 100644 index 000000000..140bb99f2 --- /dev/null +++ b/account_move_default_journal/__manifest__.py @@ -0,0 +1,15 @@ +# Copyright 2021-2023 Therp BV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +{ + "name": "Default Journal", + "version": "14.0.1.0.0", + "author": "Therp BV,Odoo Community Association (OCA)", + "license": "AGPL-3", + "category": "Accounting & Finance", + "summary": "Configure a default journal for new account moves", + "website": "https://github.com/OCA/account-financial-tools", + "depends": [ + "account", + ], + "data": ["views/account_config_settings.xml", "views/res_company_views.xml"], +} diff --git a/account_move_default_journal/models/__init__.py b/account_move_default_journal/models/__init__.py new file mode 100644 index 000000000..5c764fc0c --- /dev/null +++ b/account_move_default_journal/models/__init__.py @@ -0,0 +1,3 @@ +from . import account_config_settings +from . import account_move +from . import res_company diff --git a/account_move_default_journal/models/account_config_settings.py b/account_move_default_journal/models/account_config_settings.py new file mode 100644 index 000000000..0c7f0b5f5 --- /dev/null +++ b/account_move_default_journal/models/account_config_settings.py @@ -0,0 +1,23 @@ +# Copyright 2021-2023 Therp BV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + account_move_default_general_journal_id = fields.Many2one( + "account.journal", + string="Default journal for new miscellaneous bookings", + related="company_id.default_general_journal_id", + ) + account_move_default_sale_journal_id = fields.Many2one( + "account.journal", + string="Default journal for new sale bookings", + related="company_id.default_sale_journal_id", + ) + account_move_default_purchase_journal_id = fields.Many2one( + "account.journal", + string="Default journal for new purchase bookings", + related="company_id.default_purchase_journal_id", + ) diff --git a/account_move_default_journal/models/account_move.py b/account_move_default_journal/models/account_move.py new file mode 100644 index 000000000..50621b3db --- /dev/null +++ b/account_move_default_journal/models/account_move.py @@ -0,0 +1,31 @@ +# Copyright 2021-2023 Therp BV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from odoo import api, models + + +class AccountMove(models.Model): + _inherit = "account.move" + + @api.model + def _search_default_journal(self, journal_types): + company_id = self._context.get("default_company_id", self.env.company.id) + company = self.env["res.company"].browse(company_id) + + # Use the appropriate config parameter for the journal type + journal = None + if "sale" in journal_types: + journal = company.default_sale_journal_id + elif "purchase" in journal_types: + journal = company.default_purchase_journal_id + elif "general" in journal_types: + journal = company.default_general_journal_id + + # Use the found journal, otherwise default back to normal behavior + if journal: + default_currency_id = self._context.get("default_currency_id") + if ( + not default_currency_id + or journal.currency_id.id == default_currency_id.id + ): + return journal + return super()._search_default_journal(journal_types) diff --git a/account_move_default_journal/models/res_company.py b/account_move_default_journal/models/res_company.py new file mode 100644 index 000000000..ebc9dbfc4 --- /dev/null +++ b/account_move_default_journal/models/res_company.py @@ -0,0 +1,17 @@ +# Copyright 2023 Therp BV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + default_general_journal_id = fields.Many2one( + "account.journal", string="Default journal for new general bookings" + ) + default_sale_journal_id = fields.Many2one( + "account.journal", string="Default journal for new sale bookings" + ) + default_purchase_journal_id = fields.Many2one( + "account.journal", string="Default journal for new purchase bookings" + ) diff --git a/account_move_default_journal/readme/CONTRIBUTORS.rst b/account_move_default_journal/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..4d02b8616 --- /dev/null +++ b/account_move_default_journal/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Danny de Jong diff --git a/account_move_default_journal/readme/DESCRIPTION.rst b/account_move_default_journal/readme/DESCRIPTION.rst new file mode 100644 index 000000000..2b0570c06 --- /dev/null +++ b/account_move_default_journal/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +This module allows you to set defaults for journals, so that default values for +the journal field in forms can be configured. For one, this prevents users from +accidentally picking an old journal that gets usually offered as a default. diff --git a/account_move_default_journal/tests/__init__.py b/account_move_default_journal/tests/__init__.py new file mode 100644 index 000000000..0ff10649d --- /dev/null +++ b/account_move_default_journal/tests/__init__.py @@ -0,0 +1 @@ +from . import test_defaults diff --git a/account_move_default_journal/tests/test_defaults.py b/account_move_default_journal/tests/test_defaults.py new file mode 100644 index 000000000..b60959e5a --- /dev/null +++ b/account_move_default_journal/tests/test_defaults.py @@ -0,0 +1,79 @@ +# Copyright 2023 Therp BV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from odoo.tests import TransactionCase + + +class TestDefaults(TransactionCase): + def setUp(self): + super().setUp() + self.different_currency = self.env["res.currency"].create( + { + "name": "Test Currency", + "symbol": "?", + } + ) + self.company = self.env.ref("base.main_company") + # This journal gets selected before the 'General Journal' because of its code: + self.journal_first = self.env["account.journal"].create( + { + "name": "First Journal", + "code": "1st", + "type": "general", + "company_id": self.company.id, + } + ) + self.journal_general = self.env["account.journal"].create( + { + "name": "General Journal", + "code": "GJ", + "type": "general", + "company_id": self.company.id, + "currency_id": self.different_currency.id, + } + ) + self.journal_sale = self.env["account.journal"].create( + { + "name": "Sale Journal", + "code": "SJ", + "type": "sale", + "company_id": self.company.id, + } + ) + self.journal_purchase = self.env["account.journal"].create( + { + "name": "Purchase Journal", + "code": "PJ", + "type": "purchase", + "company_id": self.company.id, + } + ) + + def test_defaults(self): + # Test whether the first journal gets selected with no default set + move = self.env["account.move"].create({"move_type": "entry"}) + self.assertNotEqual(move.journal_id, self.journal_general) + + # Test whether the journal with the relevant currency is chosen + move = ( + self.env["account.move"] + .with_context({"default_currency_id": self.different_currency.id}) + .create({"move_type": "entry"}) + ) + self.assertEqual(move.journal_id, self.journal_general) + move = ( + self.env["account.move"] + .with_context({"default_currency_id": self.different_currency.id}) + .create({"move_type": "out_invoice"}) + ) + self.assertNotEqual(move.journal_id, self.journal_general) + + # Test whether the correct default journals are chosen + self.company.default_general_journal_id = self.journal_general + self.company.default_sale_journal_id = self.journal_sale + self.company.default_purchase_journal_id = self.journal_purchase + move = self.env["account.move"].create({"move_type": "entry"}) + self.assertEqual(move.journal_id, self.journal_general) + move = self.env["account.move"].create({"move_type": "out_invoice"}) + self.assertEqual(move.journal_id, self.journal_sale) + move = self.env["account.move"].create({"move_type": "in_invoice"}) + self.assertEqual(move.journal_id, self.journal_purchase) diff --git a/account_move_default_journal/views/account_config_settings.xml b/account_move_default_journal/views/account_config_settings.xml new file mode 100644 index 000000000..ce4d0731f --- /dev/null +++ b/account_move_default_journal/views/account_config_settings.xml @@ -0,0 +1,63 @@ + + + + res.config.settings.view.form.inherit.journals + res.config.settings + + + +

Journals

+
+
+
+
+
+ Default Journals +
+ Default journals for new bookings and invoices. +
+
+
+
+
+
+
+
+
+
+
+
+ + + + diff --git a/account_move_default_journal/views/res_company_views.xml b/account_move_default_journal/views/res_company_views.xml new file mode 100644 index 000000000..60ad713fa --- /dev/null +++ b/account_move_default_journal/views/res_company_views.xml @@ -0,0 +1,27 @@ + + + + res.company.form + res.company + + + + + + + + + +