feat(crm): end_customers table, RLS, wizard customer selector, /my-customers CRUD, GDPR anonymization

This commit is contained in:
DanielS
2026-06-17 01:57:17 +02:00
parent d96be1ace9
commit fb124b549c
12 changed files with 855 additions and 51 deletions

View File

@@ -6,7 +6,7 @@ import { InvoicePDF } from '@/components/invoice-pdf'
import { renderToBuffer } from '@react-pdf/renderer'
import React from 'react'
import { buildCustomerSnapshot, buildOrderSnapshot } from '@/lib/license-transform'
import type { Category, Order, Product, Profile, WizardSelections } from '@/lib/types'
import type { Category, EndCustomer, Order, Product, Profile, WizardSelections } from '@/lib/types'
// ─── Hilfsfunktionen ─────────────────────────────────────────────────────────
@@ -51,15 +51,18 @@ export async function submitOrder(params: {
products: Product[]
categories: Category[]
customerProfile: Partial<Profile>
endCustomerId?: string | null
endCustomer?: EndCustomer | null
}): Promise<Order> {
const { selections, products, categories, customerProfile } = params
const { selections, products, categories, customerProfile, endCustomerId, endCustomer } = params
const supabase = await createClient()
const { data: { user } } = await supabase.auth.getUser()
if (!user) throw new Error('Not authenticated')
// 1. Snapshots aufbauen
const customerSnapshot = buildCustomerSnapshot(customerProfile)
// Wenn Endkunde vorhanden: dessen Daten einfrieren; sonst Partner-Profil (Fallback)
const customerSnapshot = buildCustomerSnapshot(customerProfile, endCustomer ?? null)
const orderSnapshot = buildOrderSnapshot(selections, products, categories)
// 2. Idempotenz-Guard: Prüfen ob identische Bestellung in den letzten 30s existiert
@@ -102,6 +105,7 @@ export async function submitOrder(params: {
user_id: user.id,
order_number: orderNumber,
order_hash: orderHash,
end_customer_id: endCustomerId ?? null,
total_price: orderSnapshot.total,
customer_data: customerSnapshot,
order_data: orderSnapshot,