diff --git a/g2p_support_desk/__manifest__.py b/g2p_support_desk/__manifest__.py index c6cc17ae..6b8e66b8 100644 --- a/g2p_support_desk/__manifest__.py +++ b/g2p_support_desk/__manifest__.py @@ -12,8 +12,6 @@ "mail", "portal", "web", - "g2p_programs", - "g2p_registry_base", ], "data": [ "security/support_desk_security.xml", diff --git a/g2p_support_desk/models/__init__.py b/g2p_support_desk/models/__init__.py index 106d8b20..9302226d 100644 --- a/g2p_support_desk/models/__init__.py +++ b/g2p_support_desk/models/__init__.py @@ -3,3 +3,4 @@ from . import support_category from . import support_tag from . import support_stage +from . import support_ticket_id diff --git a/g2p_support_desk/models/support_ticket.py b/g2p_support_desk/models/support_ticket.py index fdcbeda0..9f3f248c 100644 --- a/g2p_support_desk/models/support_ticket.py +++ b/g2p_support_desk/models/support_ticket.py @@ -1,9 +1,5 @@ -import logging - from odoo import api, fields, models -_logger = logging.getLogger(__name__) - class SupportTicket(models.Model): _name = "support.ticket" @@ -19,11 +15,7 @@ class SupportTicket(models.Model): string="Team", tracking=True, ) - program_id = fields.Many2one( - "g2p.program", - string="Program", - tracking=True, - ) + user_id = fields.Many2one( "res.users", string="Assigned To", @@ -32,17 +24,12 @@ class SupportTicket(models.Model): domain=[("share", "=", False)], ) - beneficiary_id = fields.Many2one("g2p.program_membership", string="Beneficiary", tracking=True) - # partner_email = fields.Char(string='Beneficiary Email') - # partner_phone = fields.Char(string='Beneficiary Phone') - category_id = fields.Many2one("support.category", string="Category") tag_ids = fields.Many2many("support.tag", string="Tags") stage_id = fields.Many2one( "support.stage", string="Stage", tracking=True, - # default=lambda self: self._get_default_stage(), copy=False, required=True, ) @@ -56,13 +43,24 @@ class SupportTicket(models.Model): closed_date = fields.Datetime() - # Statistics - # response_time = fields.Float( - # string="Response Time (Hours)", readonly=True, compute="_compute_response_time", store=True - # ) resolution_message = fields.Html() resolution_time = fields.Float(string="Resolution Time (Hours)") + program_id = fields.Char(string="Program ID") + ern = fields.Char(string="Entitlement Reference Number") + application_id = fields.Char(string="Application ID") + + creator_name = fields.Char() + creator_email = fields.Char() + creator_address = fields.Text() + creator_phone = fields.Char() + + reg_ids = fields.One2many( + "support.ticket.id", + "ticket_id", + string="IDs", + ) + def action_assign_to_me(self): self.ensure_one() self.user_id = self.env.user.id @@ -72,39 +70,3 @@ def create(self, vals): if vals.get("number", "New") == "New": vals["number"] = self.env["ir.sequence"].next_by_code("support.ticket") or "New" return super().create(vals) - - # @api.onchange('partner_id') - # def _onchange_partner_id(self): - # if self.partner_id: - # self.partner_email = self.partner_id.email or False - # self.partner_phone = self.partner_id.phone or False - # else: - # self.partner_email = False - # self.partner_phone = False - - # @api.onchange('stage_id') - # def _onchange_stage_id(self): - # if not self.stage_id: - # return - # if self.stage_id.done: - # self.closed_date = fields.Datetime.now() - # else: - # self.closed_date = False - - # @api.depends("create_date", "write_date") - # def _compute_response_time(self): - # for ticket in self: - # if ticket.create_date and ticket.write_date: - # delta = ticket.write_date - ticket.create_date - # # Ensure we have a positive time difference - # if delta.total_seconds() > 0: - # ticket.response_time = delta.total_seconds() / 3600.0 # Convert to hours - # else: - # # If write_date is not after create_date, use a small positive value - # ticket.response_time = 0.1 - # else: - # ticket.response_time = 0.0 - - @api.onchange("program_id") - def _onchange_program_id(self): - self.beneficiary_id = False diff --git a/g2p_support_desk/models/support_ticket_id.py b/g2p_support_desk/models/support_ticket_id.py new file mode 100644 index 00000000..5c004f7a --- /dev/null +++ b/g2p_support_desk/models/support_ticket_id.py @@ -0,0 +1,17 @@ +from odoo import fields, models + + +class SupportTicketID(models.Model): + _name = "support.ticket.id" + _description = "Support Ticket ID" + _order = "id desc" + + ticket_id = fields.Many2one( + "support.ticket", + string="Support Ticket", + required=True, + index=True, + ondelete="cascade", + ) + id_type = fields.Char(string="ID Type", size=100) + value = fields.Char(string="ID Value", size=100) diff --git a/g2p_support_desk/security/ir.model.access.csv b/g2p_support_desk/security/ir.model.access.csv index 37718923..b22386f7 100644 --- a/g2p_support_desk/security/ir.model.access.csv +++ b/g2p_support_desk/security/ir.model.access.csv @@ -9,5 +9,5 @@ access_support_tag_user,support.tag.user,model_support_tag,group_support_desk_us access_support_tag_manager,support.tag.manager,model_support_tag,group_support_desk_manager,1,1,1,1 access_support_stage_user,support.stage.user,model_support_stage,group_support_desk_user,1,0,0,0 access_support_stage_manager,support.stage.manager,model_support_stage,group_support_desk_manager,1,1,1,1 -access_g2p_program_user,g2p.program.user,g2p_programs.model_g2p_program,group_support_desk_user,1,0,0,0 -access_g2p_program_manager,g2p.program.manager,g2p_programs.model_g2p_program,group_support_desk_manager,1,1,1,1 +access_support_ticket_id_user,support.ticket.id.user,model_support_ticket_id,group_support_desk_user,1,0,1,0 +access_support_ticket_id_manager,support.ticket.id.manager,model_support_ticket_id,group_support_desk_manager,1,1,1,1 diff --git a/g2p_support_desk/security/support_desk_security.xml b/g2p_support_desk/security/support_desk_security.xml index 84aa509f..574a0aed 100644 --- a/g2p_support_desk/security/support_desk_security.xml +++ b/g2p_support_desk/security/support_desk_security.xml @@ -36,22 +36,4 @@ - - - Program User Rule - - [(1,'=',1)] - - - - - - - - - Program Manager Rule - - [(1,'=',1)] - - diff --git a/g2p_support_desk/tests/test_support_desk.py b/g2p_support_desk/tests/test_support_desk.py index 0bbc55b1..6ff14d15 100644 --- a/g2p_support_desk/tests/test_support_desk.py +++ b/g2p_support_desk/tests/test_support_desk.py @@ -30,14 +30,6 @@ def setUpClass(cls): } ) - # Create test program with minimal required fields - cls.program = cls.env["g2p.program"].create( - { - "name": "Test Program", - "target_type": "individual", - } - ) - # Create test team cls.team = cls.env["support.team"].create( { @@ -100,7 +92,6 @@ def test_01_ticket_creation(self): "category_id": self.category.id, "tag_ids": [(4, self.tag.id)], "priority": "1", # Medium priority - "program_id": self.program.id, "stage_id": default_stage.id, } ) @@ -111,7 +102,6 @@ def test_01_ticket_creation(self): self.assertEqual(ticket.category_id, self.category) self.assertEqual(ticket.tag_ids, self.tag) self.assertEqual(ticket.priority, "1") - self.assertEqual(ticket.program_id, self.program) self.assertEqual(ticket.stage_id, default_stage) self.assertTrue(ticket.active) @@ -323,86 +313,3 @@ def test_10_ticket_resolution_time(self): ticket.write({"stage_id": self.stage_done.id, "closed_date": self.env.cr.now()}) self.assertIsNotNone(ticket.closed_date) self.assertIsNotNone(ticket.resolution_time) - - def test_11_ticket_beneficiary_filter(self): - """Test ticket beneficiary filter""" - # Create a ticket with a program - ticket = self.env["support.ticket"].create( - { - "name": "Beneficiary Test Ticket", - "description": "Test Description", - "team_id": self.team.id, - "program_id": self.program.id, - "stage_id": self.stage_new.id, - } - ) - - # Test that no beneficiary is selected initially - self.assertFalse(ticket.beneficiary_id) - - # Add a beneficiary to the program - partner = self.env["res.partner"].create( - { - "name": "Test Beneficiary", - "is_registrant": True, # Required for program membership - } - ) - membership = self.env["g2p.program_membership"].create( - { - "program_id": self.program.id, - "partner_id": partner.id, - } - ) - - # Test that beneficiary can be selected after adding to program - ticket.write({"beneficiary_id": membership.id}) - self.assertEqual(ticket.beneficiary_id, membership) - - # Remove the beneficiary from the program - membership.unlink() - - # Test that beneficiary is cleared when removed from program - # We need to trigger the constraint check by writing to the program_id - ticket.write({"program_id": self.program.id}) - self.assertFalse(ticket.beneficiary_id) - - def test_13_ticket_onchange_program_id(self): - """Test ticket onchange program id""" - # Create a ticket with a program - ticket = self.env["support.ticket"].create( - { - "name": "Onchange Program Test Ticket", - "description": "Test Description", - "team_id": self.team.id, - "program_id": self.program.id, - "stage_id": self.stage_new.id, - } - ) - - # Test that no beneficiary is selected initially - self.assertFalse(ticket.beneficiary_id) - - # Add a beneficiary to the program - partner = self.env["res.partner"].create( - { - "name": "Test Beneficiary", - "is_registrant": True, # Required for program membership - } - ) - membership = self.env["g2p.program_membership"].create( - { - "program_id": self.program.id, - "partner_id": partner.id, - } - ) - - # Test that beneficiary can be selected after adding to program - ticket.write({"beneficiary_id": membership.id}) - self.assertEqual(ticket.beneficiary_id, membership) - - # Remove the program - # ticket.write({"program_id": False}) - ticket.write({"program_id": False, "beneficiary_id": False}) - - # Test that beneficiary is cleared when program is removed - self.assertFalse(ticket.beneficiary_id) diff --git a/g2p_support_desk/views/support_ticket_views.xml b/g2p_support_desk/views/support_ticket_views.xml index a86c75d2..7340e887 100644 --- a/g2p_support_desk/views/support_ticket_views.xml +++ b/g2p_support_desk/views/support_ticket_views.xml @@ -43,29 +43,33 @@ - - - - - - + - + + + + + + + + + - + + + + + + + @@ -78,6 +82,20 @@ + + + + + + +
+ + + + +
+
+
@@ -97,8 +115,6 @@ - - @@ -196,7 +212,6 @@ - @@ -222,7 +237,7 @@ Support Tickets support.ticket - kanban,tree,form + tree,kanban,form {'search_default_my_tickets': 1}