# Offene Punkte – Backlog aus der Code-Analyse

Laufende Liste der offenen Verbesserungen aus der projektweiten Analyse
(Gruppen UI / Konsistenz / Technisch / Funktionen). Zweck: festhalten, was noch
aussteht und welche Entscheidungen dafür beim Kunden liegen. **Erledigtes** steht
im [CHANGELOG](../CHANGELOG.md); dieses Dokument führt nur das *Offene*.

> Abgrenzung: [`offene-aufgaben-schwierigkeiten.md`](offene-aufgaben-schwierigkeiten.md)
> schätzt den Aufwand der **Angebots-Positionen** (Pos 9–12, Konzept-Lücken).
> Hier geht es um den **Code-Qualitäts- und Feature-Backlog** aus der Analyse.

## Bereits umgesetzt (Kurzüberblick)

Details je Commit im CHANGELOG. Erledigt sind:

- **UI:** responsives Suchformular (1.2), barrierefreie klickbare Listen (1.3),
  kaputtes News-Markup (1.4), Soft-Scroll zu den Treffern. (1.5 „toter Dark-Mode"
  existierte gar nicht — Fehlbefund.)
- **Konsistenz:** NewsRepository + `download.php` über Repository (2.1),
  SQL-Escaping-Missbrauch → Cast/`e()` (2.2), `htmlspecialchars` → `e()` (2.3),
  Suchfilter als datengetriebener Builder (2.4), redundante DB-Checks entfernt
  (2.5), toter Favoriten-Code (2.6).
- **Technisch:** XSS in der Detailseite (3.1), keine SQL-Fehler-Leaks mehr (3.2),
  Upload-Inhaltsprüfung per finfo (3.3), Login-Ratenbegrenzung (3.4),
  ungeprüfte `$_GET`/`$_POST` abgesichert (3.6).
- **Feature:** Mailserver-Box mit Testmail in den Einstellungen.

## Offen – Technisch

- **3.5 Rollen / Autorisierung.** Heute darf jeder eingeloggte Nutzer alles
  ändern/löschen; schreibende Endpunkte prüfen nur „eingeloggt", keinen
  Objektbesitz/keine Rolle. Grösserer Eingriff. Konzept dazu:
  [`benutzerverwaltung-analyse.md`](benutzerverwaltung-analyse.md).
- **3.7 Testabdeckung.** Nur Golden-Master (`tests/goldenmaster.sh`) + ein
  CSRF-Test; keine Unit-Tests für `app/Repository/*` oder `App\Security\*`
  (z. B. `DownloadToken`, der neue Filter-Builder, `LoginAttemptRepository`).
- **3.8 Inline-Event-Handler → CSP.** ~70 `onclick=`-Attribute verhindern eine
  strikte Content-Security-Policy. Schrittweise auf delegierte Listener
  (`data-*`) umziehen — das Muster gibt es bereits (`toggleBpCard`, der neue
  `data-href`-Handler, `csrf.js`). Grosser, niedrig-dringlicher Umbau.

## Offen – Funktionen

- **4.1 Export gefilterter Listen (CSV/PDF)** für Berichte an den Verband. Die
  Filterlogik ist mit 2.4 jetzt sauber gekapselt (WHERE-Builder in
  `search/searchResult.php`), also gut wiederverwendbar. CSV via `fputcsv` ohne
  Lib; echtes `.xlsx`/PDF bräuchte eine Composer-Lib (Deploy/PHP-Version
  beachten). Vgl. Konzept-Lücken in `offene-aufgaben-schwierigkeiten.md`.
- **4.2 Volltextsuche** — **umgesetzt** in der *einfachen* Suche (siehe unten);
  offen bleibt nur die spätere Ausbaustufe `FULLTEXT`.
- **4.3 Audit-/Änderungsverlauf pro Brennpunkt** (wer/wann/welches Feld). Heute
  nur ein Zeitstempel `proZuletztBearbeitet`. Grundlage auch für 3.5.
- **4.4 Termin-Benachrichtigungen ausbauen.** Cron + `Mailer` verschicken schon
  Fristen-Mails; naheliegend: In-App-Badge, konfigurierbare Vorlaufzeit,
  Wochenübersicht.
- **4.5 Gespeicherte Suchen / Filter-Presets** pro Nutzer über das vorhandene
  `tabUserPref`/`UserPrefRepository` (wie `homeBpCards`). Die Suche ist bereits
  URL-parametrisierbar.

## Zuletzt umgesetzt

### 4.2 Volltextsuche (umgesetzt in der einfachen Suche)

