From cfc4e81d69d450b8f27ae28d885eb631d30ef302 Mon Sep 17 00:00:00 2001 From: Nicolas Delbovier Date: Thu, 6 Nov 2025 12:30:17 +0100 Subject: [PATCH 1/7] [ADD] helpdesk_mgmt_account: links account moves and helpdesk tickets. --- helpdesk_mgmt_account/README.rst | 114 +++++ helpdesk_mgmt_account/__init__.py | 1 + helpdesk_mgmt_account/__manifest__.py | 17 + helpdesk_mgmt_account/models/__init__.py | 2 + helpdesk_mgmt_account/models/account_move.py | 19 + .../models/helpdesk_ticket.py | 34 ++ helpdesk_mgmt_account/readme/CONFIGURE.md | 0 helpdesk_mgmt_account/readme/CONTEXT.md | 0 helpdesk_mgmt_account/readme/CONTRIBUTORS.md | 1 + helpdesk_mgmt_account/readme/CREDITS.md | 4 + helpdesk_mgmt_account/readme/DESCRIPTION.md | 0 helpdesk_mgmt_account/readme/HISTORY.md | 0 helpdesk_mgmt_account/readme/INSTALL.md | 0 helpdesk_mgmt_account/readme/ROADMAP.md | 0 helpdesk_mgmt_account/readme/USAGE.md | 0 .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 455 ++++++++++++++++++ helpdesk_mgmt_account/tests/__init__.py | 1 + .../test_helpdesk_ticket_account_move.py | 57 +++ helpdesk_mgmt_account/views/account_move.xml | 36 ++ .../views/helpdesk_ticket.xml | 37 ++ .../odoo/addons/helpdesk_mgmt_account | 1 + setup/helpdesk_mgmt_account/setup.py | 6 + 23 files changed, 785 insertions(+) create mode 100644 helpdesk_mgmt_account/README.rst create mode 100644 helpdesk_mgmt_account/__init__.py create mode 100644 helpdesk_mgmt_account/__manifest__.py create mode 100644 helpdesk_mgmt_account/models/__init__.py create mode 100644 helpdesk_mgmt_account/models/account_move.py create mode 100644 helpdesk_mgmt_account/models/helpdesk_ticket.py create mode 100644 helpdesk_mgmt_account/readme/CONFIGURE.md create mode 100644 helpdesk_mgmt_account/readme/CONTEXT.md create mode 100644 helpdesk_mgmt_account/readme/CONTRIBUTORS.md create mode 100644 helpdesk_mgmt_account/readme/CREDITS.md create mode 100644 helpdesk_mgmt_account/readme/DESCRIPTION.md create mode 100644 helpdesk_mgmt_account/readme/HISTORY.md create mode 100644 helpdesk_mgmt_account/readme/INSTALL.md create mode 100644 helpdesk_mgmt_account/readme/ROADMAP.md create mode 100644 helpdesk_mgmt_account/readme/USAGE.md create mode 100644 helpdesk_mgmt_account/static/description/icon.png create mode 100644 helpdesk_mgmt_account/static/description/index.html create mode 100644 helpdesk_mgmt_account/tests/__init__.py create mode 100644 helpdesk_mgmt_account/tests/test_helpdesk_ticket_account_move.py create mode 100644 helpdesk_mgmt_account/views/account_move.xml create mode 100644 helpdesk_mgmt_account/views/helpdesk_ticket.xml create mode 120000 setup/helpdesk_mgmt_account/odoo/addons/helpdesk_mgmt_account create mode 100644 setup/helpdesk_mgmt_account/setup.py diff --git a/helpdesk_mgmt_account/README.rst b/helpdesk_mgmt_account/README.rst new file mode 100644 index 0000000000..a28077994c --- /dev/null +++ b/helpdesk_mgmt_account/README.rst @@ -0,0 +1,114 @@ +===================== +Helpdesk Mgmt Account +===================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:1eb248d7a4f6ba782508936dcf2d75a749c38530c90e3932983b3f1150bf52a1 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fhelpdesk-lightgray.png?logo=github + :target: https://github.com/OCA/helpdesk/tree/16.0/helpdesk_mgmt_account + :alt: OCA/helpdesk +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/helpdesk-16-0/helpdesk-16-0-helpdesk_mgmt_account + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/helpdesk&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + + + +**Table of contents** + +.. contents:: + :local: + +Use Cases / Context +=================== + + + +Installation +============ + + + +Configuration +============= + + + +Usage +===== + + + +Known issues / Roadmap +====================== + + + +Changelog +========= + + + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* ACSONE SA/NV + +Contributors +------------ + +- Nicolas Delbovier nicolas.delbovier@acsone.eu (https://www.acsone.eu/) + +Other credits +------------- + +The development of this module has been financially supported by: + +- Copyright 2017 Camptocamp SA +- Copyright 2023 ACSONE SA/NV + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/helpdesk `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/helpdesk_mgmt_account/__init__.py b/helpdesk_mgmt_account/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/helpdesk_mgmt_account/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/helpdesk_mgmt_account/__manifest__.py b/helpdesk_mgmt_account/__manifest__.py new file mode 100644 index 0000000000..2f64a2c1a2 --- /dev/null +++ b/helpdesk_mgmt_account/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2025 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Helpdesk Mgmt Account", + "summary": """Link account moves and helpdesk tickets""", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "author": "ACSONE SA/NV,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/helpdesk", + "depends": ["helpdesk_mgmt", "account"], + "data": [ + "views/helpdesk_ticket.xml", + "views/account_move.xml", + ], + "demo": [], +} diff --git a/helpdesk_mgmt_account/models/__init__.py b/helpdesk_mgmt_account/models/__init__.py new file mode 100644 index 0000000000..711d3db018 --- /dev/null +++ b/helpdesk_mgmt_account/models/__init__.py @@ -0,0 +1,2 @@ +from . import helpdesk_ticket +from . import account_move diff --git a/helpdesk_mgmt_account/models/account_move.py b/helpdesk_mgmt_account/models/account_move.py new file mode 100644 index 0000000000..487d37c891 --- /dev/null +++ b/helpdesk_mgmt_account/models/account_move.py @@ -0,0 +1,19 @@ +# Copyright 2025 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class AccountMove(models.Model): + + _inherit = "account.move" + + ticket_ids = fields.Many2many("helpdesk.ticket") + ticket_count = fields.Integer( + string="Tickets Count", compute="_compute_ticket_count", store=True + ) + + @api.depends("ticket_ids") + def _compute_ticket_count(self): + for move in self: + move.ticket_count = len(move.ticket_ids) diff --git a/helpdesk_mgmt_account/models/helpdesk_ticket.py b/helpdesk_mgmt_account/models/helpdesk_ticket.py new file mode 100644 index 0000000000..f6454c3fef --- /dev/null +++ b/helpdesk_mgmt_account/models/helpdesk_ticket.py @@ -0,0 +1,34 @@ +# Copyright 2025 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class HelpdeskTicket(models.Model): + _inherit = "helpdesk.ticket" + + account_move_ids = fields.Many2many("account.move") + account_move_count = fields.Integer( + compute="_compute_account_move_count", store=True + ) + + @api.depends("account_move_ids") + def _compute_account_move_count(self): + for ticket in self: + ticket.account_move_count = len(ticket.account_move_ids) + + def action_view_account_moves(self): + action = { + "name": "Account Moves", + "type": "ir.actions.act_window", + "res_model": "account.move", + "view_mode": "tree,form", + "target": "current", + } + + action["domain"] = [("ticket_ids", "in", [self.id])] + action["context"] = { + "default_ticket_ids": [(4, [self.id])], + "default_partner_id": self.partner_id.id, + } + return action diff --git a/helpdesk_mgmt_account/readme/CONFIGURE.md b/helpdesk_mgmt_account/readme/CONFIGURE.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/helpdesk_mgmt_account/readme/CONTEXT.md b/helpdesk_mgmt_account/readme/CONTEXT.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/helpdesk_mgmt_account/readme/CONTRIBUTORS.md b/helpdesk_mgmt_account/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..e0604c970f --- /dev/null +++ b/helpdesk_mgmt_account/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Nicolas Delbovier (https://www.acsone.eu/) \ No newline at end of file diff --git a/helpdesk_mgmt_account/readme/CREDITS.md b/helpdesk_mgmt_account/readme/CREDITS.md new file mode 100644 index 0000000000..ac6af1258c --- /dev/null +++ b/helpdesk_mgmt_account/readme/CREDITS.md @@ -0,0 +1,4 @@ +The development of this module has been financially supported by: + +- Copyright 2017 Camptocamp SA +- Copyright 2023 ACSONE SA/NV diff --git a/helpdesk_mgmt_account/readme/DESCRIPTION.md b/helpdesk_mgmt_account/readme/DESCRIPTION.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/helpdesk_mgmt_account/readme/HISTORY.md b/helpdesk_mgmt_account/readme/HISTORY.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/helpdesk_mgmt_account/readme/INSTALL.md b/helpdesk_mgmt_account/readme/INSTALL.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/helpdesk_mgmt_account/readme/ROADMAP.md b/helpdesk_mgmt_account/readme/ROADMAP.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/helpdesk_mgmt_account/readme/USAGE.md b/helpdesk_mgmt_account/readme/USAGE.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/helpdesk_mgmt_account/static/description/icon.png b/helpdesk_mgmt_account/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/helpdesk_mgmt_account/static/description/index.html b/helpdesk_mgmt_account/static/description/index.html new file mode 100644 index 0000000000..3995f13699 --- /dev/null +++ b/helpdesk_mgmt_account/static/description/index.html @@ -0,0 +1,455 @@ + + + + + +Helpdesk Mgmt Account + + + +
+

