Versionsverlauf

Aktuelle Version: 2.7.0 · Was wann und wie umgesetzt wurde (Changelog).

# Changelog – FANBUS.KOELN Mitfahrportal

Alle wichtigen Änderungen an dieser Anwendung werden hier dokumentiert.

Format basiert auf Keep a Changelog. Versionsschema: Semantic Versioning (MAJOR.MINOR.PATCH).

---

## [2.7.0] – 2026-04-03

**Warteraum: öffentliche Hinweise + Kachel auf der Startseite.**

### Hinzugefügt

- **Startseite `public/index.php`:** Info-Kachel **Warteraum** mit Modal (ausführliche Erklärung: unverbindliches Interesse bei ausgebuchter Fahrt, Reihenfolge nach Anmeldung, kein Anspruch; Nachrücken z. B. bei zusätzlicher Kapazität).
- **Warteliste (technisch, siehe vorherige Arbeit):** Tabelle `booking_waitlist`, Buchungsflow `rides-book.php`, Hinweise `rides.php`, Admin `admin/waitlist.php`.

---

## [2.6.0] – 2026-03-22

**Pinwand: klare Hierarchie Rubrik → Block (Fahrt) → Bilder.**

### Hinzugefügt / Geändert

- **Tabelle `pinwand_albums`:** gehört zu einer Rubrik, optional **`ride_id`** (Spieltag/Fahrt) und optional **`title`** (Überschrift ohne Fahrt). Pro Block **1 bis beliebig viele** Bilder.
- **Migration `migrations/php_add_pinwand_albums.sql`:** legt Alben an, setzt **`pinwand_images.album_id`**, ordnet bestehende Bilder dem ersten Block je Rubrik zu.
- **Optional `migrations/php_pinwand_albums_copy_ride_from_category.sql`:** übernimmt **`pinwand_categories.ride_id`** in den ersten Block, falls diese Spalte noch existiert.
- **Admin `admin/pinwand.php`:** Rubriken nur noch mit Titel; neuer Bereich **„Blöcke“** (Fahrt + optional Überschrift); Upload und Bildtabelle wählen den **Block**. Neuerubrik legt automatisch einen ersten Block an.
- **Öffentlich `public/pinwand.php`:** Rubriküberschrift, darunter pro Block Zwischenüberschrift (Titel und/oder Datum·Gegner·Stadion), darunter Bildraster.
- **Ohne Album-Migration** bleibt der alte Modus (nur Rubrik → Bilder) erhalten.

---

## [2.5.1] – 2026-03-22

**Pinwand: Rubrik optional mit Fahrt verknüpfen (1–x Bilder pro Fahrt).**

### Hinzugefügt

- Spalte **`pinwand_categories.ride_id`** (FK auf `rides`, `ON DELETE SET NULL`) – Migration `migrations/php_add_pinwand_category_ride_id.sql`.
- **Admin → Pinwand:** Beim Anlegen und Bearbeiten einer Rubrik kann eine **Fahrt** ausgewählt werden (Liste: Datum, Gegner, Fahrt-ID). Bilder werden wie bisher der Rubrik zugeordnet – damit **mehrere Fotos zu einer konkreten Fahrt**.
- **Öffentliche Pinwand:** Unter der Rubriküberschrift erscheint bei Verknüpfung eine **Zeile Spieltag/Gegner/Stadion** (aus `matches`).

---

## [2.5.0] – 2026-03-22

**Pinwand (öffentliche Bildergalerie mit Rubriken) + Portal-Look an Odoo angeglichen.**

### Hinzugefügt

- **Öffentliche Pinwand:** `public/pinwand.php` – Rubriken, Raster mit Bildern und optionalem Kurztext; für Gäste und eingeloggte Nutzer (Layout unterscheidet sich wie bei anderen Seiten: Gast-Navbar vs. App mit Sidebar).
- **Admin-Pflege:** `admin/pinwand.php` – Rubriken, Upload (JPG/PNG/WEBP, max. 3 MB), Reihenfolge, Bildtext; nach Upload **persistenter Test-Link-Kasten** (Session) zum Kopieren; klarere Meldungen bei zu großen Dateien / leerem POST (`post_max_size`) und CSRF.
- **Diagnose:** `admin/pinwand-diagnose.php` – prüft `file_path` gegen Suchpfade und Test-URLs.
- **Bild-Auslieferung:** `core/upload_serve_relative.php` (mehrere mögliche Upload-Wurzeln); `public/upload-view.php` bindet das ein. Optional `public/pinwand-img.php` bzw. `?pwimg=` in `pinwand.php` für Auslieferung per Bild-ID.
- **Navigation:** Einträge „Pinwand“ in öffentlichem Header (Gast + App-Sidebar) und Admin; Odoo-Hauptseite verlinkt auf das Mitfahrportal.

