# TODO

Offene Punkte unter „Offen“, erledigte nach „Erledigt“ mit Datum `(YYYY-MM-DD)`.
Zu Beginn einer Aufgabe lesen, am Ende fortschreiben. Was entschieden oder geändert wurde, ins Journal `docs/journal/YYYY-MM-DD.md`.

Das Journal existiert schon. Diese Liste ist der Ort für offene Punkte, die bisher nur in `docs/ARBEITSPAKETE.md` oder im Journal standen.
Bei Änderungen am System Changelog beachten
## Offen

- [ ] (2026-11-09) **Wartelisten-Claim ausrollen.** Lokal: Claim-Seiten ohne SwimMonitor-Menü (`waiting_list/_layout.html.twig`), `error` im Template abgesichert (war nur mit Debug ein 500). GET/POST lokal geprüft. Offen: Deploy, danach `cache:clear`. Ursache des Live-500 (07.11.): `appointment.notes` (255) zu kurz für Präfix + Wartelisten-Notiz, siehe Journal 2026-11-09.

- [ ] (2026-11-09) **Claim scheitert bei langer Wartelisten-Notiz – ausrollen.** Migration `Version20261109140000` ist bereits in der (gemeinsamen) Produktionsdatenbank angewendet (09.11. 13:57), `appointment.notes` ist LONGTEXT; damit ist der 500 behoben. Offen: Entity-Änderung deployen, `cache:clear`. Betroffen waren: Einträge #1228–#1235 (eine Familie, acht Kurse, 237–242 Zeichen) und jeder künftige mit > 230 Zeichen. Eintrag #1234 (Kurs 467) hat den Platz am 07.11. dadurch verloren (Kundin schrieb 12:10); Familie kontaktieren.

- [ ] (2026-11-09) **Achtung: lokal und Server teilen dieselbe Datenbank** (`grafana`). Datenverändernde Befehle lokal wirken in Produktion. Entscheiden, ob lokal eine eigene Datenbank bekommt.

- [ ] (2026-11-09) **Lilian-Messungen → Container ausrollen.** Datenbank fertig (gemeinsame DB): Migrationen `Version20261109150000` und `Version20261109160000` sind schon angewendet, alle 954 Messungen zugeordnet (Mobi 653, Narwali2 301), Bonn Medinghoven und Zülpich in `point_ids` ergänzt, Messeinheit 2/3 entfernt. Neu im Code: Abruf holt die Punktliste selbst von Lilian. Offen: Code deployen plus `cache:clear`; bis dahin bekommen neue Cron-Importe keinen Container, danach einmal `lilian-labs:assign-containers --dry-run` und ohne. Klären: `influx_mappings` ordnet Bayrol (Narwali) Kall zu, laut Nutzer stand dort Narwali2; Bonn/Zülpich fehlen dort. Token: Anmeldung liegt lokal in der Konfiguration (E-Mail, verschlüsseltes Passwort, Einmalcode). Cron kann das nicht allein erneuern, Lilian schickt bei jedem Login einen neuen Code und hat keinen Refresh. Ausreißer (pH/Chlor 1000) bleiben offen.

- [ ] (2026-11-10) **Mobi 2 Portweiterleitungen zuordnen.** Angelegt: Loxone 8777 → `.146`, Loxone2 8778 → `.203`, Loxone3 8780 → `.244` (antworten), Dulcopool 8787 → `.82` und test 8779 → `.145` (Geräte an Mobi 2 noch nicht vorhanden). Offen: prüfen, welcher Loxone welcher ist. Bayrol/Dulcopool ist im LAN von Mobi 2 nicht zu sehen (MAC-Tabelle, ARP-Scan 10.11.): vor Ort Strom/Kabel prüfen, dann IP ablesen und Weiterleitung 8787 anpassen.

- [ ] (2026-11-09) **Mobi 2 MQTT in ioBroker prüfen.** (2026-11-10: MQTT-Passwort laut Nutzer gesetzt; in ioBroker kommt nur der Verbunden-Status, keine Daten — Ursache noch offen.) Router-WebUI ist analog Mobi 1 gesetzt (Topics `rtrmobi2/gpsdata` und `rtrmobi2/lte`). Daten kommen noch nicht an: `data_sender` auf Mobi 2 ist nach Plugin-Parse-Fehler beendet; MQTT-Passwort in der Teltonika-UI ist der Platzhalter, echten Broker-User gegenprüfen. App kennt Mobi 2 noch nicht (`ContainerApiService` nur `rtrmobi`).

