Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions g2p_support_desk/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@
"mail",
"portal",
"web",
"g2p_programs",
"g2p_registry_base",
],
"data": [
"security/support_desk_security.xml",
Expand Down
1 change: 1 addition & 0 deletions g2p_support_desk/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
from . import support_category
from . import support_tag
from . import support_stage
from . import support_ticket_id
70 changes: 16 additions & 54 deletions g2p_support_desk/models/support_ticket.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
import logging

from odoo import api, fields, models

_logger = logging.getLogger(__name__)


class SupportTicket(models.Model):
_name = "support.ticket"
Expand All @@ -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",
Expand All @@ -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,
)
Expand All @@ -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
Expand All @@ -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
17 changes: 17 additions & 0 deletions g2p_support_desk/models/support_ticket_id.py
Original file line number Diff line number Diff line change
@@ -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)
4 changes: 2 additions & 2 deletions g2p_support_desk/security/ir.model.access.csv
Original file line number Diff line number Diff line change
Expand Up @@ -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
18 changes: 0 additions & 18 deletions g2p_support_desk/security/support_desk_security.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,22 +36,4 @@
<field name="groups" eval="[(4, ref('group_support_desk_manager'))]" />
</record>

<!-- Program Record Rules -->
<record id="g2p_program_user_rule" model="ir.rule">
<field name="name">Program User Rule</field>
<field name="model_id" ref="g2p_programs.model_g2p_program" />
<field name="domain_force">[(1,'=',1)]</field>
<field name="groups" eval="[(4, ref('group_support_desk_user'))]" />
<field name="perm_read" eval="True" />
<field name="perm_write" eval="False" />
<field name="perm_create" eval="False" />
<field name="perm_unlink" eval="False" />
</record>

<record id="g2p_program_manager_rule" model="ir.rule">
<field name="name">Program Manager Rule</field>
<field name="model_id" ref="g2p_programs.model_g2p_program" />
<field name="domain_force">[(1,'=',1)]</field>
<field name="groups" eval="[(4, ref('group_support_desk_manager'))]" />
</record>
</odoo>
93 changes: 0 additions & 93 deletions g2p_support_desk/tests/test_support_desk.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
{
Expand Down Expand Up @@ -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,
}
)
Expand All @@ -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)

Expand Down Expand Up @@ -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)
49 changes: 32 additions & 17 deletions g2p_support_desk/views/support_ticket_views.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,29 +43,33 @@
<field name="name" required="1" />
<field name="team_id" />
<field name="user_id" />
<field name="priority" widget="priority" />
</group>
<group>
<field name="program_id" required="1" />
<field
name="beneficiary_id"
required="1"
domain="[('program_id', '=', program_id)]"
/>
<!-- <field name="partner_email" readonly="1"/>
<field name="partner_phone" readonly="1"/> -->
</group>
<group>
<field name="stage_id" />
<field
name="tag_ids"
widget="many2many_tags"
options="{'color_field': 'color'}"
/>
<field name="stage_id" />
<field name="priority" widget="priority" />
</group>

<group col="2">
<field name="creator_name" />
<field name="creator_email" />
<field name="creator_phone" />
<field name="creator_address" colspan="2" />
</group>

<group>
<field name="closed_date" />
<field name="category_id" />
<field name="program_id" />
<field name="ern" />
<field name="application_id" />
</group>

<group>
<field name="closed_date" />
</group>
</group>
<notebook>
Expand All @@ -78,6 +82,20 @@
<field name="resolution_time" />
</group>
</page>
<page string="IDs" name="ids">
<field name="reg_ids">
<tree editable="bottom">
<field name="id_type" />
<field name="value" />
</tree>
<form>
<group>
<field name="id_type" />
<field name="value" />
</group>
</form>
</field>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
Expand All @@ -97,8 +115,6 @@
<tree decoration-danger="priority=='3'" decoration-warning="priority=='2'">
<field name="number" />
<field name="name" />
<field name="program_id" />
<field name="beneficiary_id" />
<field name="team_id" />
<field name="user_id" />
<field name="stage_id" />
Expand Down Expand Up @@ -196,7 +212,6 @@
<search>
<field name="name" />
<field name="number" />
<field name="beneficiary_id" />
<field name="user_id" />
<field name="team_id" />
<separator />
Expand All @@ -222,7 +237,7 @@
<record id="action_support_ticket" model="ir.actions.act_window">
<field name="name">Support Tickets</field>
<field name="res_model">support.ticket</field>
<field name="view_mode">kanban,tree,form</field>
<field name="view_mode">tree,kanban,form</field>
<field name="context">{'search_default_my_tickets': 1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Expand Down