feat(fusion_helpdesk): Critical flag, KPI cards, colored stage pills
Three coordinated changes on top of the section grouping: 1. **Mark as Critical** — a red chip on the New tab sets priority='3' when submitted. The central post-create hook auto-applies a "Critical" helpdesk.tag (shipped via fusion_helpdesk_central data XML, noupdate=1 so support can recolor without losing it on upgrade), giving support a kanban-groupable signal that doesn't rely on remembering what priority='3' means. Scoped to in-app-channel tickets only, so a support agent manually setting Urgent on their own ticket isn't silently tagged. 2. **KPI cards above the sections** — Total / Open / Closed / Critical in a 4-up grid (auto-collapses to 2x2 under 540px). Each card uses its own saturated gradient so it reads on both light and dark mode — the dialog backdrop is irrelevant because the gradient brings its own background. Counts are computed in JS from state.tickets so they always match what's rendered below. 3. **Colored stage pills** — red Critical, green Solved, dark-yellow New, orange Cancelled, blue for In Progress / Testing / On Hold. Critical priority gets a *separate* red pill alongside the stage pill so you keep stage info even on escalated tickets. Stage matching is substring-based (lowercased) so a renamed "Resolved" or "Done" stage on central still maps to the green pill. Tests cover the new is_critical=True → priority='3' wiring and the default omission so SLA / stage defaults keep working for normal tickets. Bumps fusion_helpdesk to 19.0.1.7.0 and fusion_helpdesk_central to 19.0.1.2.0. End-to-end smoke test verified live: priority=3 + x_fc_client_label triggers the Critical tag.
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
# License OPL-1
|
||||
{
|
||||
'name': 'Fusion Helpdesk Central — Client API Keys',
|
||||
'version': '19.0.1.1.0',
|
||||
'version': '19.0.1.2.0',
|
||||
'category': 'Productivity',
|
||||
'summary': 'Admin UI on the central Odoo for issuing per-client API '
|
||||
'keys used by fusion_helpdesk client deployments.',
|
||||
@@ -29,6 +29,7 @@ Depends only on `helpdesk`. No client-side install needed.
|
||||
'security/ir.model.access.csv',
|
||||
'data/ir_config_parameter_data.xml',
|
||||
'data/mail_template_ack.xml',
|
||||
'data/helpdesk_tag_critical.xml',
|
||||
'views/fusion_helpdesk_client_key_views.xml',
|
||||
'views/helpdesk_ticket_views.xml',
|
||||
],
|
||||
|
||||
24
fusion_helpdesk_central/data/helpdesk_tag_critical.xml
Normal file
24
fusion_helpdesk_central/data/helpdesk_tag_critical.xml
Normal file
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2026 Nexa Systems Inc.
|
||||
License OPL-1
|
||||
-->
|
||||
<odoo>
|
||||
<!--
|
||||
Critical tag for in-app helpdesk tickets. The client-side dialog
|
||||
offers a "Mark as Critical" toggle on the New tab; when set, the
|
||||
ticket is created with priority='3' (Urgent), and the central
|
||||
post-create hook in helpdesk_ticket.py auto-applies this tag so
|
||||
support can filter / kanban-group by it without remembering which
|
||||
priority value means what. noupdate=1 protects support's color
|
||||
choice from being reset by every -u fusion_helpdesk_central.
|
||||
(noupdate lives on <data>, not on <record> — the RelaxNG schema
|
||||
rejects it on records in Odoo 19.)
|
||||
-->
|
||||
<data noupdate="1">
|
||||
<record id="tag_critical" model="helpdesk.tag">
|
||||
<field name="name">Critical</field>
|
||||
<field name="color">1</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -28,8 +28,34 @@ class HelpdeskTicket(models.Model):
|
||||
def create(self, vals_list):
|
||||
tickets = super().create(vals_list)
|
||||
tickets._fc_send_ack_email()
|
||||
tickets._fc_auto_tag_critical()
|
||||
return tickets
|
||||
|
||||
def _fc_auto_tag_critical(self):
|
||||
"""Auto-apply the Critical tag on in-app tickets that were filed with
|
||||
priority='3' (Urgent — the client-side "Mark as Critical" toggle).
|
||||
|
||||
Scoped to tickets carrying `x_fc_client_label` so support staff who
|
||||
manually set priority='3' on their own internal tickets aren't
|
||||
silently tagged. Best-effort: if the data XML hasn't loaded the tag
|
||||
yet (e.g. partial install), skip without raising — the ticket is
|
||||
already filed with priority='3' which is the load-bearing signal."""
|
||||
critical = self.filtered(
|
||||
lambda t: t.priority == '3' and t.x_fc_client_label
|
||||
)
|
||||
if not critical:
|
||||
return
|
||||
tag = self.env.ref(
|
||||
'fusion_helpdesk_central.tag_critical', raise_if_not_found=False,
|
||||
)
|
||||
if not tag:
|
||||
_logger.warning(
|
||||
'fusion_helpdesk_central: tag_critical not found, skipping '
|
||||
'auto-tag on %s critical ticket(s).', len(critical),
|
||||
)
|
||||
return
|
||||
critical.write({'tag_ids': [(4, tag.id)]})
|
||||
|
||||
def _fc_send_ack_email(self):
|
||||
"""Send the branded acknowledgement (with magic link) to the customer.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user