### Geändert

- **Pinwand-UI:** An Dashboard/Portal angeglichen (`dashboard-header`, Bootstrap-Karten), kein separater großer Rot-Hero unter der Navbar.
- **Erscheinungsbild Portal (Annäherung Odoo, nicht 1:1):** Schrift **Inter Tight** und Hintergrund **`#f0f4f5`** wie auf der Odoo-Website; CSS-Variablen `--odoo-accent`, `--odoo-ink` in `style.css`. Betroffen: `templates/public/header.php`, `templates/admin/header.php`, `assets/css/style.css`, `assets/css/admin.css`.

### Migrationen / Tabellen

- `migrations/php_add_pinwand_images.sql`
- `migrations/php_add_pinwand_categories.sql`

### Relevante Dateien

- **Public:** `public/pinwand.php`, `public/pinwand-img.php`, `public/upload-view.php`
- **Admin:** `admin/pinwand.php`, `admin/pinwand-diagnose.php`
- **Core:** `core/upload_serve_relative.php`, `core/functions.php` (`upload()`, `upload_script_url()`, `pinwand_image_url()`)
- **Doku:** `AGENT-HANDOVER-PINWAND.md`, `PINWAND-ABNAHME.txt`, `DEPLOY-LISTE-PINWAND.txt` (falls vorhanden)

### Hinweis Versionierung

- **`VERSION`-Datei** wird von `changelog.php` („Versionsverlauf“) und `APP_VERSION` genutzt – bei Releases mit Changelog-Eintrag **immer auf die gleiche Versionsnummer** setzen wie die oberste Version hier.

---

## [2.4.0] – 2026-03-18

**Fan‑Organisation: Mitgliederbereich + Archiv + exklusive Klüngelbockx (Ticket-/Tauschbörse).**

### Hinzugefügt

- **Öffentlicher Mitgliederbereich „Fan‑Organisation“:** Neue Seite `public/fanorganisation.php` als zentrale Einstiegsseite für Mitglieder (Module: Archiv, Klüngelbockx). Sichtbarkeit/Access basiert auf dem bestehenden Status `users.fanclub_member` (Admin hat immer Zugriff).
- **Archiv (Text + Dateien):** Neue Mitglieder-Seite `public/fanorganisation-archiv.php` mit:
  - Textbeiträge aus `fanorganisation_archiv`
  - Datei-Archiv aus `fanorganisation_archiv_files` (Kategorien aus `fanorganisation_archiv_categories`, initial: „Bilder“, „PDF“)
- **Admin: Archiv-Verwaltung (kein MySQL-Handbetrieb):**
  - `admin/fanorganisation-archiv.php` (Kategorien anlegen, Dateien hochladen/löschen, Überblick)
  - `admin/fanorganisation-archiv-edit.php` (Textbeiträge erstellen/bearbeiten/publizieren/löschen)
- **Navigation Portal & TONI:** Links zur Fan‑Organisation wurden im Portal-Header (nur für Mitglieder) und in TONI (Teilnehmer-Navigation/Hamburger) ergänzt.
- **Klüngelbockx exklusiv für Mitglieder:** Klüngelbockx liegt unter `portal/kluengelbockx/` und ist nur erreichbar für eingeloggte Portal-Nutzer mit `users.fanclub_member = 1` (Admin immer). Guard sitzt in:
  - `portal/kluengelbockx/index.php` (UI-Gate, liefert bestehende `index.html` aus)
  - `portal/kluengelbockx/api.php` (API-Guard; Workflow/Mails unverändert)
