feat: restructure checkout steps, add Kauf/Abo selection and product display flags
All checks were successful
Staging Build / build (push) Successful in 2m41s

This commit is contained in:
DanielS
2026-06-25 09:03:53 +02:00
parent eafd890297
commit f9fb90848b
6 changed files with 358 additions and 180 deletions

View File

@@ -55,8 +55,9 @@ export async function submitOrder(params: {
customerProfile: Partial<Profile>
endCustomerId?: string | null
endCustomer?: EndCustomer | null
billingInterval?: 'one_time' | 'monthly'
}): Promise<Order> {
const { selections, customerProfile, endCustomerId, endCustomer } = params
const { selections, customerProfile, endCustomerId, endCustomer, billingInterval } = params
const supabase = await createClient()
const { data: { user } } = await supabase.auth.getUser()
@@ -105,7 +106,7 @@ export async function submitOrder(params: {
// 1. Snapshots aufbauen
// Wenn Endkunde vorhanden: dessen Daten einfrieren; sonst Partner-Profil (Fallback)
const customerSnapshot = buildCustomerSnapshot(customerProfile, endCustomer ?? null)
const orderSnapshot = buildOrderSnapshot(selections, dbProducts, dbCategories)
const orderSnapshot = buildOrderSnapshot(selections, dbProducts, dbCategories, billingInterval)
// 2. Idempotenz-Guard: Prüfen ob identische Bestellung in den letzten 30s existiert
const orderHash = hashOrderSnapshot(orderSnapshot)

View File

@@ -84,7 +84,8 @@ export function buildCustomerSnapshot(
export function buildOrderSnapshot(
selections: WizardSelections,
products: Product[],
categories: Category[]
categories: Category[],
billingInterval?: 'one_time' | 'monthly'
): OrderSnapshot {
const items: OrderItem[] = []
let subtotal = 0
@@ -127,10 +128,10 @@ export function buildOrderSnapshot(
const taxAmount = Math.round(subtotal * (dominantTaxRate / 100) * 100) / 100
const total = Math.round((subtotal + taxAmount) * 100) / 100
// Wenn alle Items one_time sind → billing_cycle = 'one_time', sonst 'monthly'
const billingCycle = items.every((i) => i.billing_interval === 'one_time')
// Wenn billingInterval übergeben, dieses nutzen; sonst automatisch ermitteln
const billingCycle = billingInterval || (items.every((i) => i.billing_interval === 'one_time')
? 'one_time'
: 'monthly'
: 'monthly')
return {
schema_version: 1,

View File

@@ -13,6 +13,8 @@ export type Product = {
category?: Category | null
modules?: ProductModule[]
created_at: string
show_in_kauf?: boolean
show_in_abo?: boolean
}
export type Category = {