Kein Zugriff"; include "footer.php"; exit; } /** * Liefert die Teilnehmerliste fuer die Vorder-/Rueckseiten- oder * Alle-Auswahl. Vorderseite sind die Vieltrinker (>= 10 Striche im * Listenfenster), Rueckseite der Rest. * * @return list */ function stricheintragen_fetch_participants(PDO $pdo, int $tenantId, string $action): array { if ($action === 'vorderseite' || $action === 'rueckseite') { $settings = saas_fetch_tenant_settings($pdo, $tenantId); $windowDays = $settings['sheet_window_days'] ?? 100; return ledger_fetch_participants_by_window_marks($pdo, $tenantId, $windowDays, $action === 'vorderseite'); } return ledger_fetch_participant_summaries($pdo, $tenantId, ['active_only' => true]); } $eingetragen = 0; $fehlgeschlagen = false; $hatGespeichert = false; $erfolgsmeldung = null; $validierungsFehler = []; $eingaben = []; $kostenproStrichEingabe = null; $action = (string)($_GET['action'] ?? 'alle'); if (!in_array($action, ['vorderseite', 'rueckseite', 'alle'], true)) { $action = 'alle'; } if (isset($_SESSION['flash_stricheintragen']) && is_array($_SESSION['flash_stricheintragen'])) { $flash = $_SESSION['flash_stricheintragen']; unset($_SESSION['flash_stricheintragen']); if (($flash['type'] ?? '') === 'success') { $erfolgsmeldung = sprintf('%d Einträge erfolgreich hinzugefügt.', (int)($flash['count'] ?? 0)); } } const STRICHE_MAX_PRO_PERSON = 50; const STRICHE_MAX_PREIS_CENTS = 10000; // Verarbeitung des Formulars, wenn es gesendet wurde if ($_SERVER["REQUEST_METHOD"] == "POST") { $hatGespeichert = true; $action = (string)($_POST['liste_action'] ?? 'alle'); if (!in_array($action, ['vorderseite', 'rueckseite', 'alle'], true)) { $action = 'alle'; } $kostenproStrichRaw = trim((string)($_POST["kostenproStrich"] ?? '')); $kostenproStrichEingabe = $kostenproStrichRaw; $unitPriceCents = saas_parse_money_cents($kostenproStrichRaw); if ($unitPriceCents === null || $unitPriceCents <= 0) { $validierungsFehler[] = 'Bitte gültige Kosten pro Strich angeben.'; } elseif ($unitPriceCents > STRICHE_MAX_PREIS_CENTS) { $validierungsFehler[] = 'Die Kosten pro Strich überschreiten die Plausibilitätsgrenze von 100,00 €. Bitte prüfen.'; } // Teilnehmer des Mandanten - dient der Zugehoerigkeitspruefung, damit ueber // das Formular keine fremden IDs bebucht werden koennen. $eigeneTeilnehmer = []; $stmt = $pdo->prepare('SELECT id, display_name FROM participants WHERE tenant_id = ?'); $stmt->execute([$tenantId]); foreach ($stmt->fetchAll() as $row) { $eigeneTeilnehmer[(int)$row['id']] = (string)$row['display_name']; } $zuBuchen = []; foreach ($_POST["anzahlStriche"] ?? [] as $participantId => $anzahlStriche) { $participantId = (int)$participantId; if ($participantId <= 0 || !array_key_exists($participantId, $eigeneTeilnehmer)) { continue; } $rohStriche = trim((string)$anzahlStriche); $eingaben[$participantId] = $rohStriche; if ($rohStriche === '' || $rohStriche === '0') { continue; } $name = $eigeneTeilnehmer[$participantId]; if (!preg_match('/^[0-9]+$/', $rohStriche)) { $validierungsFehler[] = sprintf('%s: Bitte eine ganze positive Strich-Anzahl eintragen.', $name); continue; } $anzahlStriche = (int)$rohStriche; if ($anzahlStriche > STRICHE_MAX_PRO_PERSON) { $validierungsFehler[] = sprintf( '%s: %d Striche überschreiten die Plausibilitätsgrenze von %d pro Buchung.', $name, $anzahlStriche, STRICHE_MAX_PRO_PERSON ); continue; } $zuBuchen[$participantId] = $anzahlStriche; } if ($validierungsFehler === [] && $zuBuchen === []) { $validierungsFehler[] = 'Bitte mindestens eine Strich-Anzahl eintragen.'; } if ($validierungsFehler === []) { try { $pdo->beginTransaction(); foreach ($zuBuchen as $participantId => $anzahlStriche) { ledger_record_consumption($pdo, $tenantId, $participantId, $anzahlStriche, (int)$unitPriceCents, 'manual_bulk'); $eingetragen++; } $pdo->commit(); $_SESSION['flash_stricheintragen'] = ['type' => 'success', 'count' => $eingetragen]; header('Location: stricheintragen.php?action=' . urlencode($action)); exit; } catch (Throwable $e) { if ($pdo->inTransaction()) { $pdo->rollBack(); } $fehlgeschlagen = true; } } } // Vorder-/Rueckseite nur anbieten, wenn der Ausdruck auch wirklich zwei Seiten // hat - bei kleinen Teams gibt es nur ein Blatt und die Aufteilung waere eine // Auswahl ohne Entsprechung auf dem Papier. Muss vor dem Laden der Liste // stehen, damit ein alter Link auf "vorderseite" nicht doch eine halbe Liste // zeigt. $alleAktiven = ledger_fetch_participant_summaries($pdo, $tenantId, ['active_only' => true]); $zweiseitig = ledger_uses_two_sided_sheet(count($alleAktiven)); if (!$zweiseitig) { $action = 'alle'; } $mitarbeiter = $action === 'alle' ? $alleAktiven : stricheintragen_fetch_participants($pdo, $tenantId, $action); $settings = saas_fetch_tenant_settings($pdo, $tenantId); $kostenproStrichAnzeige = $kostenproStrichEingabe !== null ? $kostenproStrichEingabe : number_format(($settings['mark_price_cents'] ?? 20) / 100, 2, '.', ''); ?>

Anzahl der Striche für alle Mitarbeiter

Die Einträge konnten nicht gespeichert werden.

"> noetig - das Feld ist ein Blockelement mit eigenem Abstand. echo " "; echo ""; echo " "; foreach ($mitarbeiter as $teilnehmer) { $participantId = $teilnehmer['participant_id']; $name = saas_html($teilnehmer['display_name']); echo ""; echo ""; echo ""; echo ""; } echo "
Mitarbeiter Anzahl Striche
"; ?>