prepare('SELECT plan_code FROM tenant_billing WHERE tenant_id = ?'); $stmt->execute([$tenantId]); $planCode = $stmt->fetchColumn(); $cache[$tenantId] = $planCode === false ? 'free' : (string)$planCode; } catch (Throwable $e) { // Laesst sich der Tarif nicht lesen, bleibt die Oberflaeche sauber - // ein Wasserzeichen bei einem zahlenden Kunden waere der schlimmere // Fehler als ein fehlendes bei einem kostenlosen. $cache[$tenantId] = 'unknown'; } return $cache[$tenantId]; } /** * Zeigt dieser Mandant das Wasserzeichen? Im kostenlosen Tarif immer - es ist * der Gegenwert fuer die kostenlose Nutzung und deshalb nicht abschaltbar. * Alle anderen entscheiden ueber die Mandant-Einstellung * `watermark_enabled` (Standard: an). */ function plan_watermark_visible(PDO $pdo, int $tenantId): bool { if ($tenantId <= 0) { return false; } $planCode = plan_watermark_plan_code($pdo, $tenantId); if ($planCode === 'free') { return true; } if ($planCode === 'unknown') { return false; } require_once __DIR__ . '/features.php'; return app_tenant_switch_enabled($pdo, $tenantId, 'watermark_enabled'); } /** * Wortmarke der Kaffeeliste als Inline-SVG. Als Inline-Grafik statt als * Bilddatei, damit das Wasserzeichen ohne zusaetzlichen Request auskommt, * auf jedem Bildschirm scharf bleibt und die Farbe der Umgebung uebernimmt. */ function plan_watermark_logo_svg(): string { return ''; } /** * Markup des Wasserzeichens. Ohne erreichbare Marketing-Domain (CLI, * ungewoehnliche Hosts) bleibt es bei Logo und Namen ohne Link - ein * Verweis ins Leere waere schlechter als keiner. */ function plan_watermark_html(): string { $url = app_marketing_url(); $label = $url !== '' ? preg_replace('#^https?://#i', '', $url) : 'Kaffeeliste'; $inner = plan_watermark_logo_svg() . '' . htmlspecialchars($label, ENT_QUOTES, 'UTF-8') . ''; if ($url === '') { return '