import { readFile } from "node:fs/promises"; import { sanitizeText, sanitizeHtml, sanitizePhone } from "./sanitize.js"; import { fileURLToPath } from "node:url"; import { dirname, resolve } from "node:path"; // Helper function to convert date from yyyy-mm-dd to dd.mm.yyyy function formatDateGerman(dateString) { const [year, month, day] = dateString.split('-'); return `${day}.${month}.${year}`; } let cachedLogoDataUrl = null; async function getLogoDataUrl() { if (cachedLogoDataUrl) return cachedLogoDataUrl; try { const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const logoPath = resolve(__dirname, "../../../assets/stargilnails_logo_transparent.png"); const buf = await readFile(logoPath); const base64 = buf.toString("base64"); cachedLogoDataUrl = `data:image/png;base64,${base64}`; return cachedLogoDataUrl; } catch { return null; } } async function renderBrandedEmail(title, bodyHtml) { const logo = await getLogoDataUrl(); const domain = process.env.DOMAIN || 'localhost:5173'; const protocol = domain.includes('localhost') ? 'http' : 'https'; const homepageUrl = `${protocol}://${domain}`; return `
Hallo ${safeName},
wir haben deine Anfrage für ${formattedDate} um ${time} erhalten.
Wir bestätigen deinen Termin in Kürze. Du erhältst eine weitere E-Mail, sobald der Termin bestätigt ist.
${statusUrl ? `⏳ Termin-Status ansehen:
Du kannst den aktuellen Status deiner Buchung jederzeit einsehen:
Status ansehen📋 Rechtliche Informationen:
Weitere Informationen findest du in unserem Impressum und Datenschutz.
Liebe Grüße,
Stargirlnails Kiel
Hallo ${safeName},
wir haben deinen Termin am ${formattedDate} um ${time} bestätigt.
Wir freuen uns auf dich!
📋 Wichtiger Hinweis:
Die Allgemeinen Geschäftsbedingungen (AGB) findest du im Anhang dieser E-Mail. Bitte lies sie vor deinem Termin durch.
📅 Termin verwalten:
Du kannst deinen Termin-Status einsehen und bei Bedarf stornieren:
Termin ansehen & verwalten⭐ Bewertung abgeben:
Nach deinem Termin würden wir uns über deine Bewertung freuen!
Bewertung schreibenDu kannst deine Bewertung nach dem Termin über diesen Link abgeben.
📋 Rechtliche Informationen:
Weitere Informationen findest du in unserem Impressum und Datenschutz.
Liebe Grüße,
Stargirlnails Kiel
Hallo ${safeName},
dein Termin am ${formattedDate} um ${time} wurde abgesagt.
Bitte buche einen neuen Termin. Bei Fragen helfen wir dir gerne weiter.
📋 Rechtliche Informationen:
Weitere Informationen findest du in unserem Impressum und Datenschutz.
Liebe Grüße,
Stargirlnails Kiel
Hallo Admin,
eine neue Buchungsanfrage ist eingegangen:
📅 Buchungsdetails:
Bitte logge dich in das Admin-Panel ein, um die Buchung zu bestätigen oder abzulehnen.
Liebe Grüße,
Stargirlnails System
Hallo ${safeName},
wir müssen deinen Termin leider verschieben. Hier ist unser Vorschlag:
📅 Übersicht
Alter Termin | ${formattedOriginalDate} um ${params.originalTime} Uhr |
Neuer Vorschlag | ${formattedProposedDate} um ${params.proposedTime} Uhr |
Behandlung | ${safeTreatment} |
Falls du einen komplett neuen Termin buchen möchtest, kannst du deinen aktuellen Termin stornieren und einen neuen Termin auf unserer Website buchen.
Liebe Grüße,
Stargirlnails Kiel
Hallo Admin,
der Kunde ${safeCustomerName} hat den Terminänderungsvorschlag abgelehnt.
Bitte kontaktiere den Kunden, um eine alternative Lösung zu finden.
`; return renderBrandedEmail("Kunde hat Terminänderung abgelehnt", inner); } export async function renderAdminRescheduleAcceptedHTML(params) { const safeCustomerName = sanitizeText(params.customerName); const safeTreatment = sanitizeText(params.treatmentName); const inner = `Hallo Admin,
der Kunde ${safeCustomerName} hat den Terminänderungsvorschlag akzeptiert.
Der Termin wurde automatisch aktualisiert.
`; return renderBrandedEmail("Kunde hat Terminänderung akzeptiert", inner); } export async function renderAdminRescheduleExpiredHTML(params) { const inner = `Hallo Admin,
${params.expiredProposals.length} Terminänderungsvorschlag${params.expiredProposals.length > 1 ? 'e' : ''} ${params.expiredProposals.length > 1 ? 'sind' : 'ist'} abgelaufen und wurde${params.expiredProposals.length > 1 ? 'n' : ''} automatisch entfernt.
⚠️ Abgelaufene Vorschläge:
${params.expiredProposals.map(proposal => { const safeName = sanitizeText(proposal.customerName); const safeTreatment = sanitizeText(proposal.treatmentName); const safeEmail = proposal.customerEmail ? sanitizeText(proposal.customerEmail) : undefined; const safePhone = proposal.customerPhone ? sanitizeText(proposal.customerPhone) : undefined; return `Bitte kontaktiere die Kunden, um eine alternative Lösung zu finden.
Die ursprünglichen Termine bleiben bestehen.
`; return renderBrandedEmail("Abgelaufene Terminänderungsvorschläge", inner); }