# TODO – Zentrale Aufgabenliste



**Konvention:** Offene Punkte unter „Offen", erledigte nach „Erledigt" verschieben (mit Datum

`(YYYY-MM-DD)`). Zu Beginn einer Aufgabe **lesen**, am Ende **fortschreiben**. Chronologie/Details

siehe `docs/journal/`. Projektwissen für Agenten: `AGENTS.md`.



## Offen

- [x] (2026-09-04) **Magallanes Cutover finalisieren (root):** `bash /tmp/ksb-fix/finish-cutover-final.sh`
      — Deploy als ftpuser, Apache → `current/public`, Messenger WorkingDirectory → `current`, Smoke, git push.

- [ ] (2026-09-04) **SEO Blocker 1 — Frameset auf der Domain-Wurzel:** `https://dp-smartsolutions.de/`
      liefert ein `<frameset>` mit leerem `<title>`, das `…/ksbdueren/public/dpohl` einbettet. Google
      indexiert dadurch eine leere Startseite, `/robots.txt` und `/sitemap.xml` sind auf der Wurzel 404.
      vHost umstellen (Vorlage: `config/apache/dp-smartsolutions-root.conf.example`), Frameset-Datei
      entfernen, danach `APP_URL` in `.env.local` anpassen und `cache:clear`. **Achtung:** Microsoft-
      OAuth-Redirect-URIs und iframes der KSB-Seite enthalten den alten Pfad — Alias-Variante A wählen
      oder Redirect-URIs vorher nachziehen.
- [ ] (2026-09-04) **SEO Blocker 2 — Sitemap einreichen:** nach der vHost-Umstellung
      `https://dp-smartsolutions.de/sitemap.xml` in der Google Search Console anmelden und Domain
      verifizieren (auch Bing Webmaster Tools).
- [x] (2026-09-04) **Externe CDNs ersetzt:** Die Firmenpräsenz lädt nichts mehr von fremden Servern.
      Font Awesome 6.5.2 (solid + brands) liegt unter `public/vendor/fontawesome/`, die Schriften Inter
      und Barlow Condensed unter `public/vendor/fonts/`; Bootstrap kommt aus dem vorhandenen
      `public/css/bootstrap.min.css` bzw. `public/js/bootstrap.bundle.min.js`. Datenschutzerklärung
      Abschnitt 6 entsprechend angepasst.
- [ ] (2026-09-04) **Rechtstexte: Dienstleister namentlich ergänzen.** In `templates/home/datenschutz.html.twig`
      sind Hoster und E-Mail-Versanddienstleister bewusst allgemein beschrieben (Abschnitte 3 und 4,
      Twig-Kommentar im Template). Namen und Sitz eintragen, sobald geklärt — und prüfen, ob für beide
      ein AV-Vertrag nach Art. 28 DSGVO vorliegt. Danach das „Stand“-Datum oben auf der Seite anpassen.
      Empfehlung: Texte vor dem Livegang einmal juristisch prüfen lassen.
- [ ] (2026-09-04) **Firmenseite `/dpohl` — Nachträge:** `templates/home/mobile.html.twig`,
      `impressum_mobile.html.twig` und `datenschutz_mobile.html.twig` werden nicht mehr eingebunden
      (alle drei Seiten sind responsiv) und können gelöscht werden. Offen außerdem:
      Kundenstimme des Kreissportbunds schriftlich freigeben lassen und dann als Zitat einbauen;
      echte Projektbilder/Screenshots statt reiner Icon-Karten.