- [ ] (2026-11-09) **Router-Online und Standort ausrollen.** Lokal: Online nach Alter von `mqtt.0.rtr….lte/gpsdata` (5 min), Koordinaten direkt aus `gpsdata` (`ContainerApiService`). Offen: Deploy plus `cache:clear`. Optional in ioBroker: Skript `script.js.ksb.gps_mobi` auf das neue Format umstellen, sonst bleiben Ort/Region („Köln“) alt.

- [ ] (2026-11-04) **Buchungskonflikte und HTML-Maskierung ausrollen/abnehmen.** Lokal korrigiert: Event-Center prüft Belegung beim Absenden erneut, Kursumbuchung prüft volle Ferien-/begrenzte Kurse, Paketverwaltung maskiert öffentlich eingegebene Namen in Buchungsdialogen. Helfer-Tests: 17 Tests/62 Assertions. Offen: freigegebenes Deploy und Browserabnahme; atomare Reservierung gegen zeitgleiche Requests ist mit diesen kleinen Korrekturen nicht umgesetzt.

- [ ] (2026-11-03) **Newsletter-Spalte im Kurs-Excel ausrollen.** Lokal gespeichert und im XLSX/CSV. Offen: Deploy plus Migration `Version20261103184500` (erst `--dry-run`). Bestehende Buchungen haben keine gespeicherte Zustimmung.

- [ ] (2026-11-03) **Event-Center-Paketregeln ausrollen.** Lokal: 3,5h überall inaktiv, bis 6 Jahre nur bis 2,5h, ab 7 groß max. 20 / klein max. 12, Hinweis `bz@ksb-dueren.de`. Offen: Deploy plus Migration `Version20261103183000` (erst `--dry-run`). Am kleinen Paket ab 7 bleibt 4,5h aktiv; im Admin deaktivierbar.

- [ ] (2026-11-03) **Mobi Bonn Wassergewöhnung Mo 16–17 4–5 Jahre: öffentlich voll.** Kurs 466 ist 10/10 belegt; Warteliste hat 14 Namen. Admin zeigt jetzt Belegung statt nur Buchungszahl. Offen: Platz nur durch Absage oder `max_slots` erhöhen, danach `offerNext` / öffentliche Warteliste. Kein Deploy.

- [x] (2026-11-01) **Verläufe auf Mobi (`/container/3`) nach Anmeldung.** Tab Verläufe zeigt Temperatur, Chlor, Redox und pH (letzte 24 Stunden). Ursache der leeren Flächen war maskiertes JSON, siehe Journal.
- [ ] (2026-11-01) **Anlagenansicht Bayrol und Narwali 2 prüfen.** Mobi ist gesehen. Offen: dieselben Diagramme auf `/container/1` und `/container/2`, Hell/Dunkel dort. Für Bayrol und Mobi gibt es bisher keine Leistungs-Messreihe.
- [ ] (2026-11-02) **TV-Wand an der Wand prüfen.** Lokal zeigt `/live-dashboard/tv` nur Mobi (Namensanfang „Mobi“, damit Mobi 2 später mitläuft). Narwali ist dort ausgeblendet. LTE-Balken lesen RSRP vom Thema `rtrmobi/lte`. Sollzustand, Stand der Aktualisierung und Nacht ohne Sonne sind lokal gesehen. Offen: Lauf über Modell, Diagramme und die To-do-Tafel, Dauer aus den TV-Einstellungen.
- [ ] (2026-10-31) **SwimMonitor-Oberfläche 2.0 abnehmen und ausrollen.** Stand liegt seit 2026-11-03 auf `main` (`c6fab7f`). Offen: auf dem Server `./scripts/deploy.sh`, danach:
  - Datenverändernde Aktionen einmal im Browser durchspielen, da lokal bewusst nicht ausgeführt: Termin anlegen/verschieben/löschen (Kalender und Container), Terminart anlegen/löschen, To-Do und Tags, Inspektionsvorlage speichern/kopieren, Lilian-Labs-Sync und -Konfiguration, Benutzer anlegen/bearbeiten/löschen, Einstellungen speichern.
  - Danach CSP-Header `script-src 'self'; style-src 'self'` für die SwimMonitor-Routen setzen (`img-src` braucht den OSM-Kachelserver).
  - Entscheiden, ob `/calendar` öffentlich bleiben soll (`security.yaml`: `PUBLIC_ACCESS`, die Termin-API verlangt aber `ROLE_USER`; ohne Anmeldung zeigt die Seite jetzt nur einen Hinweis).
  - Terminart löschen, die noch an Terminen hängt: Verhalten der Datenbank prüfen (Fremdschlüssel).
  - Lilian-Labs-Token am 09.11.2026 erneuert (gültig bis 10.12.2026), Daten nachgeladen; Ausreißer siehe Punkt „Lilian-Messungen → Container“.
  - Deploy, danach `cache:clear`.