- **Klüngelbockx UX/Portal-Integration:** Oben eine kleine Portal-Leiste („Zur Fan‑Organisation“, „Startseite“). Header-Badge „powered by FANBUS.KOELN“. Externe Promo-Verlinkungen/Banner sowie Impressum/Datenschutz innerhalb der Klüngelbockx wurden entfernt (Rechtliches wird im Portal abgedeckt).
- **Kommunikation: Kampagnen‑Vorlage für Mitglieder-Update:** Migration `migrations/php_add_campaign_template_fanorganisation_update.sql` legt die Vorlage „Fan‑Organisation – Update“ in `campaign_templates` an (für Versand über „E-Mail an Fangemeinschaft“).
- **Kommunikation: Abfragen / Voting (MVP):** Neue Admin-Seite `admin/kommunikation-abfragen.php` für Abfragen an Zielgruppen (Fahrt, Spiel, Fan‑Organisation), inklusive Einladungsversand und Live-Auswertung. Teilnehmer stimmen in `public/abfragen.php` ab (eine Stimme pro Nutzer, bis Deadline änderbar). Einstieg auch aus TONI verlinkt.
- **Abfragen – Phase 2:** Mehrfachauswahl (optional), CSV-Export, Reminder-Versand an offene Empfänger und Ergebnis-Mail an alle Empfänger. Poll-Einladungen/Ergebnis-Mails nutzen jetzt einheitliches FANBUS-Maillayout zur Wiedererkennung.
- **Abfragen – Zielgruppe „Alle Teilnehmer“:** Zusätzlich zu Fahrt/Spiel/Fan‑Organisation kann eine Abfrage jetzt an alle registrierten aktiven Teilnehmer gesendet werden.
- **Kommunikation – Schnellnachricht:** Neue Seite `admin/kommunikation-kurzinfo.php` für kurze Info-Mails an Zielgruppen (alle/Fan‑Organisation/Fahrt/Spiel) im einheitlichen FANBUS-Maildesign mit Voransicht.
- **TONI Fahrtbewertungen – Admin-Auswertung wieder sichtbar:** Neue TONI-Admin-Seite `toni.go/fahrtbewertungen_admin.php` mit Durchschnittswerten je Fahrt (Gesamt/Orga/Bus/Theke/Atmosphäre) und Kommentarübersicht. Verlinkt in TONI-Admin-Navigation sowie direkt in `toni.go/einsatz_admin.php` pro Fahrt.

### Geändert

- **Admin-Menü:** „Fanclub‑Initiative“ wurde in **„Mitgliederverwaltung“** umbenannt (bestehender Prozess für `users.fanclub_member`). „Fan‑Organisation“ wurde als **„Archiv“** direkt in der Admin-Navigation verankert (kein „Menü im Menü“).
- **Portal-Startseite (Kacheln):** Fan‑Organisation Kachel für Mitglieder mit kürzeren, mobile-tauglichen Texten; Klüngelbockx wird über die Fan‑Organisation angesteuert (kein separater Kachel-Doppelweg).

### Migrationen / Tabellen

- `migrations/php_add_fanorganisation_members_and_archiv.sql` (Archiv-Texttabelle; die separate Member-Tabelle ist historisch/ungenutzt, da `users.fanclub_member` verwendet wird)
- `migrations/php_add_fanorganisation_archiv_files_and_categories.sql` (Kategorien + Dateien fürs Archiv)
- `migrations/php_add_campaign_template_fanorganisation_update.sql` (Kampagnen‑Vorlage: Mitglieder-Update)
- `migrations/php_add_polls_module.sql` (Abfragen/Voting: polls, options, recipients, votes)
- `migrations/php_update_polls_module_for_multiselect.sql` (Mehrfachauswahl: Unique-Key in `poll_votes` auf `poll_id,user_id,option_id`)
- `migrations/php_update_polls_module_add_target_all.sql` (Enum-Erweiterung `polls.target_type` um `all`)

### Relevante Dateien

- **Portal Public:** `public/fanorganisation.php`, `public/fanorganisation-archiv.php`, `templates/public/header.php`, `public/index.php`
- **Portal Admin:** `admin/fanorganisation-archiv.php`, `admin/fanorganisation-archiv-edit.php`, `admin/fanorganisation.php`, `admin/fanclub-initiative.php`, `admin/fanclub-initiative-edit.php`, `admin/kommunikation-abfragen.php`, `admin/kommunikation.php`, `templates/admin/header.php`
- **Kommunikation kurz:** `admin/kommunikation-kurzinfo.php`, `core/Mailer.php`
- **TONI:** `toni.go/partials/nav_teilnehmer.php`, `toni.go/partials/hamburger_teilnehmer.php`
- **Klüngelbockx:** `kluengelbockx/index.php`, `kluengelbockx/api.php`, `kluengelbockx/index.html`, `kluengelbockx/styles.css`, `kluengelbockx/script.js`
- **Abfragen Public:** `public/abfragen.php`, `public/dashboard.php`

