/** * Source-of-truth: ticket-updated email template. * * Uses the shared email layout wrapper. Body content is built from * per-language translated strings so that only text differs between locales. */ const { wrapEmailLayout } = require('../../_shared/emailLayout.cjs'); const { BADGE_BG, BRAND_DARK, BRAND_PRIMARY, } = require('../../_shared/constants.cjs'); const TEMPLATE_NAME = 'ticket-updated'; const SUBTYPE_NAME = 'Ticket Updated'; const SUBJECTS = { en: 'Ticket Updated • {{ticket.title}} ({{ticket.priority}})', fr: 'Ticket Mis à Jour • {{ticket.title}} ({{ticket.priority}})', es: 'Ticket Actualizado • {{ticket.title}} ({{ticket.priority}})', de: 'Ticket Aktualisiert • {{ticket.title}} ({{ticket.priority}})', nl: 'Ticket Bijgewerkt • {{ticket.title}} ({{ticket.priority}})', it: 'Ticket aggiornato • {{ticket.title}} ({{ticket.priority}})', pl: 'Zgłoszenie zaktualizowane • {{ticket.title}} ({{ticket.priority}})', }; /* eslint-disable max-len */ const COPY = { en: { headerLabel: 'Ticket Updated', intro: 'A ticket for {{ticket.clientName}} has been updated. Review the changes below.', badgePrefix: 'Ticket #', priority: 'Priority', status: 'Status', updatedBy: 'Updated By', assignedTo: 'Assigned To', requester: 'Requester', board: 'Board', category: 'Category', location: 'Location', changesLabel: 'Changes Made', changesVar: '{{{ticket.changes}}}', viewButton: 'View Ticket', footer: 'Powered by Alga PSA · Keeping teams aligned', textHeader: 'Ticket Updated', textUpdatedBy: 'Updated By', textAssigned: 'Assigned To', textRequester: 'Requester', textChanges: 'Changes Made', textView: 'View ticket', }, fr: { headerLabel: 'Ticket Mis à Jour', intro: 'Un ticket a été mis à jour pour {{ticket.clientName}}. Consultez les modifications ci-dessous.', badgePrefix: 'Ticket #', priority: 'Priorité', status: 'Statut', updatedBy: 'Mis à jour par', assignedTo: 'Assigné à', requester: 'Demandeur', board: 'Tableau', category: 'Catégorie', location: 'Emplacement', changesLabel: 'Modifications', changesVar: '{{{ticket.changes}}}', viewButton: 'Voir le Ticket', footer: 'Powered by Alga PSA · Gardons les équipes alignées', textHeader: 'Ticket Mis à Jour', textUpdatedBy: 'Mis à jour par', textAssigned: 'Assigné à', textRequester: 'Demandeur', textChanges: 'Modifications', textView: 'Voir le ticket', }, es: { headerLabel: 'Ticket Actualizado', intro: 'Se ha actualizado un ticket para {{ticket.clientName}}. Revisa los cambios a continuación.', badgePrefix: 'Ticket #', priority: 'Prioridad', status: 'Estado', updatedBy: 'Actualizado por', assignedTo: 'Asignado a', requester: 'Solicitante', board: 'Tablero', category: 'Categoría', location: 'Ubicación', changesLabel: 'Cambios Realizados', changesVar: '{{{ticket.changes}}}', viewButton: 'Ver Ticket', footer: 'Powered by Alga PSA · Manteniendo a los equipos alineados', textHeader: 'Ticket Actualizado', textUpdatedBy: 'Actualizado por', textAssigned: 'Asignado a', textRequester: 'Solicitante', textChanges: 'Cambios realizados', textView: 'Ver ticket', }, de: { headerLabel: 'Ticket Aktualisiert', intro: 'Ein Ticket wurde für {{ticket.clientName}} aktualisiert. Überprüfen Sie die Änderungen unten.', badgePrefix: 'Ticket #', priority: 'Priorität', status: 'Status', updatedBy: 'Aktualisiert von', assignedTo: 'Zugewiesen an', requester: 'Anforderer', board: 'Board', category: 'Kategorie', location: 'Standort', changesLabel: 'Änderungen', changesVar: '{{{ticket.changes}}}', viewButton: 'Ticket Anzeigen', footer: 'Powered by Alga PSA · Teams auf Kurs halten', textHeader: 'Ticket Aktualisiert', textUpdatedBy: 'Aktualisiert von', textAssigned: 'Zugewiesen an', textRequester: 'Anforderer', textChanges: 'Änderungen', textView: 'Ticket anzeigen', }, nl: { headerLabel: 'Ticket Bijgewerkt', intro: 'Een ticket is bijgewerkt voor {{ticket.clientName}}. Bekijk de wijzigingen hieronder.', badgePrefix: 'Ticket #', priority: 'Prioriteit', status: 'Status', updatedBy: 'Bijgewerkt door', assignedTo: 'Toegewezen aan', requester: 'Aanvrager', board: 'Bord', category: 'Categorie', location: 'Locatie', changesLabel: 'Wijzigingen', changesVar: '{{{ticket.changes}}}', viewButton: 'Ticket Bekijken', footer: 'Powered by Alga PSA · Teams op één lijn houden', textHeader: 'Ticket Bijgewerkt', textUpdatedBy: 'Bijgewerkt door', textAssigned: 'Toegewezen aan', textRequester: 'Aanvrager', textChanges: 'Wijzigingen', textView: 'Ticket bekijken', }, it: { headerLabel: 'Ticket aggiornato', intro: 'È stato aggiornato un ticket per {{ticket.clientName}}. Consulta le modifiche riportate qui sotto.', badgePrefix: 'Ticket #', priority: 'Priorità', status: 'Stato', updatedBy: 'Aggiornato da', assignedTo: 'Assegnato a', requester: 'Richiedente', board: 'Board', category: 'Categoria', location: 'Sede', changesLabel: 'Modifiche effettuate', changesVar: '{{{ticket.changes}}}', viewButton: 'Apri ticket', footer: 'Powered by Alga PSA · Manteniamo i team allineati', textHeader: 'Ticket aggiornato', textUpdatedBy: 'Aggiornato da', textAssigned: 'Assegnato a', textRequester: 'Richiedente', textChanges: 'Modifiche effettuate', textView: 'Apri ticket', }, pl: { headerLabel: 'Zgłoszenie zaktualizowane', intro: 'Zgłoszenie dla {{ticket.clientName}} zostało zaktualizowane. Sprawdź szczegóły i podejmij działania.', badgePrefix: 'Zgłoszenie #', priority: 'Priorytet', status: 'Status', updatedBy: 'Zaktualizowano', assignedTo: 'Przypisane do', requester: 'Zgłaszający', board: 'Tablica', category: 'Kategoria', location: 'Lokalizacja', changesLabel: 'Podsumowanie zgłoszenia', changesVar: '{{ticket.summary}}', viewButton: 'Zobacz zgłoszenie', footer: 'Powered by Alga PSA', textHeader: 'Zgłoszenie zaktualizowane', textUpdatedBy: 'Zaktualizowano', textAssigned: 'Przypisane do', textRequester: 'Zgłaszający', textChanges: 'Podsumowanie', textView: 'Zobacz zgłoszenie', /* PL uses {{ticket.updatedAt}} · {{ticket.updatedBy}} in the "Updated By" row */ updatedByVar: '{{ticket.updatedAt}} · {{ticket.updatedBy}}', }, }; /* eslint-enable max-len */ const CHANGES_BOX_BG = '#fff9e6'; const CHANGES_BOX_BORDER = '#ffe4a3'; const CHANGES_LABEL_COLOR = '#92400e'; function buildBodyHtml(c) { const updatedByVal = c.updatedByVar || '{{ticket.updatedBy}}'; return `
${c.intro}
| ${c.priority} | {{ticket.priority}} |
| ${c.status} | {{ticket.status}} |
| ${c.updatedBy} | ${updatedByVal} |
| ${c.assignedTo} |
{{ticket.assignedToName}}
{{ticket.assignedToEmail}}
|
| ${c.requester} |
{{ticket.requesterName}}
{{ticket.requesterContact}}
|
| ${c.board} | {{ticket.board}} |
| ${c.category} | {{ticket.categoryDetails}} |
| ${c.location} | {{ticket.locationSummary}} |