86 lines
3.4 KiB
Markdown
86 lines
3.4 KiB
Markdown
# Datenmodell & Beziehungen (Schema)
|
|
|
|
Das Datenbankschema besteht aus folgenden Tabellen im Schema `public`:
|
|
|
|
### `companies` (Unternehmen)
|
|
- Repräsentiert die Partner-Unternehmen (Retailer).
|
|
- `id` (UUID, Primary Key)
|
|
- `name` (TEXT)
|
|
- `street`, `zip`, `city`, `email` (Adressdaten)
|
|
|
|
### `users` (Systembenutzer)
|
|
- Erweitert die Authentifizierungsdaten aus `auth.users`.
|
|
- `id` (UUID, References `auth.users(id)`)
|
|
- `role` (TEXT, standardmäßig `'partner'`, oder `'admin'`)
|
|
- `company_id` (UUID, References `public.companies(id)`)
|
|
|
|
### `end_customers` (Endkunden)
|
|
- Die Endkunden, für die die Partner Lizenzen bestellen.
|
|
- `id` (UUID, Primary Key)
|
|
- `partner_id` (UUID, References `public.companies(id)`) <-- *Direkte Zuordnung zur Firma des Partners*
|
|
- `company_name` (TEXT)
|
|
- `first_name`, `last_name`, `street`, `zip`, `city`, `email` (Stammdaten)
|
|
- `bank_iban`, `bank_bic`, `bank_name`, `bank_owner` (Bankdaten)
|
|
- `is_anonymized` (BOOLEAN) <-- *Für DSGVO-Löschung*
|
|
|
|
### `categories` (Kategorien)
|
|
- Steuert das Layout und Verhalten im Wizard.
|
|
- `id` (UUID, Primary Key)
|
|
- `name` (TEXT)
|
|
- `is_required` (BOOLEAN) <-- *Muss ausgewählt werden*
|
|
- `allow_multiselect` (BOOLEAN) <-- *Mehrfachauswahl erlaubt (Checkbox statt Radio)*
|
|
- `sort_order` (INTEGER) <-- *Sortierung im Wizard*
|
|
- `show_in_branches` (BOOLEAN)
|
|
- `preselect` (BOOLEAN)
|
|
- `resets_others` (BOOLEAN)
|
|
- `allow_update_discount` (BOOLEAN) <-- *Berechtigung für Update-Rabatt*
|
|
|
|
### `products` (Katalogprodukte / Basis-Editionen)
|
|
- Hauptlösungen (z.B. Basic-Kasse, Backoffice).
|
|
- `id` (UUID, Primary Key)
|
|
- `category_id` (UUID, References `categories`)
|
|
- `name` (TEXT)
|
|
- `base_price` (DECIMAL)
|
|
- `tax_rate` (DECIMAL)
|
|
- `billing_interval` (TEXT: `'one_time'` / `'monthly'`)
|
|
- `show_in_branches` (BOOLEAN)
|
|
|
|
### `modules` (Zusatzmodule / Erweiterungen)
|
|
- Optionale Erweiterungen für Produkte. Repräsentiert im TypeScript-Code durch das Interface `ProductModule`.
|
|
- `id` (UUID, Primary Key)
|
|
- `product_id` (UUID, References `products`)
|
|
- `category_id` (UUID, References `categories`)
|
|
- `name` (TEXT)
|
|
- `price` (DECIMAL)
|
|
- `has_quantity` (BOOLEAN)
|
|
|
|
### `global_inclusions` (Globale automatische Beigaben)
|
|
- Regelt, welche Module bei Auswahl eines Produkts kostenlos enthalten sind.
|
|
- `id` (UUID, Primary Key)
|
|
- `trigger_product_id` (UUID, References `products`)
|
|
- `included_module_id` (UUID, References `modules`)
|
|
|
|
### `global_exclusions` (Globale Ausschlüsse)
|
|
- Regelt Inkompatibilitäten zwischen Produkten und/oder Modulen.
|
|
- `id` (UUID, Primary Key)
|
|
- `product_id` (UUID, References `products`)
|
|
- `excluded_product_id` (UUID, References `products`, optional)
|
|
- `excluded_module_id` (UUID, References `modules`, optional)
|
|
|
|
### `orders` (Bestellungen / Anfragen)
|
|
- Gespeicherte Snapshots von Konfigurationen.
|
|
- `id` (UUID, Primary Key)
|
|
- `user_id` (UUID, References `auth.users(id)`)
|
|
- `company_id` (UUID, References `public.companies(id)`)
|
|
- `end_customer_id` (UUID, References `end_customers(id)`)
|
|
- `order_number` (TEXT, Format: `AE-YYYY-NNNNN`)
|
|
- `order_hash` (TEXT, Idempotenz-Guard)
|
|
- `type` (TEXT: `'purchase'` / `'subscription'`) <-- *Wichtig für den Checkout-Split*
|
|
- `payment_method` (TEXT) <-- *Rechnung bei Kauf, SEPA bei Abo*
|
|
- `total_price` (DECIMAL)
|
|
- `customer_data` (JSONB) <-- *Stammdaten zum Bestellzeitpunkt*
|
|
- `order_data` (JSONB) <-- *Konfiguration zum Bestellzeitpunkt*
|
|
- `pdf_url` (TEXT)
|
|
- `status` (TEXT: `'pending'`, `'active'`, `'completed'`, `'cancelled'`)
|
|
- `created_at` (TIMESTAMPTZ)
|