- [ ] (2026-10-30) **Signage: Browser-Wiedergabe in Betrieb nehmen.** Verwaltung und Manifest können `device.playback=browser` (bei HDMI fehlt das Feld). Offen: Migration `Version20261030161500` (erst `--dry-run`), Player-Stand aus `dp signage pc` (Git `09c6303` auf `main`) auf dem Gerät. Ein älterer Player lehnt eine Browser-Version ab.
- [ ] (2026-10-26) **Signage auf dem Server in Betrieb nehmen.** Code fertig, lokal geprüft. Offen: `ffmpeg` installieren, Deploy, Migration `Version20261026170000` (erst `--dry-run`), `shared/var/signage` für www-data beschreibbar, prüfen ob die Anfragen von `signage01` mit VPN-IP `192.168.55.30` als `REMOTE_ADDR` ankommen (sonst `SIGNAGE_PLAYER_ALLOWED_IPS` anpassen), Hosts-Eintrag/Zertifikat auf dem Gerät, ersten Upload eines großen Videos testen (Abschluss rechnet sha256 und ffprobe synchron, Proxy-/FPM-Timeouts beachten). Schritte: `docs/SYMFONY-INTEGRATION-SIGNAGE-DPOHL.md` Abschnitt 9.
- [ ] (2026-10-26) **Signage: Planungskalender und Text-Videos in Betrieb nehmen.** Code fertig, lokal geprüft. Offen: `apt install ffmpeg fonts-dejavu-core`, Migration `Version20261026220000` (erst `--dry-run`), `cache:clear`, ein Text-Video testweise erstellen. Springt der Auftrag nicht auf „fertig“, Cron `signage:text-video:render` einrichten (`docs/CRONJOBS.md`). Spezifikation Abschnitt 9 „Planungskalender“ / „Text-Videos“.
- [ ] (2026-10-26) **Signage: Bildschirme an `signage01` hochkant drehen.** Die Webseite schickt `outputs[].rotation` mit (bei `normal` nicht). Offen: Player mit `rotation`-Unterstützung auf `signage01` einspielen. In der lokalen Kopie `h:\dev\dp signage pc` kennt `domain.py` das Feld noch nicht; ein älterer Player lehnt gedrehte Versionen ab. Danach in der Verwaltung Anschluss `HDMI-1` und Drehung `right` (bzw. `left`) setzen, veröffentlichen, am Bild prüfen.
- [ ] (2026-10-26) **Idee (nicht beauftragt): Signage-„Live“-Bild** — Screenshot vom Player (mpv) per Heartbeat/Befehl auf die Geräteseite. Erst nach Rückmeldung des Nutzers.
- [ ] (2026-10-26) **Signage: Synchronisation im Player bauen** (Projekt `dp signage pc`, nicht test_projekt) gegen die neue Geräte-API, inkl. `cancel_command_ids`. Danach Abnahmeliste Abschnitt 8 am echten Gerät abhaken.

- [ ] (2026-10-21) **Kritische PHP-Sicherheitsmeldung prüfen.** Tatsächliche PHP-Version und Paketstand des produktiven Webservers ermitteln, mit den offiziellen betroffenen/korrigierten Versionen abgleichen und erforderliches Laufzeit-Update planen. Repository verlangt nur PHP >=8.1; produktive Betroffenheit noch nicht bestätigt.

