CREATE TABLE IF NOT EXISTS tenants ( id INT AUTO_INCREMENT PRIMARY KEY, slug VARCHAR(100) NOT NULL, name VARCHAR(255) NOT NULL, status VARCHAR(30) NOT NULL DEFAULT 'active', timezone VARCHAR(100) NOT NULL DEFAULT 'Europe/Berlin', locale VARCHAR(20) NOT NULL DEFAULT 'de-DE', currency_code CHAR(3) NOT NULL DEFAULT 'EUR', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uq_tenants_slug (slug), KEY idx_tenants_status (status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS tenant_settings ( tenant_id INT PRIMARY KEY, mark_price_cents INT NOT NULL DEFAULT 20, self_entry_enabled TINYINT(1) NOT NULL DEFAULT 1, paypal_enabled TINYINT(1) NOT NULL DEFAULT 0, paypal_url_template VARCHAR(1000) NOT NULL DEFAULT '', sheet_window_days INT NOT NULL DEFAULT 100, negative_warning_cents INT NOT NULL DEFAULT -1000, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT fk_tenant_settings_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(255) NOT NULL, email_norm VARCHAR(255) NOT NULL, display_name VARCHAR(255) NOT NULL, password_hash VARCHAR(255) NULL, status VARCHAR(30) NOT NULL DEFAULT 'active', last_login_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uq_users_email_norm (email_norm), KEY idx_users_status (status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS tenant_memberships ( id INT AUTO_INCREMENT PRIMARY KEY, tenant_id INT NOT NULL, user_id INT NOT NULL, role VARCHAR(30) NOT NULL DEFAULT 'member', status VARCHAR(30) NOT NULL DEFAULT 'active', invited_at DATETIME NULL, joined_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uq_tenant_memberships_tenant_user (tenant_id, user_id), KEY idx_tenant_memberships_user (user_id), KEY idx_tenant_memberships_tenant_role_status (tenant_id, role, status), CONSTRAINT fk_tenant_memberships_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE, CONSTRAINT fk_tenant_memberships_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS participants ( id INT AUTO_INCREMENT PRIMARY KEY, tenant_id INT NOT NULL, user_id INT NULL, display_name VARCHAR(255) NOT NULL, email VARCHAR(255) NULL, email_norm VARCHAR(255) NULL, paypal_name VARCHAR(255) NULL, active TINYINT(1) NOT NULL DEFAULT 1, legacy_mitarbeiter_id INT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uq_participants_tenant_legacy (tenant_id, legacy_mitarbeiter_id), UNIQUE KEY uq_participants_tenant_email_norm (tenant_id, email_norm), KEY idx_participants_tenant_active_name (tenant_id, active, display_name), KEY idx_participants_user (user_id), CONSTRAINT fk_participants_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE, CONSTRAINT fk_participants_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;