diff --git a/shop/app/actions/checkout.ts b/shop/app/actions/checkout.ts index 7efc618..6da064a 100644 --- a/shop/app/actions/checkout.ts +++ b/shop/app/actions/checkout.ts @@ -8,6 +8,8 @@ import { sendMail } from '@/utils/mail'; import { renderToBuffer } from '@react-pdf/renderer'; import React from 'react'; import { InvoicePDF } from '@/components/invoice-pdf'; +import { buildEmailItemsSection } from '@/lib/actions/orders'; +import { getOrderEmailTemplate } from '@/lib/actions/email-templates'; function generateOrderNumber(prefix: 'BE' | 'AE' = 'AE'): string { const year = new Date().getFullYear(); @@ -57,11 +59,119 @@ async function triggerPostProcessing(orderId: string, supabase: any, customerSna // E-Mail versenden if (email) { + const formattedDate = new Date(order.created_at).toLocaleDateString('de-DE'); + const taxRate = orderSnapshot.tax_rate ?? 19; + const items = orderSnapshot.items ?? []; + const oneTimeItems = items.filter((item: any) => item.billing_interval === 'one_time'); + const monthlyItems = items.filter((item: any) => item.billing_interval === 'monthly'); + + const oneTimeNet = oneTimeItems.reduce((sum: number, item: any) => sum + (item.item_total || 0), 0); + const oneTimeTax = Math.round(oneTimeNet * (taxRate / 100) * 100) / 100; + const oneTimeGross = Math.round((oneTimeNet + oneTimeTax) * 100) / 100; + + const monthlyNet = monthlyItems.reduce((sum: number, item: any) => sum + (item.item_total || 0), 0); + const monthlyTax = Math.round(monthlyNet * (taxRate / 100) * 100) / 100; + const monthlyGross = Math.round((monthlyNet + monthlyTax) * 100) / 100; + + let totalDetailsText = ''; + if (oneTimeNet > 0 && monthlyNet > 0) { + totalDetailsText = `\nEinmaliger Betrag:\n- Netto: ${oneTimeNet.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })}\n- zzgl. ${taxRate}% MwSt: ${oneTimeTax.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })}\n- Brutto Gesamtbetrag: ${oneTimeGross.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })}\n\nMonatlicher Betrag:\n- Netto: ${monthlyNet.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })} / Monat\n- zzgl. ${taxRate}% MwSt: ${monthlyTax.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })} / Monat\n- Brutto Gesamtbetrag: ${monthlyGross.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })} / Monat`; + } else if (oneTimeNet > 0) { + totalDetailsText = `\nGesamtsumme:\n- Netto: ${oneTimeNet.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })}\n- zzgl. ${taxRate}% MwSt: ${oneTimeTax.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })}\n- Brutto Gesamtbetrag: ${oneTimeGross.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })}`; + } else { + totalDetailsText = `\nGesamtsumme:\n- Netto: ${monthlyNet.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })} / Monat\n- zzgl. ${taxRate}% MwSt: ${monthlyTax.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })} / Monat\n- Brutto Gesamtbetrag: ${monthlyGross.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })} / Monat`; + } + + let totalDetailsHtml = ''; + if (oneTimeNet > 0 && monthlyNet > 0) { + totalDetailsHtml = ` +
Vielen Dank für Ihre Anfrage ${order.order_number}.
` + subject: `Anfragebestätigung ${order.order_number}`, + text: emailTemplate.text, + html: emailTemplate.html, + attachments: [ + { + filename: `Anfragebestaetigung_${order.order_number}.pdf`, + content: buffer, + contentType: 'application/pdf', + } + ] }); } } catch (err) { diff --git a/shop/lib/actions/orders.ts b/shop/lib/actions/orders.ts index 92a51af..55e7849 100644 --- a/shop/lib/actions/orders.ts +++ b/shop/lib/actions/orders.ts @@ -16,7 +16,7 @@ import { getOrderEmailTemplate, getStatusEmailTemplate } from '@/lib/actions/ema // ─── Hilfsfunktionen ───────────────────────────────────────────────────────── -function buildEmailItemsSection(items: any[]) { +export function buildEmailItemsSection(items: any[]) { const groupedItems: { [key: string]: any[] } = {} items.forEach((item: any) => { const devName = item.device_name || 'Kasse 1'