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,
primaryColor: string = '#2563eb'
) {
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
| Nummer: |
${details.orderNumber} |
| Datum: |
${details.formattedDate} |
| Kunde: |
${details.customerCompanyName} |
${partnerHtml}
${details.itemsDetailsHtml || ''}
${details.totalDetailsHtml}
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 = `
${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
}
}