- [ ] (2026-07-20) **Wartelisten-Automatisierung deployen.** Umsetzung ist abgeschlossen, Deployment steht aus. Siehe `docs/ARBEITSPAKETE.md` und `docs/CRONJOBS.md`.
- [ ] (2026-10-13) **Elternbrief-Testtoken-Fix deployen.** Testversand speichert Kampagne für Flaggen-Links; lokal behoben, Server noch ohne Fix.
- [ ] (2026-10-15) **Schwimm: Kind-Name isoliert pro Buchung deployen.** Admin-Änderung von Vorname/Nachname/Geburtsdatum schreibt nicht mehr auf gemeinsamen Customer.
- [ ] (2026-10-15) **Fisch: Warteliste nur Admin + kein Auto-Nachrücken deployen.** Öffentliche Wartelisten-Anmeldung zu; Nachbesetzung manuell im Admin; Annahme-Links für bestehende Angebote bleiben.

## Erledigt

- [x] (2026-11-09) **Swim-Wartelisten-Claim lokal durchgespielt.** Gültiges Angebot: zuerst 500 durch undefined `error` in `claim.html.twig`; nach Fix GET-Formular und POST-Erfolg („Ihr Platz wurde gebucht.“). Testdaten entfernt. E2E-Option `--stop-before-claim` gibt die Claim-URL aus.

- [x] (2026-11-09) **Mobi 2 Modbus und Data-to-Server wie Mobi 1.** GPS, Modbus TCP Server/Client (`gpsdata` Register 144/146) und Sammlungen `dp`/`lte` mit Topics `rtrmobi2/gpsdata` und `rtrmobi2/lte`. MQTT in ioBroker noch offen, siehe Offen.

- [x] (2026-11-04) **Fehlerfinder: drei schwere Buchungs-/Sicherheitsfehler lokal korrigiert.** Veraltete Event-Center-Formulare, volle Zielkurse bei Umbuchung und gespeichertes HTML in Paket-/Dauer-Buchungsdialogen; sechs Regressionstests für die Buchungsprüfungen ergänzt (Journal 2026-11-04).

- [x] (2026-11-04) **Mini-3D-Modelle auf der Übersichtskarte.** `/api-data` zeigt je Standort das Container-GLB statt eines Punkts.

- [x] (2026-11-03) **Newsletter-Zustimmung im Kurs-Excel.** Teilnehmerliste XLSX und CSV enthalten die Spalte; die Buchung speichert die Checkbox.

- [x] (2026-11-03) **Event-Center-Pakete für künftige Buchungen angepasst.** 3,5 Stunden überall und 3 Stunden bei bis 6 Jahre für neue Buchungen deaktiviert, nicht gelöscht. Max. Kinder ab 7: groß 20, klein 12. Hinweis auf `bz@ksb-dueren.de` unter den Paketen, im Admin je Paket änderbar. Bestehende Ehrentage behalten Dauer und Teilnehmerzahl.

- [x] (2026-11-03) **Fehlerfinder: eingegrenzte Folgeprüfung.** Genannte Dateien auf konkret auslösbare schwere Fehler geprüft, bereits offene Befunde ausgenommen. Kein neuer schwerer Fehler sicher belegt; Helfer-Tests erfolgreich (11 Tests, 24 Assertions). Browserabnahme und Geräteprüfung bleiben offen.

- [x] (2026-11-02) **Fehlerfinder: Container-Datenexport abgesichert.** CSV-Spalten bleiben bei Messlücken korrekt zugeordnet; mehr als 1000 Rohpunkte je Parameter und fehlgeschlagene Messabfragen brechen mit Fehlermeldung ab. Vier Regressionstests ergänzt; Helfer-Tests erfolgreich (11 Tests, 24 Assertions). Kein Deploy.

- [x] (2026-11-01) **Mobi-Außentemperatur in Verläufen und in der 3D-Ansicht.** Messreihe `mobi_aussentemperatur`, Pin vor dem Container.

- [x] (2026-11-01) **3D-Anlagenansicht auf der Container-Seite.** Modell, Folie und Fenster aus `schwimmcontainer` auf `/container/{id}`, mit den vorhandenen Stamm- und Live-Werten, Wasserwelle und Energie, soweit Influx oder das Narwali-2-Panel sie hergeben (siehe Journal 2026-11-01).

- [x] (2026-11-01) **Fehlerfinder: genannte geänderte Dateien geprüft.** Kein neuer schwerer Fehler sicher belegt; Helfer-Tests erfolgreich (7 Tests, 15 Assertions). Browserabnahme bleibt offen.

