# ARBEITSPAKETE – KSB Düren / Bewegungszentrum

Feature- und Modul-Übersicht. Details in den jeweiligen Root-`.md`-Dateien und `AGENTS.md`.

| AP | Modul | Status | Doku / Hinweise |
|----|--------|--------|-----------------|
| AP-1 | Schwimmkurs-Terminbuchung | produktiv | `APPOINTMENTS_*`, automatisierte Wartelistenangebote |
| AP-2 | Bewegungszentrum-Kursbuchung | produktiv | `KURSE_NEUE_FELDER_DOKUMENTATION.md`, automatisierte Wartelistenangebote |
| AP-3 | Event Center / Bewegung am Ehrentag | produktiv | `EVENT_CENTER_EMAIL_*`, Zeitslots Workshops |
| AP-4 | Kursleiter-Portal | produktiv | `/instructor/dashboard`, vergangene Termine |
| AP-5 | Outlook / Kalender-Sync | produktiv | `MICROSOFT_OUTLOOK_*`, `CALENDAR_*`, Token-Refresh |
| AP-6 | E-Mail (IMAP + Templates) | produktiv | `EMAIL_*`, getrennte Template-Admin-Seiten |
| AP-7 | Container / SwimMonitor (Bayrol/Dulcopool) | produktiv | `config/apache/`, `WATER_DATA_COMPARISON.md` |
| AP-8 | Inspektionssystem | produktiv | `INSPECTION_SYSTEM.md` |
| AP-9 | SSL / Apache-Proxy Subdomains | produktiv | `SSL_CERTBOT_ERNEUERUNG.md` |
| AP-10 | Agenten-Doku & TODO-Workflow | **neu 2026-07-16** | `AGENTS.md`, `docs/TODO.md`, `.cursor/rules/` |

## Wartelisten-Automatisierung (2026-07-20)

**Status: abgeschlossen, Deployment ausstehend.**

- Einheitliche 24-Stunden-Platzangebote für BZ-Kursbuchungen und Schwimmkurs-Termine.
- FIFO-Weitergabe unter pessimistischer Sperre; BZ-Kontexte berücksichtigen Datum,
  Zeitslot und Mehrfachtermine.
- Getrennte Ablauf-Commands mit nebenwirkungsfreiem `--dry-run`, vorgesehen alle fünf Minuten.
- Claim-Prüfungen verhindern Überbuchungen; Stornierungen stoßen die passende Weitergabe an.
- Datenbankschema: `migrations/Version20260720160000.php`.
- Betrieb: `docs/CRONJOBS.md`; Abnahme: `docs/WARTELISTEN_TESTMATRIX.md`.

| AP-11 | Fit wie ein Fisch Buchung | **Phase 5 live — 2026-09-10** | `docs/FIT_WIE_EIN_FISCH.md`, Migration `Version20260910150000` |

## Hub & KSB-Fixes (2026-08-22)

**Status: umgesetzt (Deploy ausstehend).**

- Öffentlicher Einstieg `/buchung` mit vier getrennten Cards (Schwimmcontainer, BZ, Fit wie ein Fisch, KSB).
- Kursbuchungs-Fallback: Zahlungsinfo nur mit Kurszuordnung; neutrale System-Mail sichtbar in der Template-UI.
- BZ-/Schwimm-Warteliste: Umwandlung mit E-Mail wie Automatisierung; Detail-Modal; Zahlung erst nach Umwandlung.

## Fit wie ein Fisch — Phase 5: Mails, Sammelanmeldung, Warteliste (2026-09-10)

**Status: umgesetzt (Absenderadresse, Standorttexte und Cron noch offen — siehe `docs/TODO.md`).**
Auftrag vom 2026-09-10. Alles bleibt im `Fisch`-Namensraum — keine gemeinsamen Entities mit
Schwimmcontainer, Bewegungszentrum oder Event Center, auch wenn Muster (Warteliste, Platzangebot,
Template-Platzhalter) von dort übernommen werden.

### Umfang

1. **E-Mail-Vorlagen** `/admin/fisch/email-templates` — echte Verwaltung wie in den anderen
   Systemen, mit eigener Entity `FischEmailTemplate` (Tabelle `fisch_email_template`) statt der
   gemeinsamen `EmailTemplate`. Absender pro Vorlage hinterlegbar; solange die eigenen
   Zugangsdaten fehlen, wird die vorhandene Absenderadresse genutzt und im Admin ein
   Hinweis angezeigt.
2. **Standort-Zusatzinfos** — `FischPool` erhält Adresse, Anfahrt, Parkplatz-Hinweis, Maps-Link
   und Hinweistext. Die Angaben stehen als Platzhalter in den Vorlagen zur Verfügung und gehen
   je Schwimmbad automatisch mit der Mail raus.
3. **Buchungsflow** — Anmeldung erzeugt eine offene Anmeldung mit Validierungslink
   (`pending` + Token), erst der Klick bestätigt sie (`confirmed`) und löst die
   Bestätigungsmail aus. Offene Anmeldungen belegen den Platz mit, damit nichts doppelt
   vergeben wird; ein Command gibt abgelaufene Reservierungen wieder frei.
4. **Warteliste** — Detailansicht zur Buchung wie in den anderen Systemen, automatisches
   Platzangebot mit Frist (Angebots-Token) beim Freiwerden eines Platzes und weiterhin
   händisches Nachrücken.
5. **Listen** — Kontaktdaten (Telefon, Adresse, Erziehungsberechtigte) in den Kurs- und
   Teilnehmeransichten sichtbar, CSV-Export auch in der Teilnehmerliste eines Kurses.
6. **Formularbuilder** — konfigurierbare Felder für drei Formulare: Einzelanmeldung,
   Schule (Sammelanmeldung) und Eltern (Anmeldung über den Schul-Link). Definition als
   Feldliste pro Formulartyp; Kernfelder (Name, Geburtsdatum) bleiben gesetzt, weil die
   Altersgruppen-Logik daran hängt.
7. **Sammelanmeldung** — Link an die Schule, die den Slot komplett bucht; daraus entstehen
   kurze Eltern-Links, mit denen die Kinder endgültig angemeldet werden. Reservierte Plätze
   sind ab der Buchung der Schule blockiert.

### Festlegungen

- **Eigene Vorlagen-Entity** statt `EmailTemplate`, damit die Allowlist-Logik der anderen
  Systeme unberührt bleibt (Wartbarkeit, ausdrücklicher Wunsch).
- **Offene Anmeldungen blockieren Plätze** (Frist 72 Stunden), sonst ließe sich der Kurs
  während der Validierung überbuchen.
- **Feldkonfiguration als JSON** je Formulartyp; Zusatzfelder landen als JSON an der Anmeldung,
  damit kein Schemawechsel pro neuem Feld nötig ist.
- **Eltern-Links kurz codiert** (Base32, 10 Zeichen) unter `/booking/fisch/e/{code}`.

### Abnahme

- Container + Twig lint ok; Migration `Version20260910150000` angewandt.
- `app:fisch:e2e-test` (mit `MAILER_DSN=null://null`): Anmeldung→Verify, Wartelisten-Angebot nach
  Storno→Claim, Sammelanmeldung Schule→Elternlink — alle drei Pfade grün. Anmeldephase wird nur
  für den Lauf geöffnet und danach wiederhergestellt.
- Ablaufjobs: `app:fisch:waitlist-expire`, `app:fisch:expire-pending` (siehe `docs/CRONJOBS.md`).

**Legende:** *produktiv* = im Einsatz; größere offene Punkte immer in `docs/TODO.md` pflegen.