---

## [2.3.0] – 2026-03-09

**Mitfahrgemeinschaft (Einzelanbieter) und Eindeutschen der Oberfläche.**

### Geändert

- **Mitfahrgemeinschaft / Einzelanbieter:** Das Portal ist von einem Mitfahrportal (jeder konnte Fahrten anbieten) auf einen **reinen Einzelanbieter** umgestellt. Nur noch der zentrale Account (z. B. `service@fanbus.koeln`) bzw. Nutzer mit `users.can_offer_rides = 1` dürfen **neue** Fahrten anbieten. Alle anderen Nutzer sehen nur „Gebuchte Fahrten“ und ggf. „Fahrten verwalten“, wenn sie noch **bestehende** Fahrten als Fahrer haben (z. B. historische Angebote). Diese können sie weiterhin verwalten, abrechnen (Fahrt-Bericht, Fahrt-Dokumentation) und bearbeiten. Technisch: `can_offer_rides`, `requireCanOfferRides()`, `hasRidesAsDriver()`; Zugriff auf my-rides, rides-edit, rides-delete, fahrt-bericht, fahrt-dokumentation für Fahrer der jeweiligen Fahrt (oder Admin) auch ohne `can_offer_rides`. Migration: `migrations/php_add_users_can_offer_rides.sql`.
- **Eindeutschen (Oberfläche):** Bezeichnungen und Meldungen auf Hochdeutsch umgestellt: „Dashboard“ → „Übersicht“, „Buchunge“ → „Buchungen“, „Bonus-Codes“ → „Bonuscodes“, „Compliance / Recht“ → „Recht & Compliance“, „Logout“ → „Abmelden“. Kölsch in Fehlermeldungen und UI (z. B. „Wellkumme zeröck“, „Zeije“, „nit“, „Affbreche“, „Seite nit jefonge“) durch standarddeutsche Formulierungen ersetzt. Button „Ding Fahrt“ → „Deine Fahrt verwalten“ (Link zu Meine Fahrten).

### Relevante Dateien

- **Migration:** `migrations/php_add_users_can_offer_rides.sql`
- **Portal:** `core/Auth.php`, `templates/public/header.php`, `templates/admin/header.php`, `templates/sub-admin/header.php`, `public/my-rides.php`, `public/rides.php`, `public/rides-edit.php`, `public/rides-delete.php`, `public/fahrt-bericht.php`, `public/fahrt-dokumentation.php`, `public/dashboard.php`, `public/bookings.php`, `public/rides-create.php`, `public/rides-book.php`, `public/booking-extend.php`, `public/profile.php`, `public/404.php`, `public/500.php`, `sub-admin/dashboard.php`, `sub-admin/bonus-codes.php`

---

## [2.2.0] – 2026-02-22

**Mehrere Busse pro Fahrt, Berechnungsgrundlagen und Kein-Gewinn-Berechnung.**

### Hinzugefügt

