Menue folgt auch den Schaltern des Mandanten
Bisher blendete das Menue nur aus, was der Betreiber gesperrt hatte. Hat der Mandant selbst eine Funktion abgeschaltet - etwa "PayPal anbieten" in den Mandant-Einstellungen - blieb der Menuepunkt stehen und fuehrte auf eine Seite ohne Zweck. app_feature_available() prueft nun beide Ebenen, app_feature_tenant_switch() haelt die Zuordnung Funktion -> Mandanten-Schalter. Navigation und Anleitung nutzen die neue Pruefung; paypal-zuordnung.php sperrt sich beim direkten Aufruf ebenfalls und verweist dabei auf die Mandant-Einstellungen statt auf den Betreiber. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -165,3 +165,81 @@ function app_feature_notice_html(string $featureKey): string
|
||||
. ' ist für euren Zugang nicht freigeschaltet.</b><br>'
|
||||
. 'Wende dich an den Betreiber der Kaffeeliste, wenn ihr diese Funktion nutzen möchtet.</p></div>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Zuordnung Betreiber-Funktion -> Schalter in den Mandant-Einstellungen.
|
||||
* Manche Funktionen kann der Kunde zusaetzlich selbst abschalten; wer PayPal
|
||||
* gar nicht als Zahlungsweg anbietet, braucht auch keine PayPal-Zuordnung.
|
||||
* Funktionen ohne Eintrag kennen nur den Betreiber-Schalter.
|
||||
*/
|
||||
function app_feature_tenant_switch(string $featureKey): ?string
|
||||
{
|
||||
$switches = [
|
||||
'paypal_inbox' => 'paypal_enabled',
|
||||
'self_entry' => 'self_entry_enabled',
|
||||
];
|
||||
|
||||
return $switches[$featureKey] ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ist eine Funktion fuer den Mandanten tatsaechlich nutzbar? Prueft beide
|
||||
* Ebenen: erst die Freischaltung durch den Betreiber, dann - falls vorhanden -
|
||||
* den eigenen Schalter des Kunden in den Mandant-Einstellungen.
|
||||
*/
|
||||
function app_feature_available(PDO $pdo, int $tenantId, string $featureKey): bool
|
||||
{
|
||||
if (!app_feature_enabled($pdo, $tenantId, $featureKey)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$switch = app_feature_tenant_switch($featureKey);
|
||||
if ($switch === null || $tenantId <= 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return app_tenant_switch_enabled($pdo, $tenantId, $switch);
|
||||
}
|
||||
|
||||
/**
|
||||
* Einzelnen Schalter aus den Mandant-Einstellungen lesen. Wie bei den
|
||||
* Betreiber-Funktionen wird das Ergebnis pro Request gehalten, damit die
|
||||
* Navigation die Einstellungen nicht mehrfach laedt.
|
||||
*/
|
||||
function app_tenant_switch_enabled(PDO $pdo, int $tenantId, string $settingKey): bool
|
||||
{
|
||||
static $cache = [];
|
||||
|
||||
if (!array_key_exists($tenantId, $cache)) {
|
||||
try {
|
||||
require_once __DIR__ . '/saas-auth.php';
|
||||
$cache[$tenantId] = saas_fetch_tenant_settings($pdo, $tenantId) ?? [];
|
||||
} catch (Throwable $e) {
|
||||
// Lassen sich die Einstellungen nicht lesen, entscheidet allein die
|
||||
// Betreiber-Freischaltung - kein stiller Funktionsverlust.
|
||||
$cache[$tenantId] = [];
|
||||
}
|
||||
}
|
||||
|
||||
if (!array_key_exists($settingKey, $cache[$tenantId])) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return (int)$cache[$tenantId][$settingKey] === 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gegenstueck zu app_feature_notice_html() fuer den Fall, dass nicht der
|
||||
* Betreiber, sondern der Mandant selbst die Funktion abgeschaltet hat. Hier
|
||||
* hilft kein Kontakt zum Betreiber, sondern der Weg in die eigenen
|
||||
* Einstellungen.
|
||||
*/
|
||||
function app_feature_tenant_notice_html(string $featureKey): string
|
||||
{
|
||||
$label = app_feature_catalog()[$featureKey]['label'] ?? $featureKey;
|
||||
|
||||
return '<div class="hint-box error"><p><b>' . htmlspecialchars($label, ENT_QUOTES, 'UTF-8')
|
||||
. ' ist in euren Mandant-Einstellungen deaktiviert.</b><br>'
|
||||
. 'Ein Besitzer oder Administrator kann die Funktion unter '
|
||||
. '<a href="mandant-einstellungen.php">Mandant-Einstellungen</a> wieder einschalten.</p></div>';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user