diff --git a/helpdesk_mgmt_sale/models/helpdesk_ticket.py b/helpdesk_mgmt_sale/models/helpdesk_ticket.py index c7d7a58017..91aa86b2cd 100644 --- a/helpdesk_mgmt_sale/models/helpdesk_ticket.py +++ b/helpdesk_mgmt_sale/models/helpdesk_ticket.py @@ -1,4 +1,4 @@ -from odoo import api, fields, models +from odoo import _, api, fields, models class HelpdeskTicket(models.Model): @@ -23,3 +23,18 @@ def action_view_sale_orders(self): "default_partner_id": self.partner_id.id, } return action + + @api.model_create_multi + def create(self, vals_list): + tickets = super().create(vals_list) + if self.env.context.get("from_sale_order"): + # only one ticket is possible here + for sale in tickets.sale_order_ids: + sale.message_post(body=self._get_default_message_creation(tickets)) + + return tickets + + def _get_default_message_creation(self, tickets): + return _( + f"Helpdesk Ticket {tickets.display_name} created by {self.env.user.name}" + ) diff --git a/helpdesk_mgmt_sale/models/sale_order.py b/helpdesk_mgmt_sale/models/sale_order.py index b1e89a4605..bbf61b0369 100644 --- a/helpdesk_mgmt_sale/models/sale_order.py +++ b/helpdesk_mgmt_sale/models/sale_order.py @@ -13,3 +13,22 @@ class SaleOrder(models.Model): def _compute_ticket_count(self): for order in self: order.ticket_count = len(order.ticket_ids) + + def action_create_helpdesk_ticket(self): + self.ensure_one() + + return { + "type": "ir.actions.act_window", + "name": "Create Helpdesk ticket", + "res_model": "helpdesk.ticket", + "view_mode": "form", + "view_id": self.env.ref("helpdesk_mgmt.ticket_view_form").id, + "target": "new", + "context": { + "default_partner_id": self.partner_id.id, + "default_name": self.name, + "default_origin": self.name, + "default_sale_order_ids": [(4, self.id)], + "from_sale_order": True, + }, + } diff --git a/helpdesk_mgmt_sale/tests/test_helpdesk_ticket.py b/helpdesk_mgmt_sale/tests/test_helpdesk_ticket.py index 1a142276f1..98a7189de8 100644 --- a/helpdesk_mgmt_sale/tests/test_helpdesk_ticket.py +++ b/helpdesk_mgmt_sale/tests/test_helpdesk_ticket.py @@ -7,6 +7,7 @@ class TestHelpdeskTicketSale(BaseCommon): @classmethod def setUpClass(cls): super().setUpClass() + cls.Ticket = cls.env["helpdesk.ticket"] cls.partner = cls.env["res.partner"].create( {"name": "Test Partner", "email": "testpartner@example.com"} ) @@ -53,3 +54,42 @@ def test_action_view_sale_orders(self): self.assertEqual( action["context"]["default_ticket_ids"], [(4, [self.ticket.id])] ) + + def test_create_ticket_without_context(self): + self.Ticket.create( + { + "name": "Test Ticket", + "sale_order_ids": [(6, 0, [self.sale_order_1.id])], + "description": "Test Helpdesk Ticket", + } + ) + messages = self.sale_order_1.message_ids.filtered( + lambda m: "Helpdesk Ticket" in (m.body or "") + ) + self.assertFalse(messages, "No message should be posted without context") + + def test_create_ticket_with_context(self): + ticket = self.Ticket.with_context(from_sale_order=True).create( + { + "name": "Ticket Context", + "sale_order_ids": [(6, 0, [self.sale_order_2.id])], + "description": "Test Helpdesk Ticket", + } + ) + + messages = self.sale_order_2.message_ids.filtered( + lambda m: ticket.name in (m.body or "") + ) + + self.assertTrue(messages, "A message should be posted on the sale order") + self.assertIn(self.env.user.name, messages[0].body) + + def test_action_context_values(self): + action = self.sale_order_1.action_create_helpdesk_ticket() + ctx = action["context"] + + self.assertEqual(ctx["default_partner_id"], self.partner.id) + self.assertEqual(ctx["default_name"], self.sale_order_1.name) + self.assertEqual(ctx["default_origin"], self.sale_order_1.name) + self.assertEqual(ctx["default_sale_order_ids"], [(4, self.sale_order_1.id)]) + self.assertTrue(ctx["from_sale_order"]) diff --git a/helpdesk_mgmt_sale/views/helpdesk_ticket_views.xml b/helpdesk_mgmt_sale/views/helpdesk_ticket_views.xml index 16455a4745..0681606c32 100644 --- a/helpdesk_mgmt_sale/views/helpdesk_ticket_views.xml +++ b/helpdesk_mgmt_sale/views/helpdesk_ticket_views.xml @@ -17,6 +17,9 @@ + + + diff --git a/helpdesk_mgmt_sale/views/sale_order_views.xml b/helpdesk_mgmt_sale/views/sale_order_views.xml index 6be0789e01..dfbfdbb0db 100644 --- a/helpdesk_mgmt_sale/views/sale_order_views.xml +++ b/helpdesk_mgmt_sale/views/sale_order_views.xml @@ -28,6 +28,14 @@ + +