- [ ] (2026-09-04) **ksb - schwimm:** Einwilligung für die Öffentlichkeitsarbeit von Mobi / Kreissportbund Düren e. V. Ich bin damit einverstanden, dass Foto- und Videoaufnahmen meines Kindes, die im Rahmen des Tags der Maus bei Mobi entstehen, für die Öffentlichkeitsarbeit von Mobi und dem Kreissportbund Düren e. V. verwendet und auf der Mobi-Website sowie den Social-Media-Kanälen (z. B. Instagram und Facebook) veröffentlicht werden dürfen. grundsätzlich optionen im formular bild videoaufnahmen checkbox, einwiliigung für die öff…
- [ ] (2026-09-03) **Geschwisterpreise nachpflegen (blockiert Geschwisterbuchungen!):** `kids_abo`-Kurse
      (Moving/Ninja/Power Kids, Power Minis, Fun4Kids, Bewegungsforscher, PRAMA Teens, Die Entdecker,
      Sportzwerge), Athletikcamps I/II, „Türen auf mit der Maus" und Sommer-Ferienspiele Woche 6 haben
      `allowSiblings = true`, aber `sibling_prices = []` → **im Buchungsformular erscheint keine
      Geschwister-Eingabe mehr**. Preise unter `/admin/bz/courses` (Kurs bearbeiten → Geschwisterpreise)
      eintragen; ein Eintrag pro buchbarem Geschwisterkind, 0,00 € = kostenlos aber buchbar.

- [ ] (2026-09-03) **Altbuchungen mit 0,00 €:** 10 Abo-Buchungen vom 24.08.–01.09. wurden mit 0,00 €
      statt Monatsbeitrag gespeichert (Ursache behoben). Bewusst nicht korrigiert — bei Bedarf im Admin nachziehen.

- [ ] (2026-09-03) **Geschlecht für Geschwisterkinder?** Beim Hauptkind wird `childGender` erfasst,
      bei Geschwisterkindern nicht. Klären, ob das Feld im Buchungsformular ergänzt werden soll.

- [ ] (2026-09-03) **Gesundheitsfelder Hauptkind vs. Geschwisterkind:** Beim Geschwisterkind sind
      Vorerkrankungen/Allergien/Ernährung/Foto-Video jetzt Pflicht, beim Hauptkind nur bei
      Ferienspielen (Ernährung nie). Klären, ob das Hauptkind gleich streng behandelt werden soll.

- [ ] (2026-09-03) **Fehlende Geschwister-Angaben nachfragen:** Buchungen mit leeren
      Gesundheitsfeldern beim Geschwisterkind (u. a. 435 `CRS-575B1B9D0C29`, 488, 503) —
      bei Bedarf bei den Eltern erfragen und im Admin nachtragen.

- [ ] (2026-08-26) **Fit wie ein Fisch Phase 5:** Übungsleiter, Anwesenheit, Sammelanmeldung (Kitas),

      E-Mail-Vorlagen bearbeiten + Bestätigungsversand, Elternbriefe.

- [ ] (2026-07-16) **E-Mail-Postfach:** Klassifikation nach Deploy prüfen (Kunden vs. Buchungsbestätigungen).

- [ ] (2026-07-16) **Migration ausführen:** `php bin/console doctrine:migrations:migrate` (Version20260716120000 – workshop_group).



- [ ] (2026-07-16) **Root-Dokumentation konsolidieren** — viele `.md`-Dateien liegen noch im

      Projektroot; schrittweise in `docs/` einordnen oder in `AGENTS.md` verlinken (ohne Inhalte

      zu verlieren).

- [ ] (2026-07-16) **`.env.example` anlegen** — Env-Variablen aus `config/services.yaml` / `.env`

      (ohne Secrets) für Onboarding.

- [ ] (2026-07-16) **SSL Auto-Renewal prüfen** auf Server: `sudo certbot renew --dry-run`

      (Zertifikate zuletzt manuell am 2026-07-11 erneuert, gültig bis 2026-10-11).

- [ ] (2026-07-16) **Bayrol HTTPS-Block prüfen** — nach Certbot ggf. `ProxyPass` +

      `X-Forwarded-Proto`/`Port` in `bayrol-proxy-le-ssl.conf` (analog Dulcopool, siehe

      `SSL_CERTBOT_ERNEUERUNG.md`).



## Erledigt

- [x] (2026-09-04) **GitHub privat + Magallanes-Deploy:** Repo https://github.com/znyde87/ksbdueren,
      Magallanes global `/opt/magallanes`, `.mage.yml` (env vor composer, --no-scripts, var/log danach,
      nested Symlinks `../../../shared` für var/log + uploads), `scripts/deploy.sh`, Secrets in `shared/`,
      Apache `current/public`, Messenger `current`.



