diff --git a/app/imports.php b/app/imports.php index d3a4a67..c7bef11 100644 --- a/app/imports.php +++ b/app/imports.php @@ -39,14 +39,16 @@ function imports_find_participant(PDO $pdo, int $tenantId, string $name): ?array FROM participants WHERE tenant_id = ? AND (LOWER(paypal_name) = LOWER(?) OR LOWER(display_name) = LOWER(?)) - LIMIT 1' + ORDER BY id + LIMIT 2' ); $stmt->execute([$tenantId, $name, $name]); - $row = $stmt->fetch(); + $rows = $stmt->fetchAll(); - if ($row === false) { + if (count($rows) !== 1) { return null; } + $row = $rows[0]; return [ 'participant_id' => (int)$row['id'], diff --git a/einzahlung.php b/einzahlung.php index 2c9c951..6c0fffd 100644 --- a/einzahlung.php +++ b/einzahlung.php @@ -1,5 +1,7 @@ $rohBetrag, 'bemerkung' => $bemerkung]; + $name = $namen[$participantId] ?? ('Teilnehmer ' . $participantId); if ($rohBetrag === '') { // Leere Zeile: nur meckern, wenn trotzdem eine Bemerkung dransteht @@ -102,16 +115,23 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" ) { continue; } - $anzahlBetrag = floatval(str_replace(',', '.', $rohBetrag)); - if ($anzahlBetrag == 0.0) { + $betragCents = saas_parse_money_cents($rohBetrag); + if ($betragCents === null) { + $validierungsFehler[] = sprintf( + '%s: Der Betrag "%s" ist kein gültiger Geldbetrag.', + $name, + $rohBetrag + ); continue; } - $name = $namen[$participantId] ?? ('Teilnehmer ' . $participantId); + if ($betragCents === 0) { + continue; + } // Abzuege muessen begruendet werden, sonst ist spaeter nicht mehr // nachvollziehbar, warum jemandem Geld abgezogen wurde. - if ($anzahlBetrag < 0 && $bemerkung === '') { + if ($betragCents < 0 && $bemerkung === '') { $validierungsFehler[] = sprintf( '%s: Bei einem Abzug (negativer Betrag) ist eine Bemerkung Pflicht.', $name @@ -120,18 +140,18 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" ) { } // Groessenordnungs-Tippfehler abfangen (500 statt 5,00). - if (abs($anzahlBetrag) > EINZAHLUNG_MAX_BETRAG) { + if (abs($betragCents) > EINZAHLUNG_MAX_BETRAG_CENTS) { $validierungsFehler[] = sprintf( '%s: %s € übersteigt die Plausibilitätsgrenze von %s €. Bitte prüfen oder in mehreren Schritten eintragen.', $name, - number_format($anzahlBetrag, 2, ',', '.'), + saas_format_money_cents($betragCents), number_format(EINZAHLUNG_MAX_BETRAG, 2, ',', '.') ); continue; } $zuBuchen[$participantId] = [ - 'betrag' => $anzahlBetrag, + 'betrag_cents' => $betragCents, 'bemerkung' => $bemerkung !== '' ? $bemerkung : null, ]; } @@ -147,7 +167,7 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" ) { $pdo, $tenantId, $participantId, - (int)round($zeile['betrag'] * 100), + (int)$zeile['betrag_cents'], 'manual_bulk', $saasUser['user_id'] ?? null, $zeile['bemerkung'] @@ -157,6 +177,9 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" ) { $pdo->commit(); $eingaben = []; // Erfolgreich gebucht: Formular wieder leeren. + $_SESSION['flash_einzahlung'] = ['type' => 'success', 'count' => $eingetragen]; + header('Location: einzahlung.php'); + exit; } catch (Throwable $e) { if ($pdo->inTransaction()) { $pdo->rollBack(); @@ -188,10 +211,11 @@ $mitarbeiter = einzahlung_fetch_participants($pdo, $tenantId, $action);
Die Einzahlungen konnten nicht gespeichert werden.
Einträge erfolgreich hinzugefügt.
In der Bemerkung könnt ihr festhalten, worum es bei einer Buchung ging. Ein negativer Betrag bucht einen Abzug (z. B. Auszahlung bei Austritt oder eine Erstattung) und braucht deshalb immer eine Bemerkung.
diff --git a/hinweise.php b/hinweise.php index b18b58f..1651aec 100644 --- a/hinweise.php +++ b/hinweise.php @@ -1,5 +1,7 @@ Kaffeeliste - Hinweise"; + $meldung = null; + $fehler = null; + + if (isset($_SESSION['flash_hinweise']) && is_array($_SESSION['flash_hinweise'])) { + $flash = $_SESSION['flash_hinweise']; + unset($_SESSION['flash_hinweise']); + $meldung = isset($flash['meldung']) ? (string)$flash['meldung'] : null; + $fehler = isset($flash['fehler']) ? (string)$flash['fehler'] : null; + } // Hinweis speichern oder als geloescht markieren if ($_SERVER['REQUEST_METHOD'] === 'POST') { @@ -44,26 +54,50 @@ if($hasAccess){ $id = (int)($_POST['id'] ?? 0); if ($id > 0 && notices_soft_delete($pdo, $tenantId, $id)) { app_audit_log($pdo, $tenantId, $actorUserId, 'notice.deleted', 'notice', $id); + $meldung = 'Hinweis wurde gelöscht.'; + } else { + $fehler = 'Der Hinweis konnte nicht gelöscht werden.'; } } else { - $nachricht = $_POST['nachricht'] ?? ''; - $gueltig_bis = $_POST['gueltig_bis'] ?? ''; // z.B. "2025-09-03T14:00" + $nachricht = trim((string)($_POST['nachricht'] ?? '')); + $gueltig_bis = trim((string)($_POST['gueltig_bis'] ?? '')); // z.B. "2025-09-03T14:00" $dt = DateTime::createFromFormat('Y-m-d\TH:i', $gueltig_bis); + $dtErrors = DateTime::getLastErrors(); - if ($dt) { + if ($nachricht === '') { + $fehler = 'Bitte eine Nachricht eintragen.'; + } elseif ($dt === false || ($dtErrors !== false && ((int)$dtErrors['warning_count'] > 0 || (int)$dtErrors['error_count'] > 0))) { + $fehler = 'Bitte ein gültiges Datum mit Uhrzeit angeben.'; + } else { $gueltig_bis_sql = $dt->format('Y-m-d H:i:s'); // z.B. "2025-09-03 14:00:00" notices_create($pdo, $tenantId, (string)$nachricht, $gueltig_bis_sql, $actorUserId); app_audit_log($pdo, $tenantId, $actorUserId, 'notice.created', 'notice', null, ['valid_until' => $gueltig_bis_sql]); + $meldung = 'Hinweis wurde gespeichert.'; } } + + $_SESSION['flash_hinweise'] = [ + 'meldung' => $meldung, + 'fehler' => $fehler, + ]; + header('Location: hinweise.php'); + exit; } $hinweise = notices_fetch_all($pdo, $tenantId); ?> +