diff --git a/shop/lib/actions/email-templates.ts b/shop/lib/actions/email-templates.ts
index 0357beb..cab0262 100644
--- a/shop/lib/actions/email-templates.ts
+++ b/shop/lib/actions/email-templates.ts
@@ -6,6 +6,9 @@ interface EmailDetails {
totalDetailsHtml: string
itemsDetailsText?: string
itemsDetailsHtml?: string
+ partnerCompanyName?: string
+ partnerUserName?: string
+ partnerUserEmail?: string
}
export function getOrderEmailTemplate(
@@ -18,7 +21,47 @@ export function getOrderEmailTemplate(
? `Deine Anfrage ${details.orderNumber} wurde aktualisiert.`
: `Deine Anfrage ${details.orderNumber} ist bei uns eingegangen und wird bearbeitet.`
- 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${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`
+ 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 = `
@@ -40,6 +83,7 @@ export function getOrderEmailTemplate(
Kunde: |
${details.customerCompanyName} |
+ ${partnerHtml}
${details.itemsDetailsHtml || ''}
${details.totalDetailsHtml}
diff --git a/shop/lib/actions/orders.ts b/shop/lib/actions/orders.ts
index 6139c33..abec8e9 100644
--- a/shop/lib/actions/orders.ts
+++ b/shop/lib/actions/orders.ts
@@ -68,7 +68,7 @@ export async function submitOrder(params: {
// Check if user is assigned to a company or is admin
const { data: dbUser } = await supabase
.from('users')
- .select('role, company_id')
+ .select('role, company_id, first_name, last_name, email')
.eq('id', user.id)
.single()
@@ -77,6 +77,22 @@ export async function submitOrder(params: {
throw new Error('Sie müssen einer Firma zugewiesen sein, um eine Anfrage zu erstellen.')
}
+ let partnerCompanyName = ''
+ if (dbUser?.company_id) {
+ const { data: comp } = await supabase
+ .from('companies')
+ .select('name')
+ .eq('id', dbUser.company_id)
+ .single()
+ if (comp) {
+ partnerCompanyName = comp.name
+ }
+ } else if (isAdminUser) {
+ partnerCompanyName = 'Administrator / Direktbestellung'
+ }
+ const partnerUserName = dbUser ? [dbUser.first_name, dbUser.last_name].filter(Boolean).join(' ') : ''
+ const partnerUserEmail = dbUser?.email || user.email
+
// Fetch catalog directly from DB to prevent client tampering
const dbProducts = await getProducts()
const dbCategories = await getCategories()
@@ -267,7 +283,10 @@ export async function submitOrder(params: {
totalDetailsText,
totalDetailsHtml,
itemsDetailsText: itemsSection.text,
- itemsDetailsHtml: itemsSection.html
+ itemsDetailsHtml: itemsSection.html,
+ partnerCompanyName,
+ partnerUserName,
+ partnerUserEmail
}, `${process.env.NEXT_PUBLIC_SITE_URL || 'https://staging.hephex.de'}`, false)
await sendMail({
@@ -283,6 +302,37 @@ export async function submitOrder(params: {
}
]
})
+
+ // Notify all admins
+ try {
+ const adminClient = createAdminClient()
+ const { data: admins } = await adminClient
+ .from('users')
+ .select('email')
+ .eq('role', 'admin')
+ if (admins) {
+ const adminEmails = admins.map((a: any) => a.email).filter(Boolean)
+ for (const adminEmail of adminEmails) {
+ if (adminEmail !== user.email) {
+ await sendMail({
+ to: adminEmail,
+ subject: `[Admin-Kopie] Anfragebestätigung ${orderNumber}`,
+ text: emailTemplate.text,
+ html: emailTemplate.html,
+ attachments: [
+ {
+ filename: `Anfragebestaetigung_${orderNumber}.pdf`,
+ content: buffer,
+ contentType: 'application/pdf',
+ }
+ ]
+ })
+ }
+ }
+ }
+ } catch (adminMailError) {
+ console.error('Failed to notify admins of new order:', adminMailError)
+ }
} catch (mailError) {
console.error('Failed to send order confirmation mail:', mailError)
}
@@ -407,6 +457,29 @@ export async function updateOrderStatus(
}
await sendMail(mailOptions)
+
+ // Notify admins
+ try {
+ const adminClient = createAdminClient()
+ const { data: admins } = await adminClient
+ .from('users')
+ .select('email')
+ .eq('role', 'admin')
+ if (admins) {
+ const adminEmails = admins.map((a: any) => a.email).filter(Boolean)
+ for (const adminEmail of adminEmails) {
+ if (adminEmail !== user.email) {
+ await sendMail({
+ ...mailOptions,
+ to: adminEmail,
+ subject: `[Admin-Kopie] Statusänderung Ihrer Anfrage ${orderNumber}`
+ })
+ }
+ }
+ }
+ } catch (adminMailError) {
+ console.error('Failed to notify admins of status update:', adminMailError)
+ }
}
} catch (mailError) {
console.error('Failed to send status update email:', mailError)
@@ -545,6 +618,30 @@ export async function rejectOrder(
text: statusEmail.text,
html: statusEmail.html
})
+
+ // Notify admins
+ try {
+ const adminClient = createAdminClient()
+ const { data: admins } = await adminClient
+ .from('users')
+ .select('email')
+ .eq('role', 'admin')
+ if (admins) {
+ const adminEmails = admins.map((a: any) => a.email).filter(Boolean)
+ for (const adminEmail of adminEmails) {
+ if (adminEmail !== orderUser.email) {
+ await sendMail({
+ to: adminEmail,
+ subject: `[Admin-Kopie] Anfrage abgelehnt: ${orderNumber}`,
+ text: statusEmail.text,
+ html: statusEmail.html
+ })
+ }
+ }
+ }
+ } catch (adminMailError) {
+ console.error('Failed to notify admins of order rejection:', adminMailError)
+ }
}
} catch (mailError) {
console.error('Failed to send rejection email:', mailError)
@@ -772,6 +869,32 @@ export async function updateOrder(
`
}
+ // Load partner details for update email
+ let partnerCompanyName = ''
+ let partnerUserName = ''
+ let partnerUserEmail = ''
+ if (order?.user_id) {
+ const { data: orderDbUser } = await supabase
+ .from('users')
+ .select('first_name, last_name, email, company_id')
+ .eq('id', order.user_id)
+ .single()
+ if (orderDbUser) {
+ partnerUserName = [orderDbUser.first_name, orderDbUser.last_name].filter(Boolean).join(' ')
+ partnerUserEmail = orderDbUser.email || ''
+ if (orderDbUser.company_id) {
+ const { data: comp } = await supabase
+ .from('companies')
+ .select('name')
+ .eq('id', orderDbUser.company_id)
+ .single()
+ if (comp) {
+ partnerCompanyName = comp.name
+ }
+ }
+ }
+ }
+
const itemsSection = buildEmailItemsSection(items)
const emailTemplate = getOrderEmailTemplate({
@@ -781,7 +904,10 @@ export async function updateOrder(
totalDetailsText,
totalDetailsHtml,
itemsDetailsText: itemsSection.text,
- itemsDetailsHtml: itemsSection.html
+ itemsDetailsHtml: itemsSection.html,
+ partnerCompanyName,
+ partnerUserName,
+ partnerUserEmail
}, `${process.env.NEXT_PUBLIC_SITE_URL || 'https://staging.hephex.de'}`, true)
await sendMail({
@@ -797,6 +923,37 @@ export async function updateOrder(
}
]
})
+
+ // Notify admins
+ try {
+ const adminClient = createAdminClient()
+ const { data: admins } = await adminClient
+ .from('users')
+ .select('email')
+ .eq('role', 'admin')
+ if (admins) {
+ const adminEmails = admins.map((a: any) => a.email).filter(Boolean)
+ for (const adminEmail of adminEmails) {
+ if (adminEmail !== orderUserEmail) {
+ await sendMail({
+ to: adminEmail,
+ subject: `[Admin-Kopie] Anfrageänderung ${order.order_number}`,
+ text: emailTemplate.text,
+ html: emailTemplate.html,
+ attachments: [
+ {
+ filename: `Anfragebestaetigung_${order.order_number}.pdf`,
+ content: buffer,
+ contentType: 'application/pdf',
+ }
+ ]
+ })
+ }
+ }
+ }
+ } catch (adminMailError) {
+ console.error('Failed to notify admins of order update:', adminMailError)
+ }
} catch (mailError) {
console.error('Failed to send order update confirmation mail:', mailError)
}