- [x] (2026-11-01) **Signage: interaktive Erste-Schritte-Führung.** Knopf „Anleitung“, `public/js/admin/signage-tour.js`, Changelog 2.1.0 (siehe Journal 2026-11-01).

- [x] (2026-10-31) **SwimMonitor-Seiten im neuen Stil umgebaut.** Alle beauftragten Seiten samt Unterseiten ohne Inline-CSS, Inline-JS und CDN; Stilregeln in `docs/SWIMMONITOR-STYLE.md`, Changelog 2.0.0 (siehe Journal 2026-10-31).

- [x] (2026-10-26) **Signage-Modul umgesetzt.** Verwaltung `/signage`, Geräte-API, Manifest im Player-Format, Zeitplan-Port, Migration. Lokal geprüft (siehe Journal 2026-10-26).

- [x] (2026-10-16) **/api-data: Narwali ausgeblendet, Karte rechts.** Narwali/Narwali2 bleiben in DB, fehlen in Übersicht/Karte; Layout Cards+Karte; OpenLayers/OSM ohne API-Key.

- [x] (2026-10-16) **Logo-Bestandteile separat erstellt.** Symbol und Schriftzug als separate PNG-Varianten; Original und Website unverändert.

- [x] (2026-10-15) **Fisch Admin-Warteliste Timeout behoben.** Index lud Kapazität pro Eintrag×Kurs; jetzt einmalige Batch-Berechnung (`countBookedForCourses`).

- [x] (2026-10-15) **Rechtsseiten ans neue Design angepasst.** Impressum und Datenschutz mit aktuellem Logo, Dunkellila/Gelb, offenen Textabschnitten und responsivem Inhaltsverzeichnis.

- [x] (2026-10-15) **Loggerbau durch Smart Home ersetzt.** Neues 3D-Haus mit PV, Beleuchtung und Monitoring; Leistungsübersicht und Bildtexte angepasst.

- [x] (2026-10-15) **Effekte/Dopplungen und Rechtsseiten geprüft.** Ein gemeinsamer Scroll-Observer, doppelte Ablauf-FAQ und Bild-Schlagwörter entfernt; lokale Vorschau für Impressum/Datenschutz korrigiert.

- [x] (2026-10-15) **3D-Projektbeispiele und Loggerbau ergänzt.** Buchungssoftware, Pool-Monitoring und individueller Datenlogger als gekennzeichnete Beispielillustrationen; WebP, responsive Bildreihe und dezente Interaktion.

- [x] (2026-10-14) **Dezente Effekte auf Firmenseite.** Einmalige Scroll-Einblendung, Hover-/Klick-Rückmeldung, ruhige Link- und Linienakzente; reduzierte Bewegung berücksichtigt.

- [x] (2026-10-14) **Firmenseite auf schnelle Übersicht gekürzt.** Was/Wie/Vorteile im Einstieg, konkrete Möglichkeiten als Stichpunkte; Leistungen und KI-Umsetzung vor Referenz, kürzere Über-mich- und Ablauftexte.

- [x] (2026-10-14) **Individualsoftware mit KI erklärt.** Abschnitt zu zugeschnittenen Funktionen, schnellerer und günstigerer Entwicklung sowie Software ohne laufende eigene Lizenzgebühren ergänzt; Betriebskosten separat benannt.

- [x] (2026-10-14) **Firmenseite persönlich gestaltet.** Auf Nutzerwunsch Dunkellila/Gelb ohne Leuchteffekte; Firmenlogo mit angepasstem Hintergrund integriert (Original erhalten), sachlicher Einstieg ohne Werbedreizeiler und Schmuckschrift, KSB-Projekt im Vordergrund; Desktop, Mobilnavigation und Formular-Pflichtfelder lokal geprüft.

- [x] (2026-10-14) **Schwimmkurs-Buchung: Name bleibt nach Speichern erhalten.** Admin-Update schreibt Vorname, Nachname, E-Mail, Telefon und Geburtsdatum des Kunden mit.

- [x] (2026-10-05) (2026-08-22) **Hub und KSB-Fixes deployen.** Öffentlicher Einstieg `/buchung` und Wartelisten-Nachzug sind umgesetzt, Deploy steht aus.

- [x] (2026-10-04) (2026-09-10) **Fit wie ein Fisch: Absender, Standorttexte, Cron.** Phase 5 ist live, diese drei Punkte sind offen. Siehe `docs/FIT_WIE_EIN_FISCH.md`.
