Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
563 lines
28 KiB
JavaScript
563 lines
28 KiB
JavaScript
/**
|
|
* Update English ticket notification templates with modern styling
|
|
*
|
|
* Updates ticket-assigned, ticket-updated, ticket-closed, and ticket-comment-added
|
|
* templates to match the modern visual design of ticket-created template.
|
|
*/
|
|
|
|
exports.up = async function(knex) {
|
|
console.log('Updating English ticket notification templates with modern styling...');
|
|
|
|
// Get notification subtypes
|
|
const subtypes = await knex('notification_subtypes')
|
|
.select('id', 'name')
|
|
.whereIn('name', [
|
|
'Ticket Assigned',
|
|
'Ticket Updated',
|
|
'Ticket Closed',
|
|
'Ticket Comment Added'
|
|
]);
|
|
|
|
const getSubtypeId = (name) => {
|
|
const subtype = subtypes.find(s => s.name === name);
|
|
if (!subtype) {
|
|
throw new Error(`Notification subtype '${name}' not found`);
|
|
}
|
|
return subtype.id;
|
|
};
|
|
|
|
// Update ticket-assigned template
|
|
await knex('system_email_templates')
|
|
.where({ name: 'ticket-assigned', language_code: 'en' })
|
|
.update({
|
|
subject: 'Ticket Assigned • {{ticket.title}} ({{ticket.priority}})',
|
|
html_content: `
|
|
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#f5f3ff;padding:32px 0;font-family:'Segoe UI',Arial,sans-serif;">
|
|
<tr>
|
|
<td align="center">
|
|
<table role="presentation" width="600" cellpadding="0" cellspacing="0" style="width:100%;max-width:600px;background:#ffffff;border-radius:16px;overflow:hidden;border:1px solid #e4ddff;box-shadow:0 12px 32px rgba(138,77,234,0.12);">
|
|
<tr>
|
|
<td style="padding:32px;background:linear-gradient(135deg,#8A4DEA,#40CFF9);color:#ffffff;">
|
|
<div style="text-transform:uppercase;letter-spacing:0.08em;font-size:12px;font-weight:600;opacity:0.85;">Ticket Assigned</div>
|
|
<div style="font-size:22px;font-weight:600;margin-top:8px;">{{ticket.title}}</div>
|
|
<div style="margin-top:12px;font-size:14px;opacity:0.85;">{{ticket.metaLine}}</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:28px 32px 20px 32px;">
|
|
<p style="margin:0 0 16px 0;font-size:15px;color:#1f2933;line-height:1.5;">You have been assigned to a ticket for <strong>{{ticket.clientName}}</strong>. Review the details below and take action.</p>
|
|
<div style="margin-bottom:24px;">
|
|
<div style="display:inline-block;padding:6px 12px;border-radius:999px;background:rgba(138,77,234,0.12);color:#5b38b0;font-size:12px;font-weight:600;letter-spacing:0.02em;">Ticket #{{ticket.id}}</div>
|
|
</div>
|
|
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="border-collapse:collapse;font-size:14px;color:#1f2933;">
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;width:160px;font-weight:600;color:#475467;">Priority</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">
|
|
<span style="display:inline-block;padding:6px 12px;border-radius:999px;background-color:{{ticket.priorityColor}};color:#ffffff;font-weight:600;">{{ticket.priority}}</span>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Status</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">{{ticket.status}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Assigned By</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">{{ticket.assignedBy}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Assigned To</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">
|
|
<div style="font-weight:600;">{{ticket.assignedToName}}</div>
|
|
<div style="color:#667085;font-size:13px;">{{ticket.assignedToEmail}}</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Requester</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">
|
|
<div style="font-weight:600;">{{ticket.requesterName}}</div>
|
|
<div style="color:#667085;font-size:13px;">{{ticket.requesterContact}}</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Board</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">{{ticket.board}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Category</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">{{ticket.categoryDetails}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;font-weight:600;color:#475467;">Location</td>
|
|
<td style="padding:12px 0;">{{ticket.locationSummary}}</td>
|
|
</tr>
|
|
</table>
|
|
<div style="margin:28px 0 16px 0;padding:18px 20px;border-radius:12px;background:#f8f5ff;border:1px solid #e6deff;">
|
|
<div style="font-weight:600;color:#5b38b0;margin-bottom:8px;">Description</div>
|
|
<div style="color:#475467;line-height:1.5;">{{ticket.description}}</div>
|
|
</div>
|
|
<a href="{{ticket.url}}" style="display:inline-block;background:#8A4DEA;color:#ffffff;text-decoration:none;padding:12px 24px;border-radius:10px;font-weight:600;">View Ticket</a>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:18px 32px;background:#f8f5ff;color:#5b38b0;font-size:12px;text-align:center;">Powered by Alga PSA • Keeping teams aligned</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
`,
|
|
text_content: `
|
|
Ticket Assigned to You
|
|
|
|
{{ticket.metaLine}}
|
|
Assigned By: {{ticket.assignedBy}}
|
|
|
|
Priority: {{ticket.priority}}
|
|
Status: {{ticket.status}}
|
|
Assigned To: {{ticket.assignedDetails}}
|
|
Requester: {{ticket.requesterDetails}}
|
|
Board: {{ticket.board}}
|
|
Category: {{ticket.categoryDetails}}
|
|
Location: {{ticket.locationSummary}}
|
|
|
|
Description:
|
|
{{ticket.description}}
|
|
|
|
View ticket: {{ticket.url}}
|
|
`
|
|
});
|
|
|
|
// Update ticket-updated template
|
|
await knex('system_email_templates')
|
|
.where({ name: 'ticket-updated', language_code: 'en' })
|
|
.update({
|
|
subject: 'Ticket Updated • {{ticket.title}} ({{ticket.priority}})',
|
|
html_content: `
|
|
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#f5f3ff;padding:32px 0;font-family:'Segoe UI',Arial,sans-serif;">
|
|
<tr>
|
|
<td align="center">
|
|
<table role="presentation" width="600" cellpadding="0" cellspacing="0" style="width:100%;max-width:600px;background:#ffffff;border-radius:16px;overflow:hidden;border:1px solid #e4ddff;box-shadow:0 12px 32px rgba(138,77,234,0.12);">
|
|
<tr>
|
|
<td style="padding:32px;background:linear-gradient(135deg,#8A4DEA,#40CFF9);color:#ffffff;">
|
|
<div style="text-transform:uppercase;letter-spacing:0.08em;font-size:12px;font-weight:600;opacity:0.85;">Ticket Updated</div>
|
|
<div style="font-size:22px;font-weight:600;margin-top:8px;">{{ticket.title}}</div>
|
|
<div style="margin-top:12px;font-size:14px;opacity:0.85;">{{ticket.metaLine}}</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:28px 32px 20px 32px;">
|
|
<p style="margin:0 0 16px 0;font-size:15px;color:#1f2933;line-height:1.5;">A ticket for <strong>{{ticket.clientName}}</strong> has been updated. Review the changes below.</p>
|
|
<div style="margin-bottom:24px;">
|
|
<div style="display:inline-block;padding:6px 12px;border-radius:999px;background:rgba(138,77,234,0.12);color:#5b38b0;font-size:12px;font-weight:600;letter-spacing:0.02em;">Ticket #{{ticket.id}}</div>
|
|
</div>
|
|
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="border-collapse:collapse;font-size:14px;color:#1f2933;">
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;width:160px;font-weight:600;color:#475467;">Priority</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">
|
|
<span style="display:inline-block;padding:6px 12px;border-radius:999px;background-color:{{ticket.priorityColor}};color:#ffffff;font-weight:600;">{{ticket.priority}}</span>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Status</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">{{ticket.status}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Updated By</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">{{ticket.updatedBy}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Assigned To</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">
|
|
<div style="font-weight:600;">{{ticket.assignedToName}}</div>
|
|
<div style="color:#667085;font-size:13px;">{{ticket.assignedToEmail}}</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Requester</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">
|
|
<div style="font-weight:600;">{{ticket.requesterName}}</div>
|
|
<div style="color:#667085;font-size:13px;">{{ticket.requesterContact}}</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Board</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">{{ticket.board}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Category</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">{{ticket.categoryDetails}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;font-weight:600;color:#475467;">Location</td>
|
|
<td style="padding:12px 0;">{{ticket.locationSummary}}</td>
|
|
</tr>
|
|
</table>
|
|
<div style="margin:28px 0 16px 0;padding:18px 20px;border-radius:12px;background:#fff9e6;border:1px solid #ffe4a3;">
|
|
<div style="font-weight:600;color:#92400e;margin-bottom:8px;">Changes Made</div>
|
|
<div style="color:#475467;line-height:1.5;">{{ticket.changes}}</div>
|
|
</div>
|
|
<a href="{{ticket.url}}" style="display:inline-block;background:#8A4DEA;color:#ffffff;text-decoration:none;padding:12px 24px;border-radius:10px;font-weight:600;">View Ticket</a>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:18px 32px;background:#f8f5ff;color:#5b38b0;font-size:12px;text-align:center;">Powered by Alga PSA • Keeping teams aligned</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
`,
|
|
text_content: `
|
|
Ticket Updated
|
|
|
|
{{ticket.metaLine}}
|
|
Updated By: {{ticket.updatedBy}}
|
|
|
|
Priority: {{ticket.priority}}
|
|
Status: {{ticket.status}}
|
|
Assigned To: {{ticket.assignedDetails}}
|
|
Requester: {{ticket.requesterDetails}}
|
|
Board: {{ticket.board}}
|
|
Category: {{ticket.categoryDetails}}
|
|
Location: {{ticket.locationSummary}}
|
|
|
|
Changes Made:
|
|
{{ticket.changes}}
|
|
|
|
View ticket: {{ticket.url}}
|
|
`
|
|
});
|
|
|
|
// Update ticket-closed template
|
|
await knex('system_email_templates')
|
|
.where({ name: 'ticket-closed', language_code: 'en' })
|
|
.update({
|
|
subject: 'Ticket Closed • {{ticket.title}}',
|
|
html_content: `
|
|
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#f5f3ff;padding:32px 0;font-family:'Segoe UI',Arial,sans-serif;">
|
|
<tr>
|
|
<td align="center">
|
|
<table role="presentation" width="600" cellpadding="0" cellspacing="0" style="width:100%;max-width:600px;background:#ffffff;border-radius:16px;overflow:hidden;border:1px solid #e4ddff;box-shadow:0 12px 32px rgba(138,77,234,0.12);">
|
|
<tr>
|
|
<td style="padding:32px;background:linear-gradient(135deg,#10b981,#059669);color:#ffffff;">
|
|
<div style="text-transform:uppercase;letter-spacing:0.08em;font-size:12px;font-weight:600;opacity:0.85;">Ticket Closed</div>
|
|
<div style="font-size:22px;font-weight:600;margin-top:8px;">{{ticket.title}}</div>
|
|
<div style="margin-top:12px;font-size:14px;opacity:0.85;">{{ticket.metaLine}}</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:28px 32px 20px 32px;">
|
|
<p style="margin:0 0 16px 0;font-size:15px;color:#1f2933;line-height:1.5;">A ticket for <strong>{{ticket.clientName}}</strong> has been resolved and closed. Review the resolution details below.</p>
|
|
<div style="margin-bottom:24px;">
|
|
<div style="display:inline-block;padding:6px 12px;border-radius:999px;background:rgba(16,185,129,0.12);color:#047857;font-size:12px;font-weight:600;letter-spacing:0.02em;">Ticket #{{ticket.id}}</div>
|
|
</div>
|
|
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="border-collapse:collapse;font-size:14px;color:#1f2933;">
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;width:160px;font-weight:600;color:#475467;">Status</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">
|
|
<span style="display:inline-block;padding:6px 12px;border-radius:999px;background-color:#10b981;color:#ffffff;font-weight:600;">Closed</span>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Closed By</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">{{ticket.closedBy}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Assigned To</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">
|
|
<div style="font-weight:600;">{{ticket.assignedToName}}</div>
|
|
<div style="color:#667085;font-size:13px;">{{ticket.assignedToEmail}}</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Requester</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">
|
|
<div style="font-weight:600;">{{ticket.requesterName}}</div>
|
|
<div style="color:#667085;font-size:13px;">{{ticket.requesterContact}}</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Board</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">{{ticket.board}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Category</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">{{ticket.categoryDetails}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;font-weight:600;color:#475467;">Location</td>
|
|
<td style="padding:12px 0;">{{ticket.locationSummary}}</td>
|
|
</tr>
|
|
</table>
|
|
<div style="margin:28px 0 16px 0;padding:18px 20px;border-radius:12px;background:#f0fdf4;border:1px solid #bbf7d0;">
|
|
<div style="font-weight:600;color:#047857;margin-bottom:8px;">Resolution</div>
|
|
<div style="color:#475467;line-height:1.5;">{{ticket.resolution}}</div>
|
|
</div>
|
|
<a href="{{ticket.url}}" style="display:inline-block;background:#10b981;color:#ffffff;text-decoration:none;padding:12px 24px;border-radius:10px;font-weight:600;">View Ticket</a>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:18px 32px;background:#f0fdf4;color:#047857;font-size:12px;text-align:center;">Powered by Alga PSA • Keeping teams aligned</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
`,
|
|
text_content: `
|
|
Ticket Closed
|
|
|
|
{{ticket.metaLine}}
|
|
Closed By: {{ticket.closedBy}}
|
|
|
|
Status: Closed
|
|
Assigned To: {{ticket.assignedDetails}}
|
|
Requester: {{ticket.requesterDetails}}
|
|
Board: {{ticket.board}}
|
|
Category: {{ticket.categoryDetails}}
|
|
Location: {{ticket.locationSummary}}
|
|
|
|
Resolution:
|
|
{{ticket.resolution}}
|
|
|
|
View ticket: {{ticket.url}}
|
|
`
|
|
});
|
|
|
|
// Update ticket-comment-added template
|
|
await knex('system_email_templates')
|
|
.where({ name: 'ticket-comment-added', language_code: 'en' })
|
|
.update({
|
|
subject: 'New Comment • {{ticket.title}}',
|
|
html_content: `
|
|
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#f5f3ff;padding:32px 0;font-family:'Segoe UI',Arial,sans-serif;">
|
|
<tr>
|
|
<td align="center">
|
|
<table role="presentation" width="600" cellpadding="0" cellspacing="0" style="width:100%;max-width:600px;background:#ffffff;border-radius:16px;overflow:hidden;border:1px solid #e4ddff;box-shadow:0 12px 32px rgba(138,77,234,0.12);">
|
|
<tr>
|
|
<td style="padding:32px;background:linear-gradient(135deg,#8A4DEA,#40CFF9);color:#ffffff;">
|
|
<div style="text-transform:uppercase;letter-spacing:0.08em;font-size:12px;font-weight:600;opacity:0.85;">New Comment Added</div>
|
|
<div style="font-size:22px;font-weight:600;margin-top:8px;">{{ticket.title}}</div>
|
|
<div style="margin-top:12px;font-size:14px;opacity:0.85;">{{ticket.metaLine}}</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:28px 32px 20px 32px;">
|
|
<p style="margin:0 0 16px 0;font-size:15px;color:#1f2933;line-height:1.5;">A new comment has been added to a ticket for <strong>{{ticket.clientName}}</strong>.</p>
|
|
<div style="margin-bottom:24px;">
|
|
<div style="display:inline-block;padding:6px 12px;border-radius:999px;background:rgba(138,77,234,0.12);color:#5b38b0;font-size:12px;font-weight:600;letter-spacing:0.02em;">Ticket #{{ticket.id}}</div>
|
|
</div>
|
|
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="border-collapse:collapse;font-size:14px;color:#1f2933;">
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;width:160px;font-weight:600;color:#475467;">Priority</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">
|
|
<span style="display:inline-block;padding:6px 12px;border-radius:999px;background-color:{{ticket.priorityColor}};color:#ffffff;font-weight:600;">{{ticket.priority}}</span>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Status</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">{{ticket.status}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Comment By</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">{{comment.author}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Assigned To</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">
|
|
<div style="font-weight:600;">{{ticket.assignedToName}}</div>
|
|
<div style="color:#667085;font-size:13px;">{{ticket.assignedToEmail}}</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Requester</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">
|
|
<div style="font-weight:600;">{{ticket.requesterName}}</div>
|
|
<div style="color:#667085;font-size:13px;">{{ticket.requesterContact}}</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Board</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">{{ticket.board}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;font-weight:600;color:#475467;">Category</td>
|
|
<td style="padding:12px 0;border-bottom:1px solid #eef2ff;">{{ticket.categoryDetails}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 0;font-weight:600;color:#475467;">Location</td>
|
|
<td style="padding:12px 0;">{{ticket.locationSummary}}</td>
|
|
</tr>
|
|
</table>
|
|
<div style="margin:28px 0 16px 0;padding:18px 20px;border-radius:12px;background:#eff6ff;border:1px solid #bfdbfe;">
|
|
<div style="font-weight:600;color:#1e40af;margin-bottom:8px;">💬 Comment</div>
|
|
<div style="color:#475467;line-height:1.5;">{{comment.content}}</div>
|
|
</div>
|
|
<a href="{{ticket.url}}" style="display:inline-block;background:#8A4DEA;color:#ffffff;text-decoration:none;padding:12px 24px;border-radius:10px;font-weight:600;">View Ticket</a>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:18px 32px;background:#f8f5ff;color:#5b38b0;font-size:12px;text-align:center;">Powered by Alga PSA • Keeping teams aligned</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
`,
|
|
text_content: `
|
|
New Comment Added
|
|
|
|
{{ticket.metaLine}}
|
|
Comment By: {{comment.author}}
|
|
|
|
Priority: {{ticket.priority}}
|
|
Status: {{ticket.status}}
|
|
Assigned To: {{ticket.assignedDetails}}
|
|
Requester: {{ticket.requesterDetails}}
|
|
Board: {{ticket.board}}
|
|
Category: {{ticket.categoryDetails}}
|
|
Location: {{ticket.locationSummary}}
|
|
|
|
Comment:
|
|
{{comment.content}}
|
|
|
|
View ticket: {{ticket.url}}
|
|
`
|
|
});
|
|
|
|
console.log('✓ English ticket notification templates updated with modern styling');
|
|
};
|
|
|
|
exports.down = async function(knex) {
|
|
console.log('Reverting English ticket notification templates to basic styling...');
|
|
|
|
// Revert ticket-assigned template
|
|
await knex('system_email_templates')
|
|
.where({ name: 'ticket-assigned', language_code: 'en' })
|
|
.update({
|
|
subject: 'You have been assigned to ticket: {{ticket.title}}',
|
|
html_content: `
|
|
<h2>Ticket Assigned</h2>
|
|
<p>You have been assigned to a ticket:</p>
|
|
<div class="details">
|
|
<p><strong>Ticket ID:</strong> {{ticket.id}}</p>
|
|
<p><strong>Title:</strong> {{ticket.title}}</p>
|
|
<p><strong>Priority:</strong> {{ticket.priority}}</p>
|
|
<p><strong>Status:</strong> {{ticket.status}}</p>
|
|
<p><strong>Assigned By:</strong> {{ticket.assignedBy}}</p>
|
|
</div>
|
|
<a href="{{ticket.url}}" class="button">View Ticket</a>
|
|
`,
|
|
text_content: `
|
|
Ticket Assigned
|
|
|
|
You have been assigned to a ticket:
|
|
|
|
Ticket ID: {{ticket.id}}
|
|
Title: {{ticket.title}}
|
|
Priority: {{ticket.priority}}
|
|
Status: {{ticket.status}}
|
|
Assigned By: {{ticket.assignedBy}}
|
|
|
|
View ticket at: {{ticket.url}}
|
|
`
|
|
});
|
|
|
|
// Revert ticket-updated template
|
|
await knex('system_email_templates')
|
|
.where({ name: 'ticket-updated', language_code: 'en' })
|
|
.update({
|
|
subject: 'Ticket Updated: {{ticket.title}}',
|
|
html_content: `
|
|
<h2>Ticket Updated</h2>
|
|
<p>A ticket has been updated in your PSA system:</p>
|
|
<div class="details">
|
|
<p><strong>Ticket ID:</strong> {{ticket.id}}</p>
|
|
<p><strong>Title:</strong> {{ticket.title}}</p>
|
|
<p><strong>Changes:</strong> {{ticket.changes}}</p>
|
|
<p><strong>Updated By:</strong> {{ticket.updatedBy}}</p>
|
|
</div>
|
|
<a href="{{ticket.url}}" class="button">View Ticket</a>
|
|
`,
|
|
text_content: `
|
|
Ticket Updated
|
|
|
|
A ticket has been updated in your PSA system:
|
|
|
|
Ticket ID: {{ticket.id}}
|
|
Title: {{ticket.title}}
|
|
Changes: {{ticket.changes}}
|
|
Updated By: {{ticket.updatedBy}}
|
|
|
|
View ticket at: {{ticket.url}}
|
|
`
|
|
});
|
|
|
|
// Revert ticket-closed template
|
|
await knex('system_email_templates')
|
|
.where({ name: 'ticket-closed', language_code: 'en' })
|
|
.update({
|
|
subject: 'Ticket Closed: {{ticket.title}}',
|
|
html_content: `
|
|
<h2>Ticket Closed</h2>
|
|
<p>A ticket has been closed in your PSA system:</p>
|
|
<div class="details">
|
|
<p><strong>Ticket ID:</strong> {{ticket.id}}</p>
|
|
<p><strong>Title:</strong> {{ticket.title}}</p>
|
|
<p><strong>Resolution:</strong> {{ticket.resolution}}</p>
|
|
<p><strong>Closed By:</strong> {{ticket.closedBy}}</p>
|
|
</div>
|
|
<a href="{{ticket.url}}" class="button">View Ticket</a>
|
|
`,
|
|
text_content: `
|
|
Ticket Closed
|
|
|
|
A ticket has been closed in your PSA system:
|
|
|
|
Ticket ID: {{ticket.id}}
|
|
Title: {{ticket.title}}
|
|
Resolution: {{ticket.resolution}}
|
|
Closed By: {{ticket.closedBy}}
|
|
|
|
View ticket at: {{ticket.url}}
|
|
`
|
|
});
|
|
|
|
// Revert ticket-comment-added template
|
|
await knex('system_email_templates')
|
|
.where({ name: 'ticket-comment-added', language_code: 'en' })
|
|
.update({
|
|
subject: 'New Comment on Ticket: {{ticket.title}}',
|
|
html_content: `
|
|
<h2>New Comment Added</h2>
|
|
<p>A new comment has been added to ticket:</p>
|
|
<div class="details">
|
|
<p><strong>Ticket ID:</strong> {{ticket.id}}</p>
|
|
<p><strong>Title:</strong> {{ticket.title}}</p>
|
|
<p><strong>Comment By:</strong> {{comment.author}}</p>
|
|
<p><strong>Comment:</strong></p>
|
|
<div class="comment-content">
|
|
{{comment.content}}
|
|
</div>
|
|
</div>
|
|
<a href="{{ticket.url}}" class="button">View Ticket</a>
|
|
`,
|
|
text_content: `
|
|
New Comment Added
|
|
|
|
A new comment has been added to ticket:
|
|
|
|
Ticket ID: {{ticket.id}}
|
|
Title: {{ticket.title}}
|
|
Comment By: {{comment.author}}
|
|
|
|
Comment:
|
|
{{comment.content}}
|
|
|
|
View ticket at: {{ticket.url}}
|
|
`
|
|
});
|
|
|
|
console.log('English ticket notification templates reverted');
|
|
};
|