- **Mehrere Fahrzeuge/Busse pro Fahrt (Berechnungsgrundlage):** Neue Tabelle `ride_fahrzeuge` (Migration `migrations/php_add_ride_fahrzeuge.sql`) mit pro Fahrt mehreren Einträgen: `position`, `kennzeichen`, `distance_km_einfach`, `km_rate`. Ermöglicht saubere Kein-Gewinn-Berechnung: **Strecke einfach × 2 (Hin + Rück) × Anzahl Busse**, je Bus mit Kennzeichen und eigener Berücksichtigung im Fahrt-Bericht.
- **Fahrt-Dokumentation – Block „Fahrzeuge/Busse“:** In `public/fahrt-dokumentation.php` (sichtbar, wenn Tabelle `ride_fahrzeuge` existiert): Tabelle mit Zeilen pro Fahrzeug (Kennzeichen, Strecke einfach km, €/km). Buttons „Weiteres Fahrzeug“ und „Zeile entfernen“. Speichern schreibt alle Zeilen in `ride_fahrzeuge` (bestehende für diese Fahrt werden ersetzt). Hinweis: „Strecke einfach × 2 (Hin + Rück) × Anzahl Busse – keine Gewinnberechnung.“
- **Fahrt-Bericht – Mehr-Bus-Kalkulation:** In `public/fahrt-bericht.php`: Wenn Einträge in `ride_fahrzeuge` mit `distance_km_einfach > 0` vorhanden sind, werden pro Fahrzeug Strecke einfach, Strecke gesamt (× 2 bei Rückfahrt), Fahrzeugkosten (€/km) und die **Summe Fahrzeugkosten gesamt** berechnet und im Belegkopf („Fahrzeuge: Bus 1 (Kennzeichen), Bus 2 …“) sowie im Kalkulationsnachweis ausgewiesen. **Rückwärtskompatibilität:** Ohne Einträge in `ride_fahrzeuge` gilt weiterhin die bisherige Logik (ein Fahrzeug aus `rides.distance_km`, `rides.license_plate`, `rides.km_rate`).

### Geändert

- **Portal – Plätze pro Fahrt:** In `rides-create.php` und `rides-edit.php` ist die maximale Platzanzahl von 8 auf **30** erhöht (z. B. 7+7 = 14 Plätze bei zwei Bussen). Hinweistext: „z. B. 7 (ein Bus) oder 14 (zwei Busse)“.

### Relevante Dateien

- **Migration:** `migrations/php_add_ride_fahrzeuge.sql`
- **Portal:** `public/fahrt-dokumentation.php`, `public/fahrt-bericht.php`, `public/rides-create.php`, `public/rides-edit.php`
- **Dokumentation:** `CHANGELOG.md`, `DOKUMENTATION-IST-ZUSTAND-ANALYSE.md`, `migrations/ANLEITUNG-DOKUMENTATION.md`

---

## [2.1.0] – 2026-02-22

**Datenschutz, E-Mail-Opt-Out, Kampagnen-Layout und Admin-Übersicht.**

### Hinzugefügt

- **Einheitlicher E-Mail-Footer (Datenschutz):** In **allen** systemgenerierten E-Mails steht unten im Fuß ein kurzer Hinweis („Du erhältst diese E-Mail, weil du dich im FANBUS.KOELN angemeldet hast …“) mit Link **„Lösche mein Konto“** (`public/konto-loeschen.php`). Gilt u. a. für: Verifikation, Aktivierung, Passwort-Reset, Kampagnen, Match-Teilnehmer-Mails, Einzelmail, Buchungs-/Bonus-/Initiativ-Mails, Erinnerungs-Mail, Zahlungsbestätigung. Plain-Text-Variante für AltBody. Technisch: `systemEmailFooterHtml()`, `systemEmailFooterText()`, `appendSystemEmailFooter()` in `core/Mailer.php`.
- **Admin Benutzer – „Konto gelöscht“ erkennbar:** In der User-Verwaltung wird zwischen **„🗑 Konto gelöscht“** (Nutzer hat selbst gelöscht/Opt-Out) und **„✗ Gesperrt“** (vom Admin gesperrt) unterschieden. Neuer Filter **„Gelöscht“** zeigt nur selbst gelöschte Konten (E-Mail `deleted-…@deleted.local`).

### Geändert

- **Analytics – Mitgliederzahlen:** „Gesamt Mitglieder“, „Online“ und „Inaktiv“ zählen nur noch Nutzer mit `status IN ('active', 'email_verified')`. Gelöschte/gesperrte Konten fließen automatisch nicht mehr ein; keine manuelle Nachbereitung nötig.
- **Kampagnen-E-Mail-Layout:** Weniger steril, ansprechender an die übrigen System-Mails angeglichen. Begrenzte Zeilenbreite (max-width: 32em), kein großer Kasten um den Text, einheitlicher Footer-Bereich mit Legal-Links. Gemeinsame Methode `buildCampaignMailHtml()`; gleiches Layout auch für Premium-Partner-Kampagnen.

**Relevante Dateien:** `core/Mailer.php`, `admin/analytics.php`, `admin/users.php`, `public/konto-loeschen.php` (unverändert, bereits vorhanden)