- [x] (2026-09-03) **BZ-Geschwisterkinder Kapazität & Anzeige:** Eingabe für Geschwisterkinder erscheint
      wieder bei allen Kursen mit `allowSiblings` (vorher nur mit konfigurierten `siblingPrices` —
      Regression seit „Kind-Formular für alle BZ-Kurse"); Geschwister begrenzen im Formular die
      zubuchbaren Plätze, BZ-Dashboard zählt Teilnehmer statt Buchungen; CSV-Export und
      Buchungsdetails zeigen belegte Plätze sowie alle Formularangaben je Geschwisterkind
      (Detail-Modal: eigene Karte pro Kind; CSV: 6 Spalten pro Kind statt Sammelspalte);
      Bestätigungsmails listen Geschwister unter „übermittelte Daten"; `priceMonthly` wird im
      Kind-Formular wieder berücksichtigt (Abo-Buchungen wurden mit 0,00 € gespeichert).

- [x] (2026-08-27) **Booking Schritt 3:** „Weiter zur Buchung“ erscheint neben dem ausgewählten Kurs

      (kein Scroll nach unten nötig); Footer-Button bleibt zusätzlich.

- [x] (2026-08-26) **Fit wie ein Fisch Admin-Kernfunktionen:** Standorte-CRUD, Kurs anlegen/Kapazität/

      aktivieren, CSV-Exports, Teilnehmer stornieren/verschieben, Warteliste übernehmen/entfernen,

      Altersgruppen (Standortkategorien) editierbar.

- [x] (2026-08-26) **Fit wie ein Fisch Kursübersicht UX:** Gruppierung nach Schwimmbad, Stats, Filter

      (Suche / Altersgruppe / voll/frei); Kapazitäts-Placeholder und Excel-Dummy entfernt.

- [x] (2026-08-26) **Fisch-Admin UI:** Layout/Styles an BZ + Schwimmcontainer angeglichen

      (Breadcrumb-Header, Stats-Karten, table-fisch, Quick-Actions).

- [x] (2026-08-26) **Event anlegen Datum-Fehler:** Admin-UI mappt `eventStartDate` → API-`startDate`

      (Create/Update + Backend-Fallback); Ursache seit Event-Datumspflicht 24.08.

- [x] (2026-08-25) **Fit wie ein Fisch Startseite Admin:** `/admin/fisch/startseite` (Texte, Sponsoren,

      Kennzahlen); öffentliche Seite mit Karten/Stats modernisiert.

- [x] (2026-08-25) **Fit wie ein Fisch öffentliche Seite:** Layout/Grafiken von fit-fisch.de (Hero, Logos,

      Footer, Begrüßungstext); Assets unter `public/images/fisch/`.

- [x] (2026-08-25) **Fit wie ein Fisch Admin-Sidebar + Grundeinstellungen:** Menü in 3 Abschnitten

      (Kursverwaltung, Standortverwaltung, Einstellungen); `/admin/fisch/grundeinstellungen` mit Key-Value-UI;

      Migration `Version20260825230000` (Alter, Kurszeitraum in `fisch_season_config`).

- [x] (2026-08-25) **Fit wie ein Fisch Altsystem-Screenshots:** UI-Referenz (9 Admin-Seiten) in

      `docs/FIT_WIE_EIN_FISCH.md` → „Admin-Oberflächen — Altes System“ dokumentiert.

- [x] (2026-08-25) **Fit wie ein Fisch Anmeldung:** Speichern mit Kapazitäts-Lock, Slot-API,

      Wartelisten-Formular; `FischRegistrationService`, `FischBookingApiController`.

- [x] (2026-08-25) **Fit wie ein Fisch DB-Grundlage:** Entities `Fisch*`, Migration

      `Version20260825120000` (6 Pools, 96 Kurse, Beispiel-Anmeldungen/Warteliste); Admin-Listen aus DB.

- [x] (2026-08-25) **Mobi-Buchung Asset-Pfade:** CSS/JS via `asset()` statt `/css/` (404 unter

      `/ksbdueren/public` behoben).

- [x] (2026-08-24) **Admin Event-Bearbeitung:** Startdatum wird beim Laden befüllt (API-Fallback aus

      Namen + korrekte Reihenfolge im Formular).

- [x] (2026-08-24) **Events einmalig:** `type=event` nur am Event-Datum (start/end bzw. Datum

      im Namen); Slot-APIs begrenzt; Admin verlangt Event-Datum; bestehende Events nachgezogen

      (Migration Version20260824110000).

- [x] (2026-08-24) **Schwimm-mit-Mobi Buchungsflow Design:** Schritte 2–5 + Landingpage

      einheitlich über `booking-mobi-theme.css` (helles Layout, rote Akzente, iFrame-tauglich).

- [x] (2026-08-24) **Schwimm-mit-Mobi Landingpage `/booking`:** nur freigeschaltete Mobi-Standorte

      (`showOnSchwimmMitMobi`); kundenfreundliches Design in KSB-Rot; Admin-Toggle analog Narwali

      unter `/appointments/admin/locations`.

- [x] (2026-08-22) **Step 3 Weiter-Button:** bei Kursen über Monatsgrenzen (Aug→Sep)

      Auswahl der sichtbaren Karte; Klick auf Termin zeigt „Weiter“.

- [x] (2026-08-22) **Buchung Step 3 keine Termine:** falsche API-URL (`/public/appointments/…`)

      + fehlender/ineffizienter Kursfilter; jetzt `path(public_appointments_…)` und schnelle

      Slot-Berechnung nur für gewählte Kurse (September-Kurse Buchheim sichtbar).

- [x] (2026-08-22) **Fallback-Mails + Warteliste E2E:** System-Fallbacks (exakter HTML-Inhalt)

      in Swim- und BZ-Template-Admin; Wartelisten-Flow beider Systeme getestet/geflickt

      (Familien-Bewegungszeit Warteliste, Sync-Mails, SMTP-Fehler bricht Angebot nicht mehr ab,

      Zahlungsbestätigung-Fallback BZ). Command: `app:waitlist:e2e-test`.

- [x] (2026-08-22) **BZ-Dashboard 1:1:** eigenes Dashboard unter `/admin/bz/dashboard`

      (Stats, Schnellaktionen, Kursarten, freie Plätze, Buchungsliste); Startseite beim

      Systemwechsel auf Bewegungszentrum.

- [x] (2026-08-22) **Admin-Dashboard Ladezeit:** keine Voll-Ladung aller Buchungen mehr;

      Counts statt Entity-Listen, Joins für Listen, Buchungstabelle auf neueste 50 begrenzt.

- [x] (2026-08-22) **KSB 2026-08-21 – Fallback-E-Mail neutral:** Zahlungsinfo ohne Kurszuordnung

      kein globaler Fallback mehr; System-Fallback in der Template-Admin-UI sichtbar.

- [x] (2026-08-22) **KSB 2026-08-21 – Workshops getrennt:** eigene Cards für Workshop-Gruppen

      außerhalb des Menüs (Event-Center Step 1).

- [x] (2026-08-22) **KSB 2026-08-21 – Alte Kurse aus Filter:** nur aktive, nicht abgelaufene Kurse

      im Kursbuchungs-Filter.

- [x] (2026-08-22) **KSB 2026-08-21 – Warteliste Nachrutschen:** BZ-Umwandlung mit confirmation-Mail;

      Schwimmen-Umwandlung legt Termin an + Validierungs-Mail.

- [x] (2026-08-22) **KSB 2026-08-21 – Wartelisten-Layout:** BZ-Warteliste an Schwimmen angeglichen.

- [x] (2026-08-22) **KSB 2026-08-21 – Warteliste manuelles Löschen:** BZ-Löschen + Hinweistext;

      bei Angebot Nachrücken.

- [x] (2026-08-22) **KSB 2026-08-21 – BZ-Warteliste Detail-Link:** Detail-Modal statt Kursbuchungs-Liste.

- [x] (2026-08-22) **KSB 2026-08-21 – Manuelle Buchung E-Mails:** Auto-Versand (abschaltbar).

- [x] (2026-08-22) **KSB 2026-08-21 – BZ-Warteliste bezahlt:** Zahlung erst nach Umwandlung.

- [x] (2026-08-22) **KSB 2026-08-21 – Pflichtfelder BZ:** Kind-Formular analog Ferienspiele für **alle**
      Bewegungszentrum-Kurse (Familien-Bewegungszeit eigenes Formular; Gesundheit nur dort Pflicht).

- [x] (2026-08-22) **KSB 2026-08-21 – JS-Fehler selectCourse:** Null-Check für `continueBtn`.

- [x] (2026-08-22) **KSB 2026-08-21 – Systeme optisch trennen:** Dashboard bleibt; Menü nach
      System (Swim/BZ/Fisch/KSB) mit Farben + Switcher; öffentlicher Hub `/buchung`.

- [x] (2026-07-20) **Arbeitspaket 3 – automatisierte Wartelistenangebote:** gemeinsame Migration

      für Angebots-/Reservierungsfelder und Indizes, getrennte Ablauf-Commands mit sicherem

      `--dry-run`, FIFO-Weitergabe, Claim-Kapazitätsprüfung und fehlender BZ-Storno-Trigger;

      Cron- und manuelle Testdokumentation ergänzt.

- [x] (2026-07-20) **`docs/CRONJOBS.md`:** neue Wartelisten-Ablaufjobs inklusive Zweck,

      `--dry-run`, Exit-Codes und empfohlenem 5-Minuten-Intervall dokumentiert; bestehende

      Betriebsdokumentation verlinkt.

- [x] (2026-07-20) **BZ-Kurswarteliste:** automatische Eingangsbestätigung erhält einen neutralen

      Fallback, falls kein aktives Wartelisten-Template vorhanden ist; isolierter Versandtest

      an `pohl@dpohl-engineering.de` erfolgreich.

- [x] (2026-07-20) **Event-Center-Kursleiter in Buchungsübersicht:** aktive Personalzuordnungen

      werden konsistent gezählt, angezeigt und in der Übersichtsabfrage mitgeladen.

- [x] (2026-07-16) **E-Mail-Postfach getrennt:** Ordner „Kunden & Antworten“ vs. „Buchungsbestätigungen“; Kunden zuerst bei „Alle E-Mails“.

- [x] (2026-07-16) **BZ/Event-Center:** neutrale Fallback-E-Mails, Template-Fallback nur ohne Kurszuordnung, Postfach-Standortfilter, CSV-Export erweitert, E-Mail erneut senden + Export mit Filter, Workshop-Gruppen, Ferienspiele-Geschwister mit Gesundheitsfeldern.

- [x] (2026-07-16) **Agenten-Doku wie Datalogger-Projekt:** `AGENTS.md`, `docs/TODO.md`,

      `docs/journal/`, `.cursor/rules/projekt-konventionen.mdc` angelegt.

- [x] (2026-07-11) **SSL-Zertifikate erneuert** (`dulcopool.dp-smartsolutions.de`,

      `dp-smartsolutions.de`) — Runbook: `SSL_CERTBOT_ERNEUERUNG.md`.

- [x] (2026-06-26) **Bewegung am Ehrentag — Wording:** kein „Kindergeburtstag"/„Geburtstagskind" in

      Event-Center-Buchungssteps; „Wünsche des Kindes", „Bewegter Ehrentag".

- [x] (2026-06-26) **Workshop-Zeitslots:** `bookableTimeSlots` im Admin + Auswahl in Step 3 +

      Kapazitätsprüfung bei Buchung; gebuchte Uhrzeit in `/admin/course-bookings`.

- [x] (2026-06-26) **E-Mail-Templates getrennt:** Termin-Admin nur `APPOINTMENT_TYPES`; Event Center

      + Kursbuchung unter `/admin/event-center/email-templates/`; Event-Center-Template-UI

      gruppiert/einklappbar.

- [x] (2026-06-26) **Outlook Token-Refresh + Einzel-Sync** für Event-Center-Buchungen; fehlende

      Termine bei Statuswechsel nachholen.

- [x] (2026-06-26) **Kursleiter-Portal:** vergangene Event-Termine (einklappbar) für Abrechnungs-Check.


