feat(fusion_helpdesk): customer follow-up + embedded ticket inbox
Squash-merge of feat/helpdesk-customer-followup. The billing and fusion_login_audit work from that branch is already on main (landed separately); this lands only the helpdesk feature. - Identity keystone: submit() forwards partner_email/partner_name/ x_fc_client_label so the central Helpdesk find-or-creates the customer partner and subscribes them as a follower (enables reply emails + magic link). - Embedded in-app 'My Tickets' inbox: server-side scoped read/reply RPC endpoints, per-user seen tracking (fusion.helpdesk.ticket.seen), systray unread badge. Defense-in-depth scope domain + _norm_email normalisation (wildcard emails cannot widen scope). - fusion_helpdesk_central: x_fc_client_label field + list/search views + branded acknowledgement email template. - Deployed and smoke-tested live: nexa central 19.0.1.1.0, entech client 19.0.1.4.1 (requires Contact Creation on the central service account). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
55
fusion_helpdesk_central/data/mail_template_ack.xml
Normal file
55
fusion_helpdesk_central/data/mail_template_ack.xml
Normal file
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2026 Nexa Systems Inc.
|
||||
License OPL-1
|
||||
|
||||
Branded acknowledgement sent to the customer when an in-app-channel
|
||||
ticket is created. Carries the portal magic link (object.get_portal_url()
|
||||
embeds the access token) so the customer can track + reply without an
|
||||
account. Button colours follow the company email branding, like Odoo's
|
||||
own helpdesk templates.
|
||||
-->
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="mail_template_ticket_ack" model="mail.template">
|
||||
<field name="name">Helpdesk: Ticket Acknowledgement (Fusion)</field>
|
||||
<field name="model_id" ref="helpdesk.model_helpdesk_ticket"/>
|
||||
<field name="subject">We received your request [{{ object.ticket_ref or object.id }}]</field>
|
||||
<field name="partner_to">{{ object.partner_id.id }}</field>
|
||||
<field name="lang">{{ object.partner_id.lang }}</field>
|
||||
<field name="auto_delete" eval="True"/>
|
||||
<field name="body_html" type="html">
|
||||
<div style="margin:0; padding:0; font-family:Arial, Helvetica, sans-serif; color:#21252b; font-size:14px;">
|
||||
<p>Hello <t t-out="object.partner_name or 'there'"/>,</p>
|
||||
<p>
|
||||
Thanks for reaching out — we've received your request and our
|
||||
support team will be in touch. Here are the details:
|
||||
</p>
|
||||
<table style="margin:12px 0; font-size:14px;">
|
||||
<tr>
|
||||
<td style="padding:2px 12px 2px 0; color:#6c757d;">Reference</td>
|
||||
<td style="padding:2px 0;"><strong t-out="object.ticket_ref or object.id"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding:2px 12px 2px 0; color:#6c757d;">Subject</td>
|
||||
<td style="padding:2px 0;"><t t-out="object.name or ''"/></td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:18px 0;">
|
||||
<a t-att-href="object.get_base_url() + object.get_portal_url()"
|
||||
target="_blank"
|
||||
t-attf-style="background-color: {{ object.company_id.email_secondary_color or '#2c89e9' }}; padding:10px 18px; text-decoration:none; color: {{ object.company_id.email_primary_color or '#ffffff' }}; border-radius:5px; font-size:14px; display:inline-block;">
|
||||
View & track your ticket
|
||||
</a>
|
||||
</p>
|
||||
<p style="color:#6c757d; font-size:13px;">
|
||||
You can reply directly to this email to add information, follow up
|
||||
from the link above, or sign up for an account from that page to
|
||||
manage all of your requests in one place.
|
||||
</p>
|
||||
<p style="color:#6c757d; font-size:13px;">— <t t-out="object.company_id.name or 'Support'"/></p>
|
||||
</div>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user