---

## [2.0.0] – 2026-02-12

**Version 2.0 – Neustart.** Die Plattform ist mit eigenen Formalia und Rechtstexten in sich abgeschlossen und kann als eigenständiges Mitfahrportal („runderneuert“) betrieben werden.

### Geändert

- **Eigenständige Rechteseiten:** Impressum, Datenschutz und Nutzungsbedingungen (Vertrag/AGB) liegen vollständig im Portal – keine Abhängigkeit mehr von externen Seiten (z. B. Odoo). Eigene Texte von FANBUS.KOELN in `public/impressum.php`, `public/datenschutz.php` und `public/vertrag.php`.
- **Einheitlicher Auftritt:** Footer, E-Mails und Buchungsseite verlinken durchgängig auf die Portal-Seiten (Impressum, Datenschutz, Vertrag). Konfiguration über `config.php` (`LEGAL_*_URL`, `PUBLIC_WEB_PATH`).
- **Versionssprung auf 2.0.0:** Markiert den Schritt zu einem in sich runden, professionell ausgestatteten Mitfahrportal.

**Relevante Dateien:** `VERSION`, `config.php`, `templates/public/footer.php`, `public/impressum.php`, `public/datenschutz.php`, `public/vertrag.php`, `IMPRESSUM-DATENSCHUTZ-WICHTIG.md`

---

## [1.9.4] – 2026-02-12

### Hinzugefügt

- **Anhänge bei Initiativ-Mail:** Beim „E-Mail schreiben“ können Dateien angehängt werden (z. B. Stadionkarte, Hotelbestätigung). Konfigurierbar in `config.php`: `EMAIL_ATTACHMENT_MAX_SIZE`, `EMAIL_ATTACHMENT_MAX_FILES`, `EMAIL_ATTACHMENT_EXTENSIONS`. Validierung von Typ, Größe und Anzahl.

**Geänderte Dateien:** `config.php`, `core/Mailer.php`, `public/compose-email.php`

---

## [1.9.3] – 2026-02-12

### Hinzugefügt

- **Initiativ-Mail:** E-Mails im Portal verfassen und versenden (FANBUS-Layout). `public/compose-email.php`; Links „E-Mail schreiben“ auf Ming Fahrte, Ming Bookunge, Sub-Admin-Buchungen sowie **Admin:** Nutzer, Fahrten-Übersicht, Buchungen, Fahrten, Ranking.
- **E-Mail-Optionen:** „E-Mail schreiben“ (Portal), mailto-Link (Standard-Client), **„Kopieren“** (z. B. für Mailbird). Kopieren-Button in main.js; Sub-Admin lädt main.js.

**Geänderte/neue Dateien:** `core/Mailer.php`, `public/compose-email.php`, `public/my-rides.php`, `public/bookings.php`, `sub-admin/bookings.php`, `templates/sub-admin/footer.php`, `assets/js/main.js`, `admin/users.php`, `admin/fahrten-uebersicht.php`, `admin/bookings.php`, `admin/rides.php`, `admin/ranking.php`

---

## [1.9.2] – 2026-02-12

### Hinzugefügt

- **Support & Wartung (einheitliche Ebene):** Neue Admin-Seite „Support & Wartung“ (`/admin/support.php`) mit: Link zu Backup (Datensicherung), Hinweisen zu Rückstellung/Löschen, und **Cursor-Agent-Vorgabe** (zuerst gesamte Doku lesen, dann Lösungsvorschlag mit Nutzer abstimmen). Sidebar-Eintrag „Support & Wartung“ ergänzt.
- **AGENTS.md:** Projekt-Datei mit Beschreibung der Support-Funktionen und der verbindlichen Agent-Regel (Doku zuerst, dann abstimmen).
- **Cursor-Regel:** `.cursor/rules/projekt-doku-zuerst.mdc` (alwaysApply) – jeder Cursor-Agent in diesem Projekt erhält die Vorgabe, zuerst README, CHANGELOG, DOKUMENTATION-IST-ZUSTAND-ANALYSE, LAYOUT-REFERENZ etc. zu lesen und erst nach Absprache Änderungen umzusetzen.

