interface EmailDetails { orderNumber: string formattedDate: string customerCompanyName: string totalDetailsText: string totalDetailsHtml: string itemsDetailsText?: string itemsDetailsHtml?: string partnerCompanyName?: string partnerUserName?: string partnerUserEmail?: string } export function getOrderEmailTemplate( details: EmailDetails, siteUrl: string, isUpdate: boolean = false ) { const title = isUpdate ? 'Anfrage geändert' : 'Anfrage erhalten' const intro = isUpdate ? `Deine Anfrage ${details.orderNumber} wurde aktualisiert.` : `Deine Anfrage ${details.orderNumber} ist bei uns eingegangen und wird bearbeitet.` let partnerText = '' let partnerHtml = '' if (details.partnerCompanyName || details.partnerUserName || details.partnerUserEmail) { partnerText = `\nPartner-Informationen:` if (details.partnerCompanyName) partnerText += `\n- Firma: ${details.partnerCompanyName}` if (details.partnerUserName) partnerText += `\n- Benutzer: ${details.partnerUserName}` if (details.partnerUserEmail) partnerText += `\n- E-Mail: ${details.partnerUserEmail}` partnerText += `\n` partnerHtml = ` Partner-Informationen: ` if (details.partnerCompanyName) { partnerHtml += ` Firma: ${details.partnerCompanyName} ` } if (details.partnerUserName) { partnerHtml += ` Benutzer: ${details.partnerUserName} ` } if (details.partnerUserEmail) { partnerHtml += ` E-Mail: ${details.partnerUserEmail} ` } } const text = `Hallo,\n\n${isUpdate ? 'Deine Anfrage wurde aktualisiert.' : 'Deine Anfrage ist bei uns eingegangen.'}\n\nDetails:\n- Nummer: ${details.orderNumber}\n- Datum: ${details.formattedDate}\n- Kunde: ${details.customerCompanyName}\n${partnerText}${details.itemsDetailsText || ''}\n${details.totalDetailsText}\n\nDeine Anfragebestätigung findest du im Anhang als PDF.\n\nPDF-Link: ${siteUrl}/api/orders/${details.orderNumber}/download\n\nViele Grüße,\nDein CASPOS Team` const html = `

${title}

Hallo,

${intro}

Details

${partnerHtml} ${details.itemsDetailsHtml || ''} ${details.totalDetailsHtml}
Nummer: ${details.orderNumber}
Datum: ${details.formattedDate}
Kunde: ${details.customerCompanyName}

Die Bestätigung liegt als PDF im Anhang.

Anfragebestätigung PDF herunterladen

Viele Grüße,
Dein CASPOS Team

` return { text, html } } export function getStatusEmailTemplate( orderNumber: string, oldLabel: string, newLabel: string, statusKey?: string, rejectionReason?: string ) { const formattedOrderNumber = orderNumber.replace(/^BE-/, 'AE-') let title = 'Statusänderung' let intro = `der Status deiner Anfrage #${formattedOrderNumber} wurde aktualisiert.` let statusColor = '#f59e0b' // Amber default let showAttachmentBadge = false if (statusKey === 'approved' || statusKey === 'active' || statusKey === 'completed') { title = 'Freigabebestätigung' intro = `Ihre Anfrage #${formattedOrderNumber} wurde erfolgreich freigegeben und ist nun aktiv. Die unterzeichnete Anfragebestätigung finden Sie im Anhang dieses Schreibens.` statusColor = '#10b981' // Emerald showAttachmentBadge = true } else if (statusKey === 'rejected') { title = 'Anfrage abgelehnt' intro = `Ihre Anfrage #${formattedOrderNumber} wurde vom Support geprüft und abgelehnt.` statusColor = '#ef4444' // Red } else if (statusKey === 'pending_approval' || statusKey === 'in_review' || statusKey === 'pending') { title = 'Eingangsbestätigung' intro = `Ihre Anfrage #${formattedOrderNumber} ist eingegangen und wird derzeit von unserem Support geprüft.` statusColor = '#f59e0b' } const text = `Hallo,\n\n${title}\n\n${intro.replace(/<[^>]*>/g, '')}\n\nStatus: ${newLabel} (vorher: ${oldLabel})\n${rejectionReason ? `Grund: ${rejectionReason}\n` : ''}\nViele Grüße,\nDein CASPOS Team` const reasonSection = rejectionReason ? `

Begründung:

"${rejectionReason}"

` : '' const footerActions = showAttachmentBadge ? `

📎 PDF im Anhang verfügbar

` : '' const html = `

CASPOS

Die Kasse

${title}

Hallo,

${intro}

Anfragenummer: #${formattedOrderNumber}
Vorher: ${oldLabel}
Aktuell: ${newLabel}
${reasonSection}
${footerActions}

CASPOS Computerabrechnungssysteme GmbH · Alte Bundesstraße 16 · 76846 Hauenstein

Dies ist eine automatisch generierte Systembenachrichtigung.

` return { text, html } } export function buildEmailItemsSection(items: any[]) { const groupedItems: { [key: string]: any[] } = {} items.forEach((item: any) => { const devName = item.device_name || 'Kasse 1' if (!groupedItems[devName]) { groupedItems[devName] = [] } groupedItems[devName].push(item) }) let itemsDetailsText = '\nKassen-Konfigurationen:' let itemsDetailsHtml = ` Kassen-Konfigurationen: ` Object.entries(groupedItems).forEach(([deviceName, devItems]) => { itemsDetailsText += `\n- Kasse: ${deviceName}` itemsDetailsHtml += ` Kasse: ${deviceName} ` devItems.forEach((item: any) => { itemsDetailsText += `\n * ${item.product_name} (${item.category_name}): ${item.base_price.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })} ${item.billing_interval === 'one_time' ? 'einmalig' : 'mtl.'}` itemsDetailsHtml += ` ${item.product_name} (${item.category_name}) ${item.base_price.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })} ${item.billing_interval === 'one_time' ? 'einmalig' : 'mtl.'} ` item.selected_modules?.forEach((mod: any) => { const qty = mod.quantity || 1 const price = mod.total_price ?? (mod.price * qty) itemsDetailsText += `\n + ${mod.module_name} ${qty > 1 ? `(x${qty})` : ''}: +${price.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })} mtl.` itemsDetailsHtml += ` + ${mod.module_name} ${qty > 1 ? `(x${qty})` : ''} +${price.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })} mtl. ` }) }) }) return { text: itemsDetailsText + '\n', html: itemsDetailsHtml } }