Schalter fuer den Hinweis auf die Kaffeeliste

Der Hinweis unten rechts laesst sich ab einem bezahlten Tarif in den
Mandant-Einstellungen abschalten (neue Spalte tenant_settings.
watermark_enabled, Standard an). Im kostenlosen Tarif bleibt er fest
eingeschaltet: das Kaestchen ist angehakt und disabled, daneben steht der
Grund. Zusaetzlich erzwingt saas_update_tenant_settings() den Wert dort noch
einmal, damit ein nachgebauter POST ihn nicht abschalten kann.

Der Titel des Wasserzeichens spricht nicht mehr vom kostenlosen Tarif -
zahlende Mandanten koennen es jetzt freiwillig zeigen.

Der Smoke-Test prueft die Einstellungsseite jetzt auch angemeldet. Sein
Muster fuer PHP-Meldungen verlangt dafuer einen Doppelpunkt, sonst haette
das Feld "negative_warning" als Warnung gezaehlt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 00:27:44 +02:00
co-authored by Claude Opus 5
parent 1d53b66e3f
commit b244451c42
8 changed files with 153 additions and 16 deletions
+18 -4
View File
@@ -44,7 +44,10 @@ function plan_watermark_plan_code(PDO $pdo, int $tenantId): string
}
/**
* Zeigt dieser Mandant das Wasserzeichen? Nur der kostenlose Tarif tut das.
* 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
{
@@ -52,7 +55,18 @@ function plan_watermark_visible(PDO $pdo, int $tenantId): bool
return false;
}
return plan_watermark_plan_code($pdo, $tenantId) === 'free';
$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');
}
/**
@@ -84,10 +98,10 @@ function plan_watermark_html(): string
. '<span class="plan-watermark-text">' . htmlspecialchars($label, ENT_QUOTES, 'UTF-8') . '</span>';
if ($url === '') {
return '<div class="plan-watermark" title="Kostenloser Tarif der Kaffeeliste">' . $inner . '</div>';
return '<div class="plan-watermark" title="Kaffeeliste die digitale Kaffeekasse">' . $inner . '</div>';
}
return '<a class="plan-watermark" href="' . htmlspecialchars($url, ENT_QUOTES, 'UTF-8') . '"'
. ' target="_blank" rel="noopener noreferrer"'
. ' title="Diese Kaffeeliste läuft im kostenlosen Tarif">' . $inner . '</a>';
. ' title="Kaffeeliste die digitale Kaffeekasse">' . $inner . '</a>';
}
+18 -4
View File
@@ -288,7 +288,8 @@ function saas_fetch_tenant_settings(PDO $pdo, int $tenantId): ?array
ts.bank_account_holder,
ts.bank_iban,
ts.brand_logo,
ts.brand_color
ts.brand_color,
ts.watermark_enabled
FROM tenants t
LEFT JOIN tenant_settings ts ON ts.tenant_id = t.id
WHERE t.id = ?
@@ -336,6 +337,7 @@ function saas_fetch_tenant_settings(PDO $pdo, int $tenantId): ?array
'bank_iban' => (string)$settings['bank_iban'],
'brand_logo' => (string)$settings['brand_logo'],
'brand_color' => (string)$settings['brand_color'],
'watermark_enabled' => (int)$settings['watermark_enabled'],
];
}
@@ -425,6 +427,16 @@ function saas_update_tenant_settings(PDO $pdo, int $tenantId, array $input): arr
$pdfShowEmptyRows = !empty($input['pdf_show_empty_rows']) ? 1 : 0;
$paymentReminderEnabled = !empty($input['payment_reminder_enabled']) ? 1 : 0;
// Der Hinweis auf die Kaffeeliste laesst sich abschalten - ausser im
// kostenlosen Tarif. Die Pruefung steht hier und nicht nur im Formular,
// damit auch ein nachgebauter POST das Kaestchen nicht leeren kann. Vor
// der Transaktion, weil billing_fetch_or_init() eine fehlende Zeile
// anlegt.
$watermarkEnabled = !empty($input['watermark_enabled']) ? 1 : 0;
if (billing_fetch_or_init($pdo, $tenantId)['plan_code'] === 'free') {
$watermarkEnabled = 1;
}
try {
$pdo->beginTransaction();
@@ -443,8 +455,8 @@ function saas_update_tenant_settings(PDO $pdo, int $tenantId, array $input): arr
pdf_watermark_text, pdf_footer_text,
payment_reminder_enabled, payment_reminder_interval_days,
cash_enabled, cash_contact, bank_transfer_enabled,
bank_account_holder, bank_iban, brand_color)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
bank_account_holder, bank_iban, brand_color, watermark_enabled)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
mark_price_cents = VALUES(mark_price_cents),
self_entry_enabled = VALUES(self_entry_enabled),
@@ -464,7 +476,8 @@ function saas_update_tenant_settings(PDO $pdo, int $tenantId, array $input): arr
bank_transfer_enabled = VALUES(bank_transfer_enabled),
bank_account_holder = VALUES(bank_account_holder),
bank_iban = VALUES(bank_iban),
brand_color = VALUES(brand_color)'
brand_color = VALUES(brand_color),
watermark_enabled = VALUES(watermark_enabled)'
);
$stmt->execute([
$tenantId,
@@ -487,6 +500,7 @@ function saas_update_tenant_settings(PDO $pdo, int $tenantId, array $input): arr
$bankAccountHolder,
$bankIban,
$brandColor,
$watermarkEnabled,
]);
$pdo->commit();