# Masterplan — Rakku Website V2

Ziel: rakku.de als kompletter Next.js-Rewrite, in `/var/www/html/rakku-v2` gebaut. **Seit 11.08.2026 live** — `rakku.de` zeigt V2, V1 läuft als Sicherheitsnetz unter `old.rakku.de` (Port 3008) weiter. Ausführlicher, visueller Plan (Architektur, Datenmodell, alle Entscheidungen) liegt als gepflegtes Artifact vor — dieses Dokument ist der knappe Meilenstein-Fahrplan für die Umsetzung selbst.

## Meilensteine

### Phase 0 — Vorbereitung ✅ abgeschlossen
- Next.js-Projekt, i18n-Grundgerüst (DE/EN), MongoDB- und Nextcloud-Anbindung getestet
- *Definition of Done:* Build + Boot-Test grün, beide Sprachen erreichbar, DB/Nextcloud-Verbindung verifiziert

### Phase 1 — Öffentliche Seite im neuen Design ✅ abgeschlossen
- Wartungsmodus-Grundgerüst ✅
- Live-Chat (tawk.to) ✅
- Hero mit echtem Foto, Scroll-Reveal, Scroll-Down-Cue, Nach-oben-Button ✅
- Portfolio-Seite mit 14 migrierten Einträgen/47 Bildern + seitenweitem Kopierschutz ✅
- Datenschutz (DE/EN, echter Text migriert) + Footer mit externem Impressum-Link (impressum4u.de, wie in V1) ✅
- *Definition of Done:* alle öffentlichen V1-Seiten haben ein V2-Äquivalent mit echten Inhalten — erfüllt

### Phase 2 — Auth, Aufträge, Preis & Vertrag ✅ abgeschlossen
- Registrierung/Login, Auftragserstellung im Dashboard inkl. Datei-Upload ✅
- Preisvorschlag-Workflow (nur Admin eröffnet, Kunde reagiert) ✅
- Vertragserstellung + einfache elektronische Signatur (Standard + TFP) ✅
- TFP-Auftragstyp mit eigener Vertragsvorlage inkl. automatischer Minderjährigen-/Erziehungsberechtigten-Logik ✅
- Admin-Grundgerüst (`/admin`, einfacher Einzel-Login) als Übergangslösung bis Phase 6 ✅

### Phase 3 — Kunden-Dashboard & Nextcloud ✅ abgeschlossen
- Ordner-Zuweisung (WebDAV-Browser) im Admin ✅
- Kunden-Fotogalerie, Bewertung, Download erst nach Freigabe ✅

### Ad-hoc — Angebote-Seite ✅ abgeschlossen (03.08.2026, nicht im ursprünglichen Plan)
- Öffentliche Unterseite `/angebote` mit allen Leistungen + Preisspannen, Status admin-steuerbar (verfügbar/auf Anfrage/nicht verfügbar), bleibt immer sichtbar
- Direkter Buchen-Button pro Angebot (vorbefüllter Auftrag), individueller Auftrag bleibt parallel bestehen

### Ad-hoc — Statistiken, Ablehnungsgründe & Aktivitäts-Log ✅ abgeschlossen (03.08.2026, nicht im ursprünglichen Plan)
- Admin-Statistik-Seite (Auftrags-Funnel, Umsatz, Ablehnungsgründe, Kunden/Angebote-Nachfrage)
- Generelle Auftrags-Ablehnung mit admin-konfigurierbaren Gründen (separat vom bestehenden Preisverhandlungs-Workflow)
- Aktivitäts-Log/Timeline pro Auftrag für Nachvollziehbarkeit