Helpdesk Mgmt Account

+ + +

Beta License: AGPL-3 OCA/helpdesk Translate me on Weblate Try me on Runboat

+

Table of contents

+ + + + +
+

Usage

+
+ + +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • ACSONE SA/NV
  • +
+
+ +
+

Other credits

+

The development of this module has been financially supported by:

+
    +
  • Copyright 2017 Camptocamp SA
  • +
  • Copyright 2023 ACSONE SA/NV
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/helpdesk project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/helpdesk_mgmt_account/tests/__init__.py b/helpdesk_mgmt_account/tests/__init__.py new file mode 100644 index 0000000000..246fc0dee6 --- /dev/null +++ b/helpdesk_mgmt_account/tests/__init__.py @@ -0,0 +1 @@ +from . import test_helpdesk_ticket_account_move diff --git a/helpdesk_mgmt_account/tests/test_helpdesk_ticket_account_move.py b/helpdesk_mgmt_account/tests/test_helpdesk_ticket_account_move.py new file mode 100644 index 0000000000..756e20a01e --- /dev/null +++ b/helpdesk_mgmt_account/tests/test_helpdesk_ticket_account_move.py @@ -0,0 +1,57 @@ +# Copyright 2025 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import Command +from odoo.tests.common import TransactionCase + + +class TestHelpdeskTicketAccountMove(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.partner = cls.env["res.partner"].create( + {"name": "Test Partner", "email": "testpartner@example.com"} + ) + cls.ticket = cls.env["helpdesk.ticket"].create( + { + "name": "Test Helpdesk Ticket", + "partner_id": cls.partner.id, + "description": "Test Helpdesk Ticket", + } + ) + cls.account_move_1 = cls.env["account.move"].create( + { + "partner_id": cls.partner.id, + "ticket_ids": [Command.set([cls.ticket.id])], + } + ) + cls.account_move_2 = cls.env["account.move"].create( + { + "partner_id": cls.partner.id, + "ticket_ids": [Command.set([cls.ticket.id])], + } + ) + + def test_account_moves_associated_with_ticket(self): + # Verify that a Helpdesk ticket has multiple account moves associated with it. + self.assertEqual(len(self.ticket.account_move_ids), 2) + self.assertIn(self.account_move_1, self.ticket.account_move_ids) + self.assertIn(self.account_move_2, self.ticket.account_move_ids) + + def test_partner_association_in_account_move(self): + # Verify that an account move is associated with the correct ticket partner. + self.assertEqual(self.account_move_1.partner_id, self.partner) + self.assertEqual(self.account_move_2.partner_id, self.partner) + + def test_smartbutton_account_move_count(self): + # Check the account move counter in the smartbutton of the ticket. + self.ticket._compute_account_move_count() + self.assertEqual(self.ticket.account_move_count, 2) + + def test_action_view_account_moves(self): + # Verify that the smartbutton action displays the associated account moves correctly. + action = self.ticket.action_view_account_moves() + self.assertEqual(action["domain"], [("ticket_ids", "in", [self.ticket.id])]) + self.assertEqual( + action["context"]["default_ticket_ids"], [(4, [self.ticket.id])] + ) diff --git a/helpdesk_mgmt_account/views/account_move.xml b/helpdesk_mgmt_account/views/account_move.xml new file mode 100644 index 0000000000..64edd1e5c1 --- /dev/null +++ b/helpdesk_mgmt_account/views/account_move.xml @@ -0,0 +1,36 @@ + + + + + + account.move + + + + + + + + + + + + + + + + diff --git a/helpdesk_mgmt_account/views/helpdesk_ticket.xml b/helpdesk_mgmt_account/views/helpdesk_ticket.xml new file mode 100644 index 0000000000..9165b284c5 --- /dev/null +++ b/helpdesk_mgmt_account/views/helpdesk_ticket.xml @@ -0,0 +1,37 @@ + + + + + + helpdesk.ticket + + +
+ +
+
+
+ + Tickets + helpdesk.ticket + tree,form + [('account_move_ids', 'in', active_id)] + {'default_account_move_ids': [(4, active_id)]} + + + + +
diff --git a/setup/helpdesk_mgmt_account/odoo/addons/helpdesk_mgmt_account b/setup/helpdesk_mgmt_account/odoo/addons/helpdesk_mgmt_account new file mode 120000 index 0000000000..19431df52e --- /dev/null +++ b/setup/helpdesk_mgmt_account/odoo/addons/helpdesk_mgmt_account @@ -0,0 +1 @@ +../../../../helpdesk_mgmt_account \ No newline at end of file diff --git a/setup/helpdesk_mgmt_account/setup.py b/setup/helpdesk_mgmt_account/setup.py new file mode 100644 index 0000000000..28c57bb640 --- /dev/null +++ b/setup/helpdesk_mgmt_account/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From 0cddd5b7c73054e33a95891af830769104b0f225 Mon Sep 17 00:00:00 2001 From: Nicolas Delbovier Date: Wed, 11 Mar 2026 14:27:12 +0100 Subject: [PATCH 2/7] [FIX] helpdesk_mgmt_account: remove incorrect Sale Order context The button to view Helpdesk tickets from an Account Move was incorrectly passing a 'default_sale_order_id' in the action context due to a copy-paste error from the sales module. This caused new tickets created from an Account Move view to be linked to an unrelated Sale Order. --- helpdesk_mgmt_account/views/account_move.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/helpdesk_mgmt_account/views/account_move.xml b/helpdesk_mgmt_account/views/account_move.xml index 64edd1e5c1..7aead681c9 100644 --- a/helpdesk_mgmt_account/views/account_move.xml +++ b/helpdesk_mgmt_account/views/account_move.xml @@ -22,7 +22,6 @@ type="action" class="btn btn-primary" icon="fa-ticket" - context="{'default_sale_order_ids': [(4, id)]}" groups="helpdesk_mgmt.group_helpdesk_user_own" > From c24ca56e6b9859f93a63c9976d257f41ecaa18ae Mon Sep 17 00:00:00 2001 From: Nicolas Delbovier Date: Wed, 11 Mar 2026 14:49:24 +0100 Subject: [PATCH 3/7] [REF] helpdesk_mgmt_account: move open tickets action to Python Shifting the action logic to Python facilitates dynamic customization. This approach allows inheriting modules to override or extend the action via super(), avoiding the limitations and complexity of XML xpath inheritance for conditional logic --- helpdesk_mgmt_account/models/account_move.py | 15 ++++++++++++++- helpdesk_mgmt_account/views/account_move.xml | 4 ++-- helpdesk_mgmt_account/views/helpdesk_ticket.xml | 10 ---------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/helpdesk_mgmt_account/models/account_move.py b/helpdesk_mgmt_account/models/account_move.py index 487d37c891..5dcee4b905 100644 --- a/helpdesk_mgmt_account/models/account_move.py +++ b/helpdesk_mgmt_account/models/account_move.py @@ -1,7 +1,7 @@ # Copyright 2025 ACSONE SA/NV # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import api, fields, models +from odoo import Command, api, fields, models class AccountMove(models.Model): @@ -17,3 +17,16 @@ class AccountMove(models.Model): def _compute_ticket_count(self): for move in self: move.ticket_count = len(move.ticket_ids) + + def action_view_helpdesk_tickets(self): + self.ensure_one() + action = self.env["ir.actions.act_window"]._for_xml_id( + "helpdesk_mgmt.helpdesk_ticket_action" + ) + action["domain"] = [("account_move_ids", "in", [self.id])] + action["context"] = { + "default_account_move_ids": [Command.set(self.ids)], + # ↓ enables to show the "1" in smart button even before save + "default_account_move_count": 1, + } + return action diff --git a/helpdesk_mgmt_account/views/account_move.xml b/helpdesk_mgmt_account/views/account_move.xml index 7aead681c9..25ea5fa93c 100644 --- a/helpdesk_mgmt_account/views/account_move.xml +++ b/helpdesk_mgmt_account/views/account_move.xml @@ -18,8 +18,8 @@