-- Pfandsystem Demo - Multi-Tenant Schema -- ZUGFeRD-Konvention: utf8mb4, InnoDB -- Tenant-Modell: jede Daten-Tabelle hat tenant_id (FK auf tenants.id) SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ========================================================= -- TENANTS (Mandanten / Demo-Accounts) -- ========================================================= CREATE TABLE IF NOT EXISTS tenants ( id CHAR(36) NOT NULL DEFAULT (UUID()), name VARCHAR(255) NOT NULL, slug VARCHAR(64) NOT NULL UNIQUE, kontakt_email VARCHAR(255) NULL, firma VARCHAR(255) NULL, typ ENUM('demo','live') NOT NULL DEFAULT 'demo', status ENUM('aktiv','abgelaufen','gesperrt') NOT NULL DEFAULT 'aktiv', demo_expires_at TIMESTAMP NULL, max_users INT NOT NULL DEFAULT 5, erstellt_am TIMESTAMP DEFAULT CURRENT_TIMESTAMP, aktualisiert_am TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), INDEX idx_slug (slug), INDEX idx_status (status), INDEX idx_demo_expires (demo_expires_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ========================================================= -- MITARBEITER (Users) - tenant-scoped, plus SuperAdmins -- ========================================================= CREATE TABLE IF NOT EXISTS mitarbeiter ( id CHAR(36) NOT NULL DEFAULT (UUID()), tenant_id CHAR(36) NULL, -- NULL = SuperAdmin (cross-tenant) email VARCHAR(255) NOT NULL, password_hash VARCHAR(255) NOT NULL, name VARCHAR(255) NULL, rolle ENUM('superadmin','admin','user','fahrer') NOT NULL DEFAULT 'user', aktiv TINYINT(1) NOT NULL DEFAULT 1, erstellt_am TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_tenant_email (tenant_id, email), FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE, INDEX idx_email (email), INDEX idx_tenant (tenant_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ========================================================= -- KUNDEN - mit Anlieferungshinweis + Lieferzeit (Erweiterung 1+3) -- ========================================================= CREATE TABLE IF NOT EXISTS kunden ( id CHAR(36) NOT NULL DEFAULT (UUID()), tenant_id CHAR(36) NOT NULL, name VARCHAR(255) NOT NULL, email VARCHAR(255) NULL, adresse TEXT NULL, telefon VARCHAR(50) NULL, ansprechpartner VARCHAR(255) NULL, notiz TEXT NULL, anrede VARCHAR(20) NULL, anlieferungshinweis TEXT NULL, lieferzeit_bis VARCHAR(10) NULL, -- z.B. "05:15" erstellt_am TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE, INDEX idx_name (name), INDEX idx_tenant (tenant_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ========================================================= -- KUNDEN_BILDER (Erweiterung 1) -- ========================================================= CREATE TABLE IF NOT EXISTS kunden_bilder ( id CHAR(36) NOT NULL DEFAULT (UUID()), tenant_id CHAR(36) NOT NULL, kunde_id CHAR(36) NOT NULL, dateiname VARCHAR(500) NOT NULL, beschreibung VARCHAR(500) NULL, sortierung INT NOT NULL DEFAULT 0, erstellt_am TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE, FOREIGN KEY (kunde_id) REFERENCES kunden(id) ON DELETE CASCADE, INDEX idx_kunde (kunde_id), INDEX idx_tenant (tenant_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ========================================================= -- ARTIKEL (Pfandartikel) -- ========================================================= CREATE TABLE IF NOT EXISTS artikel ( id CHAR(36) NOT NULL DEFAULT (UUID()), tenant_id CHAR(36) NOT NULL, bezeichnung VARCHAR(255) NOT NULL, pfand_betrag DECIMAL(10, 2) NOT NULL, erstellt_am TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE, INDEX idx_bezeichnung (bezeichnung), INDEX idx_tenant (tenant_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ========================================================= -- GERAETE (Erweiterung 4: Seriennummern-Verwaltung) -- ========================================================= CREATE TABLE IF NOT EXISTS geraete ( id CHAR(36) NOT NULL DEFAULT (UUID()), tenant_id CHAR(36) NOT NULL, seriennummer VARCHAR(255) NOT NULL, typ VARCHAR(100) NOT NULL, -- z.B. "Ofen", "Kuehlschrank" bezeichnung VARCHAR(255) NULL, -- z.B. "Miwe Condo 3-Etagen" kunde_id CHAR(36) NULL, -- aktueller Standort status ENUM('aktiv','in_reparatur','ausgemustert','lager') NOT NULL DEFAULT 'aktiv', notiz TEXT NULL, erstellt_am TIMESTAMP DEFAULT CURRENT_TIMESTAMP, aktualisiert_am TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_tenant_serial (tenant_id, seriennummer), FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE, FOREIGN KEY (kunde_id) REFERENCES kunden(id) ON DELETE SET NULL, INDEX idx_tenant (tenant_id), INDEX idx_kunde (kunde_id), INDEX idx_status (status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ========================================================= -- LIEFERUNGEN -- ========================================================= CREATE TABLE IF NOT EXISTS lieferungen ( id INT AUTO_INCREMENT NOT NULL, tenant_id CHAR(36) NOT NULL, kunde_id CHAR(36) NULL, artikel_id CHAR(36) NULL, anzahl INT NOT NULL, foto_url VARCHAR(500) NULL, mitarbeiter_id CHAR(36) NULL, erstellt_am TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE, FOREIGN KEY (kunde_id) REFERENCES kunden(id) ON DELETE CASCADE, FOREIGN KEY (artikel_id) REFERENCES artikel(id) ON DELETE CASCADE, FOREIGN KEY (mitarbeiter_id) REFERENCES mitarbeiter(id) ON DELETE SET NULL, INDEX idx_tenant (tenant_id), INDEX idx_kunde (kunde_id), INDEX idx_artikel (artikel_id), INDEX idx_erstellt_am (erstellt_am) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ========================================================= -- RUECKNAHMEN -- ========================================================= CREATE TABLE IF NOT EXISTS ruecknahmen ( id INT AUTO_INCREMENT NOT NULL, tenant_id CHAR(36) NOT NULL, kunde_id CHAR(36) NULL, artikel_id CHAR(36) NULL, anzahl INT NOT NULL, foto_url VARCHAR(500) NULL, mitarbeiter_id CHAR(36) NULL, erstellt_am TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE, FOREIGN KEY (kunde_id) REFERENCES kunden(id) ON DELETE CASCADE, FOREIGN KEY (artikel_id) REFERENCES artikel(id) ON DELETE CASCADE, FOREIGN KEY (mitarbeiter_id) REFERENCES mitarbeiter(id) ON DELETE SET NULL, INDEX idx_tenant (tenant_id), INDEX idx_kunde (kunde_id), INDEX idx_artikel (artikel_id), INDEX idx_erstellt_am (erstellt_am) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; SET FOREIGN_KEY_CHECKS = 1; -- ========================================================= -- Seed: SuperAdmin (tenant_id NULL) + Demo-Tenant -- Passwort wird beim ersten Backend-Start gesetzt (env SUPERADMIN_*) -- =========================================================