### Ad-hoc — Einheitlicher Login & Admin-Redesign ✅ abgeschlossen (03.08.2026, vorgezogenes Stück aus Phase 6)
- Mitarbeiter = Client-Account mit `role: "staff"`, ein Login (`/login`) statt getrennter Admin-Zugangsdaten, rollenbasierter Redirect
- Mitarbeiter können mit demselben Account normale Aufträge anlegen
- Komplettes visuelles Redesign des Admin-Bereichs (Nutzer-Feedback: wirkte „billig")

### Ad-hoc — Großes Feedback-Paket ✅ abgeschlossen (03.08.2026)
- Farbige Kanban-Tags (Dashboard + Admin-Kartenrahmen), Sortierung im Admin, Statistik-Kreisdiagramme (SVG, keine Bibliothek)
- Registrierung mit Vor-/Nachname + Nickname, Profil-Bearbeitung + Profilbild für alle Accounts (Client-Model erweitert)
- Kunden können ihr Shooting selbst mit Begründung stornieren (`rejectedBy`-Feld unterscheidet Admin/Kunde)
- Auftragsdetailseite angereichert (mehr Felder, Aktivitäts-Log) + neuer Auftrags-Chat (`OrderMessage`-Model) zwischen Kunde und Rakku

### Ad-hoc — Echter Zahlungsstatus + Überweisungs-Referenz ✅ abgeschlossen (03.08.2026)
- Neues, unabhängiges `paid`-Feld am Order-Model — nie automatisch gesetzt, nur manuell im Admin
- Auftragsart-Label „Bezahlt" → „Kostenpflichtig" umbenannt (war mit Zahlungsstatus verwechselbar)
- Deterministisch aus der Auftrags-ID abgeleitete Zahlungsreferenz (`RK-XXXXXXXX`) für den Überweisungs-Verwendungszweck
- Sichtbar in Auftragsseite, Auftragsliste und Statistik (eigene „Offene Zahlungen"-Übersicht)

### Ad-hoc — Admin-Aufträge/Kunden für Skalierung umgebaut ✅ abgeschlossen (03.08.2026)
- Aufträge: schlanke, durchsuchbare, paginierte Liste statt allem auf einer Seite; Klick öffnet eine eigene Auftragsseite statt eines Akkordeons
- Archiv-System für Aufträge (`archived`-Feld, Umschalter in der Liste)
- Kundenakten (`/admin/clients`) — durchsuchbare Kundenliste + Akte pro Kunde mit Profil, Umsatz, vollständiger Auftragshistorie
- Explizit für ~300 Aufträge/Monat mit mehreren Mitarbeitern ausgelegt (MongoDB-Aggregation statt In-Memory-Filterung)

### Ad-hoc — Bugfix + Profil/Chat/Vertrag-Runde ✅ abgeschlossen (03.08.2026)
- Kritischer Bugfix: Server-Actions-Body-Limit (1 MB Next.js-Default) blockierte Datei-Uploads über 1 MB
- Profilbild löschen, Anschrift/Rechnungsadresse/Titel-Felder ergänzt
- Vertrags-Unterschrift übernimmt automatisch den Profilnamen
- Auftrags-Chat komplett neu: echte Bubbles mit Avatar/Name/Titel, Admin-Liste jetzt einklappbar mit Chat als Seitenpanel

### Ad-hoc — Admin ins normale Dashboard integriert ✅ abgeschlossen (03.08.2026)
- Kein separater, nicht-lokalisierter `/admin`-App-Bereich mehr — Admin-Seiten liegen jetzt unter `/[locale]/admin/...`, nutzen denselben `SiteHeader`/`SiteFooter` wie der Rest der Seite
- `/account` zeigt Mitarbeitern einen „Admin-Bereich"-Kasten mit Schnellzugriff, statt dass Admin komplett getrennt existiert
- Wartungsmodus- und Kopierschutz-Bypass für Mitarbeiter ergänzt (verhindert versehentliche Selbst-Aussperrung)

### Phase 4 — Rechnungen & E-Rechnung ✅ komplett fertig (04.08.2026)
- **Rechnungsstellung ✅ umgesetzt (04.08.2026):** admin-konfigurierbare Geschäfts-/Bankdaten (`/admin/settings`), Kleinunternehmerregelung berücksichtigt, PDF-Rechnung mit fortlaufender Nummer erzeugbar sobald Preis vereinbart, Kunden-Downloadlink — Details siehe STATUS.md
- **Zahlungsart ✅ umgesetzt (04.08.2026):** Überweisung/PayPal (manuell)/Online-Zahlung/Bar/Sonstig als Auswahl beim „Als bezahlt markieren", sichtbar für Admin, Kunde und in der Statistik (Umsatz nach Zahlungsart) — Details siehe STATUS.md
- **Mahnungen ✅ umgesetzt (04.08.2026):** mehrstufiges Mahnwesen pro Rechnung (Zahlungserinnerung → 1. Mahnung → 2. Mahnung, …), eigenes PDF pro Stufe, für Admin und Kunde einsehbar, deaktiviert sich automatisch sobald bezahlt — Details siehe STATUS.md
- **ZUGFeRD/E-Rechnung ✅ umgesetzt (04.08.2026):** jede Rechnung ist jetzt eine hybride PDF/A-3-Datei (normale PDF + maschinenlesbare `factur-x.xml` im BASIC-Profil eingebettet), XSD-validiert. Dafür mussten Adressfelder (Geschäftsadresse, Kunden-Rechnungsadresse) von Freitext auf strukturierte Felder (Straße/PLZ/Ort/Land) umgebaut werden — Details siehe STATUS.md
- **Direktes Bezahlen über die Seite ✅ code-seitig umgesetzt (04.08.2026):** Stripe Checkout (PayPal, Klarna als Sofortüberweisung-Nachfolger, Karte), jederzeit über Schalter in `/admin/settings` deaktivierbar (harte Nutzer-Anforderung, erfüllt), Zahlungsbestätigung nur per echtem Stripe-Webhook — einzige Stelle im System, an der ein Auftrag automatisch (nicht manuell) als bezahlt markiert wird. **Wartet nur noch auf Rakkus eigene Stripe-Kontoeinrichtung + API-Schlüssel**, kein Code mehr nötig — Details siehe STATUS.md
- Zahlungsstatus (offen/bezahlt) + Zahlungsreferenz pro Auftrag ✅ bereits vorgezogen umgesetzt (03.08.2026, siehe Ad-hoc-Eintrag)

### Phase 5 — Interne Buchhaltung ✅ fertig (04.08.2026)
- **Ausgaben-Erfassung ✅ umgesetzt (04.08.2026):** `/admin/expenses`, feste Kategorien, optionaler Beleg-Upload, Löschfunktion — Details siehe STATUS.md
- **Einnahmen/Ausgaben-Übersicht ✅ umgesetzt (04.08.2026):** neue Statistik-Section mit Monatsvergleich Einnahmen/Ausgaben/Gewinn — Details siehe STATUS.md
- **EÜR-Export ✅ umgesetzt (04.08.2026):** CSV-Export nach Zufluss-/Abfluss-Prinzip für den Steuerberater, bewusst kein echtes Steuererklärungs-Tool — Details siehe STATUS.md
- USt-Vorbereitung bislang nur als einfaches Summenfeld pro Ausgabe — vertiefen, falls Rakku aus der Kleinunternehmerregelung rauswächst

### Phase 6 — Mitarbeiter, Teams & Rechte (Team-/Rechtesystem-Fundament ✅ gestartet, 04.08.2026)
- Grundlage bereits vorgezogen (03.08.2026): einheitlicher Account mit `role`-Feld statt getrenntem Admin-Login — siehe Ad-hoc-Eintrag oben.
- **Team-/Rechte-System ✅ umgesetzt (04.–05.08.2026):** Abteilungen, Positionen (je Abteilung), Ränge (mit Live-Chat-Sichtbarkeit + Berechtigungsliste) und Teams als echte, vom Nutzer verwaltbare Entitäten unter `/admin/team` — ersetzt die bisherigen Freitext-Felder am Client-Model. Neue Mitarbeiter-Verwaltungsoberfläche (vorher nur per DB-Skript möglich). **Berechtigungsprüfung (`hasPermission()`) auf allen 12 Admin-Seiten, 26 Admin-Actions und 8 Datei-Download-Routen scharfgeschaltet** (05.08.2026 nachgezogen, auf Nutzer-Nachfrage beim Audit) — dabei einen echten vorbestehenden Bug gefunden und behoben (`updateOrderTagAction` hatte gar keine Berechtigungsprüfung). Details siehe STATUS.md
- Ausdrücklich als Grundlage für eine **künftige App** gedacht (nach der Website) — Datenmodell (separate Department/Position/Rank/Team-Collections statt Freitext) ist entsprechend darauf ausgelegt, dass sich darüber später auch App-seitig alles konfigurieren lässt
- **Personalmanagement ✅ Fundament umgesetzt (05.08.2026):** Personalakte pro Mitarbeiter (`/admin/team/[clientId]`) mit Abteilung/Position/Rang/Teams, Beschäftigt-seit-Datum, und allen für diese Person erstellten Dokumenten aus dem Dokumenten-Creator an einem Ort. Echte Arbeitsvertrags-/Arbeitszeugnis-**Vorlagentexte** fehlen bewusst noch (nicht von mir erfunden, siehe STATUS.md)
- **Dokumenten-Creator ✅ Fundament umgesetzt (04.08.2026):** gemeinsames Vorlagen-System (`/admin/documents`) für alle generierten Dokumente — Platzhalter-basiert (`{{token}}`), automatische Befüllung aus Mitarbeiterprofilen (nutzt Team-/Rechtesystem), Kategorien inkl. Ausbildungsdokumenten, jedes erstellte Dokument als unveränderlicher Schnappschuss gespeichert. Liefert die Engine, keinen Rechtstext — Details siehe STATUS.md
- **Umfang des Dokumenten-Sets (04.08.2026 geklärt):** Nutzerin hat die konkrete Auswahl an Vorlagen/Anleitungen bewusst offengelassen und mir die Entscheidung übertragen — Vorgabe: alles abdecken, was man braucht oder brauchen könnte, um das Business zu führen, **inklusive Ausbildungsdokumenten für Azubis** (Pflicht, nicht optional). Bei der eigentlichen Umsetzung nicht erneut nach der Liste fragen, sondern einen sinnvoll vollständigen Vorschlag bauen/vorschlagen.
- **Intranet-Bereich (neu):** interne Abläufe/Ablaufpläne für Mitarbeiter dokumentiert (nicht zu verwechseln mit der öffentlichen FAQ, siehe Backlog)
- **Qualitätsmanagement-Bereich ✅ Fundament umgesetzt (05.08.2026):** Mitarbeiter reichen unter `/account/qm` Vorgänge ein (Titel/Beschreibung/Anhang), Admin prüft/gibt frei/lehnt ab unter `/admin/qm` (eigene `qm`-Berechtigung), QM-Kategorie-Vorlagen aus dem Dokumenten-Creator werden dort referenziert — Details siehe STATUS.md

### Ad-hoc — Rabattcodes, Hinweis-Banner, Kundenkonten-Verwaltung ✅ abgeschlossen (06.08.2026)
- Rabattcodes mit Benutzungslimit/Gültigkeit, optional nur für Stammkunden — korrekt bis in Rechnung, Stripe-Betrag und Umsatz-Statistik durchgezogen, nicht nur oberflächlich angezeigt
- Sitewide Hinweis-Banner (an/aus + Text), ganz oben auf jeder Seite
- Kundenkonten-Verwaltung (Admin kann Passwort setzen, Unternehmen eintragen) mit eigener, bewusst engerer Berechtigung `client_accounts` — explizite Nutzer-Vorgabe, dass das nicht automatisch jedem mit Kundenzugriff offenstehen darf
- Details siehe STATUS.md

### Ad-hoc — Kalendersystem mit Google-Sync ✅ abgeschlossen (06.–07.08.2026)
- Aus der Auftrags-Terminübersicht (Kalenderansicht für Shootings) zu einem System mit beliebig vielen eigenen Kalendern erweitert — Sichtbarkeit privat/Team, gezieltes Teilen mit Kollegen
- Abonnierbare ICS-Links pro Kalender (Google/Apple/Outlook, aktualisiert sich automatisch)
- Echte einseitige Google-Calendar-OAuth-Push-Sync (eigenes Google-Cloud-Projekt „rakku-photography") inkl. 2-Stunden-Cronjob als Sicherheitsnetz gegen stille Fehlschläge
- Details siehe STATUS.md

### Ad-hoc — Lokales SEO für Bielefeld ✅ abgeschlossen (07.08.2026)
- „Bielefeld" prominent auf der Seite (Hero, Footer, Texte) statt nur im Kleingedruckten
- Title-Tag, Meta-Beschreibung und LocalBusiness-Schema (inkl. echter Geo-Koordinaten + Einzugsgebiet) auf lokale Suche ausgerichtet, DE/EN sauber getrennt
- Zieht das ursprünglich für Phase 8 vorgesehene SEO-Nacharbeiten-Thema vor — siehe Phase 8 unten
- Details siehe STATUS.md

### Ad-hoc — Als Nächstes geplant, in dieser Reihenfolge (festgelegt 07.08.2026)
1. Positionen/Abteilungen umbenennen (bisher nur anlegen/löschen) — ✅ umgesetzt (07.08.2026)
2. „Nochmal buchen"-Button für Stammkunden (Vorbefüllung aus altem Auftrag) — ✅ umgesetzt (07.08.2026)
3. Rabattcodes nur für Neukunden (Gegenstück zum bestehenden „nur Stammkunden"-Schalter) — ✅ umgesetzt (07.08.2026)
4. Manueller Rabatt direkt am Auftrag durchs Team, unabhängig von eingelösten Codes — ✅ umgesetzt (07.08.2026)
5. Empfehlungsprogramm (baut auf Punkt 3+4 auf) — ✅ umgesetzt (07.08.2026)
6. Bewertungen/Testimonials (admin-kuratiert) — ✅ umgesetzt (07.08.2026)
7. Zwei-Faktor-Login fürs Team (TOTP, bewusst zuletzt — sicherheitskritisch) — ✅ umgesetzt (07.08.2026) — **gesamte Reihenfolge abgeschlossen**
- Details, Berechtigungs-Überlegungen zu jedem Punkt siehe STATUS.md

### Test-Checkliste für Rakku (07.08.2026) — bitte durchklicken auf v2.rakku.de

**1. Positionen/Abteilungen/Teams umbenennen** (`/admin/team`)
- [ ] Eine Abteilung anklicken → Name ändern → speichert sich sofort
- [ ] Eine Position umbenennen
- [ ] Ein Team umbenennen (Farbe bleibt dabei erhalten)

**2. „Nochmal buchen"** (im Kundenkonto, auf einer alten Auftragsseite)
- [ ] Button „Nochmal buchen" auf einem alten Auftrag anklicken
- [ ] Prüfen: Art des Shootings, Charakter/Konzept, Ort, Zeitraum, Instagram/Discord, Idee/Stimmung, Notizen sind alle vorausgefüllt
- [ ] Auftrag absenden — landet als ganz normaler neuer Auftrag im Konto

**3. Rabattcodes nur für Neukunden** (`/admin/discounts`)
- [ ] Neuen Code anlegen, Haken „Nur für Neukunden einlösbar" setzen
- [ ] Mit einem Konto **ohne** vorherigen Auftrag einlösen → sollte klappen
- [ ] Mit einem Konto **mit** vorherigem Auftrag einlösen → sollte mit Fehlermeldung abgelehnt werden

**4. Manueller Rabatt am Auftrag** (Auftragsseite im Admin, braucht einen Preisvorschlag)
- [ ] Betrag + Grund eintragen, „Gewähren" klicken
- [ ] „Zu zahlen"-Betrag prüfen (auch mal zusätzlich einen Rabattcode einlösen — beide sollten sich addieren)
- [ ] Rechnung erstellen und im PDF prüfen, dass der Rabatt korrekt abgezogen ist
- [ ] Rabatt wieder entfernen

**5. Empfehlungsprogramm** (eigener Empfehlungscode im Kundenkonto, unter „Freunde werben")
- [ ] Eigenen Code kopieren
- [ ] Mit einem zweiten, komplett neuen Konto einen Auftrag anlegen, Preisvorschlag abwarten, den Code einlösen
- [ ] Prüfen: der Neukunde bekommt den Rabatt
- [ ] Prüfen: im werbenden Konto taucht unter „Deine verdienten Rabattcodes" ein neuer Code auf
- [ ] Prüfen: dieser Code erscheint im Admin unter „Rabattcodes" mit einem „Empfehlungsprämie"-Badge
- [ ] Einstellungen dazu unter `/admin/settings` → „Empfehlungsprogramm" anschauen (Rabatthöhen anpassbar)

**6. Bewertungen/Testimonials** (`/admin/testimonials`)
- [ ] Neue Kundenstimme anlegen → erscheint ganz unten auf der Startseite
- [ ] Sichtbarkeit ausschalten → verschwindet von der Startseite
- [ ] Reihenfolge mit den Pfeil-Buttons ändern
- [ ] Rundes Profilbild bei einer Kundenstimme hochladen und prüfen, ob es im Fließband auf der Startseite erscheint (siehe Punkt 8 unten für die volle Fließband-Checkliste)

**7. Zwei-Faktor-Login** (eigenes Profil unter `/account/profile`)
- [ ] „Einrichten" klicken, QR-Code mit einer echten Authenticator-App scannen (Google Authenticator, Authy, 1Password, …)
- [ ] Angezeigten 6-stelligen Code eingeben und bestätigen
- [ ] Die 8 Wiederherstellungscodes an einem sicheren Ort speichern (werden danach nie wieder angezeigt!)
- [ ] Ausloggen, neu einloggen → nach dem Passwort sollte jetzt der Code aus der App verlangt werden
- [ ] Einmal versuchsweise mit einem der Wiederherstellungscodes statt der App einloggen (Achtung: jeder Code funktioniert nur 1×, danach ist er verbraucht)
- [ ] Zwei-Faktor-Login testweise wieder deaktivieren (braucht dein Passwort zur Bestätigung)

**8. Portfolio-Performance** (`/admin/portfolio` und die öffentliche `/portfolio`-Seite)
- [ ] Admin-Portfolio-Seite: bei mehr als 20 Einträgen sollte unten „Zurück/Weiter" erscheinen
- [ ] Einen Portfolio-Beitrag anklicken (aufklappen) — Bilder im Bearbeiten-Formular sollten jetzt schneller da sein (werden erst beim Aufklappen geladen)
- [ ] Neues Bild hochladen und prüfen, dass die Seite insgesamt spürbar flüssiger lädt als vorher
- [ ] Öffentliche Portfolio-Seite: bei mehr als 24 Einträgen sollte ein „Mehr laden"-Button erscheinen, Kategorie-Filter sollte weiterhin normal funktionieren

**9. Foto-Ordner ohne Auftrag** (Kundendetailseite unter `/admin/clients/<Kunde>`)
- [ ] Bei einem Kunden ohne laufenden Auftrag „Ordner zuweisen" anklicken, einen Nextcloud-Ordner auswählen, Titel und Datum eintragen
- [ ] Prüfen, dass der Ordner in der Liste mit Titel und Datum erscheint
- [ ] „Bearbeiten" anklicken, Titel oder Datum ändern, speichern
- [ ] Bei mehreren Ordnern die Pfeiltasten zum Sortieren testen
- [ ] Als der jeweilige Kunde eingeloggt: unter „Meine Fotos" sollte der Ordner jetzt mit Vorschaubild, Titel und Datum erscheinen (nicht mehr nur als nackter Ordnername)

**10. Testimonials-Fließband** (Startseite ganz unten)
- [ ] Bei einer Kundenstimme im Admin ein rundes Profilbild hochladen (Empfehlung: eigenes Bild oder eines der entstandenen Fotos)
- [ ] Startseite aufrufen — Kundenstimmen sollten jetzt als durchlaufendes Fließband (rechts nach links) laufen statt als festes Raster
- [ ] Mit der Maus über das Fließband fahren — es sollte anhalten, solange der Mauszeiger darüber ist
- [ ] Eine Kundenstimme auf „Sichtbar" aus stellen — sollte aus dem Fließband verschwinden

- Details zu jedem Punkt stehen in STATUS.md, jeweils mit Datum 07.08.2026 gekennzeichnet.

### Test-Checkliste Dritte Runde, Punkte 0–4 (07.08.2026) — inzwischen durch spätere Testrunden überholt, nicht mehr aktiv

**0. Admin-FAQ + Admin-Aufträge, optisch** (`/admin/faq`, eine beliebige Auftragsseite unter `/admin/orders`)
- [ ] Admin-FAQ: Fragen sollten jetzt nach Kategorie gruppiert erscheinen, mit farbigen Kategorie-Badges
- [ ] Admin-Auftragsseite: sollte jetzt in klar beschriftete Abschnitte gegliedert sein („Preis & Zahlung", „Vertrag & Fotos", „Verwaltung") statt einer langen Liste

**1. Gutscheine** (`/gutscheine` öffentlich, `/admin/vouchers`)
- [ ] Auf `/gutscheine` einen Gutschein anfragen (Betrag wählen, Daten eintragen)
- [ ] Im Admin unter „Gutscheine" die Anfrage als bezahlt bestätigen → Code wird erzeugt und per Mail verschickt
- [ ] Den Code bei einem Auftrag mit Preisvorschlag im Rabattcode-Feld einlösen → Betrag wird korrekt abgezogen
- [ ] Denselben Code nochmal versuchen einzulösen → sollte abgelehnt werden

**2. Pakete** (`/admin/bundles`, öffentliche `/angebote`-Seite)
- [ ] Neues Paket anlegen (Titel, Preis, optional Vergleichspreis für „Du sparst X")
- [ ] Erscheint korrekt im Abschnitt „Kombi-Angebote" auf `/angebote`
- [ ] Über den Buchungslink einen Testauftrag anlegen, prüfen, dass Paketname/-preis im Admin-Auftrag korrekt angezeigt werden

**3+4. Conventions + Warteliste** (`/admin/conventions`, öffentliche `/conventions`-Seite, verlinkt im Footer)
- [ ] Neue Convention anlegen (Name, Ort, Datum) → erscheint korrekt auf `/conventions`
- [ ] Solange „Slots frei" angehakt ist: Button „Slot anfragen" sollte erscheinen
- [ ] „Slots frei" ausschalten und speichern → auf `/conventions` erscheint jetzt statt des Buttons ein Warteliste-Formular
- [ ] Über das Formular selbst eintragen (eigene Mailadresse) → Bestätigungstext erscheint
- [ ] Im Admin: die Convention zeigt jetzt „1 auf Warteliste" und einen Button „Warteliste benachrichtigen"
- [ ] Diesen Button klicken → Slots öffnen sich wieder, du bekommst eine Mail „Slots frei — {Convention-Name}"
- [ ] Zur Kontrolle: eine bestehende Convention nur im Text bearbeiten (z. B. den Ort ändern) und speichern — die Sichtbarkeit sollte dabei unverändert bleiben (war ein Bug, jetzt behoben)

**5. Zufriedenheits-Nachfrage** (Auftragsseite im Admin für den Auslöser, `/admin/feedback` für die Antworten)
- [ ] Bei einem (gerne echten, fertigen) Auftrag „Archivieren" klicken → der Kunde bekommt eine Mail „Wie war's?"
- [ ] Den Link aus der Mail öffnen (auch ohne eingeloggt zu sein möglich), Sterne vergeben, kurzen Kommentar eintragen, Haken „darf als Kundenstimme verwendet werden" setzen, absenden
- [ ] Denselben Link nochmal öffnen → sollte jetzt „bereits gespeichert" zeigen statt des Formulars nochmal
- [ ] Im Admin unter „Feedback" sollte die Antwort mit Sternen und Kommentar erscheinen
- [ ] Button „Als Kundenstimme übernehmen" klicken → unter „Bewertungen" erscheint ein neuer, noch unsichtbarer Eintrag — Text ggf. anpassen und auf „Sichtbar" stellen

**6. Wiedervorlage-Mail** (`/admin/settings`, Panel „Wiedervorlage-Mail")
- [ ] Frist und An/Aus-Schalter anschauen, bei Bedarf anpassen (läuft automatisch einmal täglich morgens per Cron, kein manueller Auslöser nötig)
- [ ] Läuft rein im Hintergrund — nichts weiter zu testen, außer die Einstellungen passen

**7. Google-Bewertungen** (`/admin/testimonials`, Reiter „Google-Bewertungen")
- [ ] Eine echte Google-Bewertung raussuchen (z. B. vom eigenen Google-Unternehmensprofil, falls schon eingerichtet) und im Reiter „Google-Bewertungen" übertragen: Name, Text, Sterne, optional Link zur echten Bewertung
- [ ] Erscheint korrekt in der Liste mit Sterne-Kennzeichnung und „Google"-Badge
- [ ] Erscheint auf der Startseite im Bewertungen-Fließband mit sichtbaren Sternen und „· Google"-Hinweis
- [ ] Im Reiter „Kundenstimmen" bleibt sie korrekt unsichtbar (getrennte Listen)

**8. Blog** (`/admin/blog`, öffentliche `/blog`-Seite, verlinkt im Footer)
- [ ] Neuen Beitrag anlegen (Titel, Kurzbeschreibung, Text, optional Titelbild)
- [ ] Erscheint korrekt auf `/blog`, Detailseite öffnet sich über die Karte
- [ ] Bei einem Titel mit Umlauten prüfen, dass die URL lesbar transliteriert wird (z. B. „ä" → „ae")
- [ ] „Veröffentlicht"-Schalter ausschalten → verschwindet von der öffentlichen Seite, bleibt aber im Admin sichtbar

- Details zu jedem Punkt stehen in STATUS.md, jeweils mit Datum 07.08.2026 gekennzeichnet.

### Ad-hoc — Zweite Runde ✅ komplett abgeschlossen (07.08.2026, während Nutzer die erste Runde testet)
1. Testimonials: rundes Profilbild pro Kundenstimme + Fließband/Marquee-Ansicht auf der Startseite — ✅ umgesetzt (07.08.2026)
2. Foto-Ordner für Kunden ohne Auftrag zuweisbar — ✅ umgesetzt (07.08.2026): Panel jetzt auch auf der Kundendetailseite, mit Titel, Datum und Pfeiltasten-Sortierung pro Kunde
3. „Meine Fotos" im Kundenkonto optisch aufwerten — ✅ umgesetzt (07.08.2026): Vorschaubild, Titel und Datum statt reiner Text-Liste, auf Übersicht und Detailseite
4. **Performance-Fix Portfolio** (Admin-Bereich + öffentliche Portfolio-Seite) — ✅ umgesetzt (07.08.2026): Pagination auf beiden Seiten, Admin-Vorschaubilder auf `next/image` umgestellt, Bilder im Bearbeiten-Formular laden jetzt erst beim Aufklappen, serverseitige Bildverkleinerung (max. 2400px, WebP) beim Upload via `sharp`
- Details, technische Analyse und Berechtigungs-Überlegungen zu jedem Punkt siehe STATUS.md

### Ad-hoc — Dritte Runde, in Arbeit (festgelegt 07.08.2026)
0. Design-Politur Admin-FAQ + Admin-Aufträge (Maßstab fürs Folgende) — ✅ umgesetzt (07.08.2026)
1. Gutscheine (neue `vouchers`-Berechtigung) — ✅ umgesetzt (07.08.2026)
2. Paket-/Kombi-Angebote (`orders`-Berechtigung) — ✅ umgesetzt (07.08.2026)
3. Convention-Übersicht, öffentlich (neue `conventions`-Berechtigung) — ✅ umgesetzt (07.08.2026)
4. Warteliste für ausgebuchte Zeiträume (zusammen mit Punkt 3 umgesetzt, `conventions`-Berechtigung statt `orders` — passt inhaltlich besser, da an denselben Content-Typ gebunden) — ✅ umgesetzt (07.08.2026)
5. Zufriedenheits-Nachfrage nach Auftragsabschluss (`orders`-Berechtigung) — ✅ umgesetzt (07.08.2026)
6. Wiedervorlage-Mail, automatisch nach 1 Jahr (`settings`-Berechtigung) — ✅ umgesetzt (07.08.2026)
7. Externe Google-Bewertungen im Testimonials-Bereich (`testimonials`-Berechtigung, zunächst manuell gepflegt statt Live-API — kein Google-API-Key vorhanden) — ✅ umgesetzt (07.08.2026)
8. Blog/Behind-the-Scenes (neue `blog`-Berechtigung) — ✅ umgesetzt (07.08.2026) — **Dritte Runde komplett abgeschlossen**
- Details, Fortschritt und Tests zu jedem Punkt siehe STATUS.md

### Ad-hoc — Nutzer-Feedback nach dem Testen der Dritten Runde (07.08.2026) ✅
1. Neuer dritter Bewertungs-Typ „Kurzbewertungen" (nur Name + Sterne, eigene Liste getrennt von den Zitat-Testimonials) — ✅ umgesetzt
2. Startseite umgebaut: beide Bewertungs-Fließbänder jetzt direkt unter dem Hero statt ganz unten — ✅ umgesetzt
3. Empfehlungscode erst ab dem ersten eigenen Auftrag verfügbar (Missbrauchsschutz) — ✅ umgesetzt
- Details zu jedem Punkt siehe STATUS.md

**Test-Checkliste dazu:**
- [ ] `/admin/testimonials` → Reiter „Kurzbewertungen" → Eintrag anlegen (z. B. „Max Mustermann", 5 Sterne) → Vorschau zeigt schon beim Tippen „Max M."
- [ ] Startseite aufrufen → direkt unter dem großen Header-Bild sollte jetzt zuerst das kompakte Sterne-Band, darunter das große Zitat-Testimonial-Band laufen
- [ ] Mit einem Konto ohne bisherigen Auftrag `/account` aufrufen → kein Empfehlungscode-Bereich sichtbar
- [ ] Nach dem ersten angelegten Auftrag erneut `/account` aufrufen → Empfehlungscode erscheint jetzt

### Ad-hoc — Vollständiger Bug-/Rechtschreib-Check (08.08.2026) ✅
Auf Nutzeranfrage einmal die komplette Seite durchgecheckt (öffentlich + Logik) und alle gefundenen Fehler behoben — u. a. eine kaputte Weiterleitung nach Mitarbeiter-Login (führte ins Leere statt ins Admin-Dashboard), fehlende Seiten in der Sitemap (Gutscheine/Conventions/Blog), falsche Zahlenformatierung im Vertrags-PDF, unübersetzte FAQ-Kategorien und ein komplett unlokalisiertes Gutschein-Formular auf der englischen Seite. Vollständige Liste mit allen Fundstellen in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Einmal ganz normal ausloggen und über `/login` wieder einloggen (nicht über einen Direktlink) → sollte jetzt korrekt im Admin-Dashboard landen
- [ ] `/en/faq` aufrufen → Kategorie-Überschriften sollten jetzt auf Englisch sein
- [ ] `/en/gutscheine` aufrufen → das Formular selbst (Betrag, Name, E-Mail usw.) sollte jetzt auf Englisch sein
- [ ] `/en/blog` aufrufen → Rubrik-Text unter der Überschrift sollte „Behind the scenes" zeigen (deutsche Seite: „Hinter den Kulissen")

### Ad-hoc — Gestrige Fixes dreifach gegengetestet + Dokumenten-Platzhalter erklärt (09.08.2026) ✅
1. Wichtigste Fixes vom Vortag nochmal unabhängig nachgetestet (Login-Weiterleitung diesmal zusätzlich auf Englisch, Preisstufen-Checkbox-Fix erstmals wirklich durchgeklickt statt nur im Code geprüft) — Details in STATUS.md
2. Dokumenten-Creator: sichtbare Erklärung, welche Platzhalter automatisch befüllt werden und welche von Hand — live pro ausgewählter Vorlage, plus feste Info-Box auf der Seite. Zwei neue automatische Platzhalter (`ausstellungsdatum`, `geburtsdatum`), dafür neues Geburtsdatum-Feld in der Personalakte

**Test-Checkliste dazu:**
- [ ] `/admin/documents` aufrufen → oben sollte eine Erklärung „So funktionieren Platzhalter" stehen
- [ ] Eine Vorlage auswählen (z. B. „Arbeitszeugnis – einfach") → darüber erscheint ein Kasten mit „automatisch ausgefüllt" (grün) und „bitte von Hand ergänzen" (gelb), inkl. Erklärung zu jedem Platzhalter
- [ ] In der Personalakte eines Mitarbeiters (`/admin/team/…`) ein Geburtsdatum eintragen → beim nächsten Dokument mit `{{geburtsdatum}}` für diese Person taucht es automatisch im Text auf

### Ad-hoc — Tieferer Bug-Sweep: Kalender, Rechnungen, Rabattcodes, Stripe, EÜR (09.08.2026) ✅
Zweiter, tieferer Durchgang über bisher nicht geprüfte Bereiche. Wichtigste Funde: Stripe-Zahlung leitete englischsprachige Kunden fälschlich immer auf die deutsche Seite zurück (behoben, gleiches Muster wie bei Gutscheinen); Rabattcode-/Gutschein-Einlösung war bei gleichzeitigen Anfragen nicht sicher vor Doppel-Einlösung (behoben, mit echten parallelen Anfragen nachgetestet); EÜR-Export konnte Einnahmen ohne Rechnung unbemerkt zu niedrig ausweisen (zeigt jetzt eine Warnung); eine latente (in der echten Datenbank nicht akute) Möglichkeit für doppelte Rechnungsnummern behoben. Volle Details in STATUS.md, inklusive einer Transparenz-Notiz zu einem eigenen Fehler beim Testen (unbeabsichtigt gelöschte Preisverhandlungs-Historie deiner eigenen 3 Test-Aufträge — keine echten Kunden- oder Rechnungsdaten betroffen).

**Kleine Randnotiz:** beim Testen wurde einmal eine echte Rechnungsnummer „RG-0006" testweise vergeben und danach wieder gelöscht — der Zähler bleibt bewusst bei 7 stehen (Rechnungsnummern werden nie wiederverwendet), falls dir mal auffällt, dass „RG-0006" in deinen echten Unterlagen fehlt: das ist beabsichtigt, keine fehlende Rechnung.

### Ad-hoc — Urlaub: eigener Menüpunkt + Besitzer-Bug behoben (09.08.2026) ✅
Direkter „Urlaub"-Punkt im Admin-Menü ergänzt (Aufträge → Urlaub), springt direkt zur gefilterten Kalenderansicht. Dabei einen echten Bug gefunden und behoben: der Urlaubskalender war fälschlich auf dein Kunden-Testkonto statt dein echtes Mitarbeiterkonto eingetragen, wodurch der „Mit Google verbinden"-Knopf und alle Verwalten-Optionen fehlten. Nebenfund: der „Aufträge"-Systemkalender ist aktuell NICHT mit Google verbunden (Token fehlt) — muss von dir selbst über den Knopf in `/admin/calendar` wiederhergestellt werden. Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Admin-Menü → „Aufträge" hovern → „Urlaub" sollte als eigener Punkt erscheinen, Klick führt direkt zur Kalenderansicht mit nur dem Urlaubskalender angehakt
- [ ] Beim Urlaubskalender in der Seitenleiste sollte jetzt „Mit Google verbinden" und „Verwalten" erscheinen
- [ ] Beim „Aufträge"-Kalender einmal auf „Mit Google verbinden" klicken, um die Verbindung wiederherzustellen

### Ad-hoc — Nachbesserung: Admin-Menü raus, Smooth-Scroll entfernt, Urlaub öffentlich (09.08.2026) ✅
Admin-Menü auf der Auftragsseite komplett entfernt (nur noch der „← Alle Aufträge"-Link); Smooth-Scrolling (Lenis) und die eigene Scrollleiste komplett entfernt — der Scroll-Bug lag an einer Konkurrenz zwischen nativer und Lenis-Scroll-Animation, jetzt läuft alles nativ; Kalender lassen sich jetzt einzeln als „öffentlich sichtbar" markieren, für den Urlaubs-Kalender aktiviert — Kund:innen sehen anstehende Urlaubszeiträume automatisch oben auf `/angebote`. Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Eine Auftragsseite öffnen → kein Admin-Menü mehr oben, nur „← Alle Aufträge"
- [ ] Auf mehreren Seiten (Startseite, Portfolio, Angebote) durchscrollen → sollte sich jetzt normal/nativ anfühlen, kein Hängenbleiben mehr an den Rändern
- [ ] Unter `/admin/calendar` beim „Urlaub"-Kalender „Verwalten" öffnen → Häkchen „Auf der Angebote-Seite öffentlich sichtbar" sollte aktiviert sein
- [ ] Einen Urlaubs-Termin eintragen (heute oder in der Zukunft) → sollte kurz danach oben auf `/angebote` als Hinweis erscheinen (DE + EN)

### Ad-hoc — Admin-Menü-Bug, Conventions-Link, Portfolio-Footer/Scroll, Urlaubsplanung, Pflichtfelder bei Registrierung (09.08.2026) ✅
Fünf gemeldete Punkte auf einmal behoben: (1) Admin-Menü lag unter dem schwebenden Haupt-Header versteckt/durchscheinend — betraf tatsächlich alle Admin-Seiten, zentral an einer Stelle behoben; (2) Conventions/Blog fehlten in der Hauptnavigation, obwohl beide Seiten längst existierten; (3) Portfolio-Footer war über die eigene Scrollleiste nicht erreichbar, wenn die Seite durch „Mehr laden"/Filterwechsel nachträglich wuchs — Scrollleiste beobachtet jetzt Größenänderungen direkt; (4) neue Urlaubsplanung fürs Team über das bestehende Kalender-System (mehrtägige Termine ziehen sich jetzt korrekt über alle betroffenen Tage, vorher nur am Starttag sichtbar) — eigener Kalender „Urlaub" bereits angelegt; (5) Geburtsdatum + Anschrift bei der Kundenregistrierung jetzt Pflichtfelder. Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Eine Auftragsseite öffnen (`/admin/orders/…`) → Admin-Menü und der schmale Haupt-Header oben sollten sauber getrennt sein, nicht mehr übereinander
- [ ] `/conventions` und `/blog` sollten jetzt als Menüpunkte in der Hauptnavigation erscheinen (auch auf `/en/...`)
- [ ] `/admin/calendar` aufrufen, in der Seitenleiste den Kalender „Urlaub" sehen → „+ Neuer Termin" mit einem mehrtägigen Zeitraum (z. B. eine Woche) und „Ganztägig" anlegen → sollte im Monatsraster an jedem betroffenen Tag erscheinen, nicht nur am ersten
- [ ] `/register` aufrufen → Geburtsdatum und Anschrift sollten jetzt als Pflichtfelder im Formular stehen, Absenden ohne sie sollte blockiert werden
- [ ] Portfolio-Seite: „Mehr laden" klicken (falls mehr als 24 Einträge vorhanden), dann ganz nach unten scrollen → Footer sollte erreichbar sein

### Ad-hoc — Termine: Enddatum/-zeit für Shootings (09.08.2026) ✅
Neben dem Start lässt sich beim Termin jetzt auch ein Ende festlegen (Shootings dauern mal 2, mal 4 Stunden). Ohne Angabe bleibt es wie bisher bei 1 Stunde Standarddauer. Wirkt sich auf internen Kalender, Google-Sync und den abonnierbaren ICS-Feed aus. Mit einem echten End-to-End-Test über die echte Oberfläche verifiziert, inkl. sauberer Entfernung des dabei kurzzeitig echten, in deinem verbundenen Google-Kalender angelegten Testtermins. Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Bei einer Anfrage/einem Auftrag unter „Termin" sowohl „Von" als auch „Bis" setzen (z. B. 14:00–18:00) → Speichern sollte funktionieren
- [ ] „Bis" vor „Von" setzen → Warnhinweis erscheint, Speichern-Button ist deaktiviert
- [ ] `/admin/calendar` aufrufen → der Termin sollte als „14:00–18:00" angezeigt werden, nicht nur „14:00"
- [ ] Nur „Von" setzen, „Bis" leer lassen → im Kalender erscheint weiterhin nur die Startzeit (Standarddauer 1 Stunde bleibt intern wie bisher)

## Was noch offen ist (Stand 11.08.2026 — nach dem Domain-Umzug aktualisiert)

**Brauchst nur du — kann ich nicht für dich erledigen (nach Wichtigkeit sortiert):**
- **Google-OAuth-Redirect-URI ergänzen:** `https://rakku.de/api/auth/google/callback` in der Google-Cloud-Console beim OAuth-Client eintragen — sonst schlägt ein *neues* „Mit Google verbinden" fehl (bestehende Verbindungen funktionieren unverändert weiter)
- **SSL-Zertifikat für `old.rakku.de`** — der nginx-Vhost dafür (zeigt auf V1/Port 3008) läuft schon über HTTP und DNS zeigt schon hierher, aber die `certbot`-Ausführung wurde vom Sandbox-Auto-Modus blockiert (System-Rechte-Anfrage) und wartet auf deine Freigabe bzw. manuelle Ausführung: `certbot --nginx -d old.rakku.de`
- **Entscheiden, ob V1 komplett gestoppt werden soll** — läuft aktuell bewusst als systemd-Dienst (`rakku-website`) im Hintergrund weiter, nur noch über `old.rakku.de` erreichbar, `rakku.de` selbst zeigt bereits ausschließlich V2
- Google-Unternehmensprofil einrichten (größter Hebel für „Fotograf Bielefeld"-Suchen)
- **„Aufträge"-Kalender ggf. neu mit Google verbinden** — Stand 09.08.2026 war die Verbindung weg (Token fehlt); nicht erneut geprüft
- **Stripe bewusst entscheiden:** ein Live-Schlüssel liegt in der `.env.local` (nicht von mir eingetragen) — Direktzahlung bleibt über den Schalter in `/admin/settings` deaktiviert, bis bewusst aktiviert; danach mit einer echten Kleinstbetrag-Zahlung testen
- Google Search Console & Bing Webmaster Tools verifizieren (Felder unter `/admin/seo`, aktuell noch leer) — jetzt sinnvoll, da `rakku.de` live ist
- Echte Arbeitsvertrags-/Arbeitszeugnis-Vorlagentexte liefern oder freigeben, dass ich einen Entwurf mache (bewusst nicht selbst erfunden, siehe Phase 6)

**Von mir noch zu bauen (Backlog, kein Termin):**
- ~~Intranet-Bereich für interne Abläufe~~ — ✅ umgesetzt (11.08.2026, siehe eigener Ad-hoc-Eintrag unten)
- Ein sehr seltener, dokumentierter Randfall bei gleichzeitiger Rabatt-Änderung + Rechnungserstellung durch zwei Team-Mitglieder (siehe Audit-Eintrag 11.08.2026 in STATUS.md) — bewusst nicht behoben, würde echte DB-Transaktionen einführen
- Siehe „Erweiterungsideen" weiter unten für ältere Vorschläge, die noch Auswahl brauchten (mittlerweile größtenteils umgesetzt, siehe dortige Markierungen)

### Phase 7 — Test & Go-Live ✅ abgeschlossen (11.08.2026)
- nginx-Umschaltung `rakku.de` → V2 durchgeführt, `SITE_URL`/Wartungsmodus/Crontab mit umgestellt, `v2.rakku.de` leitet per 301 weiter — Details siehe STATUS.md
- Google rankt `rakku.de` jetzt ab sofort real (Search Console/Bing-Verifizierung s. o. noch offen)

### Phase 8 — Nacharbeiten (läuft)
- SEO bereits vorgezogen umgesetzt (siehe Ad-hoc-Eintrag oben) — offen bleiben SSL für `old.rakku.de` (s. o.) und die endgültige V1-Stilllegung, wenn du bereit bist
- Weiterhin offen, außerhalb des Nutzers: Google-Unternehmensprofil einrichten (größter Hebel für lokale Google-Suche, kann nur der Nutzer selbst anlegen)

### Ad-hoc — Echte Personalakten + granulare Rechte (09.08.2026) ✅
Personalakte jetzt mit echten Einträgen statt nur einem Feld: pro Mitarbeiter beliebig viele Beschäftigungs-Einträge (Mitarbeiter/Teamler/Praktikant/Azubi, jeweils mit Zeitraum, bei „Mitarbeiter" zusätzlich Probezeit), Historie bleibt erhalten. Berechtigungen laufen jetzt granular statt pauschal: für die meisten Bereiche einzeln festlegbar, wer nur ansehen, wer erstellen, wer bearbeiten und wer löschen darf — als Tabelle in „Team & Rechte" statt einer langen Checkbox-Liste. Betraf über 170 Berechtigungsprüfungen im gesamten Admin-Bereich. Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] `/admin/team/…` bei einem Mitarbeiter einen Personalakte-Eintrag hinzufügen (z. B. „Praktikant:in" mit Von-/Bis-Datum) → sollte in der Liste erscheinen, alte Einträge bleiben erhalten
- [ ] `/admin/team` bei einer Position die Rechte-Tabelle öffnen → sollte pro Bereich einzelne Häkchen für Ansehen/Erstellen/Bearbeiten/Löschen zeigen (wo sinnvoll)
- [ ] Bei einer eingeschränkten Position z. B. nur „Portfolio ansehen" anhaken, keine anderen Rechte → ein Mitarbeiter mit dieser Position sollte Portfolio sehen, aber nichts anlegen/löschen können, und andere Bereiche gar nicht erst öffnen können

### Ad-hoc — Team kann Kundenkonten vor Ort anlegen (09.08.2026) ✅
Für den zukünftigen Fall eines eigenen Fotostudios, in dem Kunden direkt vor Ort sind: „+ Neuer Kunde"-Knopf unter „Kunden" legt ein Konto mit denselben Pflichtfeldern wie die normale Registrierung an, aber sofort verifiziert (kein E-Mail-Bestätigungslink nötig) und mit vom Team direkt vergebenem Passwort. Läuft über die bereits bestehende „Kundenkonten"-Berechtigung, keine neue eingeführt. Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Unter `/admin/clients` „+ Neuer Kunde" öffnen, Konto anlegen → sollte direkt zur neuen Kundenakte springen, Konto sollte ohne E-Mail-Bestätigung sofort nutzbar sein

### Ad-hoc — Kunden können ihr Konto löschen, Team kann es auch (09.08.2026) ✅
„Profil bearbeiten" hat jetzt einen „Konto löschen"-Bereich (nur Kundenkonten). Ohne vorhandene Rechnung: sofortige, vollständige Löschung inkl. Aufträge/Verträge/Foto-Ordner. Mit vorhandener Rechnung (10 Jahre Aufbewahrungspflicht, § 147 AO): nur eine Löschung *beantragen* möglich, Team bekommt eine E-Mail und sieht den Hinweis in der Kundenakte. Team-seitig gibt es denselben Mechanismus in der Kundenakte — je nach Rechnungslage entweder echtes Löschen oder Anonymisieren (Personendaten überschrieben, Rechnung/Auftragshistorie bleibt für die Buchhaltung bestehen). Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Als Testkunde ohne Rechnung unter „Profil bearbeiten" das Konto löschen → sollte sofort weg sein, Login danach nicht mehr möglich
- [ ] Als Testkunde mit Rechnung das Konto löschen → sollte nur eine Beantragung auslösen, Kundenakte zeigt „Löschung beantragt"
- [ ] In der Kundenakte eines rechnungslosen Testkunden „Kunde löschen" klicken → Konto und Aufträge komplett weg
- [ ] In der Kundenakte eines Kunden mit Rechnung „Kunde anonymisieren" klicken → Name/Adresse/E-Mail überschrieben, Rechnung bleibt in der Buchhaltung sichtbar

### Ad-hoc — Fünf neue Erweiterungsideen umgesetzt (09.08.2026) ✅
Auf „alles bis auf Punkt 6" hin fünf von sechs neu vorgeschlagenen Ideen umgesetzt (WhatsApp/SMS-Erinnerung ausgelassen, braucht bezahlten Drittanbieter): automatisches Wasserzeichen auf Vorschau-/Volldateien bei noch unbezahlten Aufträgen (verschwindet automatisch nach Zahlungseingang, live berechnet statt gespeichert) ✅, Fandom-/Charakter-Auswertung in den Statistiken ✅, Kunden-CSV-Export ✅, nachträglicher Referenzbild-Upload bei bereits bestehenden Aufträgen (Basis-Upload bei der Anfrage gab es schon) ✅, Zufriedenheits-Trend-Chart in den Statistiken ✅. Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Einen Foto-Ordner direkt aus einem unbezahlten Auftrag heraus zuweisen → Vorschau- und Volldateien sollten ein Wasserzeichen zeigen, das nach „Als bezahlt markieren" verschwindet
- [ ] `/admin/statistics` → „Beliebteste Charaktere & Fandoms" und „Zufriedenheit über Zeit" sollten erscheinen (letzteres nur bei vorhandenem Feedback)
- [ ] `/admin/clients` → „CSV exportieren" sollte eine Datei mit allen Kunden herunterladen
- [ ] Bei einem eigenen, noch offenen Auftrag unter „Meine Aufträge" ein weiteres Referenzbild hochladen → sollte erscheinen, bei abgelehnten/archivierten Aufträgen nicht möglich sein

### Ad-hoc — Telefonnummer jetzt Pflichtfeld für Kundenkonten (09.08.2026) ✅
Genau wie beim Geburtsdatum: Telefonnummer jetzt Pflichtfeld an allen drei Stellen — Registrierung, Profil bearbeiten (greift auch rückwirkend für Bestandskonten beim nächsten Speichern), „+ Neuer Kunde" im Admin-Bereich. Erscheint zusätzlich in der Kundenakte und im CSV-Export. Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] `/register` ohne Telefonnummer absenden → sollte blockiert werden, mit Telefonnummer sollte es klappen
- [ ] Bei einem älteren Kundenkonto ohne Telefonnummer das Profil speichern → sollte jetzt nach der Nummer fragen

### Ad-hoc — Fehler-Durchgang: drei echte Bugs gefunden und behoben (09.08.2026) ✅
Auf Wunsch ein kompletter Fehler-Check über die letzten Änderungen (Build, TypeScript, Lint, Logs, Code-Durchsicht). Build/TypeScript waren durchgehend sauber, drei echte Logikfehler bei der Code-Durchsicht gefunden und behoben: Telefonnummer konnte beim Speichern eines Mitarbeiter-Profils stillschweigend gelöscht werden (fehlende Absicherung, analog zum Geburtsdatum ergänzt), das Anonymisieren eines Kundenkontos vergaß die Telefonnummer zu löschen (Funktion war älter als das Feld), und Referenzbild-Dateien blieben nach einer harten Kontolöschung als verwaiste Dateien auf der Platte liegen (jetzt werden sie mit entfernt). Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Kein manueller Test nötig — bereits per Testskript direkt gegen die Datenbank verifiziert, siehe STATUS.md

### Ad-hoc — Verfügbarkeitskalender beliebig weit vorblätterbar (09.08.2026) ✅
Der öffentliche Frei/Belegt-Kalender auf `/angebote` zeigte bisher fest nur zwei Monate (aktuell + folgend). Jetzt mit „‹"/„›"-Pfeilen um je zwei Monate blätterbar — nach vorn unbegrenzt, nach hinten nur bis zum aktuellen Monat. Aus der bisherigen Server-Komponente wurde dafür eine Client-Komponente mit einer neuen öffentlichen Route `/api/availability` zum Nachladen der Belegt-Tage pro Fenster. Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Auf `/angebote` zum Verfügbarkeitskalender scrollen, mehrfach „›" klicken → sollte beliebig weit in die Zukunft blättern, „‹" sollte erst bei zurück-Erreichen des aktuellen Monats wieder deaktiviert sein

### Ad-hoc — Wartungsmodus: An/Aus-Schalter + Passwort-Vorschau (09.08.2026) ✅
Der Wartungsmodus existierte technisch schon (Datenmodell + Anzeigelogik), hatte aber nirgends eine Bedienoberfläche — nachgeholt unter „Einstellungen" (gleiche Berechtigung wie andere Systemeinstellungen). Dazu ein optionales Vorschau-Passwort: wer es auf der Wartungsseite eingibt, sieht die Seite trotzdem normal, ganz ohne Mitarbeiter-Login — als Cookie umgesetzt, das aus dem Passwort abgeleitet wird (ändert sich das Passwort, werden alte Freigaben automatisch ungültig). Mitarbeiter-Logins kamen schon vorher automatisch durch. Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Unter „Einstellungen" den Wartungsmodus aktivieren, ohne eingeloggt zu sein die Seite aufrufen → sollte den Wartungshinweis zeigen
- [ ] Auf der Wartungsseite das hinterlegte Passwort eingeben → sollte die echte Seite zeigen, auch nach einer neuen Seitennavigation noch

### Ad-hoc — Bugfix: Ecken-Rahmen auf der Wartungsseite falsch positioniert (09.08.2026) ✅
Per Screenshot gemeldet: die Ecken-Klammern um den Wartungshinweis saßen am Bildschirmrand statt eng um den Textkasten, oben mit mehr Abstand als unten. Zwei Ursachen: dem Textkasten fehlte `position: relative`, und der für die Startseite gedachte Zusatz-Versatz (damit die oberen Ecken unter dem schwebenden Header bleiben) war fest in die gemeinsame Regel eingebacken statt nur dort zu gelten. Beides behoben, in einen eigenen Zusatz nur für die Startseite verschoben. Details in STATUS.md.

### Ad-hoc — Auftragstermine zum eigenen Kalender hinzufügen (10.08.2026) ✅
Kunden sahen ihren bestätigten Shooting-Termin bisher gar nicht auf der eigenen Auftragsseite (nur den groben Wunschzeitraum aus der Anfrage). Jetzt: sobald ein Termin gesetzt ist, erscheint er dort mit Datum/Uhrzeit plus einem „Zum Kalender hinzufügen"-Menü (Google Kalender, Outlook, .ics-Download für Apple Kalender/Outlook Desktop/etc.) — Titel, Ort und Zeit überall automatisch ausgefüllt. Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Bei einem eigenen Auftrag mit gesetztem Termin unter „Meine Aufträge" nachschauen → Termin-Kasten mit „Zum Kalender hinzufügen" sollte erscheinen, alle drei Optionen sollten Titel/Zeit/Ort korrekt vorausfüllen

### Ad-hoc — Adresse bei Terminvergabe + korrekte Kalender-Übertragung (10.08.2026) ✅
Bei der Terminvergabe im Auftrag gibt es jetzt ein Adressfeld neben Von/Bis — erscheint danach auf der Kundenseite, im Admin-Kalender-Tooltip und in allen Kalender-Export-Optionen. Dabei einen echten Bug im Google-Kalender-Sync behoben: die Adresse landete bisher nur in der Beschreibung statt im dafür vorgesehenen `location`-Feld, wodurch Google sie nicht als navigierbaren Ort erkannte (keine Kartenvorschau/Wegbeschreibung). Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Bei einem Auftrag unter „Termin" eine Adresse eintragen und speichern → sollte im Admin-Kalender-Tooltip, auf der Kundenseite und in den Kalender-Export-Links erscheinen

### Ad-hoc — Aufträge übernehmen (10.08.2026) ✅
Vorgriff auf ein Team mit mehreren Fotograf:innen: Aufträge lassen sich jetzt „übernehmen" (Selbst-Zuweisung, keine Dropdown-Zuweisung an andere) — sichtbar in der Auftragsübersicht (Abzeichen pro Auftrag), in der Auftragsansicht (Übernehmen-/Abgeben-Knopf, mit Rückfrage bei Übernahme von einer Kollegin) und für den Kunden auf der eigenen Auftragsseite. Läuft über die bereits bestehende „Aufträge bearbeiten"-Berechtigung, keine neue eingeführt. Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Bei einem Auftrag „Übernehmen" klicken → sollte in der Übersicht, der Auftragsansicht und auf der Kundenseite erscheinen
- [ ] Mit einem zweiten Mitarbeiter-Konto versuchen, einen bereits übernommenen Auftrag zu übernehmen → sollte eine Rückfrage zeigen

### Ad-hoc — ToDo-System für das ganze Team (10.08.2026) ✅
Neuer Bereich „ToDos", immer sichtbar für jede:n Mitarbeiter:in (nicht berechtigungsgebunden). Grundprinzip: eigene ToDos (zugewiesen oder selbst angelegt) sieht und verwaltet man immer ohne besondere Rechte; mit der neuen granularen „ToDos"-Berechtigung sieht man zusätzlich die ToDos aller Mitarbeiter:innen und kann welche für andere anlegen/bearbeiten/löschen. Funktionsumfang: Titel, Beschreibung, Priorität, Fälligkeitsdatum, Status, optionaler Auftragsbezug, fortlaufende Notizen pro ToDo, Statistik-Kacheln, Filter nach Status/Mitarbeiter:in, „Meine"/„Alle"-Ansicht, Überfällig-Hervorhebung. Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Unter „ToDos" ein neues ToDo für dich selbst anlegen, Status ändern, eine Notiz hinzufügen
- [ ] Mit einem Testkonto ohne ToDo-Berechtigung prüfen: nur eigene ToDos sichtbar, Zuweisen-Feld beim Anlegen gesperrt

### Ad-hoc — Admin-Dashboard als Startseite + Benachrichtigungssystem (10.08.2026) ✅
Admin-Bereich öffnet jetzt zuerst auf einer echten Startseite (`/admin`, statt direkt in den Aufträgen) mit live tickender Uhr/Datum/Begrüßung und berechtigungsabhängigen Info-Kacheln (nur Kacheln zu Bereichen, für die man Rechte hat — ToDos und Benachrichtigungen sieht dagegen immer jede:r). Dazu ein neues Benachrichtigungssystem mit Glocken-Icon in der Kopfzeile für Team UND Kunden, mit Badge für ungelesene, Dropdown, Vollansicht („Alle anzeigen") und „Alle als gelesen"-Aktion. Ausgelöst bei neuer Auftragsanfrage, neuer Chat-Nachricht (beide Richtungen), und neuer QM-/Personal-Einreichung. Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Admin-Bereich öffnen → sollte auf der neuen Startseite mit Uhr/Begrüßung/Kacheln landen, passend zu den eigenen Rechten
- [ ] Als Kunde eine Chat-Nachricht in einem Auftrag schreiben → Team sollte eine Benachrichtigung samt Glocken-Badge bekommen
- [ ] Als Team auf eine Kundennachricht antworten → Kunde sollte eine Benachrichtigung samt Glocke bekommen
- [ ] Auf „Alle anzeigen" klicken → vollständige Liste sollte erscheinen, „Alle als gelesen markieren" sollte funktionieren

### Ad-hoc — Vierte Runde Erweiterungsideen ✅ komplett abgeschlossen (10.08.2026)
Komplett freigegeben, alle 11 Systeme ausführlich umgesetzt (keine Minimal-Versionen), inklusive granularer Berechtigungen wo sinnvoll. Alle live gegen die echte Datenbank getestet, dabei einen echten Bug gefunden und behoben (siehe unten). Details in STATUS.md.

- [x] **Erinnerungs-Mail vor dem Termin** — automatisch ca. 48h vor `shootDate` an den Kunden, mit Checkliste (Kostüm/Requisiten/Anfahrt) und Treffpunkt. Neuer 2-Stunden-Cron (`api/cron/preshoot-reminder`), Ein/Aus + Vorlauf in den Einstellungen.
- [x] **Interne Vorbereitungs-Checkliste pro Auftrag** — Standard- + Custom-Punkte mit Haken, Fortschrittsanzeige. Läuft über `orders_edit`.
- [x] **Automatische Feedback-Anfrage** — täglicher Cron (`api/cron/feedback-request`) als Sicherheitsnetz zum bestehenden Weg (Zufriedenheits-Mail beim Archivieren), falls ein Auftrag nie archiviert wird.
- [x] **Modellfreigabe/Nutzungsrechte pro Auftrag** — neues Feld bei Standard-Aufträgen, fließt als Schnappschuss in den Standard-Vertrag (PDF-Klausel jetzt inhaltlich davon abhängig statt Fixtext) und ist in der Auftragsansicht sichtbar.
- [x] **Team-Zuteilung für Conventions** — Selbst-Anmeldung „Ich bin dabei"/Abmelden über `conventions_view`, Fremdzuteilung über `conventions_edit`, sichtbar direkt in der Conventions-Übersicht.
- [x] **Anonyme Einreichung bei der Personalabteilung** — Checkbox im QM-Formular (nur bei Ziel „Personalabteilung"), Admin-Ansicht zeigt „Anonym" statt Namen.
- [x] **Steuerrücklage-Hinweis** — auf `/admin/statistics`, Richtwert auf Basis des Gewinns mit einstellbarem Prozentsatz (Einstellungen, Standard 28%).
- [x] **Mehrsprachige Rechnungen** — PDF-Vorlage (`lib/invoicePdf.tsx`) hat jetzt ein komplettes DE/EN-Label-Set, ausgewählt nach der hinterlegten Sprache der/des Rechnungsempfänger:in.
- [x] **Eigenes DB-Backup-Skript mit Warnhinweis im Admin** — täglicher Cron dumpt alle Collections (eigene Node-Lösung statt `mongodump`, das auf dem Server nicht installiert ist) nach `/var/backups/rakku-v2-db`, Status + manueller „Jetzt sichern"-Knopf unter „Einstellungen".
- [x] **Instagram-Story-Recap-Generator** — Download-Link im Auftrag setzt aus den höchstbewerteten Fotos automatisch ein 1080×1920-Story-Bild mit Rakku-Branding zusammen. Läuft über `orders_edit`.
- [x] **Preisvorschlags-Vorlagen** — eigener Verwaltungsbereich (`/admin/price-templates`, neue Berechtigung `price_templates`), Vorlagen als Dropdown direkt im Preisvorschlags-Formular eines Auftrags wählbar.
- [x] ~~Admin-Navigation nach Berechtigung filtern~~ — beim Nachsehen festgestellt: war längst umgesetzt, nur der Backlog-Hinweis war veraltet (jetzt entfernt).

**Dabei gefundener und behobener Bug:** die neue Checkliste im Auftrag zeigte den Haken nach einem Klick kurz wieder als leer an (kontrollierte Checkbox sprang zurück, bevor die Seite die neuen Serverdaten geladen hatte) — die Datenbank war dabei die ganze Zeit korrekt, nur die Anzeige flackerte kurz zurück. Mit optimistischem lokalem Zustand behoben, danach per Playwright verifiziert, dass der Haken jetzt sofort und dauerhaft sitzt.

### Ad-hoc — Datenbank von MongoDB Atlas auf lokal selbst gehostet umgestellt ✅ abgeschlossen (10.08.2026)
Auf Wunsch geprüft statt direkt umgesetzt: der ursprüngliche Anlass (ein vermutetes „MB-Limit") stellte sich als Atlas-Tarif-Limit heraus (512 MB beim kostenlosen M0-Tarif), nicht als MongoDB-Limit — die Datenbank war zum Zeitpunkt der Prüfung erst 1,2 MB groß, Fotos liegen ohnehin in Nextcloud. Eine komplette Umstellung auf MariaDB (ursprünglich angefragt) hätte den Umbau aller ~30 Datenmodelle und praktisch jeder Abfrage im gesamten Code bedeutet. Stattdessen: MongoDB lokal auf dem eigenen Server installiert (nur auf localhost gebunden, mit Passwort-Authentifizierung), alle Daten per `mongodump`/`mongorestore` verlustfrei vom Atlas-Cluster übertragen, `.env.local` umgestellt — löst das MB-Limit-Anliegen vollständig, ganz ohne Code-Änderungen in der App. Das Datenbank-Backup-Skript dabei wie gewünscht mit angepasst: läuft jetzt mit echtem `mongodump` statt der vorherigen Behelfslösung (MongoDB-Tools waren vorher nicht auf dem Server installiert). Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Admin-Bereich durchklicken (Aufträge/Statistiken/Team/Einstellungen) → sollte weiterhin alle echten Daten zeigen
- [ ] Unter „Einstellungen" → „Jetzt sichern" klicken → sollte eine neue Datei unter `/var/backups/rakku-v2-db` erzeugen

**Danach (nicht mehr Teil des Backlogs):** —

### Ad-hoc — Kompletter Fehler-Audit + Fahrtkosten-Rechner + Steuer-Seite ✅ abgeschlossen (10.08.2026)
Auf „prüfe alles auf Error, Fehler und Logikfehler und behebe sie" hin drei parallele Audits (Zahlungen/Preise, Berechtigungen, Daten-Integrität), 9 echte Bugs gefunden und alle behoben (Statistik-Umsatz zählte stornierte Aufträge mit, Rabatt-entfernen setzte Gutscheine nicht zurück, Rennbedingungen bei Rabatt-/Gutschein-Einlösung und im Stripe-Webhook, doppelte Rechnungen bei Doppelklick möglich, harte Kontolöschung ließ Preisvorschläge/Auftrags-Verlauf verwaist zurück, vier Stellen mit verwaisten Bilddateien beim Ersetzen). Berechtigungsprüfung selbst war sauber, keine echten Lücken gefunden. Dazu zwei neue Seiten: Fahrtkosten-Rechner (`/admin/mileage`, Kilometerpauschale direkt als Ausgabe erfassbar) und eine eigene Steuer-Seite (`/admin/tax`, macht den bisher am Statistik-Seitenende versteckten EÜR-Export leicht auffindbar, plus laufende Jahresübersicht). Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Unter „Finanzen" → „Fahrtkosten" eine Kilometerzahl eingeben → Ergebnis und vorausgefülltes Ausgabe-Formular sollten erscheinen
- [ ] Unter „Finanzen" → „Steuer" → EÜR-CSV herunterladen → sollte eine korrekte Datei liefern
- [ ] Bei einem Auftrag mit storniertem Status und akzeptiertem Preis prüfen, dass die Statistik-Seite den Betrag nicht mehr mitzählt

### Ad-hoc — Automatisches Mahnwesen mit Gebühren, Azubi-Probezeit, Foto-Vorschau-Bug behoben ✅ abgeschlossen (10.08.2026)
Probezeit-Feld in der Personalakte gilt jetzt auch für Azubis (§ 20 BBiG), nicht nur für fest angestellte Mitarbeiter:innen. Komplett neues automatisches Mahnwesen: Mahnstufen können weiterhin manuell ausgelöst werden, laufen aber auch automatisch im Hintergrund (Cron, standardmäßig AUS bis unter Einstellungen aktiviert), jede Stufe mit gestaffelter, einstellbarer Zusatzgebühr (Standard 0 €/5 €/15 €), die sich zum offenen Betrag addiert — sichtbar in der Auftragsansicht, in der Stripe-Direktzahlung und auf der Mahnung selbst, inkl. automatischer E-Mail + Glocken-Benachrichtigung an den Kunden bei jeder Stufe. Beim Nachprüfen des Story-Recap-Generators aus der letzten Runde einen echten Bug gefunden: Nextclouds Vorschaubild-Dienst schlägt bei Dateipfaden mit eckigen Klammern fehl (genau das Namensschema, das im echten Nextcloud verwendet wird) — betraf potenziell auch die normale Kunden-Fotogalerie, war nur noch nie aufgefallen, weil bisher kein echter Foto-Ordner zugewiesen war. Mit automatischem Rückfall auf lokale Verkleinerung behoben. Details in STATUS.md.

**Test-Checkliste dazu:**
- [ ] Bei einer Personalakte „Azubi" auswählen → Probezeit-Feld sollte erscheinen
- [ ] Unter „Einstellungen" → „Automatische Mahnstufen" aktivieren, Gebühren prüfen/anpassen
- [ ] Bei einem unbezahlten Auftrag mit Rechnung manuell eine Mahnstufe auslösen → Kunde sollte eine E-Mail mit dem (ggf. erhöhten) Betrag bekommen, PDF sollte die Gebühr aufschlüsseln

## Erweiterungsideen — 20 von 21 umgesetzt (09.08.2026) ✅
Auf „darfst du alles umsetzen" hin komplett durchgearbeitet (16 ursprüngliche + 5 in einer zweiten Runde vorgeschlagene). Volle Details in STATUS.md, hier die Kurzfassung:

**Statistiken** — Umsatz-Trend-Chart + Auslastungs-Heatmap ✅ neu gebaut. Ablehnungsgründe-Auswertung war schon vorhanden.

**Aufträge** — Interne Team-Notizen ✅, Mehrfachauswahl/Bulk-Archivieren ✅.

**Kalender** — Terminkonflikt-Warnung ✅, öffentliche Frei/Belegt-Übersicht auf `/angebote` ✅, bidirektionaler Google-Sync ✅ (läuft im bestehenden 2-Stunden-Cron mit, aktuell nicht live testbar da keine Google-Verbindung aktiv).

**Kunden** — Tags/Segmente ✅ neu gebaut. Gesamtumsatz in der Kundenakte war schon vorhanden.

**Pakete/Angebote** — Zusatzoptionen mit Preisaufschlag ✅, zeitlich begrenzte Aktionspreise ✅.

**Blog** — Kategorien/Tags + ähnliche Beiträge ✅, RSS-Feed unter `/blog/rss.xml` ✅.

**Gutscheine** — Bulk-Erstellung ✅, Ablauf-Erinnerung (täglicher Cron) ✅.

**Team** — Aktivitätsprotokoll (sensible Änderungen: Rechte, Mitarbeiterstatus, Kundenkonten) ✅, digitale Unterschrift am Dokument (Name + Zeitstempel + IP, auch im PDF) ✅.

**Aus der zweiten Runde** — Probezeit-Erinnerung in der Personalakte ✅ (täglicher Cron), globale Admin-Suche (Aufträge/Kunden/Dokumente) ✅, E-Mail-Textvorlage bewusst nur für die Wiedervorlage-Mail ✅ (kompletter Umbau aller Mail-Funktionen wäre zu riskant gewesen).

**Nicht umgesetzt** — Automatische DB-Sicherung: Datenbank läuft auf MongoDB Atlas, `mongodump` fehlt auf dem Server, keine Atlas-API-Zugangsdaten hier hinterlegt. **Wartet auf dich:** einmal in deinem Atlas-Dashboard unter „Backup" beim Cluster nachschauen, ob dort schon automatische Sicherungen laufen (nur ab Tarif M10 aufwärts) — dann sage ich dir, was noch zu bauen ist.

**Test-Checkliste (Auswahl):**
- [ ] `/admin/statistics` → Umsatz-Trend-Chart und „Auslastung nach Monat"-Heatmap sollten erscheinen
- [ ] Bei einem Kunden in `/admin/clients/…` einen Tag hinzufügen → sollte auch in der Kundenliste als Badge erscheinen
- [ ] `/blog` → Tag-Filterleiste sollte erscheinen (falls Beiträge mit Tags existieren), `/blog/rss.xml` sollte laden
- [ ] Admin-Menü → Suchfeld oben rechts nutzen, nach einem bekannten Kunden-/Auftragsnamen suchen
- [ ] Ein Dokument in `/admin/documents` erstellen und digital unterschreiben → sollte im PDF erscheinen
- [ ] Bei einem Auftrag eine interne Notiz eintragen → sollte NICHT im Kunden-Chat sichtbar sein

### Ad-hoc — Intranet-Bereich (11.08.2026) ✅
Interne Abläufe/SOPs fürs Team, getrennt von der öffentlichen FAQ (`/admin/intranet`), Struktur eng an die FAQ angelehnt (Kategorien, Sortierung per Pfeil-Buttons, Sichtbar-Schalter für Entwürfe) — aber bewusst rein deutschsprachig, kein öffentliches Pendant. Design-Entscheidung: **Ansehen ist für jede:s eingeloggte Team-Mitglied immer möglich**, unabhängig von Berechtigungen — nur Anlegen/Bearbeiten/Löschen ist eingeschränkt (aktuell nur bei „Inhaber/in"/Vollzugriff). Dafür das Berechtigungssystem um eine neue, bisher nicht vorhandene Kategorie erweitert (`CREATE_EDIT_DELETE_AREAS` in `lib/permissions.ts`) — Bereiche ganz ohne eigenes „Ansehen"-Recht, analog zum bereits bestehenden Muster bei ToDos (eigene ToDos immer sichtbar). Card auf dem Admin-Dashboard und eigener Nav-Link (neben ToDos, außerhalb der berechtigungsgefilterten Kategorien) ergänzt.

Im selben Zug (auf Wunsch) eine erste Team-Struktur unter „Team & Rechte" angelegt: fünf neue Abteilungen (Fotografie, Bildbearbeitung, Kundenbetreuung, Buchhaltung, Marketing) mit je einer oder zwei Positionen und sinnvoll zugeschnittenen Rechten nach dem Least-Privilege-Prinzip — sensible Bereiche (Einstellungen, Team & Rechte, Personalabteilung, QM, Kundenkonten-Verwaltung) bewusst bei niemandem außer „Inhaber/in" vergeben. Reiner Vorschlag, jederzeit anpassbar.

**Test-Checkliste dazu:**
- [ ] `/admin/intranet` aufrufen → Beitrag anlegen, Kategorie vergeben, prüfen dass er nach Kategorie gruppiert erscheint
- [ ] Pfeiltasten zum Sortieren, Sichtbar-Schalter zum Ausblenden testen
- [ ] `/admin/team` → die fünf neuen Abteilungen samt Positionen und Rechte-Zuschnitt durchsehen, bei Bedarf anpassen

### Ad-hoc — Intranet ausgebaut: Abteilungs-Sichtbarkeit, Farben, Suche, Navigation (11.08.2026) ✅
Auf „mach das Intranet mal etwas besser... tob dich aus" hin deutlich erweitert:

- **Navigation umgebaut:** „Intranet" ist jetzt eine echte Dropdown-Kategorie (vor „Verwaltung" positioniert) mit „Abläufe" und „ToDos" als Unterpunkten — beide vorher als lose Einzel-Links außerhalb des Kategorie-Systems. Dafür `AdminNavLinks` um ein `alwaysVisible`-Flag pro Kategorie erweitert (Berechtigungsfilterung wird für diese eine Kategorie übersprungen, da Ansehen dort für jede:n Mitarbeiter:in immer möglich ist).
- **Abteilungs-beschränkte Sichtbarkeit:** `IntranetArticle` hat jetzt `visibleToDepartmentIds` — leer = für alle sichtbar, sonst nur für Mitarbeiter:innen der gewählten Abteilung(en) **plus** jede:n mit `intranet_edit` (voller Überblick für die Pflegenden). Serverseitig gefiltert, nicht nur in der Anzeige versteckt — mit einem echten Test verifiziert (ein simulierter Marketing-Betrachter sieht einen nur für Fotografie freigegebenen Beitrag nachweislich nicht, ein Fotografie-Betrachter schon).
- **Abteilungs-Farben:** `Department` hat jetzt ein `color`-Feld (Farbwähler beim Anlegen unter „Team & Rechte", nachträglich änderbar über einen neuen `DepartmentColorPicker`). Die sechs bestehenden Abteilungen haben jetzt bewusst unterschiedliche Farben. Intranet-Beiträge zeigen die Abteilungs-Badges in genau dieser Farbe, damit jemand mit Überblick über alles auf einen Blick sortieren kann.
- **Anpinnen:** neues `pinned`-Feld, angepinnte Beiträge erscheinen in einem eigenen „📌 Angepinnt"-Abschnitt oben, unabhängig von der Kategorie-Gruppierung.
- **Zuletzt bearbeitet von:** `lastEditedByName` wird bei Anlegen/Bearbeiten automatisch aus der Session gesetzt, in der Zeile sichtbar (für Betrachter ohne Bearbeiten-Recht statt des Bearbeiten-Formulars).
- **Suche:** neues Eingabefeld direkt auf der Intranet-Seite (filtert clientseitig über Titel/Inhalt/Kategorie, keine zusätzliche Server-Anfrage nötig) **und** Anbindung an die globale Admin-Suche oben rechts (`/api/admin/search` durchsucht jetzt auch Intranet-Beiträge, ebenfalls abteilungsgefiltert) — ein Treffer dort führt direkt zum Beitrag und klappt ihn automatisch auf (`?open=<id>`-Parameter, `<details open>` serverseitig gesetzt).

Datenmodell bewusst mit Blick auf die für später geplante Mitarbeiter-App gebaut (Department als echte, eigenständige Entität mit Farbe statt Freitext — genau das Muster, das schon beim Team-/Rechtesystem für künftige App-Anbindung vorgesehen war). Live getestet (echter Testbeitrag mit Abteilungs-Beschränkung + Pin angelegt, Sichtbarkeits-Query direkt verifiziert, globale Suche und Deep-Link geprüft, Testdaten restlos entfernt), Build/TypeScript fehlerfrei.

**Test-Checkliste dazu:**
- [ ] `/admin/team` → bei einer Abteilung die Farbe ändern (Farbfeld links neben dem Namen)
- [ ] `/admin/intranet` → neuen Beitrag anlegen, eine Abteilung ankreuzen und „Anpinnen" aktivieren → sollte oben im „Angepinnt"-Bereich mit farbigem Abteilungs-Badge erscheinen
- [ ] Admin-Menü → „Intranet" antippen → sollte „Abläufe" und „ToDos" als Unterpunkte zeigen
- [ ] Im Intranet-Suchfeld nach einem Stichwort suchen → Liste filtert sich sofort
- [ ] Oben rechts in der globalen Suche denselben Begriff eingeben → Treffer unter „Intranet" sollte erscheinen, Klick führt direkt zum aufgeklappten Beitrag

### Ad-hoc — Echte Arbeitsvertrags-/Arbeitszeugnis-Texte (11.08.2026) ✅
Auf „mache bitte vernünftige Verträge und Arbeitszeugnisse" hin die bereits bestehenden 10 Dokumentvorlagen unter `/admin/documents` durchgesehen und überarbeitet — die Grundgerüste (Struktur, Paragraphen, korrekte Trennung einfaches/qualifiziertes Zeugnis) waren schon solide, drei echte Lücken geschlossen:

1. **Debug-Reste entfernt:** in der Abmahnung-Vorlage steckten noch `[E2E-EDIT-MARKER]`/`[DEBUG-MARKER]`-Zeilen von einem früheren Testlauf im gespeicherten Text — entfernt.
2. **Arbeitsvertrag Vollzeit/Teilzeit + Minijob:** um die nach dem Nachweisgesetz eigentlich vorgeschriebenen, bisher fehlenden Angaben ergänzt — Arbeitsort, Hinweis auf fehlende Tarifverträge, Datenschutz-Klausel, sowie beim Vollzeit-Vertrag zusätzlich ein Hinweis auf die 3-Wochen-Klagefrist bei Kündigung (§ 4 KSchG).
3. **Berufsausbildungsvertrag:** um die nach § 11 BBiG vorgeschriebene Pflicht zum Führen eines Ausbildungsnachweises (Berichtsheft) sowie den Tarifvertrags-Hinweis ergänzt.
4. **Kündigung durch Arbeitgeber:** Klagefrist-Hinweis (§ 4 KSchG) ergänzt.

**Wichtigste Ergänzung:** die eigentliche Zeugnissprache. Die Platzhalter `{{leistungsbeurteilung}}` und `{{verhaltensbeurteilung}}` in den Zeugnis-Vorlagen waren zuvor unerklärte Platzhalter ohne Hinweis auf die im deutschen Arbeitsrecht übliche Notenskala (nach dem „wohlwollend, aber wahr"-Grundsatz, § 109 GewO — Formulierungen wie „stets zu unserer vollsten Zufriedenheit" klingen alle positiv, tragen aber je nach genauer Wortwahl eine ganz bestimmte Note). Da die Bewertung zwangsläufig pro Mitarbeiter:in unterschiedlich ausfallen muss, wurde bewusst kein fester Text vorgegeben — stattdessen die im Dokumenten-Creator ohnehin schon vorhandene Platzhalter-Erklärung (`documentTokenGlossary.ts`, live angezeigt bei Vorlagenauswahl) um eine vollständige Formulierungs-Referenz für alle gängigen Notenstufen (sehr gut bis mangelhaft) für beide Platzhalter erweitert, dazu Hinweise für `taetigkeitsbeschreibung`, `beendigungsgrund` und `pruefungsergebnis`. Dafür `GenerateDocumentPanel.tsx` um mehrzeilige Darstellung (`whitespace-pre-line`) ergänzt, damit die Formulierungs-Liste auch tatsächlich als Liste erscheint statt als ein langer Fließtext-Satz.

**Wichtig für Rakku:** kompetent nach den etablierten Konventionen des deutschen Arbeitsrechts (BGB, NachwG, BBiG, KSchG, GewO) formuliert, aber keine anwaltliche Beratung — vor dem ersten echten Vertragsabschluss lohnt sich eine einmalige kurze Prüfung durch einen Steuerberater/Fachanwalt für Arbeitsrecht, insbesondere bei den Zeugnis-Notenformulierungen (falsche Note kann zu Korrekturansprüchen führen). Alle Änderungen live im DB-Inhalt verifiziert, Build/TypeScript fehlerfrei.

**Test-Checkliste dazu:**
- [ ] `/admin/documents` → „Arbeitszeugnis – qualifiziert" auswählen → bei den manuell zu ergänzenden Platzhaltern sollte jetzt eine mehrzeilige Formulierungs-Referenz für `leistungsbeurteilung` und `verhaltensbeurteilung` erscheinen
- [ ] Einen Blick in die überarbeiteten Vertragstexte werfen (Arbeitsvertrag, Ausbildungsvertrag) — neue Klauseln zu Arbeitsort, Tarifvertrag, Datenschutz, Berichtsheft sollten drinstehen

### Ad-hoc — Leere Seite bei Arbeitsverträgen behoben, Fußzeile mit Seitenzahl überall (12.08.2026) ✅
Ursache der leeren Zusatzseite gefunden: die Fußzeile im Dokumenten-Creator (`documentPdf.tsx`) lief bisher im normalen react-pdf-Textfluss statt als `fixed`-Element mit — bei längeren Dokumenten (wie dem gerade erweiterten Arbeitsvertrag) berechnete die Layout-Engine dadurch keinen Platz mehr für die Fußzeile auf der letzten Inhaltsseite und erzeugte eine fast leere Zusatzseite nur dafür. Mit `fixed` behoben (react-pdfs vorgesehener Mechanismus für seitenübergreifende Kopf-/Fußzeilen).

Gleich dabei die explizit gewünschte, immer vorhandene Fußzeile mit Dokumentname + „Seite X von Y" ergänzt — nicht nur beim Dokumenten-Creator, sondern **in allen vier PDF-Erzeugern der ganzen Anwendung** (vollständige Suche nach `renderToBuffer` im Code ergab genau diese vier): `documentPdf.tsx` (Arbeitsverträge, Zeugnisse, QM etc.), `contractPdf.tsx` (Standard- + TFP-Auftragsverträge), `invoicePdf.tsx` (Rechnungen, zweisprachig „Seite X von Y" / „Page X of Y"), `reminderPdf.tsx` (Mahnungen). Läuft unabhängig vom bisherigen optionalen Fußzeilentext-Feld — Seitenzahl + Dokumentname sind jetzt eine feste Grundausstattung, die sich nicht abschalten lässt.

Live verifiziert: ein echter Test-Arbeitsvertrag (mit den gestern ergänzten 12 Paragraphen) erzeugt jetzt korrekt 3 vollständig gefüllte Seiten statt vorher 3 Seiten mit einer leeren am Ende — Seite 3 enthält tatsächlich §9–12 plus Unterschriftenzeilen, keine leere Seite mehr. Eine Test-Rechnung zeigt korrekt „Rechnung TEST-0001 · Seite 1 von 1". Testdaten restlos entfernt, Build/TypeScript fehlerfrei.

**Test-Checkliste dazu:**
- [ ] Einen Arbeitsvertrag über `/admin/documents` erzeugen und als PDF öffnen → keine leere Seite mehr am Ende, jede Seite hat unten Dokumentname + Seitenzahl
- [ ] Eine echte Rechnung/einen echten Auftragsvertrag als PDF öffnen → gleiche Fußzeile sollte dort auch erscheinen

### Ad-hoc — Einheitliche Seitentitel überall (12.08.2026) ✅
Auf „Webseiten-Titel überall zu Rakku Photography oder Rakku Photography | UNTERSEITENNAME ändern" hin `buildPageMetadata()` (die zentrale Titel-Bau-Funktion für alle öffentlichen Seiten) umgebaut: Titel ist jetzt fest `{Firmenname}` (Startseite) oder `{Firmenname} | {Unterseite}` (überall sonst), Firmenname kommt aus den echten Geschäftsdaten (`invoiceSettings.businessName`). Bewusst nicht mehr über das bisherige freie „Titel-Zusatz"-Einstellungsfeld gesteuert — genau dieses frei editierbare Feld hatte zur Uneinheitlichkeit geführt (manche Seiten „X · Rakku Photography", die Startseite komplett anders); aus der Admin-Oberfläche entfernt.

Dabei einen echten, vorbestehenden Bug gefunden: die Portfolio-Seite nutzte für ihren SEO-Titel versehentlich den Text der Seitenüberschrift („Meine Arbeiten"/„My Work") statt eines passenden Titels — jetzt korrekt „Portfolio". Die Conventions-Seite hatte einen ganzen Satz als Titel („Wo trefft ihr Rakku?") statt eines kurzen Seitennamens — auf „Conventions" gekürzt. Zwei inzwischen komplett ungenutzte, verwaiste Übersetzungs-Keys (`portfolio.metaTitle`, `services.metaTitle`) aufgeräumt.

**Bewusste Design-Entscheidung bei der Startseite:** statt eines nackten „Rakku Photography" wird dort weiterhin die Zeile „Cosplay- & Portrait-Fotograf in Bielefeld" als Unterseiten-Teil mitgeführt (→ „Rakku Photography | Cosplay- & Portrait-Fotograf in Bielefeld") — das entspricht technisch weiterhin genau dem gewünschten Format, erhält aber den keywordreichen Titel, der beim lokalen SEO für Bielefeld-Suchen extra hinzugefügt wurde. Falls stattdessen wirklich nur das nackte „Rakku Photography" gewünscht ist: einfach Bescheid geben, ist eine Ein-Zeilen-Änderung.

Live über alle öffentlichen Seiten (DE + EN) verifiziert — durchgehend „Rakku Photography | ...", keine Ausreißer mehr.

**Test-Checkliste dazu:**
- [ ] Ein paar Seiten im Browser-Tab anschauen (Startseite, Portfolio, Angebote, FAQ, Blog) — Titel sollte überall mit „Rakku Photography" anfangen
- [ ] `/admin/seo` aufrufen → das alte „Titel-Zusatz"-Feld ist weg, stattdessen ein Hinweistext dazu