Statt wie ursprünglich geplant nur in der *erweiterten* Suche steckt die
Volltextsuche in der **einfachen** Suchleiste, mit Umschalter **Titel / Volltext**
(Feld + Umschalter als ein Bedienelement). **Titel** (Standard) filtert weiterhin
die gruppierte Übersicht clientseitig (Kanton › Gemeinde, auf-/zuklappbar).
**Volltext** sucht serverseitig und ersetzt die Übersicht durch eine Trefferliste:
je Treffer Name + Datum (rechts) und eine Zeile je Fundfeld (Tag + markierter
Auszug). Live beim Tippen (Volltext ab 3 Zeichen) mit Lade-Puls.

Getroffene Entscheidungen: Volltext durchsucht **Titel, Gegenstand, Bemerkung und
Notizen** (`EXISTS` auf `tabNotiz`; Dokumentnamen bewusst nicht, Mojibake);
Default **Titel** (gruppierte Übersicht); Persistenz vorerst nur in der **URL**
(`/suche?q=…&scope=`).

Technik: `LIKE` (kein Schema-Eingriff, latin1-verträglich), Endpoint
`search/quickSearch.php`, `ProjektRepository::searchFulltext()`/`matchingNotes()`.

**Offen (spätere Ausbaustufe):** Wechsel auf `FULLTEXT` (relevanzsortiert) nach
der utf8mb4-Migration — die Schnittstelle (`scope`-Parameter/URL) bleibt gleich,
es wird nur der WHERE-Zweig getauscht. Optional: Modus zusätzlich pro Nutzer
persistieren; den Titel/Volltext-Gedanken auch auf das Textfeld der erweiterten
Suche übertragen (heute sucht es fest in Gegenstand/Bemerkung).

### Inline-Erfassen „Neuer Brennpunkt" (umgesetzt)

„Neuer Brennpunkt" öffnet jetzt inline auf der Startseite (Muster der erweiterten
Suche: drei Karten + Filterfeld aus, Inline-Karte links, Termine-Spalte rechts
bleibt). Kein eigener Seitentitel („Brennpunkte" bleibt), Karten-Kopf „Neuer
Brennpunkt", Brotkrume „Brennpunkte › Neuer Brennpunkt", eigene URL
`/neuer-brennpunkt` (deep-linkbar). Nach dem Speichern wird der neue Eintrag
geöffnet. **Bearbeiten** bleibt unverändert in der Detailansicht.

Umsetzung: Das Formular-Markup liegt einmalig in `detail/erstellenForm.php`
(genutzt von der Standalone-Seite `erstellen.php` *und* inline), die Logik in
`detail/erstellenForm.js`. ID-Kollision mit der erweiterten Suche gelöst über
einen optionalen ID-Präfix in den Dropdown-Helfern (`detail/function.php`) und
der Gemeinde-Kaskade (`gemeindeProKanton.php`); das Inline-Formular nutzt
`bp…`-IDs.

### „Was ist neu" / Release Notes (umgesetzt)

Die frühere, fest verdrahtete „Update-Info"-Tabelle in den Einstellungen ist
abgelöst: eigene Seite `/was-ist-neu` (nach Release in Akkordeons), gespeist aus
`RELEASE-NOTES.md` (kuratiert, im Code gepflegt, getrennt von der technischen
`CHANGELOG.md`; keine DB, kein Oberflächen-Editor). Hinweis auf Ungelesenes über
ein Startseiten-Band („N Neuerungen im LBM") und ein Glocken-Badge im Header
(alle Seiten); Lesestand pro Benutzer in `tabUserPref` (`updatesSeen`). Zugang
zusätzlich über einen Link in den Einstellungen. Umsetzung: `App\Content\UpdateLog`,
`public/updates/` (`index.php` zeigt an + markiert gesehen, `seen.php` fürs
Ausblenden des Bands).

## Grössere Themen mit eigenem Dokument

- **utf8mb4-Migration:** [`utf8mb4-migration-analyse.md`](utf8mb4-migration-analyse.md),
  [`utf8mb4-migration.md`](utf8mb4-migration.md). Voraussetzung u. a. für 4.2 (FULLTEXT).
- **Benutzerverwaltung / Rollen (3.5):** [`benutzerverwaltung-analyse.md`](benutzerverwaltung-analyse.md).
- **Journal auf dem Smartphone:** [`journal-reiter-mobile.md`](journal-reiter-mobile.md)
  (eigener Reiter statt zweiter Spalte — Analyse liegt vor, Umsetzung offen).