**Geänderte/neue Dateien:** `admin/support.php`, `templates/admin/header.php`, `AGENTS.md`, `.cursor/rules/projekt-doku-zuerst.mdc`

---

## [1.9.1] – 2026-02-12

### Behoben

- **PHP 8 Deprecated-Warnungen (Erinnerungs-Mail):** Parameterreihenfolge in `Mailer::sendRideReminder` und `Mailer::sendRideReminderPreview` angepasst: Pflichtparameter `$db` steht jetzt direkt nach `$rideId`, optionale Parameter (`$customMessage`, `$includeRideDetails`) am Ende. Behebt die Meldung „Optional parameter declared before required parameter“ auf der Seite „Erinnerungs-E-Mail senden“.

**Geänderte Dateien:** `core/Mailer.php`, `public/ride-reminder.php`

---

## [1.9.0] – 2026-02-12

### Geändert

- **E-Mails einheitliches Layout:** Alle System-E-Mails nutzen jetzt das gleiche FANBUS-Layout (roter Header, weiße Karte, Footer „Dein FANBUS.KOELN Team“, © FANBUS.KOELN). Betroffen: „Neue Buchung für deine Fahrt!“ (an Fahrer), „Buchung – Zahlung erforderlich“ / „Buchung bestätigt!“ (an Mitfahrer), „Buchung erweitert – Stadionkarte hinzöjeföhjt“ (an Fahrer), „Buchung storniert – keine Zahlung eingegangen“ (an Mitfahrer), „Dein Bonuscode für eine Freifahrt!“ (Treuebonus). Versand erfolgt weiterhin über PHPMailer (SMTP), BCC an info@fanbus.koeln unverändert.
- **E-Mail-Footer: Impressum, Datenschutz, AGB/Vertrag:** In allen an Nutzer (Kunden) gerichteten E-Mails steht im Footer eine Zeile mit verlinkten Begriffen: **Impressum** · **Datenschutz** · **AGB / Vertrag**. Links führen auf öffentlich erreichbare Seiten (kein Login). URLs werden in `config.php` über `LEGAL_IMPRESSUM_URL`, `LEGAL_DATENSCHUTZ_URL` und `LEGAL_AGB_URL` gesteuert (Standard: Portal-Seiten für Impressum/Datenschutz, Odoo für Vertrag).

**Geänderte Dateien (Release 1.9.0):** `config.php`, `CHANGELOG.md`, `core/Mailer.php`, `public/rides-book.php`, `public/booking-extend.php`, `public/booking-cancel.php`, `admin/bonus-codes.php`

---

## [1.8.0] – 2026-02-11

### Hinzugefügt

- **Datensicherung im Admin:** Neue Seite „Datensicherung“ mit Button zum Export der kompletten Datenbank als .sql-Datei. Optional Vollbackup als .zip (Datenbank + Upload-Ordner), falls ZipArchive verfügbar ist. Link in der Admin-Sidebar.

---

## [1.7.0] – 2026-02-11

### Hinzugefügt

- **Breadcrumbs:** Pfad-Anzeige (Heem → Dashboard → …) auf allen relevanten Seiten; einheitliche Seitentitel (h1) im Public-Bereich.
- **Sidebar auf Mobile:** Menü-Button nur unter 992px; Sidebar per Toggle einblendbar, Backdrop und Schließen-Button.
- **Dashboard:** Drei Blöcke „Offene Buchunge“, „Nächste Fahrt“, „Letzte Aktivität“ mit direkten Links.
- **Benachrichtigungen:** Glocken-Icon mit Badge in der Navbar, wenn offene Buchungen/Zahlungen (Fahrer oder Passagier); Link zum Dashboard #offen.
- **Fehlerseiten:** 404 und 500 mit Kölsch-Texten und Links zu Heem/Dashboard; .htaccess ErrorDocument eingetragen.
- **Suche Startseite:** Filter „Spell / Gegner sökke“ über der Spielkalender-Liste (clientseitig).

### Geändert

- **Public-Layout:** Seitenmenü wie Admin/Sub-Admin (feste Sidebar links, Inhalt rechts), Menü nach Rolle; Sidebar scrollt mit (nicht fix).
- **Navbar:** Nur ein Menü-Button; Hamburger auf Desktop (ausgeloggt) ausgeblendet; eingeloggt kein Hamburger in der Leiste.
- **Sub-Admin Buchungen:** `status` und `payment_status` abgesichert; Status-Spalte mit max. Breite, keine PHP-Warnung mehr in der Tabelle.
- **Kontaktdaten:** Bereich mit Klasse `contact-data` für stabile Sichtbarkeit; CSS-Anpassungen in admin.css.

