From 7a61002ef5816db1d65411a8b19c83124d7e2543 Mon Sep 17 00:00:00 2001 From: DanielS Date: Fri, 3 Jul 2026 08:50:28 +0200 Subject: [PATCH] feat(order): add net/tax/gross breakdown for one-time and monthly totals --- shop/app/order/success/page.tsx | 61 +++++++++- shop/components/HomeClient.tsx | 43 +------ shop/components/invoice-pdf.tsx | 77 ++++++++++--- shop/components/order-wizard.tsx | 26 ++--- shop/lib/actions/orders.ts | 192 +++++++++++++++++++++++++++++-- 5 files changed, 309 insertions(+), 90 deletions(-) diff --git a/shop/app/order/success/page.tsx b/shop/app/order/success/page.tsx index 4c3a40c..7f8b52e 100644 --- a/shop/app/order/success/page.tsx +++ b/shop/app/order/success/page.tsx @@ -36,6 +36,18 @@ export default async function OrderSuccessPage({ const o = order as Order const items = o.order_data?.items ?? [] + const taxRate = o.order_data?.tax_rate ?? 19 + const oneTimeItems = items.filter((item) => item.billing_interval === 'one_time') + const monthlyItems = items.filter((item) => item.billing_interval === 'monthly') + + const oneTimeNet = oneTimeItems.reduce((sum, item) => 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, item) => sum + (item.item_total || 0), 0) + const monthlyTax = Math.round(monthlyNet * (taxRate / 100) * 100) / 100 + const monthlyGross = Math.round((monthlyNet + monthlyTax) * 100) / 100 + const statusLabel: Record = { pending: 'Eingegangen', active: 'In Bearbeitung', @@ -104,12 +116,49 @@ export default async function OrderSuccessPage({ {/* Gesamtbetrag */} -
- Gesamtbetrag - - {new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(o.total_price)} - -
+ {oneTimeNet > 0 && ( +
+ {monthlyNet > 0 &&

Einmaliger Betrag

} +
+ Netto: + {new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(oneTimeNet)} +
+
+ zzgl. {taxRate}% MwSt.: + {new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(oneTimeTax)} +
+
+ Brutto Gesamtbetrag: + 0 ? "text-white" : "text-gradient"}> + {new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(oneTimeGross)} + +
+
+ )} + + {oneTimeNet > 0 && monthlyNet > 0 && ( + + )} + + {monthlyNet > 0 && ( +
+ {oneTimeNet > 0 &&

Monatlicher Betrag

} +
+ Netto: + {new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(monthlyNet)} / Monat +
+
+ zzgl. {taxRate}% MwSt.: + {new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(monthlyTax)} / Monat +
+
+ Brutto Gesamtbetrag: + + {new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(monthlyGross)} / Monat + +
+
+ )} {o.order_data?.price_multiplier !== null && o.order_data?.price_multiplier !== undefined && (
diff --git a/shop/components/HomeClient.tsx b/shop/components/HomeClient.tsx index 8672baa..0e68159 100644 --- a/shop/components/HomeClient.tsx +++ b/shop/components/HomeClient.tsx @@ -130,14 +130,13 @@ export function HomeClient({ initialUser }: HomeClientProps) { variants={itemVariants} className="text-4xl font-extrabold tracking-tight sm:text-5xl md:text-6xl lg:text-7xl/tight bg-clip-text text-transparent bg-gradient-to-b from-white via-slate-100 to-slate-400" > - POS Software Lizenzen & Module + CASPOS Software Lizenzen & Module Erwerben und verwalten Sie digitale Lizenzen für CASPOS Kassensysteme. - Sofortige Aktivierung und automatische Bereitstellung für Ihre Kunden.
@@ -347,46 +346,6 @@ export function HomeClient({ initialUser }: HomeClientProps) { - {/* Core values / Features list */} -
-
-
-
-
- Sicherheit & Stabilität -
-

- Verlässliche Plattform für Lizenz-Aktivierungen -

-

- Unsere Kassenlösungen sind GoBD-konform und offline-fähig. Über den Lizenz-Management-Server werden alle Lizenzen und Module verschlüsselt übertragen und sind innerhalb weniger Millisekunden auf der Kasse aktiv. -

-
-
-
- -
GoBD Konformität
-

Konform nach allen aktuellen steuerrechtlichen Anforderungen.

-
-
- -
Same-Day-Bearbeitung
-

Bearbeitung und Erstellung Ihrer Lizenzen noch am selben Werktag.

-
-
- -
Verschlüsselte Keys
-

Sichere Lizenz-Authentifizierung direkt auf der Kasse.

-
-
- -
Partner Support
-

Schnelle Hilfe und kompetente Ansprechpartner für Händler.

-
-
-
-
-
{/* Footer */}