Erweiterte Bezahloptionen: Barzahlung, PayPal und Ueberweisung

Bisher gab es nur PayPal. Jetzt sind pro Mandant drei unabhaengig
aktivierbare Zahlungswege konfigurierbar (mandant-einstellungen.php):

- Barzahlung mit frei waehlbarem Ansprechpartner.
- PayPal wie bisher, mit Zahlungslink.
- Ueberweisung mit Kontoinhaber und IBAN (Format wird geprueft,
  Leerzeichen werden normalisiert).

Das Mitglieder-Dashboard (index.php) zeigt unter "Bezahlen" alle
aktivierten Methoden mit dem jeweils offenen Betrag; die IBAN wird zur
besseren Lesbarkeit in Viererbloecken angezeigt.

Neue tenant_settings-Spalten via Migration 0021 (cash_enabled,
cash_contact, bank_transfer_enabled, bank_account_holder, bank_iban).
This commit is contained in:
2026-07-21 16:13:28 +02:00
parent bafa5e7e61
commit c16b105f00
4 changed files with 116 additions and 9 deletions
+40 -4
View File
@@ -281,7 +281,12 @@ function saas_fetch_tenant_settings(PDO $pdo, int $tenantId): ?array
ts.pdf_footer_text,
ts.payment_reminder_enabled,
ts.payment_reminder_interval_days,
ts.pdf_watermark_logo
ts.pdf_watermark_logo,
ts.cash_enabled,
ts.cash_contact,
ts.bank_transfer_enabled,
ts.bank_account_holder,
ts.bank_iban
FROM tenants t
LEFT JOIN tenant_settings ts ON ts.tenant_id = t.id
WHERE t.id = ?
@@ -322,6 +327,11 @@ function saas_fetch_tenant_settings(PDO $pdo, int $tenantId): ?array
'payment_reminder_enabled' => (int)$settings['payment_reminder_enabled'],
'payment_reminder_interval_days' => (int)$settings['payment_reminder_interval_days'],
'pdf_watermark_logo' => (string)$settings['pdf_watermark_logo'],
'cash_enabled' => (int)$settings['cash_enabled'],
'cash_contact' => (string)$settings['cash_contact'],
'bank_transfer_enabled' => (int)$settings['bank_transfer_enabled'],
'bank_account_holder' => (string)$settings['bank_account_holder'],
'bank_iban' => (string)$settings['bank_iban'],
];
}
@@ -335,6 +345,9 @@ function saas_update_tenant_settings(PDO $pdo, int $tenantId, array $input): arr
$sheetWindowDays = filter_var($input['sheet_window_days'] ?? null, FILTER_VALIDATE_INT);
$negativeWarningCents = saas_parse_money_cents($input['negative_warning'] ?? '');
$paypalUrlTemplate = trim((string)($input['paypal_url_template'] ?? ''));
$cashContact = trim((string)($input['cash_contact'] ?? ''));
$bankAccountHolder = trim((string)($input['bank_account_holder'] ?? ''));
$bankIban = strtoupper(preg_replace('/\s+/', '', (string)($input['bank_iban'] ?? '')));
$pdfSplitMode = trim((string)($input['pdf_split_mode'] ?? 'drinking_behavior'));
$pdfRowHeightPx = filter_var($input['pdf_row_height_px'] ?? null, FILTER_VALIDATE_INT);
$pdfWatermarkText = trim((string)($input['pdf_watermark_text'] ?? ''));
@@ -381,6 +394,15 @@ function saas_update_tenant_settings(PDO $pdo, int $tenantId, array $input): arr
if ($paymentReminderIntervalDays === false || $paymentReminderIntervalDays < 1 || $paymentReminderIntervalDays > 90) {
$errors[] = 'Das Erinnerungs-Intervall muss zwischen 1 und 90 Tagen liegen.';
}
if (strlen($cashContact) > 255) {
$errors[] = 'Der Bar-Ansprechpartner ist zu lang (max. 255 Zeichen).';
}
if (strlen($bankAccountHolder) > 255) {
$errors[] = 'Der Kontoinhaber ist zu lang (max. 255 Zeichen).';
}
if ($bankIban !== '' && !preg_match('/^[A-Z]{2}[0-9]{2}[A-Z0-9]{10,30}$/', $bankIban)) {
$errors[] = 'Die IBAN hat kein gültiges Format.';
}
if ($errors !== []) {
return ['ok' => false, 'errors' => $errors];
@@ -388,6 +410,8 @@ function saas_update_tenant_settings(PDO $pdo, int $tenantId, array $input): arr
$selfEntryEnabled = !empty($input['self_entry_enabled']) ? 1 : 0;
$paypalEnabled = !empty($input['paypal_enabled']) ? 1 : 0;
$cashEnabled = !empty($input['cash_enabled']) ? 1 : 0;
$bankTransferEnabled = !empty($input['bank_transfer_enabled']) ? 1 : 0;
$pdfShowEmptyRows = !empty($input['pdf_show_empty_rows']) ? 1 : 0;
$paymentReminderEnabled = !empty($input['payment_reminder_enabled']) ? 1 : 0;
@@ -407,8 +431,10 @@ function saas_update_tenant_settings(PDO $pdo, int $tenantId, array $input): arr
paypal_url_template, sheet_window_days, negative_warning_cents,
pdf_show_empty_rows, pdf_split_mode, pdf_row_height_px,
pdf_watermark_text, pdf_footer_text,
payment_reminder_enabled, payment_reminder_interval_days)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
payment_reminder_enabled, payment_reminder_interval_days,
cash_enabled, cash_contact, bank_transfer_enabled,
bank_account_holder, bank_iban)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
mark_price_cents = VALUES(mark_price_cents),
self_entry_enabled = VALUES(self_entry_enabled),
@@ -422,7 +448,12 @@ function saas_update_tenant_settings(PDO $pdo, int $tenantId, array $input): arr
pdf_watermark_text = VALUES(pdf_watermark_text),
pdf_footer_text = VALUES(pdf_footer_text),
payment_reminder_enabled = VALUES(payment_reminder_enabled),
payment_reminder_interval_days = VALUES(payment_reminder_interval_days)'
payment_reminder_interval_days = VALUES(payment_reminder_interval_days),
cash_enabled = VALUES(cash_enabled),
cash_contact = VALUES(cash_contact),
bank_transfer_enabled = VALUES(bank_transfer_enabled),
bank_account_holder = VALUES(bank_account_holder),
bank_iban = VALUES(bank_iban)'
);
$stmt->execute([
$tenantId,
@@ -439,6 +470,11 @@ function saas_update_tenant_settings(PDO $pdo, int $tenantId, array $input): arr
$pdfFooterText,
$paymentReminderEnabled,
(int)$paymentReminderIntervalDays,
$cashEnabled,
$cashContact,
$bankTransferEnabled,
$bankAccountHolder,
$bankIban,
]);
$pdo->commit();