---

## [1.6.0] – 2026-02-11

### Hinzugefügt

- **Zahlung & Belegpflicht:** Bestätigungsseite mit erwartetem Betrag vor „Zahlung bestätigen“. Zahlungsbestätigungs-E-Mail an Teilnehmer (FANBUS-Layout). „Zahlung bestätigen“ auch ohne Vorauskasse (Bar/Fahrtende) für Belegpflicht. Fahrt-Bericht mit Spalten nur bei Nutzung (Sitz, Stadionkarte, Übernachtung); Beträge auch wenn gespeicherter Gesamtbetrag fehlt.
- **E-Mail:** Alle System-Mails in BCC an info@fanbus.koeln.
- **Kölsch:** „Wat de berappe moss“, „Vun [Name] ze krije“, „Zahlung bestätije“ usw. in Buchungen und Fahrten.

### Geändert

- Buchungen speichern Gesamtbetrag; ältere Buchungen per Migration nachziehbar.

---

## [1.5.0] – 2026-02-10

### Hinzugefügt

- **Premium-Partner:** Eigener Bereich für aktive Anbieter (Buchungsübersicht, Bonus-Codes, Compliance). Banner auf der Startseite, Admin vergibt Status.
- **iCal-Export:** Buchungen als Kalenderdatei (.ics) exportierbar.
- **Erinnerungs-E-Mails:** Fahrer können Mitfahrer per E-Mail erinnern (mit aktuellen Fahrtdetails, optional eigener Nachricht, Test-Vorschau).

### Geändert

- Login-Weiterleitung für Premium-Partner, Link zu ihrem Bereich in „Meine Fahrten“.

---

## [1.4.0] – 2026-02-09

### Hinzugefügt

- **Bonus-System:** 5 Fahrten = 1 Freifahrt (Treuebonus), Bonuscode-Eingabe beim Buchen, Admin verwaltet Treue- und Kampagnen-Codes.
- **Ranking:** Aktivste Mitfahrer (Admin + öffentliche Vorschau), Top 3 Badges.
- **PayPal:** Automatischer Zahlungslink in Mails und im Dashboard bei ausstehender Zahlung.

### Geändert

- Startseite und Footer: Bonus- und Ranking-Links.

---

## [1.3.0] – 2026-02-09

### Hinzugefügt

- **Compliance im Admin:** Seite „Compliance / Recht“ mit Rechtsdokument (Druck/Teilen).
- **Fahrt-Bericht:** Bezeichnung „Compliance-Report“, angepasste Formulierungen im Nullsummen-Zertifikat.

---

## [1.2.0] – 2025-01-27

### Hinzugefügt

- **Buchung erweitern:** Teilnehmer können Stadionkarten zu bestehenden Buchungen nachbuchen, wenn der Fahrer die Fahrt mit Karten anbietet. Nur hinzufügen, Kontingente werden beachtet.

---

## [1.1.0] – 2026-02-04

### Hinzugefügt

- **Fahrtbilder:** Bis zu 2 Bilder pro Fahrt (z. B. Stadionkarte, Hotel), Thumbnails und Modal.
- **App-Icons & PWA:** Eigene Icons und Manifest für Browser und „Zum Home-Bildschirm“.

---

## [1.0.0] – 2026-01-27

### Erste stabile Hauptversion (PHP-Portal)

- **Stadionkarten:** Optionale Karten mit Kontingenten und Preisen, Buchung mit Aufteilung.
- **Übernachtung:** Optionale Übernachtung pro Fahrt, Kostenaufteilung.
- **Vorauskasse:** Optional mit Frist, Status „Wartet auf Zahlung“ / „Zahlung eingegangen“, Bestätigen/Stornieren durch Fahrer.
- **Teilnehmernamen:** Alle Mitfahrer namentlich pro Buchung.
- **Kölsch:** UI in Kölscher Mundart.

---

Format: Keep a Changelog · Versionsschema: Semantic Versioning (MAJOR.MINOR.PATCH).