Versionsverlauf
Aktuelle Version: 3.1.93 · 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).
---
## [3.1.93] – 2026-08-07
**Klüngelbockx: Ablehnung Reservierung nach außen neutral (kein Karte↔Mitfahrt-Bezug).**
- Mitglieder sehen/erhalten nur neutrale Meldung („Reservierung nicht möglich…“).
- Interner Prüfergrund nur in Admin-Mail / Admin-UI.
- Hilfe-Text ohne Kopplung Karte–Fahrt.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/DEPLOY-JETZT.txt
portal/kluengelbockx/inc_kluengelbockx_credits.php
portal/kluengelbockx/script.js
portal/kluengelbockx/index.html
portal/hilfe/kluengelbockx.md
portal/DOKU-FANORGANISATION-KLUENGELBOCKX.md
```
---
## [3.1.92] – 2026-08-07
**Klüngelbockx: Reservierung ohne Mitfahrt blockieren + Admin-Sperre.**
- Stadionkarten-Reservierung nur mit gebuchter Mitfahrt zum gleichen Spieldatum – sonst Abbruch.
- Hinweis-Mail an Kartnehmer und Admin (`ADMIN_EMAIL`).
- Admin Credits-Details: temporäre (frei wählbares Datum) oder dauerhafte **Reservierungs-Sperre** (Anbieten bleibt erlaubt).
- Migration: `assets/migrations/php_add_users_klx_reserve_block.sql`
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/DEPLOY-JETZT.txt
portal/kluengelbockx/inc_kluengelbockx_credits.php
portal/kluengelbockx/api.php
portal/kluengelbockx/script.js
portal/kluengelbockx/styles.css
portal/kluengelbockx/index.html
portal/hilfe/kluengelbockx.md
portal/DOKU-FANORGANISATION-KLUENGELBOCKX.md
portal/assets/migrations/php_add_users_klx_reserve_block.sql
```
**DB:** Migration `php_add_users_klx_reserve_block.sql` ausführen.
---
## [3.1.91] – 2026-08-07
**Klüngelbockx-Credits: Mitfahrt erst nach Zahlung + Admin-Abgleich Karte↔Fahrt.**
- Mitfahrt-Credit (+1) weiterhin nur bei `paid` / `not_required` (nicht bei bloßer Buchung).
- Admin Credits-Details: Tabelle **Karte ↔ Mitfahrt** (gleiches Spieldatum, Zahlungsstatus, Credit ja/nein).
- Beim Öffnen der Details: Sync der Mitfahrt-Credits (nachziehbar, wenn Zahlung schon bestätigt).
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/DEPLOY-JETZT.txt
portal/kluengelbockx/inc_kluengelbockx_credits.php
portal/kluengelbockx/api.php
portal/kluengelbockx/script.js
portal/kluengelbockx/styles.css
portal/kluengelbockx/index.html
portal/hilfe/kluengelbockx.md
portal/DOKU-FANORGANISATION-KLUENGELBOCKX.md
```
---
## [3.1.90] – 2026-08-07
**Klüngelbockx-Credits: Saisonstart 1. Juni + Nachbuchung vermittelter Karten.**
- `KLX_CREDITS_SEASON_START` von 2026-08-23 auf **2026-06-01** (Regel: Saisonstart spätestens 1. Juni).
- Abgabe-Credit weiter nur bei erfolgreicher Vermittlung (`sold` / Abschluss), nicht bei Freigabe.
- Automatische **Nachbuchung** fehlender `offer_completed`-Credits für bereits vermittelte Karten (idempotent, einmal pro Session beim Laden).
- Hilfe/DOKU: Texte an Ist-Logik angepasst.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/DEPLOY-JETZT.txt
portal/config.php
portal/kluengelbockx/inc_kluengelbockx_credits.php
portal/kluengelbockx/api.php
portal/hilfe/kluengelbockx.md
portal/DOKU-FANORGANISATION-KLUENGELBOCKX.md
```
Nach Deploy: Klüngelbockx einmal öffnen (eingeloggt) – Nachbuchung läuft automatisch.
---
## [3.1.89] – 2026-08-06
**Bonuscodes: Fahrer 100 % / Beifahrer 50 % mit eigenen Mails; Treue unverändert; Deaktivieren.**
- Treuebonus bleibt einmalig 100 % Fahrt + bestehende Jubilar-Mail.
- Neu: **Fahrer-Rabatt** (100 %, mehrfach) und **Beifahrer-Rabatt** (50 %, mehrfach) mit eigenen E-Mail-Texten (nicht mehr Treue-Mail).
- Admin: Typ-Dropdown, Deaktivieren/Aktivieren, aufgeräumte Infobox (ohne Migrationspfad in der UI).
- Buchung: Hinweistext zu 100 %/50 %; Validierung nach `discount_percent` / Typ.
- Migration: `assets/migrations/php_add_bonus_codes_driver_co_driver.sql` (einmalig ausführen).
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/BONUS-WORKFLOW.md
portal/DEPLOY-JETZT.txt
portal/core/functions.php
portal/core/Mailer.php
portal/admin/bonus-codes.php
portal/sub-admin/bonus-codes.php
portal/public/rides-book.php
portal/assets/migrations/php_add_bonus_codes_driver_co_driver.sql
```
**DB:** Migration `php_add_bonus_codes_driver_co_driver.sql` in phpMyAdmin ausführen.
---
## [3.1.88] – 2026-08-02
**Klüngelbockx: Kartenprüfung-Badge nüchtern (Slate, weißes Schild – kein Gold/Teal-Show).**
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/kluengelbockx/styles.css
```
---
## [3.1.87] – 2026-08-02
**Klüngelbockx: Schild im Kartenprüfung-Badge nicht mehr FC-Rot (`.logo i`-Override).**
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/kluengelbockx/styles.css
```
---
## [3.1.86] – 2026-08-02
**Klüngelbockx: Header-Badge „Kartenprüfung“ als klares Security-Siegel.**
### Geändert
- Statt blassem Pill mit Rot/Petrol-Mix: solides Teal-Siegel, weiße Schrift, goldenes Schild.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/kluengelbockx/index.html
portal/kluengelbockx/styles.css
```
---
## [3.1.85] – 2026-08-02
**Admin-Dashboard: Fahrtenplaner-Direktlinks lesbar (nicht mehr weiß auf Hellblau).**
### Geändert
- Links unter „Direktlinks (Lesezeichen / Fallback bei 404)“ eingeklappt; Text dunkel auf hellem Hintergrund.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/admin/dashboard.php
```
---
## [3.1.84] – 2026-08-02
**Klüngelbockx: Solidaritäts-Box wieder Ursprung (ohne doppelte AGB-/Ticketbörse-Passage).**
### Geändert
- Start & Hilfe: wieder „Wer gibt, der nimmt“ + Credits.
- Kontaktstelle/AGB bleibt im Regelwerk-Kasten oben (+ Hilfe/Hinweis).
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/kluengelbockx/index.html
```
---
## [3.1.83] – 2026-08-02
**Klüngelbockx: Doppelte „Weitergabe erfolgt / läuft über“-Formulierungen gestrafft.**
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/kluengelbockx/index.html
```
---
## [3.1.82] – 2026-08-02
**Klüngelbockx: Regelwerk-Kurzfassung exponiert, aber ruhig oben auf der Startseite.**
### Neu
- Kasten *In Kürze aus dem Regelwerk der Klüngelbockx!* direkt unter dem Hero (Petrol-Akzent, gerade, kein Signal-Aufkleber).
- Links zu Hilfe und „Wichtiger Hinweis“.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/kluengelbockx/index.html
portal/kluengelbockx/styles.css
```
---
## [3.1.81] – 2026-08-02
**Kalender: Hotel-Banner gerade (ohne Schrägstellung) – Farbe reicht zur Hervorhebung.**
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/public/index.php
```
---
## [3.1.80] – 2026-08-02
**Fahrten-Detail: Badge „mit Übernachtung“ gerade ausgerichtet.**
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/public/rides.php
```
---
## [3.1.79] – 2026-08-02
**Fahrten-Detail: Attribut-Badge „mit Übernachtung“ neben Auswärts/Bundesliga.**
### Geändert
- Wenn mindestens eine Fahrt Hotel anbietet: auffälliges Badge (Pink–Orange, leicht schräg) unter den bestehenden Attributen.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/public/rides.php
```
---
## [3.1.78] – 2026-08-02
**Kalender: Hotel-Banner viel auffälliger (schräger Aufkleber, Signal-Farbe).**
### Geändert
- Querbanner „Mit und ohne Übernachtung“: herausgelöst, leicht schräg, Pink–Orange-Verlauf, Schatten – klar vor dem gelben „AKTUELLES!“.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/public/index.php
```
---
## [3.1.77] – 2026-08-02
**Kalender: Querbanner „Mit und ohne Übernachtung“ bei Hotel-Angebot.**
### Geändert
- Spieltag-Karte: wenn die Fahrt Übernachtung anbietet, zusätzliches Banner (neben „AKTUELLES!“): *Mit und ohne Übernachtung – du wählst bei der Buchung.*
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/public/index.php
```
---
## [3.1.76] – 2026-08-02
**Klüngelbockx: Stadionkarten klar als Kontaktstelle + FC-Ticketbörse.**
### Geändert
- Start-/Hilfe-Banner und rechtlicher Hinweis: Klüngelbockx nur Kontaktstelle für Heim & Auswärts; tatsächliche Weitergabe nach AGB des 1. FC Köln über dessen Ticketbörse.
- Credits-Hinweise unverändert.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/kluengelbockx/index.html
```
---
## [3.1.75] – 2026-08-02
**Fahrtenbilder schärfer: größere Vorschau über volle Kartenbreite.**
### Geändert
- Thumbs nicht mehr 100×70 in der schmalen Spalte (wirkte bei Logos verpixelt).
- 4er-Reihe vollbreit, `object-fit: contain`, höheres Anzeigeformat – Modal unverändert.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/public/rides.php
```
---
## [3.1.74] – 2026-08-02
**Fahrtenkarte: bis zu 4 Bilder (z. B. 2× Stadion + 2× Hotel) im gleichen Thumbnail-Format.**
### Neu
- DB-Spalten `rides.media_image_3`, `rides.media_image_4` (Migration)
- Anlegen/Bearbeiten: 4 Upload-Slots; Liste zeigt alle gesetzten Thumbs (100×70, Modal wie bisher)
### Deploy
1. **Zuerst SQL** (einmal): `portal/assets/migrations/php_add_ride_media_image_3_4.sql`
2. Dann Dateien:
```
portal/VERSION
portal/CHANGELOG.md
portal/core/functions.php
portal/public/rides.php
portal/public/rides-create.php
portal/public/rides-edit.php
portal/assets/migrations/php_add_ride_media_image_3_4.sql
```
---
## [3.1.73] – 2026-08-02
**Wiederherstellung: Layout vom Morgen (01.08. ~11:52) – zuverlässige klassische Fahrtenkarte.**
Alle nächtlichen Katalog-Experimente (Hero, Boarding-Pass, fb-ride-offer) verworfen.
Quelle: Cursor Local History vom 01.08.2026 11:52.
### Wiederhergestellt
- `public/rides.php` – klassische Bootstrap-Karte (`card mb-3`), großer Preis, bekannte Badges
- `assets/css/style.css` (+ hardlink `public/assets/css/style.css`) – passendes Morgen-CSS
- `public/index.php` – Kalender-Matchkarten wie am Morgen
- `portal_accommodation_badges_html()` – Bootstrap-Badges wie am Morgen
- Cache-Bust `PORTAL_ASSETS_BUILD` → `cal15`
### Deploy
`portal/DEPLOY-JETZT.txt` — alle Dateien zusammen:
```
portal/VERSION
portal/CHANGELOG.md
portal/config.php
portal/core/functions.php
portal/public/rides.php
portal/public/index.php
portal/assets/css/style.css
portal/public/assets/css/style.css
```
---
## [3.1.72] – 2026-08-02
**STABIL: Fahrtenseite zurück auf die letzte funktionierende Angebotskarte.**
Layout-Experimente (Hero/Pass/Infokarte) zurückgenommen. PHP + CSS wieder zusammenpassend.
### Deploy
`portal/DEPLOY-JETZT.txt` — alle Dateien zusammen:
```
portal/VERSION
portal/CHANGELOG.md
portal/config.php
portal/public/rides.php
portal/assets/css/style.css
portal/public/assets/css/style.css
```
---
## [3.1.71] – 2026-08-02
**Fahrtenkatalog: Boarding-Pass-Show entfernt – dichte Infokarte.**
### Geändert
- Alle Infos wieder sichtbar: Zeit, Ort, Plätze, Hinweis (Hotel-Vorspann aus Hinweis gestrichen).
- Keine Perforation, kein Rot-Rand/Glitzer, kein leerer Dunkelblock.
- Akzente nur inhaltlich (Zeit, Plätze, Hinweisbalken, CTA).
### Deploy
`portal/DEPLOY-JETZT.txt`
```
portal/VERSION
portal/CHANGELOG.md
portal/config.php
portal/public/rides.php
portal/assets/css/style.css
portal/public/assets/css/style.css
```
---
## [3.1.70] – 2026-08-02
**Fahrtenkatalog neu erfunden: Boarding-Pass statt Formular-Karte.**
### Geändert
- Große Abfahrtszeit, Ort, Badge „x frei“, perforierte Ticket-Trennung.
- Roter Mitfahren-Button; Hinweis/Hotel nur unter „Details zur Fahrt“.
- Marker `data-fb-card="pass-3.1.70"`, Cache `cal12`.
### Deploy
`portal/DEPLOY-JETZT.txt`
```
portal/VERSION
portal/CHANGELOG.md
portal/config.php
portal/public/rides.php
portal/assets/css/style.css
portal/public/assets/css/style.css
```
---
## [3.1.69] – 2026-08-02
**Fahrtenkatalog: Doppelungen entfernt.**
### Behoben
- Gegner / „Auswärts“ nicht mehr doppelt (nur Match-Kopf).
- Karten-Headline = Abfahrtort.
- Hotelzeile wiederholt nicht „Übernachtung optional“, wenn der Hinweis das schon sagt.
- Vorauskasse nur beim Preis.
### Deploy
`portal/DEPLOY-JETZT.txt`
```
portal/VERSION
portal/CHANGELOG.md
portal/config.php
portal/public/rides.php
portal/assets/css/style.css
portal/public/assets/css/style.css
```
---
## [3.1.68] – 2026-08-02
**Fahrtenkatalog neu: Auswärtsfahrt als Eyecatcher – kein Altherren-/Hotelkatalog.**
### Geändert
- Match-Kopf und Angebotskarte: Gegner groß, Abfahrt klar, dunkler Fanfahrt-Stage.
- Keine Medien-/Bettfotos in der Liste; Übernachtung nur Nebenzeile.
- Handy: Preis + großer „Jetzt mitfahren“-Button direkt unter dem Stage.
- Marker `data-fb-card="away-3.1.68"`, Cache `cal10`.
### Deploy
`portal/DEPLOY-JETZT.txt`
```
portal/VERSION
portal/CHANGELOG.md
portal/config.php
portal/public/rides.php
portal/assets/css/style.css
portal/public/assets/css/style.css
```
---
## [3.1.67] – 2026-08-02
**Deploy-Hinweis: klassische Fahrtenkarte – rides.php + style.css immer zusammen.**
Halb-Upload (nur CSS oder nur PHP) erzeugt die leere kaputte Karte. Marker `data-fb-card="classic-3.1.67"`. Cache `cal9`.
### Deploy
`portal/DEPLOY-JETZT.txt`
```
portal/VERSION
portal/CHANGELOG.md
portal/config.php
portal/public/rides.php
portal/assets/css/style.css
portal/public/assets/css/style.css
```
---
## [3.1.66] – 2026-08-02
**Fahrtenkatalog: Wiederherstellung der letzten guten Angebotskarte (vor Eyecatcher-Experiment).**
### Geändert
- Markup + CSS der öffentlichen Fahrtenkarte auf den Stand vor Hero/Hotel-Banner zurückgesetzt.
- CTA bleibt „Jetzt mitfahren“; „Fahrt bearbeiten“ nur als Nebenlink.
- Cache-Buster `cal8`.
### Deploy
Immer aktuell: `portal/DEPLOY-JETZT.txt`
```
portal/VERSION
portal/CHANGELOG.md
portal/config.php
portal/public/rides.php
portal/assets/css/style.css
portal/public/assets/css/style.css
```
---
## [3.1.65] – 2026-08-02
**Fahrtenkatalog: wieder Fanfahrt zuerst – kein Hotelzimmer als Hero.**
### Behoben
- Medienbilder (oft Hotel) werden **nicht** mehr als Banner genutzt.
- Kopf zeigt Abfahrt / Gegner / Badge „Fanfahrt“; Fotos nur noch als kleine Thumbs.
- Übernachtung bleibt optionale Nebenzeile, nicht der Eyecatcher.
- Handy: Preis + „Jetzt mitfahren“ weiter direkt unter der Abfahrt.
### Deploy
Immer aktuell auch in: `portal/DEPLOY-JETZT.txt`
```
portal/VERSION
portal/CHANGELOG.md
portal/config.php
portal/public/rides.php
portal/assets/css/style.css
portal/public/assets/css/style.css
```
---
## [3.1.64] – 2026-08-02
**Fahrtenkatalog: Eyecatcher mobil-first – Hero vollbreit, Preis & Mitfahren-Button direkt darunter.**
### Geändert
- Angebotskarte: Bild/Gradient als voller Hero oben mit Abfahrt & Gegner.
- Handy: Preis + großer Touch-Button („Jetzt mitfahren“) direkt unter dem Hero; Details darunter.
- Desktop ab 768px: Infos links, Preis/CTA rechts.
- Keine verschachtelten Hinweis-/Hotel-Kästen mehr; Hinweistext kürzer fürs Smartphone.
- CSS-Cache-Buster `cal6`.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/config.php
portal/public/rides.php
portal/assets/css/style.css
portal/public/assets/css/style.css
```
---
## [3.1.63] – 2026-08-02
**Fahrtenkatalog: CTA wieder „Jetzt mitfahren“, kein „Fahrt verwalten“ als Hauptbutton.**
### Behoben
- Als Anbieter/Admin sah man auf der öffentlichen Liste den Admin-Button statt des Buchungs-CTAs.
- Katalog bleibt katalogisch: primär „Jetzt mitfahren“; „Fahrt bearbeiten“ nur als kleiner Nebenlink für die eigene Fahrt.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/public/rides.php
portal/assets/css/style.css
portal/public/assets/css/style.css
```
---
## [3.1.62] – 2026-08-02
**Öffentliche Fahrten-Darstellung: klarer, moderner – Fanfahrt vor Hotel.**
### Geändert
- Übernachtungs-Label immer „optional“ (nie „Mit Übernachtung“ als Pflicht-Suggestion).
- Fahrtenliste: Angebotskarte mit Preis, Ort/Zeit, Platz-Meter und CTA im Vordergrund.
- **Keine großen Hotel-/Medienposter** mehr – Fotos nur noch als winzige Zusatz-Thumbs.
- Kalender-Matchkarte: Emoji-Badge-Stapel durch eine Kostenzeile ersetzt; Hinweis ruhiger.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/core/functions.php
portal/public/rides.php
portal/public/index.php
portal/assets/css/style.css
portal/public/assets/css/style.css
```
---
## [3.1.61] – 2026-08-01
**Klüngelbockx: Abgabe-Credit erst bei erfolgreichem Abschluss.**
### Geändert
- Kein `+1` mehr bei Admin-Freigabe (`offer_approved` ist No-Op).
- Automatisch `+1` für den Abgeber bei Erfolg:
- Heim: Abschlussmeldung `success_matched` / `success_other`
- Auswärts: Weitergabe-Zusage (`confirm_sale` → `sold`)
- Einheitlich `+1` (kein `+0,5`); Ledger-Event `offer_completed`, idempotent pro Ticket.
- Angebot entfernen: `−1` nur noch, wenn zuvor ein Abschluss-Credit existierte.
- Hilfe-/UI-Texte: „+1 bei erfolgreichem Abschluss“ statt „bei Freigabe“.
### Hinweis Bestand
- Bereits gebuchte `offer_approved`-Credits nicht rückwirkend umbuchen.
- Für abgeschlossene Probevermittlungen ohne `offer_completed`: Admin-Korrektur `+1` im Credits-Ledger möglich.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/kluengelbockx/inc_kluengelbockx_credits.php
portal/kluengelbockx/api.php
portal/kluengelbockx/index.html
portal/kluengelbockx/script.js
```
---
## [3.1.60] – 2026-08-01
**Klüngelbockx: Anreise-Frage im Angebotsformular immer sichtbar.**
### Geändert
- Unter „Für die Statistik (optional)“ erscheint die feste Frage dauerhaft (nicht erst nach Häkchen).
- Häkchen „Auswahlfrage aktivieren“ steuert nur noch die Antwortfelder (2–4 Optionen).
- Bei Auswärts weiter standardmäßig aktiviert.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/kluengelbockx/index.html
```
---
## [3.1.59] – 2026-08-01
**Klüngelbockx: Anbieter-Feld „Max. Reservierungen pro E-Mail“ entfernt.**
### Entfernt
- Feld im Angebotsformular und Anzeige „Interessenten-Limit“ in der Karten-Info.
- Pro-Angebot-Override entfällt; es gilt nur noch die globale Admin-Vorgabe (unsichtbar für Anbieter).
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/kluengelbockx/index.html
portal/kluengelbockx/script.js
portal/kluengelbockx/api.php
```
---
## [3.1.58] – 2026-08-01
**Klüngelbockx: Anreise-Frage wieder im Formular, dezent als „Statistik“.**
### Geändert
- Auswahlfrage wieder sichtbar beim Anbieten (Stadionkarte).
- Überschrift „Für die Statistik (optional)“ – ohne Screening-Erklärung.
- Frage bleibt fest; 2–4 Antworten editierbar.
- Bei Auswärts standardmäßig aktiviert; Server-Fallback wenn nicht gesetzt.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/kluengelbockx/index.html
portal/kluengelbockx/script.js
portal/kluengelbockx/api.php
portal/kluengelbockx/inc_kluengelbockx_moderation.php
```
---
## [3.1.57] – 2026-08-01
**Klüngelbockx: Anreise-Frage unsichtbar beim Anbieten.**
### Geändert
- Keine Anbieter-UI mehr für die Anreise-Frage (kein Häkchen, keine Absichts-Erklärung, keine Options-Felder).
- Bei **Auswärts**-Stadionkarten setzt der Server die feste Frage + Standardantworten automatisch.
- Interessent sieht die Kurzfrage erst beim Reservieren; Antwort weiter in der Anbieter-Mail.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/kluengelbockx/index.html
portal/kluengelbockx/script.js
portal/kluengelbockx/api.php
portal/kluengelbockx/inc_kluengelbockx_moderation.php
```
---
## [3.1.56] – 2026-08-01
**Klüngelbockx: Anreise-Frage fest – nur Antworten wählbar.**
### Geändert
- Frage an Interessenten ist fix: „Wie gedenkst du zum Auswärtsspiel zu fahren?“ (nicht editierbar).
- Anbieter legt nur 2–4 Antwortmöglichkeiten fest (Vorschläge: FANBUS, PKW, Sonstiges).
- Block wieder bei **allen** Stadionkarten sichtbar (nicht nur Auswärts – Standard „Heim“ hatte die Frage unsichtbar gemacht).
- Server erzwingt den festen Fragetext.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/kluengelbockx/index.html
portal/kluengelbockx/script.js
portal/kluengelbockx/api.php
portal/kluengelbockx/inc_kluengelbockx_moderation.php
```
---
## [3.1.55] – 2026-08-01
**Admin kann Konten vollständig heilen (Status, Passwort, Fan-Org).**
### Behoben
- Freischalten ging nur bei `email_verified` – bei `pending` (E-Mail nie bestätigt) blieb Login blockiert, obwohl Admin Passwort o. Ä. gesetzt hatte.
- Activate räumte `verification_token` / `email_verified_at` nicht zuverlässig auf.
### Hinzugefügt
- `admin/user-edit.php` – Stammdaten, Status, Passwort, Fanclub-Flag + Anschrift/Geburtstag, Button „Vollständig freischalten“.
- `Auth::adminHealActivate()` / `Auth::adminSaveUser()` – zentrale Heil-Logik.
### Geändert
- User-Liste: „Bearbeiten“, Freischalten auch bei pending, Fanclub an/aus.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/core/Auth.php
portal/admin/users.php
portal/admin/user-edit.php
```
---
## [3.1.54] – 2026-08-01
**Registrierung nachvollziehbar: Fortschrittsseite statt Login-Sackgasse.**
### Hinzugefügt
- `public/registrierung-status.php` – 3 Schritte (Konto → E-Mail → Freischaltung), Resend Bestätigungsmail, Fan-Org-Hinweis.
### Geändert
- Nach Registrierung und E-Mail-Bestätigung Redirect auf Fortschrittsseite (nicht mehr Login).
- Register-UI: Ablaufstreifen, klarerer Fan-Org-Block, Button „Konto anlegen“.
- Fan-Org-Seite entschlackt: ein Pfad pro Zustand (Gast / wartend / Mitglied / Formular).
- Auth-Texte Hochdeutsch; Login-Fehler mit Link zum Fortschritt.
- `Auth::user()` liefert `status` und `fanclub_member`; Fan-Org-Opt-in auch bei Pending-Resend.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/core/Auth.php
portal/assets/css/style.css
portal/public/assets/css/style.css
portal/public/registrierung-status.php
portal/public/register.php
portal/public/verify-email.php
portal/public/login.php
portal/public/fanclub-initiative.php
```
---
## [3.1.53] – 2026-08-01
**Registrierungs-Mail: Button + Ersatzlink mailclient-sicher.**
### Behoben
- Bestätigungsmail nach Registrierung: CTA oft unsichtbar (CSS-`linear-gradient` wird von vielen Clients gestrippt → weißer Text ohne Hintergrund).
- Ersatzlink war nur als Text in einem `<div>` (Outlook-schwach) und nicht als klickbarer `<a href>`.
- Plain-Text-Teil (AltBody) betont den kopierbaren Bestätigungslink klarer.
### Geändert
- Bulletproof-CTA (`bgcolor` + solide Farbe) und prominenter Fallback-Block als Hilfsfunktionen im Mailer.
- Gleiches Muster für Aktivierungs- und Passwort-Reset-Mail; System-Footer in zentrierter Tabelle.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/core/Mailer.php
```
---
## [3.1.52] – 2026-08-01
**Klüngelbockx: reine Vermittlung Heim = Auswärts.**
### Geändert
- Keine Vorab-Übergabe an FANBUS, kein FANBUS-Besitz als Börsen-Anbieter.
- Auto-Gate (Fahrart / Buchungsnummer / Soft-Absage „anderweitig vergeben“) entfernt.
- Optionale Anbieter-Frage (2–4 Antworten) beim Anbieten; Antwort nur in Reservierungs-Mail, Entscheidung manuell.
- Hilfe/Doku/UI: Fahrtbindung- und Insider-Texte entfernt; FC-Transfer-Hinweis in Zusage-Mail.
- Absage-Mail freundlicher („Reservierung konnte diesmal nicht erfüllt werden“).
- Mobile-Menü: Overlay funktioniert (Nav auf `body`, nicht im sticky Header); FANBUS-Teal statt FC-Rot für Menü, Primary-Buttons, Footer.
### Deploy
```
portal/VERSION
portal/CHANGELOG.md
portal/hilfe/kluengelbockx.md
portal/DOKU-FANORGANISATION-KLUENGELBOCKX.md
portal/kluengelbockx/index.html
portal/kluengelbockx/script.js
portal/kluengelbockx/styles.css
portal/kluengelbockx/api.php
portal/kluengelbockx/inc_kluengelbockx_moderation.php
```
---
## [3.1.51] – 2026-07-21
**WhatsApp Business FANBUS.KOELN öffentlich verlinkt.**
### Hinzugefügt
- Config: `WHATSAPP_E164` / `WHATSAPP_URL` / `WHATSAPP_DISPLAY` → `https://wa.me/4915560630003`
- Helper: `portal_whatsapp_url()`, `portal_whatsapp_link_html()`
- Link in Footer, Landing (Schnellzugriff), Impressum
- Impressum-Telefon auf **+49 155 6063 0003** (wie WhatsApp) korrigiert
### Deploy
```
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/VERSION
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/CHANGELOG.md
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/config.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/core/functions.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/templates/public/footer.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/public/landing.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/public/impressum.php
```
---
## [3.1.50] – 2026-07-21
**Fahrt-Admin: Stadionkarten-Pool / Vermittlung über Mitfahrt komplett entfernt.**
### Geändert
- `admin/rides.php`: kein Ticket-Pool, keine Zuordnung, keine Börse-Aktionen, keine Karten-Texte mehr – nur noch Fahrt-Details (Mitfahrt).
- Button „Pool“ entfernt; optional „Details“ ohne Karten.
- Spalte „MAX. PASSAGIERE“ → „GEBUCHT“.
- Live: `rides.has_tickets` für alle Fahrten auf 0 gesetzt (kein Mitfahrt+Karte mehr).
- Öffentliche Buchung/Anlegen bleibt über `PORTAL_RIDE_ATTACHED_TICKETS_ENABLED = false` ohne Karten.
- **Klüngelbockx** (eigene Börse) unverändert – nur der Weg „Karte über die Fahrt“ ist weg.
### Deploy
```
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/VERSION
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/CHANGELOG.md
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/admin/rides.php
```
---
## [3.1.49] – 2026-07-21
**Admin-Fahrtenliste: Button „Pool“ (Stadionkarten) entfernt, solange Fahrt-mit-Karte aus ist.**
### Geändert
- `PORTAL_RIDE_ATTACHED_TICKETS_ENABLED = false`: kein Ticket-Pool-Button mehr in der Fahrtenübersicht.
- Detailseite zeigt Ticket-UI nur noch bei aktivem Flag oder echtem Altbestand an der Fahrt.
- Klüngelbockx selbst bleibt unverändert (eigene Börse).
### Deploy
```
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/VERSION
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/CHANGELOG.md
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/admin/rides.php
```
---
## [3.1.48] – 2026-07-21
**Weiterer Bus (Bus 3+) in Fahrt bearbeiten – klarer Button, km wird übernommen.**
### Geändert
- Button „Weiterer Bus (z. B. Bus 3)“; neue Zeile übernimmt Strecke/€/km vom ersten Bus.
- HSV-Fahrt (ID 51): Bus-3-Zeile in der DB angelegt (km/€ von Bus 1).
### Deploy
```
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/VERSION
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/CHANGELOG.md
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/public/rides-edit.php
```
---
## [3.1.47] – 2026-07-21
**Hotel-Verfügbarkeit wieder sichtbar (X von Y frei).**
### Geändert
- Buchung & Fahrtdetails & Liste: **Hotelplätze: X von Y frei** (wenn Max. Personen gesetzt).
- Dropdown-Option zeigt „noch X frei“.
- Zählung über `portal_accommodation_count_booked` (inkl. Legacy `accommodation_included`).
### Deploy
```
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/VERSION
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/CHANGELOG.md
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/core/functions.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/public/rides.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/public/rides-book.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/public/rides-edit.php
```
**HSV:** In der Fahrt „Max. Personen (Hotel)“ auf 6 bzw. 8 setzen – sonst gibt es keine Zahl zum Anzeigen.
---
## [3.1.46] – 2026-07-21
**Fahrtenkarte wieder schlicht: nur „Mit Übernachtung“ + Vorauskasse – ohne Orga-Badges.**
### Geändert
- Öffentliche Badges wieder wie früher: **Mit Übernachtung** (kein DZ/EZ, kein „Entscheidung offen“).
- Buchungsformular ohne Orga-Status-Kasten; Hotel bleibt **optional** wählbar.
- Karten/Tickets unverändert aus (`PORTAL_RIDE_ATTACHED_TICKETS_ENABLED`).
### Deploy
```
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/VERSION
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/CHANGELOG.md
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/core/functions.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/public/rides.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/public/rides-book.php
```
(Falls 3.1.45 noch nicht live: zusätzlich `rides-edit.php`, `rides-create.php` aus der 3.1.45-Liste mitnehmen.)
---
## [3.1.45] – 2026-07-21
**Übernachtung immer optional – nie Pflicht-Paket mit der Mitfahrt.**
### Geändert
- Legacy-Fahrten mit Hotel (`has_accommodation`, ohne `optional_with_minimum`) werden wie **optional** behandelt: Listen-/Orientierungspreis = nur Fahrpreis; Buchung wählt Hotel aktiv (Standard: ohne).
- Badge: „Übernachtung optional“ statt „Mit Übernachtung“.
- Hotel-Kontingent (`accommodation_max_persons` / EZ) gilt für alle Hotel-Fahrten; bei ausgeschöpftem Kontingent nur noch Mitfahrt.
- Admin: Modus-Standard „Optional“; Speichern setzt leere Legacy-Modi auf `optional_with_minimum`.
### Deploy (keine SQL-Migration)
```
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/VERSION
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/CHANGELOG.md
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/core/functions.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/public/rides.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/public/rides-book.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/public/rides-edit.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/public/rides-create.php
```
**Nach Deploy (HSV u. a.):** Fahrt im Admin öffnen → Hotel-Kontingent (z. B. 6 oder 8) setzen → speichern. Bus-Plätze (`available_seats`) separat prüfen, falls nicht 18 gewünscht.
---
## [3.1.44] – 2026-07-21
**Auswärts: Prüfung + Ersterwerb in einer Ticketing-Mail (statt zwei).**
### Geändert
- Bei Auswärts-Einreichung: **eine** Mail an `ticketing@` (Prüfung + Ersterwerb-Schritte), **eine** Mail an den Abgeber.
- Heim bleibt: nur die Prüfungsmail an Ticketing.
### Deploy
```
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/VERSION
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/CHANGELOG.md
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/hilfe/kluengelbockx.md
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/kluengelbockx/api.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/kluengelbockx/index.html
```
---
## [3.1.43] – 2026-07-21
**Auswärts-Ersterwerb: Korrespondenz Abgeber ↔ FANBUS (Zahlung, dann physische Karte).**
### Hinzugefügt
- Bei Einreichung Auswärts: Mails an **Abgeber** und **`ticketing@fanbus.koeln`** (Preis, Zahlungsweg, Kontakt).
- Freigaben-UI: „Korrespondenz senden“, „Vorab-Übergabe erledigt“; Freigabe erst danach möglich.
- Status `away_handover_status` (`pending` / `done`).
### Deploy (keine SQL-Migration)
```
portal/VERSION
portal/CHANGELOG.md
portal/hilfe/kluengelbockx.md
portal/kluengelbockx/api.php
portal/kluengelbockx/inc_kluengelbockx_moderation.php
portal/kluengelbockx/index.html
portal/kluengelbockx/script.js
portal/kluengelbockx/styles.css
```
Lokal vollständig:
```
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/VERSION
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/CHANGELOG.md
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/hilfe/kluengelbockx.md
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/kluengelbockx/api.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/kluengelbockx/inc_kluengelbockx_moderation.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/kluengelbockx/index.html
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/kluengelbockx/script.js
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/kluengelbockx/styles.css
```
---
## [3.1.42] – 2026-07-21
**Klüngelbockx Sub-Admin: Freigaben-Anmeldung (zweites Passwort) wieder sichtbar und zuverlässig.**
### Behoben
- Staff-Flags werden **vor** `script.js` gesetzt (Init sah `__FANBUS_KL_KLX_MANAGER__` sonst nicht).
- Deutlicher Button **Freigaben-Anmeldung** direkt neben „Klüngelbockx“ in der Modul-Leiste.
- Zusätzlicher CTA in der Staff-Willkommenskarte: „Freigaben-Anmeldung (zweites Passwort)“.
- Login-Modal mit Klüngelbockx-Admin-Account (`admins.json`, z. B. Michael).
### Deploy (keine SQL-Migration)
| # | Relativer Pfad ab `portal/` |
|---|-----------------------------|
| 1 | `VERSION` |
| 2 | `CHANGELOG.md` |
| 3 | `core/Auth.php` |
| 4 | `kluengelbockx/index.php` |
| 5 | `kluengelbockx/index.html` |
| 6 | `kluengelbockx/script.js` |
| 7 | `kluengelbockx/styles.css` |
---
## [3.1.41] – 2026-07-21
**Klüngelbockx: Header/Modul-Leiste überdecken sich nicht mehr; Freigaben-Login für Sub-Admin wieder erreichbar.**
### Behoben
- Sticky-Overlap: Modul-Leiste (`z-index`/`top`) und Header (`--kl-fb-modulebar-h`) – Guthaben war halb verdeckt.
- Sub-Admin (`sub_admin_klx`): Button **Freigaben** in der Modul-Leiste + Login-Modal; Nav-Punkt „Freigaben“ bleibt.
- Guthaben-Badge auf Mobile neben dem Hamburger sichtbar (nicht mehr `display:none`).
- Rollen-Check: `Auth::hasRole` liest DB-Rolle und zieht die Session nach.
### Deploy (keine SQL-Migration)
| # | Relativer Pfad ab `portal/` |
|---|-----------------------------|
| 1 | `VERSION` |
| 2 | `CHANGELOG.md` |
| 3 | `core/Auth.php` |
| 4 | `kluengelbockx/index.php` |
| 5 | `kluengelbockx/index.html` |
| 6 | `kluengelbockx/script.js` |
| 7 | `kluengelbockx/styles.css` |
---
## [3.1.40] – 2026-07-21
**Klüngelbockx: Prüfungsmeldung per E-Mail an `ticketing@fanbus.koeln` (nicht nur Badge).**
### Hinzugefügt / Geändert
- Beim Einreichen einer Stadionkarte (`pending_review`): Mail an `KLX_MODERATION_NOTIFY_EMAIL` = **`ticketing@fanbus.koeln`**.
- Fallback über Portal-`Mailer`, falls Klüngelbockx-SMTP scheitert; Fehler werden geloggt.
- Badge im Admin bleibt; Mail ist der eigentliche Hinweis, dass etwas zu prüfen ist.
### Deploy (keine SQL-Migration)
| # | Relativer Pfad ab `portal/` |
|---|-----------------------------|
| 1 | `VERSION` |
| 2 | `CHANGELOG.md` |
| 3 | `config.php` |
| 4 | `kluengelbockx/api.php` |
| 5 | `kluengelbockx/inc_kluengelbockx_moderation.php` |
| 6 | `hilfe/kluengelbockx.md` |
---
## [3.1.39] – 2026-07-21
**Auswärts: Vorab-Übergabe an FANBUS.KOELN – danach FANBUS als Börsen-Anbieter.**
### Geändert
- Bei Freigabe Auswärts: Credit an Original-Abgeber, dann Seller → FANBUS (`fanbus_owned`, `original_seller` intern).
- Reservierungs-Mails/Bestätigung gehen an `KLX_AWAY_FANBUS_SELLER_EMAIL` (**`ticketing@fanbus.koeln`**).
- Freigabe-Prüfungsmeldung (`KLX_MODERATION_NOTIFY_EMAIL`) ebenfalls an **`ticketing@fanbus.koeln`** (kein CC an service@).
- Admin-Confirm-Dialog weist auf Vorab-Übergabe hin.
- Hilfe/Chronologie: Heim = Vermittlung; Auswärts = FANBUS-Eigentum nach Vorab.
### Deploy (keine SQL-Migration)
| # | Relativer Pfad ab `portal/` |
|---|-----------------------------|
| 1 | `VERSION` |
| 2 | `CHANGELOG.md` |
| 3 | `config.php` |
| 4 | `kluengelbockx/inc_kluengelbockx_moderation.php` |
| 5 | `kluengelbockx/api.php` |
| 6 | `kluengelbockx/index.html` |
| 7 | `kluengelbockx/script.js` |
| 8 | `hilfe/kluengelbockx.md` |
| 9 | `DOKU-FANORGANISATION-KLUENGELBOCKX.md` |
---
## [3.1.38] – 2026-07-21
**Credit-Systematik: Mitfahrt-Credit bei verbindlicher Buchung (nicht erst nach Spiel); Doppel-Credit Heim-Abschluss aus.**
### Geändert
- Mitfahrt **+1**, sobald Buchung `paid` / `not_required` (Sync auch direkt nach Buchung ohne Vorauskasse).
- Damit: Mitfahrt buchen → Credit → Auswärtskarte reservieren (−1) → oft **netto 0** für dieselbe Reise.
- Heim-Koordinations-Abschluss vergibt **kein** Extra-Credit mehr (+1 bleibt bei Freigabe).
- Hilfe-/UI-Texte an die Systematik angepasst.
### Deploy (keine SQL-Migration)
| # | Relativer Pfad ab `portal/` |
|---|-----------------------------|
| 1 | `VERSION` |
| 2 | `CHANGELOG.md` |
| 3 | `kluengelbockx/inc_kluengelbockx_credits.php` |
| 4 | `kluengelbockx/index.html` |
| 5 | `kluengelbockx/script.js` |
| 6 | `public/rides-book.php` |
| 7 | `hilfe/kluengelbockx.md` |
---
## [3.1.37] – 2026-07-21
**Restlücken geschlossen: Hilfe/Admin/Kommunikation an Börsen-Flow; Buchungs-Gate Spieltag/Gegner.**
### Geändert
- Hilfe-Chronologie Auswärts: kein Pool/Gesamtzahlung/Vermittlungsantrag mehr – Börse + private Weitergabe.
- Admin-Akkordeon „Auswärts-Pool“ ausgeblendet.
- Auswärts-Reservierung: Buchungsnummer muss zum **selben Spieltag** und Gegner passen.
- Staff-Hilfe, DOKU, Buchungsmail: Vermittlungssprache / Trennung Mitfahrt ↔ Karte.
### Deploy (keine SQL-Migration)
| # | Relativer Pfad ab `portal/` |
|---|-----------------------------|
| 1 | `VERSION` |
| 2 | `CHANGELOG.md` |
| 3 | `kluengelbockx/inc_kluengelbockx_moderation.php` |
| 4 | `kluengelbockx/index.html` |
| 5 | `kluengelbockx/script.js` |
| 6 | `core/Mailer.php` |
| 7 | `hilfe/kluengelbockx.md` |
| 8 | `DOKU-FANORGANISATION-KLUENGELBOCKX.md` |
---
## [3.1.36] – 2026-07-21
**Auswärtskarten in die Börse (wie Heim) + Reservierungs-Gate: Fahrart + Buchungsnummer.**
### Geändert / Hinzugefügt
- Freigabe Auswärts → `listing: public` / `available` (Rubrik-Filter **Auswärtskarten**). Neue Saison, kein Pool-Altbestand.
- Reservierung Auswärts: Dropdown Fahrart (FANBUS / PKW / andere); nur FANBUS weiter; sonst Soft-Ablehnung.
- Bei FANBUS: Pflichtfeld **Buchungsnummer** (`buchungen.id`) mit DB-Abgleich (eigene Auswärts-Buchung).
- Buchungsnummer sichtbar: Meine Buchungen + Bestätigungs-E-Mail.
- FC-AGB-Opt-in bleibt (3.1.35).
### Deploy (keine SQL-Migration)
| # | Relativer Pfad ab `portal/` |
|---|-----------------------------|
| 1 | `VERSION` |
| 2 | `CHANGELOG.md` |
| 3 | `kluengelbockx/inc_kluengelbockx_moderation.php` |
| 4 | `kluengelbockx/api.php` |
| 5 | `kluengelbockx/index.html` |
| 6 | `kluengelbockx/script.js` |
| 7 | `kluengelbockx/styles.css` |
| 8 | `public/bookings.php` |
| 9 | `public/meine-buchungen.php` |
| 10 | `public/rides-book.php` |
| 11 | `core/Mailer.php` |
| 12 | `hilfe/kluengelbockx.md` |
| 13 | `DOKU-FANORGANISATION-KLUENGELBOCKX.md` |
---
## [3.1.35] – 2026-07-21
**Klüngelbockx: Pflicht-Opt-in AGB des 1. FC Köln (Tageskarten) bei Stadionkarten – verstärkt Börsen-Neutralität.**
### Hinzugefügt
- Anbieten und Reservieren von Stadionkarten: Checkbox + Link auf `FC_TICKET_AGB_URL` (PDF Stand März 2026).
- API speichert Nachweis im Ticket-JSON: Anbieter `fc_agb_confirmed_at` / `fc_agb_ip_address`; Empfänger unter `reserved_by` bzw. `buyer_fc_agb_*`.
- Vermittler-Hinweis-Modal erwähnt die FC-AGB.
### Deploy (keine Migration)
| # | Relativer Pfad ab `portal/` |
|---|-----------------------------|
| 1 | `VERSION` |
| 2 | `CHANGELOG.md` |
| 3 | `config.php` |
| 4 | `kluengelbockx/inc_kluengelbockx_moderation.php` |
| 5 | `kluengelbockx/api.php` |
| 6 | `kluengelbockx/index.php` |
| 7 | `kluengelbockx/index.html` |
| 8 | `kluengelbockx/script.js` |
| 9 | `kluengelbockx/styles.css` |
| 10 | `hilfe/kluengelbockx.md` |
| 11 | `DOKU-FANORGANISATION-KLUENGELBOCKX.md` |
---
## [3.1.34] – 2026-07-20
**Elementar: „Fahrt mit Karte“ entfernt – Mitfahrt und Ticket-Pool getrennt.**
### Geändert
- **`PORTAL_RIDE_ATTACHED_TICKETS_ENABLED = false`** in `config.php`: keine Stadionkarten mehr an Fahrtangeboten.
- Fallback-Define auch in `core/functions.php` (verhindert Fatal bei teilweisem Deploy).
- Buchung (`rides-book.php`): nur noch Mitfahrt (+ optional Hotel); keine Ticket-Auswahl.
- Anbieten/Bearbeiten: Checkbox „Mit Stadionkarte“ ausgeblendet; Speichern setzt `has_tickets = 0`.
- Admin: Fahrt-Zuordnung (Assign) blockiert; Unassign / → Börse bleiben (Pool freigeben).
- **Buchung erweitern:** nur noch Übernachtung; Stadionkarten-Hinweis → Klüngelbockx (Schritt 2).
- Badges/Hinweise „Stadionkarte an Fahrt“ in Listen ausgeblendet.
- Altbestand: bestehende `buchung_ticket_items` bleiben sichtbar/zahlbar.
### Deploy (keine Migration)
| # | Relativer Pfad ab `portal/` |
|---|-----------------------------|
| 1 | `VERSION` |
| 2 | `CHANGELOG.md` |
| 3 | `config.php` |
| 4 | `core/functions.php` |
| 5 | `public/rides-book.php` |
| 6 | `public/rides-create.php` |
| 7 | `public/rides-edit.php` |
| 8 | `public/booking-extend.php` |
| 9 | `public/bookings.php` |
| 10 | `public/rides.php` |
| 11 | `public/index.php` |
| 12 | `public/my-rides.php` |
| 13 | `admin/rides.php` |
| 14 | `core/Mailer.php` |
| 15 | `KUNDENPORTAL_PRINZIP.md` |
| 16 | `hilfe/kluengelbockx.md` |
| 17 | `assets/docs/HANDBUCH_FANBUS_KOELN.html` |
| 18 | `DOKU-FANORGANISATION-KLUENGELBOCKX.md` |
---
## [3.1.33] – 2026-07-20
**Meine Buchungen: Hotel nachziehen (nur Aufstocken) über bestehendes Mitgliederkonto.**
### Geändert
- **`booking-extend.php`:** Neben Stadionkarten auch **Übernachtung nachziehen** (nur von „ohne“ → DZ/EZ); klarer Weghinweis oben.
- **`bookings.php`:** Button „Buchung erweitern“ immer bei Mitfahrer-Buchungen; konkrete Wegbeschreibung **Menü → Gebuchte Fahrten / Meine Buchungen → Buchung erweitern**. Fix Fahrer ohne Mitfahrer (keine PHP-Warnungen).
- **`rides-book.php` + `core/Mailer.php`:** dieselbe Wegbeschreibung in Bestätigung (Flash + E-Mail) und Buchungsformular.
- **`templates/public/header.php`:** Menüpunkt bleibt **„Gebuchte Fahrten“** (Seite heißt „Meine Buchungen“).
- Doku: `KUNDENPORTAL_PRINZIP.md`, Handbuch, `hilfe/kluengelbockx.md`.
### Deploy (keine Migration)
| # | Relativer Pfad ab `portal/` |
|---|-----------------------------|
| 1 | `VERSION` |
| 2 | `CHANGELOG.md` |
| 3 | `public/booking-extend.php` |
| 4 | `public/bookings.php` |
| 5 | `public/rides-book.php` |
| 6 | `core/Mailer.php` |
| 7 | `templates/public/header.php` |
| 8 | `KUNDENPORTAL_PRINZIP.md` |
| 9 | `assets/docs/HANDBUCH_FANBUS_KOELN.html` *(bzw. Hardlink `public/assets/docs/…`)* |
| 10 | `hilfe/kluengelbockx.md` |
---
## [3.1.32] – 2026-07-19
**Hilfe: Auswärts-Stadionkarten-Vermittlung visualisiert + farbige Spielkalender-Kachelköpfe (Petrol/Grün).**
### Hinzugefügt / Geändert
- **Klüngelbockx Hilfe:** Rubrik **„Auswärtskarten – Vermittlung Schritt für Schritt“** (`#kl-away-mediation`).
- **Buchungsseite:** Link zur Hilfe-Rubrik.
- **Spielkalender:** farbige Kachelköpfe nach Wettbewerb/Heim/Auswärts (kein Rot).
- Handbuch + DOKU ergänzt.
### Deploy (keine Migration)
**Basis auf dem Server:** Document-Root des Mitfahrportals (= lokaler Ordner `portal/`)
Hard-Reload nach Upload. Cache: CSS/JS über `PORTAL_ASSETS_BUILD` (`…-cal4`) bzw. Klüngelbockx `?v=1.1.54` / `?v=1.1.56`.
| # | Relativer Pfad ab `portal/` |
|---|-----------------------------|
| 1 | `VERSION` |
| 2 | `CHANGELOG.md` |
| 3 | `config.php` |
| 4 | `core/functions.php` |
| 5 | `public/index.php` |
| 6 | `public/rides-book.php` |
| 7 | `assets/css/style.css` |
| 8 | `public/assets/css/style.css` *(falls separat deployed – oft Hardlink/Kopie von 7)* |
| 9 | `kluengelbockx/index.html` |
| 10 | `kluengelbockx/styles.css` |
| 11 | `kluengelbockx/script.js` |
| 12 | `assets/docs/HANDBUCH_FANBUS_KOELN.html` |
| 13 | `DOKU-FANORGANISATION-KLUENGELBOCKX.md` |
**Absolute Pfade (lokal):**
```
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/VERSION
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/CHANGELOG.md
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/config.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/core/functions.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/public/index.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/public/rides-book.php
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/assets/css/style.css
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/public/assets/css/style.css
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/kluengelbockx/index.html
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/kluengelbockx/styles.css
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/kluengelbockx/script.js
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/assets/docs/HANDBUCH_FANBUS_KOELN.html
/Volumes/APPSTORE/SOFTWARESCHMIEDE/PREMIUM_APPz/FANBUS.KOELN/portal/DOKU-FANORGANISATION-KLUENGELBOCKX.md
```
---
## [3.1.31] – 2026-07-16
## [3.1.31] – 2026-07-16
**Lizenzschutz: Stadionkarten nie als Verkauf/Paketpreis – nur Vermittlung; Terminologie wasserdicht.**
### Geändert
- **Spielkalender:** Einzelkosten nur **Fahrpreis** + ggf. **Übernachtung**; Stadionkarten ausgeblendet; wieder als **klare Badges** (Fahrpreis rot, Übernachtung grau mit „+“, Hin/Rück blau) – inhaltlich getrennt, optisch wieder auffällig.
- **Fahrtenliste / Buchung:** Kartenpreis **nicht** im Paket-/Orientierungspreis; Badge und Texte als **Vermittlungsantrag / kein Verkauf**.
- **`inc_ride_ticket_mediation.php`:** Schärfere Formulierungen (kein Kaufvertrag mit FANBUS; Vermittlungsantrag; Label immer „Vermittlung, Originalpreis – kein Verkauf“).
- **Klüngelbockx UI:** „Käuferschutz“ → **Kartenprüfung**; „Verkauf bestätigen“ → **Weitergabe bestätigen**; Käufer/Verkäufer → Empfänger/Abgeber (sichtbare Texte).
- **Compliance-Doku** + **DOKU-FANORGANISATION-KLUENGELBOCKX.md** an ATGB/Vermittlung angeglichen.
### Deploy
**Basis:** `portal/` (Server-Root des Mitfahrportals)
**Keine Migration.** Nur Dateien überschreiben, danach Hard-Reload.
| # | Datei |
|---|--------|
| 1 | `VERSION` |
| 2 | `CHANGELOG.md` |
| 3 | `public/index.php` |
| 4 | `public/rides.php` |
| 5 | `public/rides-book.php` |
| 6 | `public/fanorganisation.php` |
| 7 | `inc_ride_ticket_mediation.php` |
| 8 | `core/functions.php` |
| 9 | `admin/compliance-dokumentation.php` |
| 10 | `kluengelbockx/index.html` |
| 11 | `kluengelbockx/script.js` |
| 12 | `kluengelbockx/api.php` |
| 13 | `DOKU-FANORGANISATION-KLUENGELBOCKX.md` |
**Nach Upload:** Browser-Cache leeren / Hard-Reload (Klüngelbockx nutzt `script.js?v=1.1.55`).
---
## [3.1.20] – 2026-06-02
**Fix: MySQL-Collation bei E-Mail-Join (Fanclub ↔ users).**
### Behoben
- Fatal error 1267 (`utf8mb4_0900_ai_ci` vs `utf8mb4_unicode_ci`) in `admin/fanclub-initiative.php` und verwandten Queries.
- Hilfsfunktion `portal_sql_email_equals()` in `core/functions.php`.
### Deploy
`core/functions.php`, `admin/fanclub-initiative.php`, `public/fanclub-initiative.php` (Server-Stand ersetzen!), `core/Auth.php`, `admin/users.php`, optional `migrations/20260602_email_collation_unicode.sql`, `VERSION`
---
---
---
---
## [3.1.30] – 2026-07-13
**Klüngelbockx: Rechtlicher Hinweis als Badge + Pop-up (mobil schlanker).**
### Geändert
- Lange Inline-Hinweise durch klickbaren Badge **„Wichtiger Hinweis“** ersetzt; Volltext im Pop-up (Startseite, Anbieten, Reservierung, Ticket-Karten).
- E-Mails mit Vermittler-Hinweis unverändert.
### Deploy
`kluengelbockx/index.html`, `kluengelbockx/script.js?v=1.1.53`, `kluengelbockx/styles.css`, `CHANGELOG.md`
---
## [3.1.29] – 2026-07-13
**Klüngelbockx Heim: Rückkehr zur privaten Weitergabe (Ursprungsmodell) – mit durchgängigen Vermittler-Hinweisen.**
### Geändert
- **Heim-Stadionkarten:** Wieder Reservierung, Originalpreis, Zahlungsangabe des Abgebers, private Abwicklung – wie vor dem Koordinationsmodus (3.1.27/28).
- **Prüfung:** Rechnung + Kartenfoto für **Heim und Auswärts** (Admin-Freigabe vor Veröffentlichung).
- **Hinweise überall:** Private Weitergabe zum Originalpreis; FANBUS.KOELN / Klüngelbockx **nur Vermittler** – Zahlung und Übergabe direkt zwischen Abgeber und Empfänger (UI, Hilfe, E-Mails).
- **Credits:** Wieder +1 bei Freigabe (Heim & Auswärts), −1 bei Reservierung.
- **Auswärts unverändert:** Pool → Fahrt-Disposition.
### Deploy
`kluengelbockx/inc_kluengelbockx_moderation.php`, `kluengelbockx/api.php`, `kluengelbockx/index.html`, `kluengelbockx/script.js?v=1.1.49`, `kluengelbockx/inc_kluengelbockx_credits.php`, `hilfe/kluengelbockx.md`, `CHANGELOG.md`, `VERSION`
---
## [3.1.28] – 2026-07-12
**Klüngelbockx Heim: Leitsatz, Abschluss-Credits (+1 / +0,5 / 0).**
### Geändert
- Leitsatz: **„Ich kann nicht – wer hat Interesse?“** – Koordination, kein Kauf über Klüngelbockx.
- E-Mails: Abstimmung Uhrzeit FC-Ticketbörse, keine Garantie, Abschlusshinweis.
- **Abschluss melden:** Erfolg mit Interessent (+1 Credit), FC-Börse anderer Käufer (+0,5), fehlgeschlagen (0).
- Heim: **kein Credit mehr bei Freigabe** – nur nach Abschluss. Auswärts unverändert (+1 bei Freigabe).
### Deploy
`kluengelbockx/inc_kluengelbockx_moderation.php`, `inc_kluengelbockx_credits.php`, `api.php`, `index.html`, `script.js?v=1.1.47`, `hilfe/kluengelbockx.md`, `VERSION`
---
## [3.1.27] – 2026-07-12
**Klüngelbockx Heim: Koordinationsmodus (FC-Ticketbörse) – kein Kauf/Übergabe mehr über die Box.**
### Geändert
- **Heimspiele:** Nach Freigabe `coordination_home` statt öffentlicher Verkaufsbörse.
- **Interesse bekunden** statt Reservieren/Kaufen; Anbieter markiert „Über FC-Börse erledigt“.
- Kein Preis, keine Zahlungsmethode beim Heim-Angebot; Hinweise auf fc-tickets.de.
- **Auswärts unverändert:** Pool → Fahrt-Disposition.
### Deploy
`kluengelbockx/inc_kluengelbockx_moderation.php`, `kluengelbockx/api.php`, `kluengelbockx/index.html`, `kluengelbockx/script.js`, `hilfe/kluengelbockx.md`, `VERSION`
---
## [3.1.26] – 2026-07-09
**ATGB-Compliance: einheitliche Terminologie (Vermittlung, Kostenanteil, kein Reisepaket) – Deploy-Paket 3.1.24–3.1.26.**
### Geändert (Texte & Doku)
- Überall: **Kostenanteil Fahrgemeinschaft** statt „Preis/Fahrtkosten“; **Vermittlung** statt „FANBUS-Pool/als Anbieter/mit der Fahrt buchen“.
- Klüngelbockx: `index.html`, `script.js`, `api.php`, `hilfe/kluengelbockx.md` – ATGB-Hinweis § 7, Auswärts-Workflow.
- Admin/Fahrten: `admin/rides.php`, `inc_kluengelbockx_ride_pool.php`.
- Portal: `rides-create.php`, `rides-edit.php`, Dashboard, Fanclub, Bonus, Mailer, Handbuch.
### Enthalten aus 3.1.24 / 3.1.25 (gleicher Deploy)
- Auswärtsticket: ATGB-Opt-in, Vermittlungshinweis, `fc_agb_confirmed_at` (Migration!).
- Kostenaufstellung getrennt, eine Gesamtzahlung, Rechtshinweis.
### Deploy (ein Rutsch)
1. **Migration einmal:** `/public/assets/migrations/fix-php-fc-ticket-agb.php`
2. **Dateien:** siehe Liste unten + `public/legal/AGB_Tageskarten_Maerz_2026.pdf`
3. **`VERSION`** → `3.1.26`
4. Klüngelbockx: Cache leeren (`script.js?v=1.1.45`)
**Kern-Dateien:** `config.php`, `inc_ride_ticket_mediation.php`, `inc_kluengelbockx_ride_pool.php`, `public/rides-book.php`, `public/booking-extend.php`, `public/bookings.php`, `public/booking-payment-confirm.php`, `kluengelbockx/*`, `admin/rides.php`, `core/Mailer.php`, Doku/Hilfe/Handbuch.
---
## [3.1.25] – 2026-07-09
**Kostenaufstellung: Kostenanteil Fahrgemeinschaft, getrennte Positionen, eine Gesamtzahlung.**
### Geändert
- Einheitliche Bezeichnungen: **Kostenanteil Fahrgemeinschaft**, **Kostenanteil Übernachtung**, **Stadionkarte (Vermittlung, Originalpreis)**.
- Zahlungsaufstellung in `rides-book.php`, `bookings.php`, `booking-payment-confirm.php` mit rechtlichem Kurzhinweis (Umlage § 3, Vermittlung inkl. Zahlungsabwicklung, eine Gesamtzahlung).
- Hilfsfunktionen in `inc_ride_ticket_mediation.php` (`portal_booking_cost_label_*`, `portal_booking_payment_legal_note_html`).
### Deploy
`inc_ride_ticket_mediation.php`, `public/rides-book.php`, `public/bookings.php`, `public/booking-payment-confirm.php`, `VERSION`
---
## [3.1.24] – 2026-07-09
**Auswärtstickets: Vermittlungshinweis + 1.-FC-Köln-AGB-Opt-in in der Fahrtbuchung.**
### Hinzugefügt
- **`rides-book.php` / `booking-extend.php`:** Bei Klüngelbockx-vermittelten Auswärtstickets Hinweis (Karte anderer Mitglieder, Originalpreis, nur Vermittlung), separates Pflicht-Opt-in für AGB des 1. FC Köln (Stand März 2026), getrennt vom Mitfahrtvertrag.
- **`inc_ride_ticket_mediation.php`:** Hilfsfunktionen, Klüngelbockx-Status `sold` nach Buchung.
- **`config.php`:** `FC_TICKET_AGB_URL` → PDF unter `/public/legal/AGB_Tageskarten_Maerz_2026.pdf`.
- **Migration:** `public/assets/migrations/fix-php-fc-ticket-agb.php` → `buchungen.fc_agb_confirmed_at`, `fc_agb_ip_address`.
### Deploy
`config.php`, `inc_ride_ticket_mediation.php`, `public/rides-book.php`, `public/booking-extend.php`, `public/legal/AGB_Tageskarten_Maerz_2026.pdf`, Migration einmal aufrufen, `VERSION`
---
## [3.1.23] – 2026-06-30
**Mitgliederverwaltung: Portal-Konto pro Eintrag anlegen.**
### Hinzugefügt
- **`admin/fanclub-initiative.php`:** Button **Portal-Konto anlegen** (User-Plus) pro Zeile bei „kein Portal-Konto“.
### Deploy
`admin/fanclub-initiative.php`, `core/Auth.php` (E-Mail-Collation bei Provision), `VERSION`
---
## [3.1.22] – 2026-06-30
**Fix: Fan-Org-Hinweise verschwinden nicht mehr nach 5 Sekunden.**
### Behoben
- `main.js` / `admin.js`: Auto-Hide nur noch für Flash-Meldungen (`.alert-flash`), nicht für Seiten-Hinweise.
- Flash-Timeout von 5 auf **12 Sekunden** erhöht.
- Fanclub-Seite: dauerhafte Hinweise (`alert-persistent`), ausführlicherer Text, Sprunglink zum Formular.
### Deploy
`core/Flash.php`, `assets/js/main.js`, `assets/js/admin.js`, `assets/css/style.css`, `public/fanclub-initiative.php`, `VERSION`
---
## [3.1.21] – 2026-06-30
**Fan-Org: Hinweise für bereits registrierte Nutzer.**
### Geändert
- **`public/fanclub-initiative.php`:** Klarstellung „bereits registriert → einloggen, Mitgliedschaft bestätigen“ (oben, im Ablauf, am Formular).
### Deploy
`public/fanclub-initiative.php`, `VERSION`
---
## [3.1.19] – 2026-06-02
**Klüngelbockx Phase 2: Auswärts-Karten ↔ Fahrten (nur Haupt-Admin).**
### Hinzugefügt
- **`admin/rides.php?id=…`:** FANBUS-Pool für das Spieltag – Karten **Fahrt zuordnen**, **lösen** oder als **Überschuss → Börse** freigeben.
- **`inc_kluengelbockx_ride_pool.php`:** Zuordnung legt `ride_ticket_types` an und setzt `listing: fanbus_assigned`.
- Listen-Link **Pool** pro Fahrt.
### Geändert
- Klüngelbockx `api.php`: Reservierung blockiert auch für `fanbus_assigned` (nur Mitfahrt-Buchung).
- Hilfe/Doku: `hilfe/kluengelbockx.md`, `DOKU-FANORGANISATION-KLUENGELBOCKX.md`, Klüngelbockx-Hilfe (`index.html`), Benutzerhandbuch Kapitel Klüngelbockx.
### Deploy
`inc_kluengelbockx_ride_pool.php`, `admin/rides.php`, `kluengelbockx/api.php`, `kluengelbockx/index.html`, `kluengelbockx/script.js`, `hilfe/kluengelbockx.md`, `DOKU-FANORGANISATION-KLUENGELBOCKX.md`, `assets/docs/HANDBUCH_FANBUS_KOELN.html`, `VERSION`
---
## [3.1.18] – 2026-06-29
**Klüngelbockx Phase 1: Heim- vs. Auswärtskarten, FANBUS-Pool.**
### Hinzugefügt
- **Anbieten:** Auswahl **Heimspiel** / **Auswärts** bei Stadionkarten.
- **Freigabe:** Heim → öffentliche Börse; Auswärts → **FANBUS-Pool** (nicht öffentlich).
- **Admin:** Akkordeon **FANBUS-Pool (Auswärtskarten)** mit freigegebenen Auswärts-Karten.
### Geändert
- Felder `ticket_match_type`, `listing`, Status `fanbus_pool` in `ticketboerse_data.json`.
- Reservierung blockiert für FANBUS-Pool-Karten.
### Deploy
`kluengelbockx/inc_kluengelbockx_moderation.php`, `api.php`, `index.html`, `script.js`, `styles.css`, `VERSION`
Klüngelbockx **v1.1.43**
**Phase 2 (3.1.19):** Auswärtskarten Fahrten zuordnen (Admin), Überschuss → Börse.
---
## [3.1.17] – 2026-06-29
**Registrierung Pflicht – Fan-Org nur über register.php oder als eingeloggter aktiver User.**
### Feste Regel
Mitfahrportal-Registrierung (`register.php`) ist der **verbindliche Sicherheitsanker** (Klüngelbockx, TONI, identifizierter Zugang). Kein Portal-Konto mehr über das öffentliche Fanclub-Formular allein.
### Hinzugefügt
- **`register.php`:** Option **Fan-Organisation mitoptieren** (Anschrift, Geburtstag) → `saveFanclubInterestForUser()` bei Registrierung.
- URL `register.php?fanorg=1` aktiviert die Option voraus.
### Geändert
- **`fanclub-initiative.php`:** Gäste sehen nur Hinweis → Registrierung; Formular nur für **eingeloggte, freigeschaltete** Nutzer (Nachzügler).
- **`Auth::saveFanclubInterestForUser()`** – Fanclub-Eintrag + `fanclub_member` an bestehendes User-Konto.
- **`ensurePortalUserForFanclubInterest()`** – nur noch Admin-Legacy-Migration, nicht öffentlicher Weg.
### Deploy
`core/Auth.php`, `public/register.php`, `public/fanclub-initiative.php`, `admin/fanclub-initiative.php`, `VERSION`
---
## [3.1.16] – 2026-06-29
**Fanclub-Eintrag erzeugt automatisch Portal-Konto (pending) – Sync für Bestandsdaten.**
### Hinzugefügt
- **`Auth::ensurePortalUserForFanclubInterest()`:** Bei Fanclub-Anmeldung ohne bestehendes User-Konto → `users`-Eintrag (`pending`, `fanclub_member = 1`), Verknüpfung `fanclub_interessenten.user_id`, Bestätigungs-Mail + Admin-Hinweis (kein Auto-Freischalten).
- **Admin Fanclub-Initiative:** Button **Portal-Konten anlegen** für Einträge ohne User; Tabelle zeigt Portal-Status und „Mitglied“-Badge.
### Geändert
- **`fanclub-initiative.php`:** Nach Eintragung automatische Portal-Verknüpfung; Erfolgstext je nach Situation (neu / verknüpft / Passwort setzen).
### Deploy
`core/Auth.php`, `public/fanclub-initiative.php`, `admin/fanclub-initiative.php`, `VERSION`
---
## [3.1.15] – 2026-06-29
**Klüngelbockx für Michael (Bus-Staff): kein doppelter Admin-Button mehr.**
### Geändert
- **Klüngelbockx Modul-Leiste:** Für **Klüngelbockx-Verantwortliche** (`sub_admin_klx`) kein **Staff**-Button mehr in der Börse (Arbeit passiert hier; kein Umweg über Staff-Übersicht).
- **Klüngelbockx-Navigation:** Interner Menüpunkt heißt für Michael **Freigaben** (Hammer-Icon), Login-Modal **Freigaben-Login** – statt zweitem „Admin“.
- **`staff/dashboard.php`**, **`hilfe/kluengelbockx.md`:** Texte angepasst.
### Deploy
`kluengelbockx/index.php`, `kluengelbockx/script.js`, `staff/dashboard.php`, `hilfe/kluengelbockx.md`, `VERSION`
---
## [3.1.14] – 2026-06-29
**Klüngelbockx Modul-Leiste: Admin vs. Bus-Staff klar getrennt.**
### Geändert
- **Klüngelbockx:** Verwaltungs-Button zeigt für **Haupt-Admin** **Admin** (→ `/admin/dashboard.php`), für **Bus-Staff** (Michael etc.) weiter **Staff** (→ `/staff/dashboard.php`).
- **`portal_staff_modulebar_label()`** in `core/functions.php`.
### Deploy
`core/functions.php`, `kluengelbockx/index.php`, `VERSION`
---
## [3.1.13] – 2026-06-23
**Fanclub vs. Mitfahrportal-Registrierung – Verwechslung behoben.**
### Geändert
- **`fanclub-initiative.php`:** Nach Fanclub-Eintragung klarer Hinweis + Button **Schritt 2: Mitfahrportal-Registrierung** (`/public/register.php`).
- **`admin/users.php`:** Hinweis, wenn Fanclub-Einträge **ohne** Portal-Konto existieren (Link zur Fanclub-Verwaltung).
- **`register.php`:** E-Mail aus URL `?email=` vorausfüllen (nach Fanclub-Flow).
### Deploy
`public/fanclub-initiative.php`, `public/register.php`, `admin/users.php`, `VERSION`
---
## [3.1.12] – 2026-06-23
**Registrierung: Bestätigungs-Mail bei erneuter Anmeldung + Admin „Mail erneut“.**
### Behoben
- **Erneute Registrierung mit gleicher E-Mail (`pending`):** keine tote Meldung mehr – **Bestätigungs-Mail wird erneut gesendet** (neuer Token, Passwort aktualisiert).
- **Admin → Benutzer:** Button **„Mail erneut“** für `pending`.
- **Links in Mails:** `PORTAL_MAIL_BASE_URL` = `https://mitfahrportal.fanbus.koeln` (statt `mein.fanbus.koeln`).
### Deploy
`config.php`, `core/functions.php`, `core/Auth.php`, `core/Mailer.php`, `public/register.php`, `admin/users.php`, `VERSION`
---
## [3.1.11] – 2026-06-13
**Registrierungs-Mails: doppeltes BCC behoben, Admin-Hinweis bei neuer Anmeldung.**
### Behoben
- **`sendVerificationEmail()`:** BCC zu `info@fanbus.koeln` wurde doppelt gesetzt (in `getMailer()` und nochmal) – kann PHPMailer zum Abbruch bringen → **keine Bestätigungs-Mail, keine BCC-Kopie**.
- **`sendRegistrationPendingAdminNotice()`:** Admin erhält bei jeder Registrierung eine Mail (Status pending), unabhängig vom Nutzer-Versand.
### Deploy
`core/Mailer.php`, `core/Auth.php`, `VERSION`
---
## [3.1.10] – 2026-06-13
**Registrierung: Fehler sichtbar, INSERT zuverlässig, Duplikat-Hinweise.**
### Behoben
- **`Database::insert()`:** Erkennt fehlgeschlagenes Speichern zuverlässig (nicht mehr falsch „Erfolg“).
- **`public/register.php`:** Rote Meldung direkt über dem Formular; klare Texte bei bereits registrierter E-Mail (`pending` / `email_verified`).
- **`core/Flash.php`:** `error` → Bootstrap `danger`, HTML in Meldungen (Zeilenumbrüche).
- **`Auth::register()`:** Prüfung DB-Spalten; Mailer in try/catch (Absturz blockiert nicht mehr den Speichervorgang).
### Deploy
`core/Database.php`, `core/Auth.php`, `core/Flash.php`, `public/register.php`, `VERSION`
---
## [3.1.9] – 2026-06-13
**Registrierung repariert: CSRF-Blockade entfernt, Admin sieht „E-Mail offen“.**
### Behoben
- **`public/register.php`:** CSRF-Prüfung blockierte Registrierung (eingeführt in 3.1.7) – wieder wie vorher, Formular geht durch.
- **`admin/users.php`:** Filter **„E-Mail offen“** (`pending`) ergänzt – „Wartend/Freischaltung“ zeigte nur `email_verified`, frische Registrierungen waren unsichtbar.
### Deploy
`public/register.php`, `admin/users.php`, `VERSION`
---
## [3.1.8] – 2026-06-13
**Registrierung: ursprünglicher Workflow wiederhergestellt (E-Mail → Admin-Freischaltung).**
### Geändert
- **3.1.7 rückgängig:** Kein Auto-Aktivieren nach E-Mail-Bestätigung oder bei SMTP-Ausfall.
- **Ablauf wieder:** `pending` → E-Mail-Link → `email_verified` → Admin „Freischalten“ → `active` → Login.
- **Admin-Mail** nach E-Mail-Bestätigung mit Link zu `/admin/users.php?filter=waiting`.
- Beibehalten: korrekter Bestätigungslink (`/public/verify-email.php`), klarere Fehlermeldungen, E-Mail lowercase, CSRF auf Registrierung.
### Deploy
`core/Auth.php`, `core/Mailer.php`, `public/register.php`, `public/verify-email.php`, `VERSION`
**Nicht** die SQL aus 3.1.7 ausführen (Auto-Aktivierung aller `email_verified`).
---
## [3.1.7] – 2026-06-13
**Zurückgenommen in 3.1.8** – Auto-Aktivierung nach E-Mail war nicht gewünscht.
---
## [3.1.6] – 2026-06-12
**Bus-Staff – einheitliche UI-Marke statt „Verwaltung“ / „Junior-Partner“.**
### Geändert
- **`portal_bus_staff_short_label()` / `portal_bus_staff_full_name()`** in `core/functions.php`; Badge, Willkommen und Seitentitel für Sub-Admins nutzen **Staff** bzw. **Der Bus-Staff von FANBUS.KOELN** (DB-Rollen unverändert).
- **Navbar & Dashboard:** Staff-Shell zeigt „Staff“ statt „Verwaltung“; `/staff/dashboard.php` mit Bus-Staff-Einleitung.
- **Klüngelbockx:** Modul-Leiste „Staff“, Login-Hinweis Bus-Staff · Klüngelbockx.
- **Hilfe-Texte** (`hilfe/*.md`), Handbuch-Registry, `DOKU-JUNIOR-PARTNER-SUB-ADMIN.md` (UI-Abschnitt), `BETRIEBSREFERENZ.md`.
### Deploy-Hinweis
Keine DB-Migration. u. a. `core/functions.php`, `templates/admin/header.php`, `staff/dashboard.php`, `kluengelbockx/index.php`, `hilfe/`, `assets/css/admin.css`, `VERSION`.
---
## [3.1.5] – 2026-06-12
**Junior-Partner Fan-Org: eingeschränktes Kommunikationsmodul.**
### Hinzugefügt
- **Kommunikation für `sub_admin_fanorg`:** Sidebar-Gruppe *Kommunikation*; Modul-Leiste verlinkt auf `/admin/kommunikation.php`.
- **`inc_portal_kommunikation_access.php`:** Scope `full` (Admin) vs. `fanorg` (Junior) – serverseitige Zielgruppen-Prüfung.
### Geändert
- **`/admin/kommunikation*.php`** (Hub, Schnellnachricht, Fan-Org-Kampagne, Einzeln): Junior-Partner nutzen Staff-Shell; Fan-Org-Juniors nur Zielgruppe Fan-Organisation / Mitglieder.
- **Michael (`sub_admin_klx`):** unverändert ohne Portal-Kommunikation (Börse-eigene Mails).
### Deploy-Hinweis
Keine DB-Migration. u. a. `inc_portal_kommunikation_access.php`, `admin/kommunikation.php`, `kommunikation-kurzinfo.php`, `kommunikation-premium.php`, `kommunikation-einzeln.php`, `inc_portal_staff_sidebar.php`, `inc_fanbus_module_nav.php`, `hilfe/fan-organisation.md`, `DOKU-JUNIOR-PARTNER-SUB-ADMIN.md`, `VERSION`.
---
## [3.1.4] – 2026-06-12
**Hilfe & Doku im Portal – Menü als Wohnzimmer, nicht lose Markdown-Dateien.**
### Hinzugefügt
- **Integrierte Hilfe & Doku:** `/staff/hilfe.php` (Übersicht), `/staff/hilfe-lesen.php` (Markdown im Admin-Layout), `/staff/handbuch.php` (Benutzerhandbuch mit Kapitel-Navigation); Registry und Markdown-Renderer in `inc_portal_docs.php`.
- **Benutzerhandbuch im System:** `assets/docs/HANDBUCH_FANBUS_KOELN.html` – Kapitel springen per Anker; Navigation gruppiert wie Sidebar (Einstieg, Mitfahrportal, TONI, Fan-Org, Klüngelbockx, Betrieb).
- **Junior-Anleitungen:** `hilfe/fan-organisation.md`, `hilfe/kluengelbockx.md` (+ `hilfe/README.md` mit Pflege-Checkliste Anker ↔ Menü ↔ HTML).
### Geändert
- **Sidebar (Admin & Junior-Partner):** Klapp-Gruppen statt langer Liste – Mitfahrportal, Fan-Organisation, Klüngelbockx, Hilfe & Doku; mobil kompakter (`inc_portal_staff_sidebar.php`, `staff_sidebar_menu.php`, `admin.css`, `admin.js`).
- **Doku-Zugriff:** Betriebsdoku nur noch Haupt-Admin (Menü *Hilfe & Doku* → Betrieb & Referenz); Juniors sehen nur rollenspezifische Anleitungen – keine `BETRIEBSREFERENZ.md`-Links mehr in der UI.
- **Support & Wartung:** Link zur Hilfe-Übersicht (`admin/support.php`).
- **Agent-Doku:** Anker-Pflege-Regel in `AGENTS.md` §3, `BETRIEBSREFERENZ.md` Pflege-Regel 4, `.cursor/rules/projekt-doku-zuerst.mdc`.
### Entfernt / verschoben
- Lose Hilfe-URLs im Root: `HILFE-FAN-ORGANISATION.md` / `HILFE-KLUENGELBOCKX-VERANTWORTUNG.md` → Inhalt unter `portal/hilfe/` (alte Dateien auf Server nach Deploy löschen).
### Deploy-Hinweis
Keine DB-Migration. PHP/CSS/JS/HTML/MD deployen, u. a. `staff/`, `inc_portal_docs.php`, `inc_portal_staff_sidebar.php`, `templates/partials/staff_sidebar_menu.php`, `assets/docs/`, `assets/css/admin.css`, `assets/js/admin.js`, `hilfe/`, `kluengelbockx/index.html`, `AGENTS.md`, `BETRIEBSREFERENZ.md`, `.cursor/rules/projekt-doku-zuerst.mdc`, `VERSION`.
---
## [3.1.3] – 2026-06-11
### Hinzugefügt
- **Klüngelbockx Dankeschön-Guthaben:** Als Dankeschön für die Fan-Org-Mitgliedschaft erhält jedes Mitglied **einmalig +1 Credit** (`opening_credit`, `opening_launch_{user_id}`) – auch Neumitglieder, je Person nur einmal. UI: Banner beim ersten Gutschein, Solidaritäts-Texte.
---
## [3.1.2] – 2026-06-09
**Junior-Partner live: bereichsspezifische Verantwortung für Fan-Organisation und Klüngelbockx.**
### Behoben
- **Spielkalender:** In `public/index.php` wurde fälschlich **FANBUS.KOELN** statt **1. FC Köln** in der VS-Anzeige gezeigt (Nebeneffekt der Anbieter-Umbenennung). Korrigiert via `FANBUS_MATCH_HOME_TEAM` in `config.php`.
- **Sonderfahrten:** Trainingslager & Co. ohne „VS“-Layout – nur Fahrttitel, Badge **Fahrt** (`portal_match_is_trip_event`, Wettbewerbe Trainingslager/Sonderfahrt/Fanfahrt/Event). Bestehende Einträge mit „Trainingslager“ im Titel werden erkannt.
### Hinzugefügt
- **Junior-Partner (UI):** `sub_admin_fanorg` und `sub_admin_klx` werden als **Junior-Partner** mit Bereichs-Badge (Fan-Organisation / Klüngelbockx), Willkommens-Hinweis und Handschlag-Icon angezeigt – Navbar, Dashboard, Klüngelbockx, Nutzerliste (`portal_junior_partner_*` in `core/functions.php`).
- **Klüngelbockx Admin für Michael Schäfer:** separater Eintrag in `kluengelbockx/admins.json`; Menüpunkt **Admin** in der Börse-Navigation öffnet Login-Modal (kein Browser-Konsole-Workaround).
### Geändert
- **Rollen-Zuweisung (Produktion):** Andreas Fox → `sub_admin_fanorg` (Fan-Org-Verwaltung ohne Voll-Admin); Michael Schäfer → `sub_admin_klx` (Börse ja, Freigaben nur nach separatem Börse-Passwort). Migration `migrations/20260609_scoped_sub_admin_roles.sql`.
- **Haupt-Admin unverändert:** Vollzugriff `/admin/` und Klüngelbockx-Auto-Admin ohne zweites Passwort.
### Deploy-Hinweis
- DB-Migration + PHP (`Auth.php`, `fanorg-admin/`, `kluengelbockx/index.php`, `script.js`, `api.php`, `core/functions.php`, Templates) + `admins.json` auf dem Server.
---
## [3.1.1] – 2026-06-01
**Klüngelbockx: Käuferschutz, Rechnung + Kartenfoto, Admin-Freigabe, Kommunikation.**
### Geändert (Navigation)
- **Admin-Bereich:** Schutz vor vertauschtem Sub-Admin-Layout unter `/admin/` (Deploy-Prüfung, Redirect); einheitlicher **Anbieter**-Name **FANBUS.KOELN** (`FANBUS_RIDE_PROVIDER_LABEL`) statt Login „Admin“ / Account „Fanbus Köln“; UI-Label **Anbieter** statt Fahrer (`FANBUS_RIDE_PROVIDER_TERM`).
- **Bereichs-Sub-Admins:** Rollen `sub_admin_fanorg` (eigene Verwaltungsoberfläche `/fanorg-admin/`) und `sub_admin_klx` (Börse ja, Klüngelbockx-Admin nur nach separatem Login); Haupt-Admin behält Klüngelbockx-Auto-Admin.
- **Einheitlicher Modul-Wechsel:** In Portal (Public/Sub-Admin/Admin), Klüngelbockx und TONI wurde eine **immer sichtbare Modul-Leiste** ergänzt, um schneller zwischen **Mitfahrportal**, **TONI.go**, **Klüngelbockx** und **Kommunikation** zu wechseln.
- **Fan-Organisation auffindbar:** Modul **„Fan-Organisation“** immer sichtbar – wie Klüngelbockx für Nicht-Mitglieder **gesperrt** (Schloss, gestrichelter Rand) mit Link zur Anmeldung `/public/fanclub-initiative.php`; Quick-Nav, Sidebar, TONI; Admin-Vorschau: `?module_nav_preview=nonmember`.
- **Landing `public/landing.php`:** vierte Modul-Kachel **Fan-Organisation** (10 % Rabatt, Klüngelbockx/Archiv); Mitglieder → Mitgliederbereich, sonst Anmeldung.
### Hinzugefügt
- **Klüngelbockx-Guthaben – Mitfahrt:** Alternative zum Karten-Angebot: **+1 Credit** pro abgeschlossener Mitfahrt als Passagier; **Saisonstart 23.08.2026** (DFB-Pokal Auswärts), **Neustart bei 0**, keine rückwirkenden Credits; Konfiguration `KLX_CREDITS_SEASON_START` / `KLX_CREDITS_SEASON_MATCH_ID` in `config.php`.
- **Käuferschutz (Kommunikation):** Header-Flyer „KLÜNGELBOCKx + Käuferschutz“ (sticky), Logo-Badge; Hilfe `#kl-kaeuferschutz`; Anbieten-Formular; Fan-Organisation-Kachel; optionale Portal-Nachricht (`20260601_portal_nachricht_kluengelbockx_kaeuferschutz.sql`).
- **Stadionkarten (Kategorie Tickets):** Pflicht **Rechnung** + **Kartenfoto** (kein Textfeld Kartennummer – nur Ablichtung); mobil: „Foto aufnehmen“ / „Galerie“; Freigabe durch Admin.
- **Admin-Bereich:** Akkordeon „Freigaben (Rechnungsprüfung)“ mit Rechnungslink, Freigeben/Ablehnen; Badge für offene Prüfungen.
- **API:** `upload_invoice`, `upload_card_proof`, `moderate_ticket`, `admin_pending_offers`, `admin_view_invoice` (`doc=invoice|card`); Hilfen in `inc_kluengelbockx_moderation.php`.
- **Schutz:** Doppel-Angebote (gleiches Spiel/Platz) blockiert; Prüfunterlagen unter `uploads/moderation/` (nicht direkt per URL).
### Geändert
- **Guthaben:** +1 für Stadionkarten erst bei Admin-Freigabe (nicht bei Einreichung).
- **Portal Admin/Sub-Admin:** `admin_tickets` und Freigaben ohne separaten Klüngelbockx-Login.
- **API/Frontend (v1.1.26):** Reine JSON-Antworten auch bei Uploads (`upload_invoice`, `upload_card_proof`); Fallback wenn `inc_kluengelbockx_moderation.php` fehlt; MIME ohne `finfo`; klare Fehlermeldung statt „Unexpected token <“.
- **Admin-Zugang (v1.1.27–28):** Portal-Admin/Sub-Admin ohne separaten Klüngelbockx-Login; API `session_context` erkennt Staff auch bei direktem `index.html`; `.htaccess` leitet auf `index.php` um; Admin-Login-Button standardmäßig ausgeblendet.
- **Freigaben (v1.1.29):** Rechnung/Kartenfoto im Overlay (Schließen, Escape, Browser-Zurück); optional „In neuem Tab“.
- **Freigabe-Hinweise Portal:** Ausstehende Stadionkarten-Freigaben im Admin (Banner, Sidebar-Badge, Popup beim Besuch), Dashboard, Fan-Organisation; gelbe Leiste in Klüngelbockx; Link `#admin` öffnet Freigaben-Akkordeon.
- **E-Mail Reservierung:** Anbieter-Benachrichtigung per PHPMailer + Portal-SMTP (`noreply@fanbus.koeln`), nicht mehr nur `mail()`; ehrliche API-Meldung wenn Versand scheitert.
- **Reservierung ablehnen:** In der Anbieter-Mail zweiter Link „Reservierung ablehnen“ (`api.php?action=reject_sale`); Angebot wird wieder `available`, Guthaben (Stadionkarten) zurückgebucht; Käufer erhält Ablehnungs-Mail.
- **Fix:** E-Mail-Links Bestätigen/Ablehnen ohne Portal-Login (Token-Aktionen umgehen Mitgliedschafts-Gate); alte Links `/?action=confirm_sale` leiten auf `api.php` um; `get_ticket_by_token` ebenfalls per Token ohne Login.
- **Käufer-Mail nach Verkaufsbestätigung:** Odoo-/„Fahrgelegenheit gesucht?“-Block entfernt; stattdessen Hinweis „FANBUS.KOELN – jetzt einsteigen“ mit Link zum Mitfahrportal (`mein.fanbus.koeln`).
- **Admin Guthaben:** Klüngelbockx-Admin → Akkordeon „Stadionkarten-Guthaben“: Saldo aller Mitglieder, Buchungshistorie, manuelle Korrektur (+/− oder Ziel-Saldo) mit Pflicht-Grund im Ledger.
- **UI:** Button „Admin-Login“ für normale Mitglieder entfernt (Zugang nur noch über Portal-Admin → Menü „Admin“).
### Deploy
`portal/kluengelbockx/` – u. a. `api.php`, `script.js`, `index.html`, `styles.css`, `inc_kluengelbockx_moderation.php`, `inc_kluengelbockx_credits.php`, Ordner `uploads/moderation/` (schreibbar).
---
## [3.1.0] – 2026-06-01
**Übernachtung (Hotel-Option), einheitliche Badges, Admin-Deadline-Hinweis.**
### Hinzugefügt
- **Übernachtung MVP (Portal):** Modus „Optional mit Mindestanzahl + Hard-Cap + Deadline“ – Mitfahrer wählen bei Buchung **ohne Hotel / DZ / EZ**; **fixe Tarife** pro Person (keine Nachforderung, kein Guthaben nach Buchung).
- **Admin-Konfiguration** (`rides-edit.php`): Mindest-/Maximalanzahl Personen, optional EZ-Cap, **Booking.com-Deadline**, Tarife DZ/EZ, manuelle Entscheidung **pending / confirmed / cancelled**.
- **Migration:** `migrations/php_add_accommodation_options_deadline_caps.sql` (Spalten in `rides` und `buchungen`: u. a. `accommodation_mode`, `accommodation_type`, `accommodation_unit_price`, `accommodation_decision`).
- **Zentrale Badge-Helper** (`core/functions.php`): `portal_accommodation_*`, `portal_booking_accommodation_badge_html()` – einheitliche Anzeige in Kalender, Fahrtenliste, Dashboard, Meine Fahrten/Buchungen, Admin-Fahrtenübersicht.
- **Admin-Hinweisfenster:** Modal beim Admin-Besuch, wenn eine Übernachtungs-Deadline in **≤ 7 Tagen** ansteht (oder kurz überfällig) – inkl. Buchungsstand, Kontingent, Link zur Fahrtbearbeitung; „Heute nicht mehr anzeigen“ / „Verstanden“. **Keine** E-Mail-Erinnerungen an den Admin.
### Geändert
- **Buchungslogik** (`rides-book.php`): Kontingent- und Deadline-Prüfung, Speicherung von `accommodation_type` und Fixpreis pro Buchung.
- **Listen & Übersichten:** `index.php`, `rides.php`, `dashboard.php`, `my-rides.php`, `bookings.php`, `meine-buchungen.php`, `admin/fahrten-uebersicht.php` – Badges und Preishinweise an neues Modell angeglichen (optional: Listenpreis ohne Hotel, DZ/EZ als „ab“-Hinweis).
- **Kalender:** Preis-SQL ohne automatische Hotel-Zuschlag-Addition bei optionalem Modus; Übernachtungs-Badges über Helper.
### Festlegungen (fachlich)
- Hotel = **fixe Tarife** (Admin kalkuliert manuell inkl. Puffer/Crew); **kein** dynamischer Umlage-Topf im Portal.
- **Mindestanzahl** = Hinweis + Admin-Entscheidung, kein Auto-Stopp bei zu wenigen Buchungen.
- **Warteraum** = Busplätze; Hotel-Kontingent separat (Admin kann Max. in der Fahrtbearbeitung erhöhen).
### Deploy-Hinweis
1. Migration `php_add_accommodation_options_deadline_caps.sql` ausführen
2. u. a. `core/functions.php`, `rides-edit.php`, `rides-book.php`, geänderte Listen-Seiten, `templates/admin/header.php`, `templates/admin/footer.php`, `admin/dashboard.php`
**Noch offen:** `rides-create.php` – Übernachtungs-UI weiterhin Legacy (Anlage neuer Fahrten über Bearbeitung oder spätere Angleichung).
### Hinzugefügt (ergänzend)
- **Öffentliche Fahrtbewertungen:** `public/bewertungen.php` – Durchschnitte und Kommentare aus TONI-Tabelle `fahrtbewertungen` (gemeinsame DB), ohne Login. Teaser + Link auf Login, Registrierung, Landing und **Spielkalender** (`index.php`).
---
## [3.0.1] – 2026-05-09
**Klüngelbockx: Transfers, Pfade, Limits, UI & Doku.**
### Geändert / Hinzugefügt
- **`kluengelbockx/api.php`:** Dateizugriff über `KLUENGELBOCKX_ROOT` (`ticketboerse_data.json`, `admins.json`, `config.php`, `uploads/`, `email_logs.json`) – unabhängig vom PHP-CWD auf Shared Hosting.
- **Transaktionsprotokoll:** `transaction_logs` in der JSON; bei Reservierung/Bestätigung/Storno; API `admin_transaction_logs`; Zusammenführung mit **Archiv-Zeilen** aus `tickets` (`sold`/`reserved`), wenn kein Log-Eintrag existiert.
- **Admin-Zugriff Protokoll:** FANBUS-**Admin** oder **Sub-Admin** (Session/DB-Rolle) oder Klüngelbockx-Admin-Session; `index.php` setzt `__FANBUS_KL_PORTAL_STAFF__` für Nav/UX.
- **Reservierung:** serverseitig `maxTicketsPerUser`; optional **`buyer_max_concurrent`** pro Angebot.
- **`confirm_sale`:** GET → HTML, POST → JSON (SPA-kompatibel).
- **`kluengelbockx/index.php`:** Vorbefüllung Name/Telefon aus Portalprofil; optional `seller-phone` im Formular.
- **`kluengelbockx/styles.css` / `index.html`:** FANBUS-Design-Tokens (Petrol), Hilfe/Nutzungsregeln (Fan-Organisation FANBUS.KOELN), **Empty-State**-Kontrast auf hellem Grund.
- **Benutzerliste (Admin):** aus Verkäufer- und Reservierungs-E-Mails abgeleitet; Storno-Löschlogik präzisiert.
### Doku
- **`portal/DOKU-FANORGANISATION-KLUENGELBOCKX.md`:** Abschnitte Datenhaltung, Transfers, Limits, UX, Troubleshooting ergänzt/aktualisiert.
---
## [3.0.0] – 2026-04-12
**FANBUS-Oberfläche: Petrol-Design (Portal, Admin, E-Mails) – klare Abgrenzung vom klassischen FC-Rot als Primärfarbe.**
Diese **3.0.0** ist bewusst mehr als ein Facelift: Sie dokumentiert eine **stärkere Eigenständigkeit von FANBUS.KOELN** – sichtbar in Farbwelt, Oberflächen und System-Mails – und eine **weitere Abnabelung von Mustern und Erscheinungsbildern**, die aus **bisher noch geführten Kooperationen** mitgewachsen waren. Technisch und gestalterisch soll damit die **eigene Marke** klarer erkennbar sein, ohne bestehende Funktionen oder Rechtslagen zu ersetzen.
### Geändert (Überblick)
- **Öffentliches Mitfahrportal:** `assets/css/style.css` – FANBUS-Design-Tokens (Petrol, ruhige Flächen), Navbar- und Hero-Verlauf wie TONI/MyOffice, Startseiten-Kacheln, Karten/Schatten/Typo, Footer, Quick-Nav, Bootstrap-Primär (`--bs-primary`), Cache-Buster für CSS/JS über `asset()` + `PORTAL_ASSETS_BUILD` in `config.php`.
- **Eingeloggter Bereich & Admin:** `assets/css/admin.css` – gleiche Token-Basis; Admin-Navbar, Sidebar, Karten, Buttons, Formulare, Login-Box; **`admin/index.php`** (Admin-Login) optisch angeglichen.
- **E-Mails:** `core/Mailer.php` – einheitliche Petrol-Köpfe und CTAs; Links und Akzente in FANBUS-Farben; **Rot nur noch semantisch** (z. B. „Lösche mein Konto“). Passwort-/Verifikations-Templates mitangepasst.
- **Weitere PHP/CSS:** u. a. Passwort-Seiten, Pinwand, Teilnehmerportal, Compliance-Dokumente (Admin/Sub-Admin), Fahrt-Bericht, Fahrten-Übersicht, `rides.php` – dort wo noch Alt-Rot als „Marke“ wirkte, auf Petrol bzw. Tokens umgestellt.
### Hinweis
- Statische Dateien gehören laut Konfiguration unter **`portal/assets/`** (`ASSETS_PATH`). Nach versehentlichem Verschieben: **`assets`** wieder direkt unter das Portal-Root legen, damit `/assets/…` und `asset()` stimmen.
---
## [2.8.2] – 2026-04-12
**Fahrtenplaner: PDF bei fehlendem `vendor/` – Hinweis + Fallback auf Druckansicht.**
### Geändert
- **`fahrtenplaner-pdf.php`:** Autoload zusätzlich relativ zu `portal/`; klarere Fehlermeldung (vollständigen Ordner `vendor/` deployen bzw. `composer install` im Portal-Verzeichnis).
- **`fahrtenplaner.php`:** Antwort **503** / fehlende PDF-Abhängigkeiten → Dialog mit **Druckansicht** als Alternative (Browser „Als PDF speichern“).
---
## [2.8.1] – 2026-04-12
**Fahrtenplaner: echte PDF-Datei per Server (Dompdf).**
### Hinzugefügt
- **`admin/fahrtenplaner-pdf.php`:** POST mit CSRF + HTML-Ansicht → `application/pdf` zum Download (`Fahrtenplan-YYYY-mm-dd-His.pdf`). Abhängigkeit **Dompdf** via Composer (`portal/composer.json`, `vendor/`).
- **UI:** getrennte Aktionen **PDF speichern** (Download) und **Drucken** (Browser-Dialog wie bisher); Fallback-Einstiege `public/admin/fahrtenplaner-pdf.php` und `public/fahrtenplaner-pdf.php` (analog zu `fahrtenplaner-admin.php`).
---
## [2.8.0] – 2026-04-12
**Admin: Fahrtenplaner – interne Zeitplanung für Fernfahrten (Mit/ohne Übernachtung).**
### Hinzugefügt
- **`admin/fahrtenplaner.php`:** Nur für **Haupt-Admin** (`requireAdmin`). Planung von Anreise, Pausen, Verweilzeit am Hotel, kurzer Strecke Hotel→Stadion und Zielzeit **Einlass** (bezogen auf Anstoß + Minuten vor Anstoß). Keine Speicherung in der DB – reines Planungswerkzeug.
- **Art der Fahrt:** Wahl **ohne Übernachtung** (ein Fahrzeitblock Treff→Stadion) oder **mit Übernachtung** (2a Treff→Hotel, 2b Verweilzeit/Check-in, 2c Kurzstrecke Hotel→Stadion) – jeweils nur die nötigen Felder.
- **Ergebnis:** Chronologische **Timeline** (Treff zuerst, Stadion-Einlass als Ziel), motivierende Texte, Druckansicht **PDF** (Browser „Als PDF speichern“) mit Kopfzeile und Tabelle für Fahrer/innen.
- **Hilfe:** Aufklappbare Übersicht **„Was beeinflusst frühere/spätere Abfahrt?“** (Fahrzeit, Pausen, Puffer, Treff, Verweilzeit, Hotel→Stadion, Minuten vor Anstoß).
- **Navigation:** Admin-Menü „Fahrtenplaner“; Dashboard-Hinweis mit Direktlink; Fallback-Einstiege `public/admin/fahrtenplaner.php`, `public/fahrtenplaner-admin.php` falls der Webroot nur `public/` ist.
- **`core/functions.php`:** `admin_base_path()` / `admin_url()` für korrekte Admin-URLs je nach Server-Document-Root.
### Relevante Dateien
- `admin/fahrtenplaner.php`, `templates/admin/header.php`, `admin/dashboard.php`, `core/functions.php`, `public/admin/fahrtenplaner.php`, `public/fahrtenplaner-admin.php`
---
## [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).