/** * Source-of-truth: ticket-created 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, INFO_BOX_BG, INFO_BOX_BORDER, } = require('../../_shared/constants.cjs'); const TEMPLATE_NAME = 'ticket-created'; const SUBTYPE_NAME = 'Ticket Created'; const SUBJECTS = { en: 'New Ticket • {{ticket.title}} ({{ticket.priority}})', fr: 'Nouveau Ticket • {{ticket.title}} ({{ticket.priority}})', es: 'Nuevo Ticket • {{ticket.title}} ({{ticket.priority}})', de: 'Neues Ticket • {{ticket.title}} ({{ticket.priority}})', nl: 'Nieuw Ticket • {{ticket.title}} ({{ticket.priority}})', it: 'Nuovo ticket • {{ticket.title}} ({{ticket.priority}})', pl: 'Nowe zgłoszenie • {{ticket.title}} ({{ticket.priority}})', }; /* eslint-disable max-len */ const COPY = { en: { headerLabel: 'New Ticket Created', intro: 'A new ticket has been logged for {{ticket.clientName}}. Review the summary below and follow the link to take action.', badgePrefix: 'Ticket #', priority: 'Priority', status: 'Status', created: 'Created', assignedTo: 'Assigned To', requester: 'Requester', board: 'Board', category: 'Category', location: 'Location', descriptionLabel: 'Description', descriptionVar: '{{{ticket.description}}}', viewButton: 'View Ticket', footer: 'Powered by Alga PSA · Keeping teams aligned', textHeader: 'New Ticket Created for {{ticket.clientName}}', textCreated: 'Created', textAssigned: 'Assigned To', textRequester: 'Requester', textDescription: 'Description', textView: 'View ticket', }, fr: { headerLabel: 'Nouveau Ticket Créé', intro: 'Un nouveau ticket a été enregistré pour {{ticket.clientName}}. Consultez le résumé ci-dessous et suivez le lien pour agir.', badgePrefix: 'Ticket #', priority: 'Priorité', status: 'Statut', created: 'Créé', assignedTo: 'Assigné à', requester: 'Demandeur', board: 'Tableau', category: 'Catégorie', location: 'Emplacement', descriptionLabel: 'Description', descriptionVar: '{{ticket.description}}', viewButton: 'Voir le Ticket', footer: 'Powered by Alga PSA · Maintenir les équipes alignées', textHeader: 'Nouveau Ticket Créé pour {{ticket.clientName}}', textCreated: 'Créé', textAssigned: 'Assigné à', textRequester: 'Demandeur', textDescription: 'Description', textView: 'Voir le ticket', }, es: { headerLabel: 'Nuevo Ticket Creado', intro: 'Se ha registrado un nuevo ticket para {{ticket.clientName}}. Revisa el resumen a continuación y sigue el enlace para tomar acción.', badgePrefix: 'Ticket #', priority: 'Prioridad', status: 'Estado', created: 'Creado', assignedTo: 'Asignado a', requester: 'Solicitante', board: 'Tablero', category: 'Categoría', location: 'Ubicación', descriptionLabel: 'Descripción', descriptionVar: '{{ticket.description}}', viewButton: 'Ver Ticket', footer: 'Powered by Alga PSA · Manteniendo a los equipos alineados', textHeader: 'Nuevo Ticket Creado para {{ticket.clientName}}', textCreated: 'Creado', textAssigned: 'Asignado a', textRequester: 'Solicitante', textDescription: 'Descripción', textView: 'Ver ticket', }, de: { headerLabel: 'Neues Ticket Erstellt', intro: 'Ein neues Ticket wurde für {{ticket.clientName}} registriert. Überprüfen Sie die Zusammenfassung unten und folgen Sie dem Link, um Maßnahmen zu ergreifen.', badgePrefix: 'Ticket #', priority: 'Priorität', status: 'Status', created: 'Erstellt', assignedTo: 'Zugewiesen an', requester: 'Anforderer', board: 'Board', category: 'Kategorie', location: 'Standort', descriptionLabel: 'Beschreibung', descriptionVar: '{{ticket.description}}', viewButton: 'Ticket Anzeigen', footer: 'Powered by Alga PSA · Teams auf Kurs halten', textHeader: 'Neues Ticket Erstellt für {{ticket.clientName}}', textCreated: 'Erstellt', textAssigned: 'Zugewiesen an', textRequester: 'Anforderer', textDescription: 'Beschreibung', textView: 'Ticket anzeigen', }, nl: { headerLabel: 'Nieuw Ticket Aangemaakt', intro: 'Een nieuw ticket is geregistreerd voor {{ticket.clientName}}. Bekijk de samenvatting hieronder en volg de link om actie te ondernemen.', badgePrefix: 'Ticket #', priority: 'Prioriteit', status: 'Status', created: 'Aangemaakt', assignedTo: 'Toegewezen aan', requester: 'Aanvrager', board: 'Bord', category: 'Categorie', location: 'Locatie', descriptionLabel: 'Beschrijving', descriptionVar: '{{ticket.description}}', viewButton: 'Ticket Bekijken', footer: 'Powered by Alga PSA · Teams op één lijn houden', textHeader: 'Nieuw Ticket Aangemaakt voor {{ticket.clientName}}', textCreated: 'Aangemaakt', textAssigned: 'Toegewezen aan', textRequester: 'Aanvrager', textDescription: 'Beschrijving', textView: 'Ticket bekijken', }, it: { headerLabel: 'Nuovo ticket Creato', intro: 'È stato registrato un nuovo ticket per {{ticket.clientName}}. Consulta il riepilogo qui sotto e utilizza il link per intervenire.', badgePrefix: 'Ticket #', priority: 'Priorità', status: 'Stato', created: 'Creato', assignedTo: 'Assegnato a', requester: 'Richiedente', board: 'Board', category: 'Categoria', location: 'Sede', descriptionLabel: 'Descrizione', descriptionVar: '{{ticket.description}}', viewButton: 'Apri ticket', footer: 'Powered by Alga PSA · Manteniamo i team allineati', textHeader: 'Nuovo ticket creato per {{ticket.clientName}}', textCreated: 'Creato', textAssigned: 'Assegnato a', textRequester: 'Richiedente', textDescription: 'Descrizione', textView: 'Apri ticket', }, pl: { headerLabel: 'Nowe zgłoszenie', intro: 'Utworzono nowe zgłoszenie dla {{ticket.clientName}}. Zapoznaj się z podsumowaniem i przejdź do zgłoszenia.', badgePrefix: 'Zgłoszenie #', priority: 'Priorytet', status: 'Status', created: 'Utworzono', assignedTo: 'Przypisane do', requester: 'Zgłaszający', board: 'Tablica', category: 'Kategoria', location: 'Lokalizacja', descriptionLabel: 'Podsumowanie zgłoszenia', descriptionVar: '{{ticket.summary}}', viewButton: 'Zobacz zgłoszenie', footer: 'Powered by Alga PSA', textHeader: 'Nowe zgłoszenie', textCreated: 'Utworzono', textAssigned: 'Przypisane do', textRequester: 'Zgłaszający', textDescription: 'Podsumowanie', textView: 'Zobacz zgłoszenie', }, }; /* eslint-enable max-len */ function buildBodyHtml(c) { return `

${c.intro}

${c.badgePrefix}{{ticket.id}}
${c.priority} {{ticket.priority}}
${c.status} {{ticket.status}}
${c.created} {{ticket.createdAt}} · {{ticket.createdBy}}
${c.assignedTo}
{{ticket.assignedToName}}
{{ticket.assignedToEmail}}
${c.requester}
{{ticket.requesterName}}
{{ticket.requesterContact}}
${c.board} {{ticket.board}}
${c.category} {{ticket.categoryDetails}}
${c.location} {{ticket.locationSummary}}
${c.descriptionLabel}
${c.descriptionVar}
${c.viewButton}`; } function buildText(c) { return `${c.textHeader} {{ticket.metaLine}} ${c.textCreated}: {{ticket.createdAt}} · {{ticket.createdBy}} ${c.priority}: {{ticket.priority}} ${c.status}: {{ticket.status}} ${c.textAssigned}: {{ticket.assignedDetails}} ${c.textRequester}: {{ticket.requesterDetails}} ${c.board}: {{ticket.board}} ${c.category}: {{ticket.categoryDetails}} ${c.location}: {{ticket.locationSummary}} ${c.textDescription}: ${c.descriptionVar} ${c.textView}: {{ticket.url}}`; } function getTemplate() { return { templateName: TEMPLATE_NAME, subtypeName: SUBTYPE_NAME, translations: Object.entries(COPY).map(([lang, copy]) => ({ language: lang, subject: SUBJECTS[lang], htmlContent: wrapEmailLayout({ language: lang, headerLabel: copy.headerLabel, headerTitle: '{{ticket.title}}', headerMeta: '{{ticket.metaLine}}', bodyHtml: buildBodyHtml(copy), footerText: copy.footer, }), textContent: buildText(copy), })), }; } module.exports = { TEMPLATE_NAME, SUBTYPE_NAME, getTemplate };