diff --git a/app/saas-auth.php b/app/saas-auth.php index 8e94f2f..b39a104 100644 --- a/app/saas-auth.php +++ b/app/saas-auth.php @@ -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(); diff --git a/database/migrations/0021_payment_methods.sql b/database/migrations/0021_payment_methods.sql new file mode 100644 index 0000000..d3cae2a --- /dev/null +++ b/database/migrations/0021_payment_methods.sql @@ -0,0 +1,9 @@ +-- Erweiterte Bezahloptionen pro Mandant: Barzahlung (mit Ansprechpartner) und +-- Ueberweisung (mit IBAN und Kontoinhaber). PayPal existiert bereits ueber +-- paypal_enabled/paypal_url_template. +ALTER TABLE tenant_settings + ADD COLUMN cash_enabled TINYINT(1) NOT NULL DEFAULT 0 AFTER pdf_watermark_logo, + ADD COLUMN cash_contact VARCHAR(255) NOT NULL DEFAULT '' AFTER cash_enabled, + ADD COLUMN bank_transfer_enabled TINYINT(1) NOT NULL DEFAULT 0 AFTER cash_contact, + ADD COLUMN bank_account_holder VARCHAR(255) NOT NULL DEFAULT '' AFTER bank_transfer_enabled, + ADD COLUMN bank_iban VARCHAR(40) NOT NULL DEFAULT '' AFTER bank_account_holder; diff --git a/index.php b/index.php index c0cc03a..e2b4110 100644 --- a/index.php +++ b/index.php @@ -271,6 +271,10 @@ if ($hasAccess && $participant !== null && $settings !== null) { $selfEntryEnabled = (int)$settings['self_entry_enabled'] === 1; $paypalEnabled = (int)$settings['paypal_enabled'] === 1 && trim((string)$settings['paypal_url_template']) !== ''; + $cashEnabled = (int)$settings['cash_enabled'] === 1; + $bankTransferEnabled = (int)$settings['bank_transfer_enabled'] === 1 + && trim((string)$settings['bank_iban']) !== ''; + $anyPaymentEnabled = $paypalEnabled || $cashEnabled || $bankTransferEnabled; ?>

Kaffeeliste

@@ -354,8 +358,37 @@ if ($hasAccess && $participant !== null && $settings !== null) { Falsch getippt? Mit „Letzten Strich stornieren" nimmst du deinen jüngsten selbst eingetragenen Strich wieder zurück. Vom Kassenwart eingetragene Striche bleiben davon unberührt. + +

Bezahlen

+ +

Dein offener Betrag:

+ + + + +

Barzahlung

+ +

Bitte bar bei bezahlen.

+ +

Barzahlung ist möglich.

+ + + + +

Überweisung

+

+ + Kontoinhaber:
+ + IBAN: + +
Bitte überweise deinen offenen Betrag von . + +

+ + -

PayPal-Einzahlungen

+

PayPal

Bezahle immer über die Freunde-Funktion von PayPal. Ansonsten stellen wir 20% des Betrags als Gebühr in Rechnung.

!empty($_POST['self_entry_enabled']) ? 1 : 0, 'paypal_enabled' => !empty($_POST['paypal_enabled']) ? 1 : 0, 'paypal_url_template' => $_POST['paypal_url_template'] ?? '', + 'cash_enabled' => !empty($_POST['cash_enabled']) ? 1 : 0, + 'cash_contact' => $_POST['cash_contact'] ?? '', + 'bank_transfer_enabled' => !empty($_POST['bank_transfer_enabled']) ? 1 : 0, + 'bank_account_holder' => $_POST['bank_account_holder'] ?? '', + 'bank_iban' => $_POST['bank_iban'] ?? '', 'sheet_window_days' => $_POST['sheet_window_days'] ?? 100, 'negative_warning_cents' => -abs(saas_parse_money_cents($_POST['negative_warning'] ?? '') ?? 0), 'pdf_show_empty_rows' => !empty($_POST['pdf_show_empty_rows']) ? 1 : 0, @@ -125,16 +130,40 @@ include 'nav.php';
+

Bezahloptionen

+

Aktiviere die Zahlungswege, die deine Mitglieder nutzen können. Nur aktivierte Optionen werden im Mitglieder-Dashboard angezeigt.

+
+
+ > + +
+
+ + +
+
+ > + +
+
- > - + > +
- > - + + +
+
+ + +
+
+ > +
>