Version 0.3.68k-test-i – Übersicht über die letzten Änderungen.
## 0.3.68k-test-i
- Fix: Offline-Funktion auf Desktop (Firefox/Windows) repariert – `core/offline.js` hatte einen Syntax-Fehler (`async async`) und wurde dadurch gar nicht ausgeführt
- Offline: Wizard-Formulare werden jetzt immer abgefangen (online-first). Wenn beim Speichern die Verbindung weg ist, wird automatisch lokal gespeichert statt „Website nicht erreichbar“
- Offline-Sync: JavaScript-Fehler in `offline_sync.php` behoben (Draft-Liste + op_id/device_id), Sync-Seite läuft wieder stabil
- Service Worker: Cache-Version erhöht, damit Updates sicher greifen
## 0.3.68k-test-h
- Offline-Sync: echte Queue (Reihenfolge + weniger Chaos bei vielen Entwürfen)
- Offline-Sync: pro Entwurf/Bild op_id + device_id (Grundlage für Idempotenz)
- Server: Idempotenz-Schutz (sync_ops) gegen doppelte Offline-POSTs bei Retries/Netzabbrüchen
- Offline-Sync: Retry-Zähler bei fehlgeschlagenen Entwürfen
- Offline-Sync: Notfall-Export (JSON) der Offline-Daten
- Fix: JS-Fehler (updateSyncHint) vorbereitet – weitere Stabilisierung in 0.3.68k-test-i
## 0.3.68k-test-g
- PWA/Offline: Service Worker Install-Fix – Precache enthielt 'login.php' (404) und verhinderte dadurch die Installation im Desktop-Browser
- Service Worker: Precache korrigiert (index.php statt login.php) + Cache-Version bump
- Manifest: start_url auf index.php gesetzt (stabiler Erststart)
## 0.3.68k-test-f
- Offline-Wizard: Weiterklicken auch ohne Internet (automatische Weiterleitung zum nächsten Schritt nach Offline-Speichern)
- Offline-Warmup: bei vorhandenem Protokoll-ID werden alle Wizard-Seiten vorab geladen, damit sie offline verfügbar sind
- Offline-Sync: Foto-Uploads werden inkl. zugehöriger Formularfelder synchronisiert (nicht nur Datei alleine)
- Service Worker: Precache erweitert (special_terms + data_privacy) und Cache-Version erhöht
- Service Worker: statische Assets jetzt robust unabhängig vom Installationspfad (nicht nur /uebergabe)
## 0.3.68j-test
- PWA/Offline: Desktop-Browser Offline-Fallback (kein Browser-Netzwerkfehler mehr)
- Service Worker: erweiterter Precache (Login, Dashboard, Index, Offline-Seite)
- Service Worker: HTML-Fallback auch für nicht-Navigation-Requests (PHP-Seiten)
- Service Worker: Cache-Version bump (Update greift sicher)
- Offline: robuster SW-Pfad (funktioniert unabhängig vom Unterordner / DocumentRoot)
- Offline-Nutzung: Dashboard & Protokollbearbeitung ohne Internet möglich
- Stabilisierung: Offline-Erkennung & kontrollierter Reload beim Erstinstall
## 0.3.68i-test
- PWA/Offline: Service Worker + Manifest + App-Icons (Caching der Oberfläche)
- Offline-Modus: Formular-Eingaben werden bei fehlendem Internet lokal gespeichert (Entwürfe)
- Offline Sync: offline_sync.php zum Synchronisieren/Löschen von lokalen Entwürfen & Offline-Fotos
- UI: Online/Offline-Badge + Sync-Button in der Topbar
## 0.3.68h-test
- settings.php: DB Setup / Migration nicht mehr "wild" im Hausverwaltungs-Tabellenlayout, sondern als eigene, saubere Section-Card (Admin).
## 0.3.68g-test
- E-Mail: Footer-Hinweis ergänzt um die E-Mail-Adresse der zuständigen Hausverwaltung (aus property_managers), als Kontakt-Hilfe für Mieter.
## 0.3.68f-test
- install/db_migrate.php: Optische DB-Migration/Setup-Seite ergänzt (Admin-Only) mit Statusanzeige für Tabellen/Spalten und 1-Klick-Migration.
- settings.php: Admin-Link „DB-Setup öffnen“ ergänzt.
## 0.3.68e-test
- view_protocol.php: Button "E-Mails erneut senden" nach Abschluss ergänzt (nur Ersteller/Admin).
- E-Mail: Erneuter Versand nutzt bestehende, noch gültige Tokens ohne created_at zu erneuern (keine Token-Verlängerung); abgelaufene Links werden als "abgelaufen" angezeigt.
## 0.3.68d-test
- DB: Zentrales Auto-Setup erweitert (CREATE TABLE IF NOT EXISTS + fehlende Kern-Tabellen für produktionssicheren Deploy).
- DB: protocols automatisch um status/closed_at ergänzt.
## 0.3.68c-test
- PDF: Personenblock erweitert – Straße, PLZ/Ort und Land werden je Person einzeln ausgegeben (Vermieter & Mieter), damit alle Personendaten im Protokoll vollständig sichtbar sind.
- PDF: Mängel + Mängelbilder klar als eigener Abschnitt; Raumfotos werden separat als eigener Abschnitt („Raumfotos“) dargestellt.
- PDF: Photo-Grid nutzt Bottom-Margin sicher über Getter (kein Zugriff auf geschützte FPDF-Properties).
## 0.3.68a-test
- PDF: Fix für "Cannot access protected property PDF::$lMargin" – Margin-Zugriff über Getter, Photo-Grid nutzt sichere Berechnung.
## 0.3.67a-test
- PDF: Personenbereich erweitert – vollständige Adressdaten (Straße, PLZ, Ort, Land) und neue Anschrift (nach Auszug) werden im PDF ausgegeben, damit das Protokoll allein alle Personendaten enthält.
## 0.3.66a-test
- PDF: Mängel & zugehörige Fotos jetzt pro Raum/Mangel zusammenhängend, moderneres Layout (Boxen/Abstände).
## 0.3.59 – PDF-Mängelbereiche pro Raum & E-Mail-Hinweise
- PDF: Mängel werden je Raum mit einem blauen Abschnittsbalken „Mängel – <Raum>“ getrennt und dadurch klarer strukturiert.
- preview.php: zusätzlicher Hinweis „E-Mail versandt.“ bei bereits abgeschlossenen Protokollen.
- E-Mail: Hinweistext um die im Protokoll hinterlegte Hausverwaltung ergänzt; Klartext-Fallback-Links (PDF/ZIP) entfernt.
## 0.3.58 – Token-Gültigkeit (Admin) & Logo-Spalte in Hausverwaltungen
- `settings.php`:
- Admin-Einstellung für Token-Gültigkeit ergänzt (30/60/90 Tage).
- Hausverwaltungen-Tabelle: ID-Spalte entfernt, neue Spalte „Logo“ mit Vorschau (oder Platzhalter) hinzugefügt.
- `download_token.php`:
- Token-Ablaufprüfung ergänzt (basierend auf Admin-Einstellung; Default 30 Tage).
- `includes/email_helper.php`:
- Tokens werden bei Ablauf automatisch erneuert (statt alten, abgelaufenen Token weiterzuverwenden).
## 0.3.57a – Syntaxfixes & Link-Korrekturen
- `edit_rooms.php` / `edit_keys.php`:
- PHP-ParseError behoben (doppelte `<?php`-Öffnung entfernt, Footer-Include korrekt).
- `edit_meters.php`:
- Am Seitenende (außerhalb des Wizards) ein zentrierter Button „Weiter zu Sondervereinbarung“ ergänzt.
- `data_privacy.php`:
- Falsche Weiterleitung bei gesperrtem Protokoll korrigiert (`$id` → `$protocol_id`).
- `login_template.php`:
- Formular-Action auf `index.php` korrigiert (statt nicht vorhandener `login.php`).
## 0.3.57 – Mobile Flow: Weiter-Links & automatische Weiterleitung
- `edit_persons.php`:
- Nach „Speichern“ wird jetzt direkt zum nächsten Schritt „Räume“ weitergeleitet (im Wizard inkl. `&wizard=1`).
- `edit_rooms.php`:
- „Fertig“-Button im Auswahlmodus entfernt.
- Am Seitenende (außerhalb des Wizards) ein zentrierter Button „Weiter zu Schlüsseln“ ergänzt.
- `edit_keys.php`:
- Am Seitenende (außerhalb des Wizards) ein zentrierter Button „Weiter zu Zählern“ ergänzt.
- `special_terms.php`:
- Nach „Speichern“ wird jetzt direkt zum nächsten Schritt „Datenschutz“ weitergeleitet.
- `data_privacy_save.php`:
- Nach Annahme der Datenschutz-Einwilligung erfolgt automatisch die Weiterleitung zur `preview.php?id=...` (im Wizard inkl. `&wizard=1`).
## 0.3.56 – Token-Stabilität & Apple-Mail kompatible Buttons
- `download_token.php`:
- Robustere Token-Auswertung (Hex-Token wird zuverlässig extrahiert, auch wenn Mail-Clients den Parameter minimal verändern).
- Zusätzliche TOKEN-Logs beim Aufruf (Token-Aufruf & ungültige Parameter) zur besseren Nachvollziehbarkeit.
- `includes/email_helper.php`:
- Button-Layout auf „bulletproof“ Inline-Styles umgestellt (bessere Darstellung in Apple Mail / iOS, Button-Text wird zuverlässig angezeigt).
- Buttons zentriert und untereinander; zusätzlich Fallback-Links im Footer für Clients, die Buttons blockieren.
## 0.3.55 – Dashboard Download-Spalte sichtbarer gemacht
- `dashboard.php`:
- Spaltenüberschrift zu „Downloads (HV/Mieter)“ präzisiert.
- Ausgabe vereinheitlicht (HV ✅/❌ · Mieter ✅/❌).
- Admin-Hinweisbox oberhalb der Tabelle ergänzt, damit die Funktion sofort sichtbar ist.
## 0.3.54 – Protokoll-Hinweise & Download-Transparenz
- `preview.php`:
- Überschrift der Vorschau von „Vorschau Protokoll #ID“ auf „Vorschau Protokoll – [Straße]“ geändert, damit die Objektadresse im Fokus steht.
- Hinweistext ergänzt, dass Herdanschlüsse und wassergeführte Leitungen vom Mieter durch qualifiziertes Fachpersonal/Fachunternehmen durchführen bzw. prüfen zu lassen sind.
- `generate_pdf.php`:
- Den gleichen Hinweis zu Herd und wassergeführten Leitungen im Unterschriften-Bereich des PDFs ergänzt.
- `includes/email_helper.php`:
- Datenschutz-Hinweis in der E-Mail konkretisiert: Download-Dateien werden spätestens nach 30 Tagen automatisch vom Server gelöscht.
- `dashboard.php`:
- Neue Spalte „Downloads“ in der Protokollübersicht ergänzt, die pro Protokoll anzeigt, ob Hausverwaltung (HV) und Mieter die bereitgestellten Dateien (PDF/ZIP) bereits heruntergeladen haben (HV ✅/❌, Mieter ✅/❌).
## 0.3.52 – Download-Token & öffentliche Downloads
- `download_token.php`:
- Schöne Fehlerseite für ungültige oder abgelaufene Download-Links eingebaut (integriertes Layout mit Header/Footer).
- Zusätzliche Token-Logs ergänzt, wenn ein leerer oder unbekannter Token aufgerufen wird.
- `download_images_zip.php`:
- Titel und Überschrift von „Bilder-Download“ auf „Datei-Download“ geändert (da ZIP-Datei mit Protokolldaten).
- Bugfix: Beim Aufruf über Token wird die `protocol_id` nun zuverlässig auch aus `$_GET['id']` gelesen, sodass der Download-Link nicht mehr fälschlich „Ungültige Protokoll-ID“ meldet.
## 0.3.51 – SMTP-E-Mail-Versand & Test-Tools
- `includes/email_helper.php`:
- SMTP-Versand vollständig überarbeitet und mit Strato-SMTP (SSL, Port 465) kompatibel gemacht.
- Login nun über das technische Punycode-Postfach `noreply@xn--wohnungsbergabe-6vb.online`.
- Absenderadresse (MAIL FROM) ebenfalls auf die Punycode-Domain umgestellt, um RFC-konforme Domains ohne Umlaute zu verwenden.
- Ausführliches Logging über `appLogError('MAIL', …)` ergänzt:
- Start von `send_protocol_emails()`.
- Anzahl gefundener Empfänger (Vermieter/HV, Mieter).
- SMTP-Login-Versuche.
- Erfolg oder Fehlschlag einzelner Sendungen.
- `test_mail.php`:
- Neue Testseite im Root der Anwendung (`/uebergabe/test_mail.php`), um den SMTP-Versand unabhängig von Protokollen zu testen.
- Aufruf per `?to=adresse@example.com` versendet eine einfache Testmail und gibt Status im Browser sowie im Error-Log aus.
- `config.php`:
- Zentrale SMTP-Konstanten (`SMTP_HOST`, `SMTP_PORT`, `SMTP_USER`, `SMTP_PASS`) ergänzt, sodass Zugangsdaten an einer Stelle gepflegt werden können.
## 0.3.37 – PDF-Farbschema an Webdesign angepasst
- `generate_pdf.php`:
- Die Abschnitts-Header (`pdf_section_header`) verwenden jetzt ein Farbschema, das direkt an die Web-Oberfläche angelehnt ist:
- Hintergrund angelehnt an `--color-primary-soft` (helles Blau),
- Rahmenfarbe angelehnt an `--color-border-subtle`,
- Textfarbe angelehnt an `--text-main`.
- Der Haupttitel nutzt nun exakt den Primärfarbton der Web-App (`--color-primary` = `#2563eb`), um einen klaren Wiedererkennungswert zwischen Weboberfläche und PDF zu schaffen.
- Die restliche Typografie (Schriftgrößen, Abstände) bleibt wie in 0.3.36, wirkt durch die angepassten Farben nun aber deutlich näher am Look & Feel des Dashboards.
- `generate_pdf.php`:
- Die Abschnitts-Header (`pdf_section_header`) verwenden jetzt ein Farbschema, das direkt an die Web-Oberfläche angelehnt ist:
- Hintergrund angelehnt an `--color-primary-soft` (helles Blau),
- Rahmenfarbe angelehnt an `--color-border-subtle`,
- Textfarbe angelehnt an `--text-main`.
- Der Haupttitel nutzt nun exakt den Primärfarbton der Web-App (`--color-primary` = `#2563eb`), um einen klaren Wiedererkennungswert zwischen Weboberfläche und PDF zu schaffen.
- Die restliche Typografie (Schriftgrößen, Abstände) bleibt wie in 0.3.36, wirkt durch die angepassten Farben nun aber deutlich näher am Look & Feel des Dashboards.
## 0.3.36 – Modernisiertes PDF-Layout
- `generate_pdf.php`:
- Einführung einer Hilfsfunktion `pdf_section_header()`, die Abschnittsüberschriften (z. B. „Personen“, „Schlüssel“, „Unterschriften“) im Stil der Weboberfläche mit leicht hinterlegtem Balken, klarer Typografie und konsistenten Abständen rendert.
- Einheitliche Seitenränder und automatischer Seitenumbruch gesetzt (`SetMargins(15, 20, 15)`, `SetAutoPageBreak(true, 20)`), damit das Layout luftiger und besser lesbar wird.
- Der Haupttitel (Übergabe-/Abnahme-/Vorabnahmeprotokoll) wird nun größer und in einem dezenten Blauton dargestellt, angelehnt an das moderne Web-Design.
- Raumüberschriften („Raum: …“) erhalten mehr Abstand nach oben, sodass jedes Zimmer wie ein eigener sauber abgegrenzter Block wirkt.
- Bestehende Inhalte (Personen, Schlüssel, Räume, Mängel, Fotos, Unterschriften) bleiben inhaltlich unverändert, werden aber optisch strukturierter und übersichtlicher dargestellt.
## 0.3.35 – Raumfotos wieder vollständig & Mieter-Namen im PDF
- `includes/protocol_zip_helper.php`:
- Die drei Fotoabfragen (Raum-, Feature- und Mängel-Fotos) wurden korrigiert:
- Raumfotos kommen wieder aus `protocol_room_photos`, Features aus `protocol_room_feature_photos`, Mängel aus `protocol_room_issue_photos`.
- Alle Abfragen joinen nun optional auf `room_types`, sodass der Raumname aus `custom_name` **oder** dem Raumtyp (`room_types.name`) stammt – erst wenn beides fehlt, wird auf `Raum <ID>` zurückgegriffen.
- Dadurch werden wieder alle normalen Raum-Bilder (z. B. Wohnzimmer mit 4 Fotos) korrekt in die ZIP aufgenommen.
- `download_images_zip.php`:
- Die SQL für das Laden der Mieter-Namen wurde bereinigt (`role = 'MIETER'`), damit MariaDB keine Syntaxfehler mehr meldet.
- Der PDF-Dateiname innerhalb der ZIP basiert damit wieder wie vorgesehen ausschließlich auf den Mieternamen; falls keine gefunden werden, bleibt der Fallback `Protokoll_<ID>.pdf` aktiv.
- `view_protocol.php`:
- Die Beschriftung des ZIP-Buttons wurde von „Bilder downloaden“ auf „Paket Download“ geändert, da die ZIP nun Bilder **und** PDF enthält.
## 0.3.34 – Raum-Namen für Bilddateien & PDF nur mit Mieternamen
- `includes/protocol_zip_helper.php`:
- Die Fotoabfragen (`ROOM_PHOTOS`, `FEATURE_PHOTOS`, `ISSUE_PHOTOS`) joinen jetzt zusätzlich die `room_types`-Tabelle.
- Der Raumname wird als `COALESCE(pr.custom_name, rt.name, CONCAT('Raum ', pr.id))` ermittelt, sodass Bilder z. B. als `bad-1.jpg` statt `raum-208-1.jpg` benannt werden, wenn der Raumtyp „Bad“ hinterlegt ist.
- `download_images_zip.php`:
- Der Dateiname der PDF **innerhalb** der ZIP basiert nun ausschließlich auf den Mieternamen (z. B. `Max_Mustermann.pdf` oder `Max_Mustermann_&_Erika_Müller.pdf`).
- Falls kein Mieternamen erfasst sind, wird wie bisher auf `Protokoll_<ID>.pdf` zurückgefallen.
## 0.3.33 – PDF-Dateiname mit Objekt- und Mieternamen in der ZIP
- `download_images_zip.php`:
- Lädt jetzt zusätzlich die Mieternamen aus `protocol_persons` (Rolle `MIETER`) und baut daraus zusammen mit Objektadresse und Protokolltyp einen sprechenden Basisnamen.
- Dieser Basisname (z. B. `Protokoll_80_UEBERGABE_Musterstrasse_1_58095_Hagen_Max_Mustermann`) wird:
- als Dateiname des PDFs **innerhalb** der ZIP verwendet (`<Basisname>.pdf`),
- und als Grundlage für den ZIP-Dateinamen (`<Basisname>_Bilder.zip`).
- Nicht erlaubte Zeichen werden wie bisher durch Unterstriche ersetzt, sodass Dateinamen betriebssystemkompatibel bleiben.
## 0.3.32 – PDF wird in ZIP aufgenommen & Ansicht-Bug behoben
- `generate_pdf.php`:
- Das erzeugte PDF wird nun zusätzlich im Verzeichnis `uploads/pdfs` unter `protocol_<ID>.pdf` serverseitig gespeichert.
- Die Ausgabe an den Browser erfolgt über den PDF-Inhalt im Speicher, sodass Datei-Speicherung und Anzeige sauber kombiniert werden können.
- `download_images_zip.php`:
- Nach der Erstellung der Bilder-ZIP wird – sofern vorhanden – automatisch die passende `protocol_<ID>.pdf` als `protokoll.pdf` in das ZIP-Archiv aufgenommen.
- Fehlschläge beim Hinzufügen des PDFs werden über `appLogError('ZIP_DEBUG', ...)` protokolliert, beeinträchtigen aber den Bilder-Download nicht.
- `view_protocol.php`:
- Ein versehentlich übrig gebliebenes `?>` im Layout (sichtbar als „?>“ oberhalb der Protokollvorschau) wurde entfernt, sodass die Seite wieder sauber dargestellt wird.
## 0.3.31 – Lesbare Bildnamen in der ZIP (Bad, Küche, etc.)
- `includes/protocol_zip_helper.php`:
- Die Dateinamen in der Bilder-ZIP basieren jetzt auf dem Raum-Namen (`custom_name`) statt generischen „Raum“-Bezeichnungen.
- Alle Bilder werden im Schema `<raum>-<laufendeNummer>.jpg` benannt, z. B. `bad-1.jpg`, `bad-2.jpg`, `bad-maengel-1.jpg`.
- Leerzeichen und Sonderzeichen im Raum-Namen werden über `protocol_zip_slugify()` in kleine, bindestrich-getrennte Bezeichner umgewandelt (Option 3: Bindestrich statt Unterstrich).
## 0.3.30 – ZIP-Zähler korrigiert & Protokoll-Kopieren repariert
- `includes/protocol_zip_helper.php`:
- Der Zähler `$addedCount` wird jetzt nach jedem erfolgreichen `$zip->addFile()` erhöht.
- Dadurch wird eine ZIP-Datei mit gefundenen Bildern nicht mehr fälschlicherweise als „leer“ verworfen.
- `copy_protocol.php`:
- Defekte/inkonsistente `sort_order`-Erkennung entfernt.
- Die ORDER-BY-Logik wurde vereinfacht und nutzt jetzt nur noch Spalten, die im aktuellen Schema existieren (`pr.id`, `photos.id`, `f.id`, `d.id`).
- Syntax-/Klammerfehler aus dem vorherigen Patch wurden behoben, sodass das Kopieren von Protokollen wieder ohne 500-Fehler funktioniert.
- `version.php`:
- Versionsnummer auf `0.3.30` angehoben; Anzeige auf der Login-Seite bleibt damit synchron zum internen Stand.
## 0.3.29 – ORDER BY ohne `sort_order` für ältere Datenbanken
- `includes/protocol_zip_helper.php`:
- Die `ORDER BY pr.sort_order, pr.id, photos.id` Klauseln in allen drei Foto-Abfragen wurden auf `ORDER BY pr.id, photos.id` reduziert.
- Hintergrund: In produktiven/älteren Datenbanken existiert die Spalte `sort_order` in `protocol_rooms` teilweise noch nicht, was zu `SQLSTATE[42S22]: Column not found: 1054 Unknown column 'pr.sort_order'` führte.
- Die Reihenfolge der Bilder bleibt stabil (nach Raum-ID und Foto-ID), ist aber jetzt mit allen DB-Ständen kompatibel.
## 0.3.28 – ZIP-Fotoabfragen vereinfacht & robust
- `includes/protocol_zip_helper.php`:
- Die drei SELECT-Abfragen für Raum-, Feature- und Mängel-Fotos wurden komplett neu aufgebaut.
- Es werden nur noch tatsächlich vorhandene Spalten aus `protocol_rooms`, `protocol_room_photos`, `protocol_room_feature_photos` und `protocol_room_issues`/`protocol_room_issue_photos` verwendet.
- Raumbezeichnungen werden aus `custom_name` bzw. einem generischen Fallback (`Raum {id}`) gebildet; eine separate `room_types`-Tabelle ist nicht mehr nötig.
- Fehler in den Abfragen werden jetzt pro Block mit `ZIP_DEBUG` (`Fehler in ROOM_PHOTOS/FEATURE_PHOTOS/ISSUE_PHOTOS`) protokolliert, statt stumm geschluckt zu werden.
## 0.3.27 – ZIP-Queries an DB-Schema angepasst
- `includes/protocol_zip_helper.php`:
- Die SELECT-Abfragen für Raum-, Feature- und Mängel-Fotos verwenden nun ausschließlich Spalten, die im aktuellen Datenbankschema tatsächlich vorhanden sind.
- `room_types`/`name_prefix`/`room_type` werden nicht mehr abgefragt; stattdessen wird der Anzeigename pro Raum aus `custom_name` bzw. einem generischen Fallback (`Raum {id}`) erzeugt.
- Dadurch schlagen die SQL-Statements nicht mehr wegen fehlender Spalten fehl, und vorhandene Foto-Datensätze können korrekt in die ZIP-Datei übernommen werden.
## 0.3.26 – ZIP-Fotoabfrage an DB-Schema angepasst & Demo-Bilder entfernt
- `includes/protocol_zip_helper.php`:
- Die SELECTs für Raum-, Feature- und Mängel-Fotos verwenden jetzt die tatsächlichen Spalten aus `protocol_rooms` und `room_types`:
- `COALESCE(pr.custom_name, CONCAT(rt.name_prefix, ' ', rt.name)) AS room_name`
- `rt.name AS room_type`
- Alle drei Abfragen joinen `room_types` über `pr.room_type_id`, analog zur Logik in `generate_pdf.php`.
- Damit schlagen die Queries nicht mehr wegen nicht existierender Spalten (`pr.name`, `pr.room_type`) fehl und liefern für vorhandene Fotos korrekte Datensätze.
- `uploads/rooms/`:
- Beispiel-/Testbilder aus dem ZIP entfernt, der Ordner bleibt leer zur Laufzeitbefüllung auf dem Server.
## 0.3.25 – Zusätzliche ZIP_DEBUG-Infos (Räume & Upload-Verzeichnis)
- `includes/protocol_zip_helper.php`:
- Loggt nun beim Start von `create_protocol_images_zip()` den aufgerufenen Protokoll-ID sowie, ob das Basis-Uploadverzeichnis (`/uploads`) gefunden wurde.
- Zusätzlich wird einmalig die Anzahl der Räume (`protocol_rooms`) für das aktuelle Protokoll als `ZIP_DEBUG` protokolliert.
- Damit können wir erkennen, ob das Problem an fehlenden Räumen, fehlenden Foto-Datensätzen oder ausschließlich an den Dateipfaden liegt.
## 0.3.24 – ZIP-Bilder-Logik an generate_pdf angeglichen
- `includes/protocol_zip_helper.php`:
- `create_protocol_images_zip()` komplett überarbeitet.
- Lädt jetzt zunächst alle Räume des Protokolls aus `protocol_rooms` (identisch zu `generate_pdf.php`) und arbeitet anschließend mit den Raum-IDs.
- Raumfotos werden über `protocol_room_photos` mit `WHERE protocol_room_id IN (...)` geladen – gleiche Abfrage wie in der PDF-Erzeugung.
- Feature-Fotos werden über `protocol_room_feature_photos` mit den gleichen Raum-IDs geladen.
- Mängel-Fotos werden über `protocol_room_issues` → `protocol_room_issue_photos` ermittelt, ebenfalls analog zur PDF-Erzeugung.
- Alle Bildpfade werden relativ zu `v22/uploads` aufgelöst, und fehlende Dateien werden als `ZIP_DEBUG` ins Error-Log geschrieben.
- Wenn keine einzige Datei in die ZIP übernommen werden konnte, wird die ZIP gelöscht und ein `ZIP`-Logeintrag geschrieben.
## 0.3.23 – ZIP-Debug-Logging für Bildpfade
- `includes/protocol_zip_helper.php`:
- Zusätzliche `ZIP_DEBUG`-Logeinträge für jede Fotoquelle:
- Anzahl gefundener Datensätze pro Bereich (Raumfotos, Feature-Fotos, Mängel-Fotos) sowie das erste `file_path`.
- Wenn eine Datei physisch nicht gefunden wird, wird jetzt pro Pfad ein `ZIP_DEBUG`-Eintrag mit absolutem und relativem Pfad geschrieben.
- So können wir auf dem Server eindeutig erkennen, ob das Problem an fehlenden DB-Datensätzen oder an falschen/alten Dateipfaden liegt.
## 0.3.22 – ZIP-Fehler sichtbar im Protokoll & detaillierteres Logging
- `includes/protocol_zip_helper.php`:
- Ergänzt um Zählung der tatsächlich in die ZIP übernommenen Dateien (`$addedCount`).
- Wenn kein einziges Foto hinzugefügt werden konnte, wird die ZIP verworfen und ein Eintrag über `appLogError()` geschrieben.
- Bei fehlender `ZipArchive`-Unterstützung oder Problemen beim Öffnen der ZIP-Datei wird ebenfalls ein Logeintrag geschrieben.
- Pfadauflösung der Bilddateien erfolgt jetzt konsistent relativ zu `v22/uploads`, identisch zu den Upload-Skripten.
- `download_images_zip.php`:
- Falls keine ZIP erzeugt werden konnte, erfolgt jetzt eine Rückleitung nach `view_protocol.php?id=…&zip_error=1` statt einer „nackten“ Fehlerseite.
- Fehler im `catch`-Block werden nun über `appLogError()` ins zentrale Fehler-Log geschrieben.
- `view_protocol.php`:
- Zeigt bei `?zip_error=1` oberhalb der Protokollansicht einen roten Hinweis („Für dieses Protokoll konnten keine Bilder gefunden oder gepackt werden.“) im Standard-Layout an.
## 0.3.21 – Bild-ZIP wie PDF-Logik & hübsche Fehlermeldungen
- `includes/protocol_zip_helper.php`:
- Die Auswahl der Mängel-Fotos basiert jetzt auf den Tabellen `protocol_room_issues` und `protocol_room_issue_photos` statt auf den alten, nicht mehr verwendeten `protocol_defects`/`protocol_defect_photos`.
- Damit nutzt der ZIP-Export dieselbe Datenbasis wie die PDF-Erzeugung; Bilder, die im PDF erscheinen, werden jetzt auch in der ZIP gefunden.
- `download_images_zip.php`:
- Neue Hilfsfunktion `render_zip_error_page()`, die Fehler in einem modernen Layout mit `layout_header.php`/`layout_footer.php` und einer roten Hinweis-Box (`alert alert-error`) darstellt.
- Fehlersituationen (ungültige ID, Protokoll nicht gefunden, keine Bilder vorhanden, interner Fehler) werden nicht mehr als „nackter Text“, sondern als saubere Seite mit Rück-Link zum Protokoll bzw. Dashboard angezeigt.
## 0.3.14
- copy_protocol.php: robust handling for missing `sort_order` column. Use information_schema check and dynamic ORDER BY.
- Added app_error_log in catch blocks for better logging.
## 0.3.11
- ZIP-Export: Alle Fotos eines Protokolls (Raumfotos, Feature-Fotos, Mängel-Fotos) werden in die Bild-ZIP aufgenommen.
- ZIP-Export: Dateinamen enthalten den Raumnamen sowie Hinweise auf Feature/Mangel (z. B. wohnzimmer_feature_1.jpg).
- Bild-Download: download_images_zip.php überarbeitet (SELECT * ohne nicht vorhandene Spalten, robustere Dateinamen, Fehlerlogging).
- Buttons: „Bilder downloaden“-Button in view_protocol.php zwischen „Protokoll erzeugen“ und „Protokoll kopieren“ ergänzt.
- Transaktionen: save_protocol.php commit() nur noch bei aktiver Transaktion mit sauberer Einrückung.
## 0.3.10
- ZIP-Download: Neues Hilfsmodul includes/protocol_zip_helper.php, das alle Raumfotos eines Protokolls in eine ZIP-Datei schreibt (Dateinamen nach Raumname + laufender Nummer).
- Neuer Endpunkt download_images_zip.php: erzeugt bei Bedarf eine ZIP-Datei mit allen Raumfotos und liefert sie als Download aus.
- Vorschau (preview.php): Bei geschlossenem Protokoll erscheint neben „PDF anzeigen“ ein zweiter blauer Button „Bilder downloaden“, der den ZIP-Download startet.
- save_protocol.php: Aufruf von $pdo->commit() abgesichert (Commit nur, wenn eine Transaktion aktiv ist), um PDOException „There is no active transaction“ zu verhindern.
## 0.3.09
- save_protocol.php: Aufruf von $pdo->rollBack() abgesichert, so dass nur bei aktiver Transaktion zurückgerollt wird (Fehler „There is no active transaction“ verhindert).
- save_protocol.php: Gefangene Exceptions werden nun zusätzlich über app_error_log in die Datei app_error.log geschrieben.
## 0.3.08
- Protokoll-Erstellung: Wenn beim Anlegen eines neuen Protokolls kein Vermieter erfasst wird, wird automatisch ein Vermieter-Eintrag aus den Hausverwaltungsdaten des Benutzers erzeugt (zuerst zugewiesener Mandant, sonst persönliche Einstellungen).
- Personen: Abschnittsüberschrift auf „Hausverwaltung / Vermieter“ geändert, damit klar ist, dass hier die Hausverwaltung eingetragen wird.
## 0.3.07
- Personen: Vermieter-Daten werden bei neuen / leeren Protokollen automatisch aus der zugewiesenen Hausverwaltung (Mandant) übernommen.
- Fallback: Wenn dem Benutzer keine Hausverwaltung durch den Admin zugewiesen ist, werden die unter „Einstellungen → Hausverwaltung“ hinterlegten Daten (Name, Adresse, Kontakt) als Vermieter vorbelegt.
## 0.3.06
- Dashboard: Suchfeld mit Label „Suche“ versehen.
- Dashboard: Clientseitige Paginierung (20 Protokolle pro Seite) mit Vor-/Zurück-Steuerung und Anzeige der Trefferzahl implementiert.
- Dashboard: Suche filtert alle geladenen Protokolle und berücksichtigt die Paginierung.
- Einstellungen: Trainingscenter-Link im Footer von settings.php entfernt.
## 0.3.05
- Sidebar-Header überarbeitet: Icon entfernt, Titel „Wohnungsübergabe.Online“ bleibt sauber im sichtbaren Bereich.
- Untertitel angepasst zu „Digitale Wohnungsübergabe“.
- Trainingscenter: Reihenfolge der Antwortoptionen pro Frage wird zufällig gemischt.
- Trainingscenter: Kein automatischer Redirect mehr – stattdessen Button „Zurück zum Dashboard“ nach bestandenem Level.
- Dashboard: Live-Suchfeld für Protokolle (Mieter, Adresse, Art, Status, Ersteller) ergänzt.
# Changelog
## 0.3.03-a
- Navigation: Trainingscenter in der linken Seitenleiste unter „System“ ergänzt – sichtbar direkt nach dem Login.
- UX: Trainingscenter-Eintrag sitzt zwischen „Einstellungen“ und „Passwort ändern“ und zeigt einen „NEU“-Hinweis, wenn eine neue Fragenversion vorhanden ist.
- Technik: layout_header.php lädt nun den Benutzerkontext und die Trainingskonfiguration, um den Trainingsstatus stabil auszuwerten.
## 0.3.02-o
- Trainingscenter: Fragenkatalog auf insgesamt 100 Fragen erweitert (Level-basiertes Lernsystem).
- Trainingscenter: Nach Beantwortung der ersten 5 Fragen eines Levels wird das Ergebnis angezeigt und bei vollständigen richtigen Antworten automatisch zurück zum Dashboard geleitet.
- Einstellungen: Trainingscenter ist jederzeit über einen Button unter Einstellungen erreichbar; Button blinkt, wenn neue Fragen-Versionen bereitstehen.
- Login: Produktname in „Wohnungsübergabe.Online“ geändert, das „.Online“ leuchtet grün im Login-Header.
- Dashboard: Neues Logo oben links in der Seitenleiste integriert (Haus mit Haken) unter der Marke „Wohnungsübergabe.Online“.
## 0.3.02-m-e
- Räume: Änderungen an der Räume-Liste (Sortierung / Drag & Drop) zurückgenommen, Stand wie in 0.3.02-l wiederhergestellt.
- Stabilität: Fehler im Error-Handler (Syntaxfehler in error_handler.php) behoben, der 500-Fehler verursachte.
- Logging: Globaler Error-Handler bleibt aktiv und schreibt nach uploads/app_error.log; close_protocol_error.log funktioniert wie zuvor weiter.
- DatenHölle: Stufe-1-Rätsel bleibt unverändert aktiv.
## 0.3.02-m-c
- DatenHölle: Erste Rätsel-Stufe eingebaut (3 Fragen zu Objekt/Personen/Räumen, Fotos & DSGVO als Trainingsquiz für Admins).
- UI: Höllen-Overlay bleibt im bestehenden Layout, erweitert um kleine Stufe-1-Geschichte.
- Logik: Abschluss-Button im Höllen-Overlay prüft jetzt Antworten und quittiert richtige Lösungen mit einem kurzen Hinweis.
## 0.3.02-m
- Fix: Alphabetische Sortierung der Räume funktioniert auch ohne mbstring (Fallback auf strtolower).
- Neu: Räume-Liste modernisiert (Card-Layout, besser lesbar auf Handy & Tablet).
- Neu: Sortieroptionen für Räume: Reihenfolge (Standard), Alphabetisch, „Mit Mängeln zuerst“.
- Neu: Drag & Drop für Räume; Reihenfolge wird pro Protokoll als sort_order gespeichert.
- DB: Spalte sort_order für protocol_rooms ergänzt (inkl. sicherem ALTER TABLE Fallback).
- Logging: Globaler Error-Handler schreibt nun zusätzlich nach uploads/app_error.log (hilfreich bei 500-Fehlern).
- DatenHölle: Schreibweise korrigiert und Text leicht erweitert als Vorbereitung für zukünftige Rätsel.
## 0.3.02-l
- Neu: Verstecktes „Changelog-Bossfight“-Easter Egg im Dashboard für Admins (Geheimbutton „💀 Changelog“ unten rechts).
- UI: Kleines Dev-Fun-Overlay („GAME OVER: changelog.md“) inkl. DatenHölle-Hinweis, ohne Einfluss auf normale Nutzer.
- Wartung: Versionsnummer auf 0.3.02-l angehoben und Login-Anzeige bleibt als BETA gekennzeichnet.
## 0.3.02-k
- Fix: Fehlerhafte Redirects in room_details.php korrigiert (kaputte URL mit room_id und Hash entfernt).
- Fix: room_id wird wieder korrekt gesetzt; Meldung „Kein Raum gewählt.“ erscheint nicht mehr nach Aktionen in den Räumen.
- Verbesserung: Hash-Anker (#room-issues-section, #room-textblocks-section, etc.) werden korrekt an die room_id angehängt.
## 0.3.02
- Mobile Navigation überarbeitet: Sidebar wird auf kleineren Geräten ausgeblendet und über einen festen Menü-Button (Burger-Menü) geöffnet.
- Menü-Button ist nun stets oben links sichtbar, auch beim Scrollen; Inhalt erhält dafür zusätzlichen oberen Abstand.
- Aktions-Menü im Dashboard auf Smartphones verbessert: Buttons wie „Vorschau“, „Bearbeiten“ und „Kopieren“ sind besser bedienbar und größer dargestellt.
## 0.3.01
- Dashboard-Protokolltabelle für Mobilgeräte optimiert: Zeilen werden als Karten dargestellt, Kopfzeile ausgeblendet.
- Jede Zelle zeigt jetzt ein Label per `data-label`, damit Inhalte auf dem Handy klar zugeordnet sind.
- Aktionsspalte wird auf Smartphones in eine gestapelte Buttonliste mit 100%-Breite umgebaut, damit alles gut bedienbar ist.
## 0.3.00
- Sondervereinbarungs-Seite überarbeitet: Textfeld jetzt vollbreit, mit einheitlichem, professionellen Styling im App-Layout.
- Neue CSS-Klasse `.textarea-block` für größere, komfortable Textareas eingeführt.
- Start des neuen Versionszweigs ab 0.3.xx.
## 0.22.55
- Mobile-Darstellung optimiert (Layout stapelt auf Smartphones, reduzierte Abstände, besser lesbare Titel).
- Buttons werden auf sehr kleinen Bildschirmen breiter/zentriert dargestellt.
- Tabellen sind in schmalen Ansichten horizontal scrollbar statt abgeschnitten.
- Karten- und Formularabstände für Handy/Tablet angepasst.
## 0.22.54
- Darstellung abgeschlossener Protokolle überarbeitet.
- Status-Badge jetzt groß & blau (zentriert).
- Hinweis „Überprüfen Sie alle Angaben…“ wird bei geschlossenem Protokoll nicht mehr angezeigt.
- Layout insgesamt harmonisiert.
## 0.22.53
- In `preview.php` wird bei bereits abgeschlossenen Protokollen unter dem Hinweis nun ein zentrierter blauer Button angezeigt, über den direkt die PDF-Ansicht geöffnet werden kann.
## 0.22.52
- Bei Abnahmen wird im Abschlussprozess nur noch geprüft, ob eine neue Anschrift (nach Auszug) beim Mieter hinterlegt ist; Kontoinhaber und IBAN sind nicht mehr Pflichtfelder.
- Die Hinweisbox in `preview.php` für fehlende Angaben bei Abnahmen wurde entsprechend angepasst (kein Hinweis mehr auf Kontoinhaber/IBAN).
## 0.22.51
- `data_privacy.php` zeigt statt eines freien Texteingabefeldes nun eine fest formulierte Datenschutzerklärung zur Verarbeitung der Protokolldaten an, passend zum Layout.
- `close_protocol.php` leitet bei fehlender Datenschutzerklärung bzw. fehlender neuer Anschrift/Bankverbindung bei Abnahmen zur Vorschau mit Fehlerparametern weiter.
- `preview.php` zeigt für diese Fehlerzustände gestaltete Hinweisboxen oberhalb der Protokollvorschau an.
## 0.22.48
- `generate_pdf.php` prüft vor dem Einbinden von Unterschriftsbildern, ob die zugehörigen Dateien existieren; fehlende Signatur-Dateien verhindern die PDF-Erzeugung nicht mehr.
- `close_protocol.php` bereinigt und an die Tabelle `protocol_extras` angepasst (Prüfung der Datenschutzerklärung) sowie mit robustem Fehler-Logging versehen.
## 0.22.47
- `close_protocol.php` mit globalem `try/catch` versehen; bei Fehlern wird ein Log `uploads/debug_close_protocol.log` geschrieben und zur Vorschau mit Fehlerparameter umgeleitet.
- Error-Handler bleibt aktiv, um weitere PHP-Probleme sichtbar/logbar zu machen.
## 0.22.46
- Defekten ABNAHME-Prüfblock in `close_protocol.php` vollständig entfernt, damit kein Syntax-/Parse-Error mehr auftreten kann.
- `core/error_handler.php` erweitert: ungefangene Exceptions und fatale Fehler werden nun ebenfalls im Browser als rote Box angezeigt.
## 0.22.45 – Zentraler Error-Handler
*Stand: 2025-12-08 22:30 Uhr*
- `core/error_handler.php` eingeführt: zentraler, schön formatierter PHP-Fehlerausgabe-Handler für den Debug-Modus.
- `config.php` um Konstante `APP_DEBUG` ergänzt (aktuell: `true`), sodass sich der Debug-Modus zentral steuern lässt.
- `core/bootstrap.php` lädt den Error-Handler automatisch, wenn `APP_DEBUG === true`.
## 0.22.44 – ABNAHME-Pflichtfeld-Check vorübergehend deaktiviert
*Stand: 2025-12-08 22:20 Uhr*
- Die zusätzliche Prüfung der Nachsendeanschrift/Bankverbindung bei ABNAHME in `close_protocol.php` wurde komplett auskommentiert, um HTTP-500 Fehler auszuschließen.
- Protokolle können wieder wie zuvor abgeschlossen werden; spätere Reaktivierung der Prüfung ist schrittweise möglich.
## 0.22.43 – SQL Fix in close_protocol
*Stand: 2025-12-08 22:10 Uhr*
- Defektes SELECT-Statement in `close_protocol.php` korrigiert (Mieter: Nachsendeanschrift + IBAN + Kontoinhaber werden jetzt aus `protocol_persons` korrekt gelesen).
## 0.22.42 – close_protocol Debug & Fix
*Stand: 2025-12-08 22:00 Uhr*
- Abnahme-Check für Nachsendeanschrift/Bankverbindung des Mieters in `close_protocol.php` bereinigt (sauberes SELECT mit `new_address`/`forwarding_address`, `iban`, `account_holder`).
- Zusätzliche Fehlerausgabe in `close_protocol.php` aktiviert (`display_errors`), um HTTP-500-Probleme besser sichtbar zu machen.
## 0.22.41 – Fix edit_persons Warning
*Stand: 2025-12-08 21:45 Uhr*
- Fehler `Undefined variable $forwardingColumn` in `edit_persons.php` behoben (Closure verwendet nun nur noch vorhandene Variablen).
- Dadurch treten keine Header-Warnungen mehr auf und die Weiterleitung nach dem Speichern der Personen funktioniert wieder sauber.
## 0.22.40 – Wizard-Flow & neue Anschrift
*Stand: 2025-12-08 21:30 Uhr*
- Seite `new_protocol.php` zeigt nur noch die Objektdaten an. Personen/Hausverwaltung/Mieter werden jetzt erst im Schritt „Personen“ gepflegt.
- Beim Speichern eines neuen Protokolls wird dank `from_edit_object` nun zuerst die Seite `edit_persons.php` geöffnet (statt direkt „Räume“).
- Die Nachsendeanschrift des Mieters (`Neue Anschrift (nach Auszug)`) wird über `edit_persons.php` sauber mit dem Feld `protocol_persons.new_address` verknüpft.
## 0.22.39 – Feld „Neue Anschrift (nach Auszug)” neu angebunden
*Stand: 2025-12-08 20:27 Uhr*
- Das Feld **„Neue Anschrift (nach Auszug)”** beim Mieter wurde technisch neu angebunden:
- Formularfeld heißt nun `mieter_new_address` und wird direkt in die Spalte `protocol_persons.new_address` geschrieben.
- Die dynamische Speicherlogik in `edit_persons.php` nutzt jetzt das Feld `new_address` ohne Umweg über `forwarding_address`.
- Beim Laden des Formulars wird der Wert aus `protocol_persons.new_address` wieder korrekt angezeigt.
- Beim ersten Aufruf von `edit_persons.php` wird – falls noch nicht vorhanden – die Spalte `new_address` automatisch in `protocol_persons` angelegt.
- `version.php` auf **0.22.39** aktualisiert.
## 0.22.38 – Nachsendeanschrift (Neue Anschrift nach Auszug) wird zuverlässig gespeichert
*Stand: 2025-12-08 20:11 Uhr*
- In `edit_persons.php` wird beim Laden nun sichergestellt, dass eine Spalte für die Nachsendeanschrift existiert:
- Es wird geprüft, ob `protocol_persons.forwarding_address` oder `protocol_persons.new_address` vorhanden ist.
- Falls keine der beiden Spalten existiert, wird automatisch `new_address` als `TEXT`-Spalte angelegt.
- Dadurch wird das Feld **„Neue Anschrift (nach Auszug)”** im Bereich **Mieter** ab sofort korrekt in der Datenbank gespeichert und beim erneuten Öffnen des Protokolls wieder angezeigt.
- Versionsdatei `version.php` auf **0.22.38** aktualisiert, damit Login/Interface und Changelog wieder dieselbe Versionsnummer verwenden.
## 0.22.36 – Raumbezogene Bildstruktur & Kautions-Hinweis
*Stand: 2025-12-08 20:30 Uhr*
- ZIP-Export nach Protokollabschluss:
- Dateiname des Bild-Archives jetzt nach Schema `<Mieter>_<Objekt>.zip` (z. B. `max_mustermann_musterstrasse_12_58095_hagen.zip`).
- Alle Bilder werden im ZIP nach Räumen gruppiert (z. B. `Wohnzimmer/Wohnzimmer1.jpg`, `Wohnzimmer/Wohnzimmer2.jpg`, `Bad/Bad1.jpg` usw.).
- Abnahme: Pflichtprüfung Nachsendeanschrift/Kautionsdaten:
- Bei Abnahme-Protokollen wird der Abschluss blockiert, wenn beim Mieter keine neue Anschrift, kein Kontoinhaber oder keine IBAN für die Mietkaution hinterlegt sind.
- Statt einer „leeren“ Seite erscheint nun in der Vorschau eine rote Hinweisbox mit Text und Link zurück zu den Personenangaben.
- Bugfix: Feld „Neue Anschrift (nach Auszug)“:
- Die eingegebene neue Anschrift wird jetzt korrekt in `protocol_persons` gespeichert – unabhängig davon, ob die Datenbankspalte `forwarding_address` oder das ältere `new_address` vorhanden ist.
- Beim erneuten Öffnen der Personenmaske wird das Feld „Neue Anschrift (nach Auszug)“ zuverlässig mit dem gespeicherten Wert vorbefüllt.
## 0.22.35 – Sprechende ZIP-Dateinamen für Bilder-Export
*Stand: 2025-12-08 19:00 Uhr*
- Beim Abschluss eines Protokolls werden die Bilder-ZIP-Archive nun mit einem sprechenden Namen erzeugt:
- Schema: `protocol_<Protokoll-ID>_<Mietername>_images.zip` (z. B. `protocol_42_max_mustermann_images.zip`).
- Der Name des Mieters wird aus `protocol_persons` (Rolle `MIETER`) übernommen und zu einem Dateinamen-Slug umgewandelt.
- Der Speicherort bleibt unverändert: `uploads/protocol_zips/…`.
- Der im Datensatz `protocols.images_zip_path` gespeicherte Pfad zeigt weiterhin auf diesen ZIP-Dateinamen.
## 0.22.34 – Schlüssel-Logik, Kautionsdaten & ZIP-Export der Bilder
*Stand: 2025-12-08 18:30 Uhr*
- Bereich **Schlüssel** erweitert:
- Neue Checkbox „Schließanlage vorhanden“, Speicherung in `protocols.has_master_key_system`.
- Sicherstellung eines zusätzlichen Standard-Schlüsseltyps **„Haus-/Wohnungstürschlüssel (Einheit)“** in `key_types`.
- Bereich **Personen / Mieter** erweitert:
- Neue Felder für **Kontoinhaber (Kaution)** und **IBAN (für Mietkaution)** beim Mieter.
- Speicherung der Daten in `protocol_persons.iban` und `protocol_persons.account_holder`.
- Bei Protokolltyp **ABNAHME** wird beim Abschluss geprüft, ob neue Anschrift sowie Bankverbindung (Kontoinhaber + IBAN) des Mieters ausgefüllt sind – sonst Abbruch mit Hinweis zurück zur Personenmaske.
- Bereich **Fotos / Dateien** erweitert:
- Beim Abschluss eines Protokolls werden alle Raum‑, Mangel‑ und Ausstattungs‑Fotos in ein ZIP-Archiv (`uploads/protocol_zips/protocol_<ID>_images.zip`) gepackt.
- Pfad des ZIP-Archivs wird – sofern die Spalte vorhanden ist – in `protocols.images_zip_path` abgelegt.
## 0.22.33 – Version & Changelog konsolidiert
*Stand: 2025-12-08 18:00 Uhr*
- Zentrale Versionsdatei `version.php` auf **0.22.33** gesetzt, damit Login, Dashboard und öffentlicher Changelog dieselbe Versionsnummer anzeigen.
- `CHANGELOG.md` aufgeräumt und nach oben hin um einen Sammel-Eintrag für die internen Entwicklungsstände **0.22.19–0.22.32** ergänzt.
- Interne Darstellung des Changelogs in `changelog.php` (intern) und `public_changelog.php` (Login-Link) geprüft – beide lesen weiterhin diese Datei.
- Hinweis: Frühere Einträge wurden inhaltlich nicht verändert, sondern nur nach unten „geschoben“, damit neue Versionen oben sichtbar sind.
## 0.22.32 – Textbausteine pro Raum speichern
*Stand: 2025-12-08 17:30 Uhr*
- `db.php`:
- Neue Tabelle `protocol_room_textblocks` für Textbausteine, die pro Raum/Protokoll gespeichert werden (lokale Nutzung, unabhängig von den globalen Vorlagen in `textblocks`).
- `room_details.php`:
- Bereich **„Textbausteine“** auf serverseitige Verarbeitung umgestellt (keine JavaScript-Popups oder Inline-Speicherlogik mehr nötig).
- Beim Klick auf **„➕ Textbaustein übernehmen“** wird der ausgewählte Baustein sofort in `protocol_room_textblocks` gespeichert.
- Alle für diesen Raum gespeicherten Bausteine werden unterhalb der Auswahl in einer Liste angezeigt.
- Jede Änderung an einem Baustein (Textarea + Button **„Speichern“**) wird beim Bestätigen automatisch in der Datenbank aktualisiert.
- Einzelne Bausteine können über **„Entfernen“** wieder aus dem Protokoll gelöscht werden.
## 0.22.31 – Layoutfix Textbausteine / Mängel
*Stand: 2025-12-08 17:10 Uhr*
- `room_details.php`:
- Die Karte **„Textbausteine“** wurde HTML-seitig bereinigt; fehlerhafte Reste (`style`-Attribut-Zerfall) führten dazu, dass nachfolgender Code als Text angezeigt wurde.
- Die Karten **„Textbausteine“** und **„Mängel“** sind wieder klar voneinander getrennt und erscheinen in eigenen Blöcken („Blasen“).
- Sichtbarer Fragment-Code wie `e="issue_title" placeholder="z.B. Loch in der Wand"` wird nicht mehr ausgegeben.
## 0.22.30 – Inline-Editor für Textbausteine (ohne Browser-Popups)
*Stand: 2025-12-08 16:45 Uhr*
- `room_details.php`:
- Das Bearbeiten von Textbausteinen erfolgt nun über einen Inline-Editor direkt in der Textbaustein-Blase.
- Ein Klick auf das ✏️-Icon öffnet unterhalb des jeweiligen Bausteins ein Eingabefeld mit „Speichern“ und „Abbrechen“.
- Es werden keinerlei Browser-Popups (`alert`, `prompt`, etc.) mehr verwendet – ideal für Tablets und mobile Geräte.
- Die Anpassung wirkt nur für das aktuelle Protokoll; die ursprüngliche Textbaustein-Vorlage in `textblocks` bleibt unverändert.
## 0.22.28 – Textbausteine nur in der Blase + Bearbeiten-Icon
*Stand: 2025-12-08 16:30 Uhr*
- `room_details.php`:
- Beim Übernehmen eines Textbausteins wird die Raumbeschreibung nicht mehr automatisch befüllt; sie bleibt komplett frei für individuelle Texte.
- Die ausgewählten Textbausteine erscheinen ausschließlich in der Textbaustein-Blase unterhalb der Auswahl.
- Neben jedem Baustein wird nun ein kleines ✏️-Symbol angezeigt, das direkt zur Bearbeitung des jeweiligen Textbausteins führt (`textblocks.php#tb-{id}`).
- `textblocks.php`:
- Jeder Eintrag (Formular) besitzt nun eine eigene Anker-ID (`id="tb-{id}"`), sodass Aufrufe mit `#tb-{id}` direkt zum richtigen Textbaustein scrollen.
## 0.22.27 – Textbausteine ohne Browser-Popup & schöner Button
*Stand: 2025-12-08 16:15 Uhr*
- `room_details.php`:
- Die bisherige Browser-Meldung (Alert) „Bitte zuerst in das Textfeld klicken …“ wurde entfernt.
- Beim Klick auf **„➕ Textbaustein übernehmen“**:
- Wird der Textbaustein automatisch an die Raumbeschreibung (`room_description`) angehängt.
- Er erscheint zusätzlich in der Textbaustein-Blase unterhalb der Auswahl; mehrere Bausteine werden untereinander addiert.
- Beschreibungstext angepasst: Hinweis, dass der Text automatisch an die Raumbeschreibung angehängt und unten gelistet wird.
- Button-Optik überarbeitet:
- Statt einer neutralen Outline-Schaltfläche jetzt eine primäre, hervorgehobene Schaltfläche mit „➕ Textbaustein übernehmen“.
## 0.22.26 – Eigene Karte für Textbausteine & Vorschau-Blase
*Stand: 2025-12-08 16:00 Uhr*
- `room_details.php`:
- Die Textbaustein-Auswahl wurde aus der Raumbeschreibung herausgelöst und in eine eigene Karte **„Textbausteine“** verschoben – optisch analog zu den Karten **„Mängel“** und **„Ausstattungen“**.
- Unterhalb der Auswahl befindet sich nun eine Vorschau-Blase:
- Jeder eingefügte Textbaustein wird dort als eigener Absatz mit Titel (falls gesetzt) und Text angezeigt.
- Die Blase ist optisch hervorgehoben (heller Hintergrund, gestrichelter Rahmen) und sitzt in derselben Karte wie die Textbaustein-Auswahl.
- Das Einfügen funktioniert weiterhin wie gewohnt:
- Der ausgewählte Baustein wird in das zuletzt fokussierte Textfeld (Raumbeschreibung oder Mängelbeschreibung) angehängt.
- Zusätzlich wird der Baustein in der Vorschau-Blase gelistet, damit nachvollziehbar bleibt, welche Bausteine verwendet wurden.
## 0.22.25 – Raumbeschreibung als eigene Karte & modernes Textbaustein-UI
*Stand: 2025-12-08 15:45 Uhr*
- `room_details.php`:
- Die Kopfkarte zeigt jetzt nur noch Titel, Zurück-Button und Objektadresse.
- Die Felder **„Anzeigename (optional)“** und **„Beschreibung / Notiz zum Raum“** wurden in eine eigene Karte *„Raumbeschreibung & Textbausteine“* ausgelagert – optisch analog zur Mängel-Karte.
- Das Textbaustein-UI wurde modernisiert:
- Kompakte Inline-Darstellung mit Label, Dropdown, Button „Text einfügen“ und Kurzbeschreibung.
- Position direkt oberhalb der Raumbeschreibung, damit klar ist, wohin der Text eingefügt wird.
- Verhalten bleibt wie gehabt: der Textbaustein wird in das zuletzt fokussierte Textfeld (z.B. Raumbeschreibung oder Mangelbeschreibung) eingefügt.
## 0.22.24 – Textbausteine für Räume & Mängel
*Stand: 2025-12-08 15:30 Uhr*
- Neue Tabelle `textblocks` in `db.php`:
- Verwaltung von wiederverwendbaren Textbausteinen (Titel, optionaler Raumtyp, Textinhalt, Ersteller, Zeitstempel).
- Neue Admin-Seite `textblocks.php`:
- Nur für Admins über den Bereich **System → Textbausteine** erreichbar.
- Anlegen, Bearbeiten und Löschen von Textbausteinen über eine moderne Kartenansicht.
- Integration in `room_details.php`:
- Über dem Raumformular gibt es nun eine Auswahl „Textbaustein einfügen“ mit Dropdown.
- Der ausgewählte Baustein wird in das zuletzt fokussierte Textfeld eingefügt (z.B. Raumbeschreibung oder Mängel-Beschreibung).
- JavaScript-Logik (`insertTextblockFromSelect`) sorgt dafür, dass der Text komfortabel und ohne Seitenreload an das Ende des Feldes angehängt wird.
## 0.22.20 – Hinweisbox in Vorschau integriert
*Stand: 2025-12-09 00:15 Uhr*
- `preview.php`:
- Die Warnung bei fehlenden Unterschriften (`error=missing_signatures`) wird nun innerhalb der Hauptkarte der Vorschau angezeigt, nicht mehr als volle Breitenleiste über der Seite.
- Optik an das bestehende Layout angepasst (Alert innerhalb des weißen Kartenrahmens, mit reduziertem Außenabstand).
- Styling vereinheitlicht mit anderen Hinweismeldungen (`alert alert-danger` wie bei Datenschutzhinweis).
## 0.22.19–0.22.32 – Interne Entwicklungsstände (Sammel-Eintrag)
*Stand: bis 2025-12-07*
- Mehrere Zwischenupdates am geführten Protokoll (Wizard), an der Signatur-Ansicht, an Layout/Styling des Dashboards sowie an der Hausverwaltungs- und Benutzerlogik.
- Verschiedene Bugfixes rund um Navigation, Preview-Ansichten und kleinere Datenbank-Anpassungen.
- Diese Stände wurden produktiv verwendet, aber nicht vollständig im Changelog dokumentiert; daher werden sie hier gesammelt aufgeführt.
## 0.22.19 – Sofortige Sperre nach Abschluss & PDF-Redirect
*Stand: 2025-12-08 22:45 Uhr*
- `close_protocol.php`:
- Nach erfolgreichem Abschluss wird nicht mehr zur Vorschau-Seite weitergeleitet.
- Stattdessen:
- Öffnet sich automatisch die PDF-Ausgabe in einem neuen Tab/Fenster (`generate_pdf.php?id=...`).
- Der aktuelle Tab wird nach kurzer Verzögerung automatisch zurück zum Dashboard (`dashboard.php`) geleitet.
- Dadurch gibt es kein Zeitfenster mehr, in dem ein normales Benutzerkonto nach dem Abschluss noch in Bearbeitungsseiten springen kann.
- Wizard-Aufräumen:
- Falls für das abgeschlossene Protokoll ein geführter Modus aktiv war (`$_SESSION['wizard_active']` / `$_SESSION['wizard_protocol_id']`), wird dieser beim Abschluss entfernt.
- Bestehende Sperrlogik:
- Die bereits vorhandene Sperre auf allen Bearbeitungsseiten (`edit_persons.php`, `edit_rooms.php`, `edit_keys.php`, `edit_meters.php`, `special_terms.php`, `data_privacy.php`) für geschlossene Protokolle wurde geprüft und bleibt unverändert aktiv.
## 0.22.19 – Fehlermeldung bei fehlenden Unterschriften
*Stand: 2025-12-08 23:30 Uhr*
- `close_protocol.php`:
- Wenn das Protokoll nicht abgeschlossen werden kann, weil noch nicht beide Parteien unterschrieben haben, wird keine nackte Textseite mehr ausgegeben.
- Stattdessen erfolgt ein Redirect zurück zur Vorschau (`preview.php`) mit dem Parameter `error=missing_signatures`.
- `preview.php`:
- Zeigt bei `error=missing_signatures` oberhalb der Kartenansicht eine optisch integrierte Warnbox mit dem Hinweis, dass sowohl Mieter/in als auch Vermieter/in unterschreiben müssen, bevor das Protokoll abgeschlossen werden kann.
## 0.22.18 – Wizard bleibt aktiv (Session-Fix)
*Stand: 2025-12-07 22:00 Uhr*
- Geführter Modus wird jetzt in der Session (`$_SESSION['wizard_active']` / `$_SESSION['wizard_protocol_id']`) gespeichert.
- Beim Wechsel über die obere Navigation (Objektdaten, Personen, Räume, Schlüssel, Zähler, Sondervereinbarung, Datenschutz, Vorschau) bleibt der Wizard aktiv, solange es sich um dasselbe Protokoll handelt.
- Alle relevanten Seiten (`new_protocol.php`, `save_protocol.php`, `edit_rooms.php`, `edit_keys.php`, `edit_meters.php`, `special_terms.php`, `data_privacy.php`, `room_details.php`) erkennen den Wizard jetzt auch ohne `?wizard=1`-Parameter korrekt über die Session.
- Nach dem endgültigen Abschluss eines Protokolls (`close_protocol.php`) wird der Wizard-Status für dieses Protokoll automatisch zurückgesetzt.
## 0.22.17 – Geführtes Protokoll & Assistent
### Neuer Button & Startmodus
- Auf der Protokollübersicht einen zweiten Button hinzugefügt:
- **„➕ Neues Protokoll“** – normales Protokoll wie bisher.
- **„⭐ Geführtes Protokoll“** – startet den neuen Schritt-für-Schritt-Assistenten.
- Der bisherige Link zum Anlegen eines neuen Protokolls wurde bereinigt (fehlerhafte Zeichen im `href` entfernt).
### Guided Mode / Assistent
- In `new_protocol.php` einen **guided mode** eingeführt:
- Parameter `guided=1` aktiviert den Assistenten.
- Seitentitel unterscheidet zwischen *„Neues Protokoll“* und *„Geführtes Protokoll“*.
- Hidden-Feld `wizard` steuert, ob der Nutzer im geführten Modus durch die Schritte geleitet wird.
### Räume & Mängel (edit_rooms.php)
- Für jeden Raum werden nun Mängel, Ausstattungen und Fotos ausgewertet.
- Im geführten Modus gilt:
- Jeder Raum benötigt **mindestens zwei Fotos**.
- Zusätzlich muss es mindestens **einen Eintrag** geben (Mangel oder Ausstattung).
- Erst wenn **alle Räume** diese Bedingungen erfüllen, erscheint der Button
**„Weiter zu Schlüsseln“**.
- Andernfalls erhält der Nutzer einen deutlichen Hinweis, dass noch Daten fehlen.
### Schlüssel (edit_keys.php)
- Nach dem Laden der Schlüssel wird geprüft, ob überhaupt Schlüssel erfasst wurden.
- Im geführten Modus:
- Button **„Weiter zu Zählern“** wird nur angezeigt, wenn mindestens **ein Schlüssel** vorhanden ist.
- Wenn noch keine Schlüssel erfasst sind, erscheint eine Warnmeldung und es geht **nicht weiter**.
### Zähler (edit_meters.php)
- Nach dem Laden der Zähler wird geprüft, ob jeder Zähler:
- eine **Zählernummer** und
- einen **aktuellen Stand** hat.
- Erst wenn alle Zähler vollständig sind, wird der Button
**„Weiter zu Sondervereinbarung“** angezeigt.
- Bei unvollständigen Zählern bleibt der Nutzer in diesem Schritt und erhält eine passende Warnmeldung.
### Technische Bereinigungen
- Alte, fehlerhafte Sequenzen mit `\$variable` in mehreren Dateien (u. a. `edit_rooms.php`, `edit_keys.php`, `edit_meters.php`, `data_privacy.php`, `special_terms.php`, `property_manager_helper.php`) wurden auf korrekte PHP-Variablen (`$variable`) bereinigt.
- Damit funktionieren `$_GET`, `$_POST`, `$wizard_mode` und andere Variablen wieder zuverlässig.
## 0.22.13 – Versionseintrag & Login-Changelog korrigiert
**2025-12-07 21:07 (Europe/Berlin)**
- `version.php`:
- Versionsangabe auf **0.22.13** aktualisiert, damit Login-Seite und Changelog-Link den aktuellen Stand anzeigen.
- `public_changelog.php`:
- Keine funktionale Änderung am Script selbst, aber Verweis im Login bleibt bestehen; es liest weiterhin `v22/CHANGELOG.md`.
- Hinweis:
- Die Inhalte von `v22/CHANGELOG.md` wurden bereits in 0.22.12 erweitert; mit 0.22.13 sind nun Anzeige (Version) und Inhalte konsistent.
## 0.22.13 – Aktuelle Änderungen (Stand 07.12.2025)
### Allgemein
- Versionsanzeige im Login-Bereich auf **v0.22.13** gesetzt.
- Dokumentation und Pflege des Changelogs als fester Bestandteil des Workflows vermerkt.
### Protokolle & Workflow
- Vorbereitung eines Schritt-für-Schritt-Wizards für neue Protokolle
(Objektdaten → Personen → Räume & Mängel → Schlüssel → Zähler → Sondervereinbarungen → Dateien → Vorschau).
- Pflicht-Checkbox für die **Datenschutzerklärung** wieder aktiviert:
Abschluss eines Protokolls ist nur nach Zustimmung möglich.
- Fehler behoben, bei dem nach Mietersignatur ein zweites leeres Signaturfeld erschien.
- Verhalten bei fehlender Vermieter-Signatur verbessert: interne Fehlermeldung statt externer Browserseite.
- Reset-Funktion der Unterschriften repariert, sodass nach „Unterschrift zurücksetzen“ wieder neu gezeichnet werden kann.
- Bei Mieter- und Vermieterunterschrift werden nun **voller Name und Datum** mit angezeigt.
- Hochgeladene Bilder in Protokollen werden für die Webansicht automatisch auf ca. **max. 800px Breite** skaliert.
- Admin kann abgeschlossene Protokolle wieder **freigeben**.
- Funktion zum **Kopieren** eines fertigen Protokolls vorbereitet, damit dieses als Vorlage für neue Mieter genutzt werden kann.
- Anzeige im Protokoll korrigiert: Reihenfolge jetzt **Mieter → Hausverwaltung → Firmenname** gemäß Einstellungen.
### Benutzer & Hausverwaltungen
- Verwaltung von Hausverwaltungen (Anlegen, Bearbeiten, Löschen) auf Admin beschränkt und technisch repariert.
- Speichern von Hausverwaltungs-/Firmendaten aus den Einstellungen funktioniert wieder zuverlässig.
- Benutzerverwaltung erweitert:
- Benutzer können wieder bearbeitet werden (inkl. Adminrechte und Passwortänderung).
- Einem Benutzer können **mehrere Hausverwaltungen** zugeordnet werden.
- Vorbereitung eines Modus, in dem Benutzer ohne Hausverwaltung alle Protokolle sehen können.
- Navigationsproblem auf einzelnen Unterseiten behoben (linker Navigationsbaum ist wieder vorhanden).
### Layout & Darstellung
- Dashboard-Ansicht angepasst: statt „ID #x“ wird nun vorrangig der **Mietername** dargestellt; die ID kann optional klein angezeigt werden.
- Favicon aus dem Hauslogo des Protokoll-Reiters erzeugt und im System eingebunden.
- Layout und Abstände für Tablet-Nutzung optimiert (Buttons, Bildgrößen, Spaltenbreiten).
### Backend & MySQL / Fehlerbehebungen
- Mehrere fehlende Tabellenfelder ergänzt und Querverweise korrigiert.
- Fehler **500 Internal Server Error** auf `settings.php` behoben
(Abgleich und Anpassung gegenüber der funktionierenden Version aus v21.14).
- Syntaxfehler in `layout_header.php` (unerwartetes `else`) behoben.
- Vorbereitung für spätere Oracle-Anbindung im Code angelegt.
- Bildvorschau / Lightbox stabilisiert und robuster gegen fehlerhafte Bilddaten gemacht.
## 0.22.12 – Geführte Protokoll-Erfassung (Wizard Schritt für Schritt)
**2025-12-07 20:59 (Europe/Berlin)**
- `new_protocol.php` / `save_protocol.php`:
- Beim Anlegen eines neuen Protokolls wird ein interner *Wizard-Modus* aktiviert.
- Nach dem Speichern der Objektdaten und Personen wird automatisch zur Raum-Erfassung weitergeleitet (*Schritt 3 von 7 – Räume & Mängel*).
- `edit_rooms.php`:
- Info-Hinweis oben, wenn der Wizard aktiv ist (Schritt 3 von 7).
- Am Seitenende ein Button **„Weiter zu Schlüsseln“**, der im Wizard automatisch nach `edit_keys.php` mit `wizard=1` verzweigt.
- `edit_keys.php`:
- Info-Hinweis **„Schritt 4 von 7 – Schlüssel“** für die geführte Erfassung.
- Am Seitenende ein Button **„Weiter zu Zählern“**, der im Wizard nach `edit_meters.php` weiterleitet.
- `edit_meters.php`:
- Info-Hinweis **„Schritt 5 von 7 – Zähler“**.
- Am Seitenende ein Button **„Weiter zu Sondervereinbarung“**.
- `special_terms.php`:
- Tabellendefinition `protocol_extras` um das Feld `privacy_explained_to_tenant` erweitert (inkl. Migration via `ALTER TABLE`).
- Im Wizard-Modus wird nach dem Speichern automatisch zum Datenschutzhinweis (`data_privacy.php?id=…&wizard=1`) weitergeleitet.
- `data_privacy.php`:
- Tabellendefinition `protocol_extras` ebenfalls um `privacy_explained_to_tenant` ergänzt (inkl. Migration).
- Formular-Action so angepasst, dass im Wizard-Modus `&wizard=1` an `data_privacy_save.php` übergeben werden kann.
---
## 0.22.11 – PDF-Header wie Objektpflege-Vorlage
**2025-12-07 20:30 (Europe/Berlin)**
- `generate_pdf.php`:
- Kopfbereich des Protokolls überarbeitet, angelehnt an die bestehende Objektpflege-Vorlage (PDF Nr. 2).
- Titel (*Übergabeprotokoll*, *Abnahmeprotokoll*, *Vorabnahmeprotokoll*) nun größer und linksbündig.
- Direkt darunter Datum/Uhrzeit des Protokolls in einem separaten Textblock.
- Objektadresse kompakt unter dem Datum ausgegeben.
- Optische Trennlinie unterhalb des Kopfbereichs ergänzt, um den Inhalt klar vom Header zu trennen.
---
## 0.22.08 – Hausverwaltungs-Logos & PDF-Layout
**2025-12-07 20:07 (Europe/Berlin)**
- `property_managers` / `property_manager_helper.php`:
- Spalte `logo_path` in der Tabelle `property_managers` ergänzt (inkl. automatischer Migration via `ALTER TABLE`, falls bereits vorhanden).
- Neue Hilfsfunktionen zum Setzen und Laden des Logo-Pfads sowie zum Verarbeiten von Logo-Uploads (Speicherung unter `uploads/property_managers/`).
- `settings.php`:
- Im Bereich *Hausverwaltungen (Mandanten)* kann pro Hausverwaltung ein Logo hochgeladen bzw. aktualisiert werden (Neuanlage + Bearbeitung).
- Formulare wurden auf `enctype="multipart/form-data"` angepasst, damit Datei-Uploads funktionieren.
- `generate_pdf.php`:
- PDF-Kopfbereich überarbeitet: Titel (*Übergabeprotokoll*, *Abnahmeprotokoll*, *Vorabnahmeprotokoll*) zentriert.
- Falls vorhanden, wird das Logo der zugeordneten Hausverwaltung oben rechts angezeigt.
- Neue FPDF-Unterklasse `PDF` mit `Footer()`, um auf jeder Seite die Adresse/Kontaktdaten der Hausverwaltung als Fußzeile auszugeben.
---
## 0.22.07 – Unterschriften-Textzeichen korrigiert
**2025-12-07 19:46 (Europe/Berlin)**
- `generate_pdf.php`:
- Das Sonderzeichen „–“ in der Unterschriftenzeile durch einen normalen Bindestrich „-“ ersetzt.
- Verhindert die Darstellung eines „?“ zwischen Name und „unterschrieben am“ im PDF.
---
## 0.22.06 – Namen in der Unterschriften-Sektion
**2025-12-07 19:42 (Europe/Berlin)**
- `generate_pdf.php`:
- Personenrollen aus `protocol_persons.role` (z. B. `MIETER`, `VERMIETER`, `HAUSMEISTER`) werden jetzt auf die internen Bezeichner `tenant`, `landlord` und `caretaker` gemappt.
- Dadurch erscheinen in der PDF-Unterschriften-Sektion die tatsächlichen Namen von Mieter/in und Vermieter/in statt nur Platzhalter oder `?`.
---
## 0.22.05 – PDF-Fehler: Personenname-Spalte
**2025-12-07 19:32 (Europe/Berlin)**
- `generate_pdf.php`:
- Abfrage der Personennamen robuster gemacht.
- Fällt automatisch von der alten Spalte `person_fullname` auf die aktuelle Spalte `name` zurück.
- Behebt den Fehler *"Unknown column 'person_fullname' in 'SELECT'"* beim PDF-Export.
---
## 0.22.04 – Signatur-Neuzeichnen auf Tablets repariert
### Geändert
- Das JavaScript in `layout_footer.php` wurde angepasst: Wenn eine vorhandene Unterschrift über „Unterschrift neu zeichnen“ zurückgesetzt wird, wird nach dem Einblenden des Signaturfelds die Canvas-Größe erneut berechnet (`resizeCanvas()`), damit Eingaben auch dann sichtbar werden, wenn das Feld beim Initialisieren noch ausgeblendet war.
## 0.22.03 – Unterschriften-Layout optimiert & Namen im PDF
### Geändert
- In `preview.php` werden nach erfasster Unterschrift nur noch die Vorschau und ein Button „Unterschrift neu zeichnen“ angezeigt; die großen leeren Signaturfelder darunter entfallen und erscheinen nur, wenn tatsächlich neu unterschrieben werden soll.
- Das JavaScript in `layout_footer.php` wurde erweitert: Beim Klick auf „Unterschrift neu zeichnen“ wird die gespeicherte Vorschau ausgeblendet, das Signaturfeld eingeblendet und der Button „Unterschrift speichern“ sichtbar gemacht.
- `generate_pdf.php` lädt jetzt zusätzlich die Namen aus `protocol_persons` und zeigt auf der Unterschriften-Seite die voll ausgeschriebenen Namen von Mieter/in und Vermieter/in zusammen mit dem Unterschriftsdatum an (z. B. „Max Mustermann – unterschrieben am …“).
## 0.22.02 – Verbesserte Tablet-Unterschriften & PDF-Integration
### Geändert
- Multi-Upload und Kamera-Unterstützung für Raum-, Mängel- und Ausstattungsfotos in `room_details.php` aktiviert (`multiple`, `accept="image/*"`, `capture="environment"`).
- Zählerfoto-Upload in `edit_meters.php` so angepasst, dass auf mobilen Geräten direkt die Kamera geöffnet wird (`capture="environment"`).
- Neue Tabelle `protocol_signatures` wird in `preview.php` automatisch angelegt und zum Laden der Mieter-/Vermieter-Unterschriften verwendet.
- In `preview.php` wurde ein neuer Abschnitt „Unterschriften“ ergänzt: zwei Signaturfelder (Canvas) für Mieter/in und Vermieter/in, mit deutlicher blauer Umrandung, Touch-fähig und mit Bildvorschau der gespeicherten Signatur.
- Neue Datei `sign_protocol.php` speichert Unterschriften als PNG unter `uploads/signatures/` und leitet bei fehlerhaften Signaturdaten zurück auf die Vorschau mit einer Fehlermeldung, statt eine nackte PHP-Seite anzuzeigen.
- In `close_protocol.php` wird das Abschließen eines Protokolls nur noch erlaubt, wenn sowohl Mieter/in als auch Vermieter/in in `protocol_signatures` vorhanden sind.
- `generate_pdf.php` wurde erweitert: Am Ende des PDFs wird eine Unterschriften-Seite erzeugt, auf der die gespeicherten Signaturbilder von Mieter/in und Vermieter/in eingebunden werden.
## 0.21.27 – Bilddateien beim Upload verkleinert
### Geändert
- Neue Helper-Datei `includes/image_helper.php` mit `optimize_image_for_web()` eingeführt.
- In `room_details.php` werden hochgeladene Raum-, Mängel- und Ausstattungsfotos nach dem Upload serverseitig verkleinert (max. ca. 1600×1200, JPEG mit reduzierter Qualität).
- In `edit_meters.php` werden Zählerfotos ebenfalls direkt nach dem Upload optimiert.
- Falls die GD-Library nicht verfügbar ist, bleiben die Originaldateien unverändert, damit der Upload trotzdem funktioniert.
## 0.21.26 – Galerie-Ansicht für Fotos
### Geändert
- `img.thumb` deutlich verkleinert (max. Breite ca. 320px, in Galerien ca. 180px) für kompaktere Darstellung bei vielen Fotos.
- In `room_details.php` werden Mängel- und Ausstattungsfotos jetzt als Galerie (`.photo-gallery`) mit kleinen Vorschaubildern dargestellt; Klick auf ein Bild öffnet eine große Ansicht (Lightbox).
- In `edit_meters.php` werden Zählerfotos ebenfalls als klickbare Thumbnails mit Lightbox-Ansicht dargestellt.
- `layout_header.php` und `layout_footer.php` um CSS und JavaScript für eine einfache Bild-Lightbox erweitert.
## 0.21.25 – Bilddarstellung im Web optimiert
### Geändert
- Globale CSS-Klasse `img.thumb` in `layout_header.php` ergänzt.
- Hochgeladene Fotos in `room_details.php` (Räume, Mängel, Ausstattung) und `edit_meters.php` (Zählerfotos) werden nun automatisch auf eine sinnvolle Breite skaliert (`max-width: 800px`, responsive) und verzerren nicht mehr das Layout.
## 0.21.24 – Changelog ohne Sidebar im eingeloggten Bereich
### Geändert
- `layout_header.php` so angepasst, dass für `changelog.php` die linke Sidebar und die Topbar ausgeblendet werden.
- Im eingeloggten Changelog wird damit nur noch der Inhaltsbereich angezeigt, ohne Navigations- oder System-Links.
## 0.21.23 – Sichere & öffentliche Changelog-Anzeige
### Geändert
- Die Versionsanzeige auf der Login-Seite verweist jetzt auf `public_changelog.php`, eine reine Informationsseite ohne Login-Pflicht und ohne Admin-Oberfläche.
- `changelog.php` im internen Bereich wurde mit `require_login()` abgesichert und kann nur noch von angemeldeten Nutzern aufgerufen werden.
- Neue zentrale Versionsnummer in `version.php` auf `0.21.23` umgestellt (neues Schema mit führender 0).
## v21.22 – Version-Link & Changelog-Seite
### Geändert
- Versionshinweis auf der Login-Seite mittig unter dem Login-Formular ausgerichtet.
- Die angezeigte Version ist nun ein klickbarer Link, der eine eigene `changelog.php` öffnet.
- `changelog.php` nutzt das bestehende Layout (`layout_header.php` / `layout_footer.php`) und zeigt die Inhalte der `CHANGELOG.md` in einer scrollbaren, formatierten Box an.
## v21.21 – Zentrale Versionsverwaltung
### Geändert
- Neue Datei `version.php` eingeführt, die die aktuelle Versionsnummer (`v21.21`) zentral bereitstellt.
- `index.php` zeigt die Versionsnummer nun dynamisch über `version.php` an, statt eines fest codierten Textes.
- Künftige Versionen müssen nur noch `version.php` anpassen, damit die Anzeige auf der Loginseite aktuell bleibt.
## v21.20 – Versionsnummer auf Loginseite
- Ersetzt 'Demo-Zugang' durch aktuelle Versionsnummer.
## v21.19 – DSGVO-Hinweis & Sondervereinbarungs-Layout
### Geändert
- `data_privacy_save.php`: Bei fehlendem Häkchen zur Datenschutzerklärung erfolgt kein nacktes PHP-Echo mehr, sondern ein Redirect zurück zur Datenschutzerklärungs-Seite mit Fehlermeldung in der UI.
- `data_privacy.php`: Zeigt nun eine rot hinterlegte Fehlermeldung (`alert alert-danger`), wenn die Einwilligung nicht gesetzt wurde.
- `layout_header.php`: Allgemeine Alert-Styles (`.alert`, `.alert-danger`, `.alert-success`) ergänzt und Form-Styles (`.form-label`, `.form-textarea`) hinzugefügt.
- `special_terms.php`: Sondervereinbarungs-Textfeld optisch überarbeitet (mittig, volle Breite, nicht frei skalierbar) und in eine strukturierte `form-section` eingebettet.
## v21.18 – Ersteller-Anzeige auch für Admin-Ansicht
### Geändert
- Admin-Ansicht der Protokollliste nutzt nun ebenfalls den erweiterten SELECT mit `tenant_names` und `creator_name`.
- Spalte „Ersteller“ wird damit auch für Admins korrekt mit dem Benutzernamen aus `users.username` befüllt, statt „Unbekannt“ anzuzeigen.
## v21.17 – Dashboard Fixes (Header & Ersteller-Spalte)
### Geändert
- Tabellen-Header der Protokollübersicht so angepasst, dass der blaue Kopfbereich über die gesamte Tabellenbreite läuft.
- Doppelte Status-Spalte entfernt; die Spalte „Ersteller“ zeigt nun korrekt den Benutzernamen des Erstellers statt des Status.
- Kleinere Typografie-Anpassungen bleiben erhalten (`.status-chip`, `.cell-small`).
## v22.16a – Dashboard Spaltenanpassung (Mieter, Ersteller, Freigaben)
### Geändert
- Dashboard-Tabelle: Erste Spalte zeigt nun den/ die Mieter (`tenant_names`) statt der numerischen ID.
- Neue Spalte „Ersteller“ zwischen „Status“ und „Freigegeben für“, basierend auf `users.username`.
- „Status“-Badge typografisch etwas kleiner.
- Spalte „Freigegeben für“ mit Klasse `.cell-small` (kleinere, dezentere Darstellung).
## v22.1-C – Projektstruktur-Refactoring (Core & Module-Basis)
**Release:** in Arbeit
**Entwickler:** ChatGPT (für Micha Udall / Objektpflege Hagen)
### Added
- Ordner `/core` mit `config.php`, `db.php` und `bootstrap.php` als zentrale Initialisierungsschicht.
- Ordner `/modules/settings` mit `settings_admin.php` zur Kapselung der Benutzerlisten-Logik.
- Ordner `/modules/protocols` mit `protocol_list.php` zur Kapselung der Dashboard-Protokoll-Logik.
### Changed
- `config.php` um die Konstanten `BASE_PATH` und `APP_ENV` erweitert.
- `index.php`, `auth.php`, `layout_header.php`, `logout.php` und `login_template.php` so angepasst, dass sie den Core-Bootstrap verwenden.
- `settings.php` so angepasst, dass die Benutzerliste über `get_all_users_for_admin($pdo)` aus dem Settings-Modul geladen wird.
- `dashboard.php` so angepasst, dass die Protokoll-Liste über `get_dashboard_protocols(...)` aus dem Protocol-Modul aufgebaut wird.
### Debug
- In `dashboard.php` temporär `ini_set('display_errors', '1');` und `error_reporting(E_ALL);` aktiviert, um Serverfehler direkt im Browser sichtbar zu machen (nur für Fehlersuche gedacht).
### Schritt 6 – Settings-Adminfunktion ausgelagert & Debug verfeinert
- `modules/settings/admin_roles.php` hinzugefügt:
- Enthält jetzt die Funktion `ensure_is_admin_column($pdo, $current_user_id)`, die zuvor direkt in `settings.php` definiert war.
- Kümmert sich um das Anlegen der Spalte `is_admin` in der Tabelle `users` und darum, den aktuellen Benutzer bei Bedarf als Admin zu markieren.
- `settings.php` angepasst:
- Bindet nun zusätzlich `modules/settings/admin_roles.php` ein.
- Die ursprüngliche Funktionsdefinition von `ensure_is_admin_column(...)` wurde entfernt, um Doppeldefinitionen zu vermeiden.
- `dashboard.php` angepasst:
- Die temporäre Fehleranzeige wird nun nur noch aktiviert, wenn `APP_ENV` nicht auf `production` steht:
`if (defined('APP_ENV') && APP_ENV !== 'production') { … }`
- Dadurch werden im Live-Betrieb keine Debug-Warnungen mehr angezeigt, während eine Entwicklungsumgebung weiterhin vollständige Fehlermeldungen sehen kann.
### Schritt 7 – Protokoll-Aktionen modularisiert (`modules/protocols/actions.php`)
- Neuen Helfer `modules/protocols/actions.php` hinzugefügt:
- Funktion `toggle_protocol_share($pdo, $protocol_id)`:
- Kapselt das Umschalten der Freigabe (`visible_for_all` 0/1) für ein Protokoll.
- Funktion `delete_protocol($pdo, $protocol_id)`:
- Kapselt das Löschen eines Protokolls anhand seiner ID.
- `dashboard.php` angepasst:
- Bindet nun zusätzlich `modules/protocols/actions.php` ein.
- Die bisher im Dashboard direkt enthaltene Logik für:
- Freigabe umschalten (`UPDATE protocols SET visible_for_all = …`)
- Löschen eines Protokolls (`DELETE FROM protocols WHERE id = ?`)
wurde durch Aufrufe der neuen Modul-Funktionen ersetzt.
- Vorteil:
- Die fachliche Logik für Protokoll-Aktionen ist an einer zentralen Stelle gekapselt
und kann später auch von anderen Seiten (z.B. eigener Protokollverwaltung, API, etc.)
wiederverwendet werden, ohne das Dashboard weiter aufzublähen.
### Schritt 8 – Sichtbarkeit der Protokolle für Nicht-Admins korrigiert
- `dashboard.php` angepasst:
- Die Protokoll-Liste (`$rows`) wird jetzt unabhängig vom Adminstatus immer über
`get_dashboard_protocols($pdo, $current_user_id, $is_admin, $has_is_admin, $property_manager_id, $can_see_all);`
befüllt.
- Zuvor wurde diese Funktion nur innerhalb eines `if ($is_admin) { ... }`-Blocks aufgerufen, wodurch
Nicht-Admin-Benutzer fälschlicherweise keine Protokolle angezeigt bekamen (auch dann nicht, wenn
`visible_for_all = 1` oder `can_see_all = 1` gesetzt war).
- Ergebnis:
- Admins sehen weiterhin alle Protokolle.
- Normale Benutzer sehen jetzt gemäß der bestehenden Logik:
- eigene Protokolle,
- ggf. Protokolle derselben Hausverwaltung,
- freigegebene Admin-Protokolle (`visible_for_all = 1`),
- sowie – falls `can_see_all = 1` und keine Hausverwaltung zugeordnet ist – alle Protokolle.
### Schritt 9 – Fehler bei `can_see_all` (500-Fehler für User) behoben
- `modules/protocols/protocol_list.php` angepasst:
- In der Funktion `get_dashboard_protocols(...)` wurde der Parameter-Übergabe-Mechanismus zur PDO-Query korrigiert.
- Bisher wurde unabhängig vom gewählten SQL immer ein Parameter-Array `[':uid' => $current_user_id, ':pm_id' => …]` an `$stmt->execute($params)` übergeben.
- In dem speziellen Fall, in dem ein Benutzer
- die Spalte `is_admin` besitzt,
- `can_see_all = 1` gesetzt ist und
- **keine** Hausverwaltung (`property_manager_id` leer) hat,
wurde ein SQL ohne Platzhalter (`:uid`, `:pm_id`) generiert, aber trotzdem ein Parameter-Array übergeben.
- Das führte zu einem PDO-Fehler „Invalid parameter number“ und damit zu einem HTTP 500 nur für diese Benutzer.
- Neues Verhalten:
- Es wird nun geprüft, ob `:uid` bzw. `:pm_id` im SQL überhaupt vorkommen.
- Nur vorhandene Platzhalter werden mit Werten befüllt.
- Wenn kein Platzhalter vorkommt (z.B. bei `can_see_all` ohne Hausverwaltung), wird `$stmt->execute()` ohne Parameter aufgerufen.
- Ergebnis:
- Benutzer mit gesetztem Häkchen **„Alle Protokolle sehen (ohne Hausverwaltung)“** können das Dashboard jetzt ohne 500-Fehler öffnen und sehen die erwarteten Protokolle.
### Schritt 10 – Protokolle gezielt für einzelne Benutzer freigeben
- Neues Feature: „Freigeben an bestimmten Benutzer“ im Dashboard.
- `modules/protocols/actions.php` erweitert:
- Neue Funktion `ensure_protocol_user_shares_table($pdo)`:
- Legt bei Bedarf die Tabelle `protocol_user_shares` an:
- `id`, `protocol_id`, `user_id`, `created_at`
- Unique-Index auf (`protocol_id`, `user_id`), um doppelte Einträge zu vermeiden.
- Neue Funktion `share_protocol_with_user($pdo, $protocol_id, $user_id)`:
- Stellt sicher, dass die Tabelle existiert.
- Trägt eine gezielte Freigabe für einen bestimmten Benutzer ein (`INSERT IGNORE`).
- `modules/protocols/protocol_list.php` angepasst:
- Die Funktion `get_dashboard_protocols(...)` berücksichtigt jetzt zusätzlich:
- Protokolle, für die in `protocol_user_shares` ein Eintrag für den aktuellen Benutzer existiert.
- Dazu wurden die jeweiligen SQL-Varianten um eine `EXISTS`-Bedingung erweitert:
- `OR EXISTS (SELECT 1 FROM protocol_user_shares pus WHERE pus.protocol_id = p.id AND pus.user_id = :uid)`
- Zu Beginn der Funktion wird – falls verfügbar – `ensure_protocol_user_shares_table($pdo)` aufgerufen, um die Tabelle sicherzustellen.
- `dashboard.php` erweitert:
- Lädt eine Liste potenzieller Ziel-Benutzer (`$share_users`) für Admins:
- `SELECT id, username FROM users WHERE id <> :current_user_id ORDER BY username ASC`.
- Neue POST-Action:
- Wenn ein Admin im Dashboard ein Protokoll gezielt für einen Benutzer freigibt (`share_protocol_id`, `share_user_id`), wird `share_protocol_with_user($pdo, $pid, $uid)` aufgerufen.
- UI-Anpassung in der Aktions-Spalte:
- Bisheriger Button:
- `Für Nutzer freigeben` (globale Freigabe via `visible_for_all`).
- Zusätzlich:
- Dropdown mit allen Benutzern und Button **„Für Benutzer freigeben“**, um ein Protokoll nur für einen ausgewählten Benutzer freizugeben.
- Verhalten:
- Globale Freigaben (`visible_for_all`) funktionieren wie bisher.
- Das Häkchen „Alle Protokolle sehen (ohne Hausverwaltung)“ funktioniert weiterhin wie in den vorherigen Schritten korrigiert.
- Neu: Admins können ein Protokoll gezielt für einzelne Benutzer freigeben, ohne es für alle sichtbar zu machen.
### Schritt 11 – Benutzerfreigaben anzeigen & wieder entfernen
- `modules/protocols/actions.php` erweitert:
- Neue Funktion `get_protocol_user_shares_map($pdo, $protocol_ids)`:
- Liefert für eine Liste von Protokoll-IDs alle zugehörigen Benutzerfreigaben (inkl. `user_id` und `username`).
- Neue Funktion `delete_protocol_user_share($pdo, $protocol_id, $user_id)`:
- Entfernt eine gezielte Benutzerfreigabe aus `protocol_user_shares`.
- `dashboard.php` angepasst:
- Nach dem Laden der Protokoll-Liste (`$rows`) wird jetzt eine Map `$share_map` mit Benutzerfreigaben je Protokoll ermittelt.
- Neue Spalte **„Freigegeben für“** in der Protokolltabelle:
- Zeigt für jedes Protokoll:
- „Alle Nutzer“, falls `visible_for_all = 1`.
- und/oder eine kommaseparierte Liste der Benutzernamen, für die eine gezielte Freigabe in `protocol_user_shares` eingetragen ist.
- Neue Admin-Aktion:
- Unter den bisherigen Buttons (Vorschau, Bearbeiten/Kopieren, globale Freigabe, gezielte Freigabe) gibt es jetzt:
- Ein Dropdown „Freigabe entfernen für …“ mit den Benutzern, für die dieses Protokoll gezielt freigegeben wurde.
- Einen Button **„Freigabe entfernen“**, der `delete_protocol_user_share($pdo, $pid, $uid)` aufruft.
- Ergebnis:
- Admins sehen im Dashboard auf einen Blick, für wen ein Protokoll freigegeben ist.
- Admins können gezielte Freigaben für einzelne Benutzer bequem wieder entfernen, ohne das Protokoll selbst zu löschen oder die globale Freigabe zu beeinflussen.
### Schritt 12 – Aktionen-Spalte kompakter & moderner gestaltet
- `layout_header.php`:
- Neue Hilfsklassen `.row-actions`, `.btn-sm` und `.select-sm` für kompakte, pill-förmige Buttons und schlanke Select-Felder ergänzt.
- `dashboard.php`:
- Die Aktionen-Spalte der Protokoll-Liste wurde auf eine flexible „Action-Bar“ (`<div class="row-actions">…`) umgebaut.
- Alle Buttons (Vorschau, Bearbeiten/Anzeigen, Kopieren, globale Freigabe, Benutzerfreigabe, Freigabe entfernen, Löschen) verwenden jetzt die kompakte Klasse `btn-sm`.
- Die Select-Felder für Benutzer- und Freigabe-Auswahl verwenden die kompakte Klasse `select-sm`.
- Ziel:
- Jede Protokollzeile bleibt deutlich flacher, auch wenn viele Aktionen verfügbar sind.
- Die Übersicht wird bei vielen Protokollen klarer und professioneller, ohne Funktionalität zu verlieren.
## v21.12 – Hausverwaltungsdaten, Sichtbarkeit & Mandanten
**Release:** automatisch generiert
**Entwickler:** ChatGPT (für Micha Udall / Objektpflege Hagen)
### 🔧 Änderungen
- `new_protocol.php`:
- Überschrift „Vermieter“ in „Hausverwaltung“ geändert.
- Hausverwaltungsdaten (Name, Adresse, Kontakt) werden automatisch aus den Benutzereinstellungen (`user_settings`) übernommen.
- `db.php`:
- Neue Spalte `visible_for_all` für `protocols` wird bei Bedarf automatisch angelegt (für Admin-Freigaben).
- `dashboard.php`:
- Normale Benutzer sehen nur noch:
- eigene Protokolle (`created_by` = aktueller Benutzer) sowie
- Protokolle, die von einem Admin freigegeben wurden (`visible_for_all = 1`).
- Admins können Protokolle per Button „Für Nutzer freigeben“ / „Freigabe entfernen“ bereitstellen.
- `includes/property_manager_helper.php` neu:
- Tabelle `property_managers` (Hausverwaltungen) wird automatisch angelegt.
- Spalte `property_manager_id` in `users` wird bei Bedarf automatisch angelegt.
- `settings.php`:
- Neuer Admin-Bereich „Hausverwaltungen (Mandanten)“:
- Hausverwaltungen anlegen (Name, Adresse, Kontakt).
- Übersicht aller Hausverwaltungen.
- Benutzerverwaltung erweitert:
- Jeder Benutzer kann per Dropdown einer Hausverwaltung zugeordnet werden.
### 🧠 Verhalten
- Jeder Benutzer pflegt unter „Einstellungen“ seine eigenen Firmendaten & Hausverwaltungsdaten.
- Beim Anlegen eines neuen Protokolls werden diese Daten automatisch im Abschnitt „Hausverwaltung“ vorbelegt.
- Admins können:
- Protokolle zentral freigeben (sichtbar für normale Benutzer).
- Beliebig viele Hausverwaltungen (Mandanten) anlegen.
- Benutzer einer Hausverwaltung zuordnen, damit klar ist, zu welcher HV sie gehören.
erblick)
### v21.10
- Benutzerverwaltung unter „Einstellungen“ ergänzt (Benutzer anlegen + Liste der Benutzer).
- Erste Variante der Admin-Erkennung über `is_admin`.
### v21.9
- `settings.php` an bestehende Auth-/DB-Struktur angepasst.
- 500er-Fehler beim Aufruf von `settings.php` behoben.
### v21.8
- Erste Version der Einstellungsseite (Firmendaten / Hausverwaltung).
- `sql/user_settings.sql` eingeführt (manuelles Anlegen der Tabelle).
### v21.7 und älter
- Grundfunktionen für Protokollsystem, Kopierfunktion, Bildskalierung, Datenschutz-Checkbox, Schreibschutz für abgeschlossene Protokolle, etc.
## v21.15
- Erweiterung Benutzer-Rollen/Sichtlogik:
- Neues Flag `can_see_all` für Benutzer (Spalte in `users`-Tabelle wird automatisch angelegt).
- In der Benutzerverwaltung kann pro Benutzer (ohne zugeordnete Hausverwaltung) die Option **„Kann alle sehen“** per Checkbox gesetzt werden.
- Backend-Logik im Dashboard angepasst:
- Wenn ein Benutzer **keine** Hausverwaltung hat und `can_see_all=1`, sieht er alle Protokolle.
- Wenn ein Benutzer eine Hausverwaltung hat, sieht er eigene Protokolle, die Protokolle derselben Hausverwaltung sowie freigegebene Admin-Protokolle.
- Einstellungen (`settings.php`) angepasst:
- Benutzerliste lädt jetzt `can_see_all` mit.
- Neue POST-Action `toggle_can_see_all` zum Speichern der Einstellung.
## v21.16
- Bugfix für Einstellungen (settings.php):
- Absicherung der neuen Spalte `can_see_all`, falls die Datenbank keine ALTER-Berechtigung hat.
- Benutzerliste fragt `can_see_all` nur dann ab, wenn die Spalte in der Tabelle `users` tatsächlich existiert.
- Die Checkbox „Kann alle sehen“ wird sauber ausgeblendet, wenn das Flag in der Datenbank nicht zur Verfügung steht.
## v21.17
- Bugfix: Kompatibilität `settings.php` mit älteren Datenbanken ohne `property_manager_id`-Spalte oder ohne ausreichende ALTER-Rechte:
- Die Benutzerliste prüft jetzt dynamisch, ob `property_manager_id` und `can_see_all` tatsächlich existieren.
- Die SELECT-Statements holen nur dann `property_manager_id`/`can_see_all`, wenn die Spalten in `users` wirklich vorhanden sind.
- So werden `Unknown column ... in 'field list'`-Fehler und daraus resultierende HTTP 500-Fehler vermieden.
## v21.18
- Bugfix: `settings.php` – defekte/durch "..." gekürzte SELECT‑Statements wurden entfernt.
- Die Benutzerliste baut jetzt die Spaltenliste dynamisch auf Basis der tatsächlich vorhandenen MySQL‑Spalten (`is_admin`, `property_manager_id`, `can_see_all`) auf.
- Bei SQL‑Fehlern wird automatisch auf eine stabile Minimalabfrage (`id, username, created_at`) zurückgefallen, statt einen HTTP 500 zu erzeugen.
- Stabilität der MySQL‑Anbindung:
- Tabellen und Spalten für Hausverwaltungen (`property_managers`, `property_manager_id`) und Benutzereinstellungen (`user_settings`) werden weiterhin über Helper‑Funktionen mit `CREATE TABLE IF NOT EXISTS` bzw. `ALTER TABLE` bei Bedarf automatisch angelegt.
## v22.1-D – Modernes UI-Redesign (Tablet-Style)
### Schritt 13 – Globales Layout & Design überarbeitet
- `layout_header.php` (globale Styles):
- Farbpalette modernisiert:
- Hintergrund jetzt mit einem soften radialen Verlauf (`#eef2ff` → `#f9fafb`) für eine leichte „App“-Anmutung.
- Primärfarbe auf ein modernes Indigo (`#4f46e5` / `#6366f1`) umgestellt.
- Danger-Farbe auf `#ef4444` aktualisiert.
- Border-Radien (`--radius-lg`, `--radius-md`) vergrößert und Schatten (`--shadow-soft`) leicht verstärkt.
- Sidebar:
- Hintergrund leicht transparentes Weiß mit `backdrop-filter: blur(18px)` für einen „Glas“-Effekt.
- Etwas mehr Innenabstand und weichere Border für eine tabletartige linke Navigationsleiste.
- Sidebar-Logo:
- Größer und mit modernem Verlauf (`#6366f1` → `#22c55e`) und deutlichem Glow/Shadow – wirkt wie ein App-Icon.
- Haupt-Content:
- Karten (`.card`) mit stärker gerundeten Ecken, mehr Innenabstand und zentrierter Maximalbreite (max. 1200px) versehen, dadurch wirkt die Seite auf größeren Bildschirmen wie eine zentrale „App-Fläche“.
- Navigation:
- `nav-link`-Typografie und Abstände leicht vergrößert und auf die neue Primärfarbe abgestimmt.
- Hover- und Active-Zustände mit subtileren, halbtransparenten Indigo-Hintergründen gestaltet.
- Topbar:
- User-Badge (`.topbar-user`) mit feinem Rand und transparentem Hintergrund aufgefrischt.
- Logout-Link (`.topbar-link`) wirkt jetzt wie ein kleiner, heller Pill-Button inklusive Shadow im Hover-Zustand.
- Buttons:
- Grund-Buttons (`.btn`) etwas größer und „griffiger“ gemacht.
- Primär-Buttons (`.btn-primary`) nutzen einen Verlauf (Indigo) mit stärkerem Glow, passend zum App-Look.
- Outline- und Danger-Buttons mit dezenteren, moderneren Rändern.
- Content-Layout:
- `.content > .card` erhält eine zentrale Maximalbreite, so dass der Inhalt wie ein zentriertes Tablet-Layout wirkt und an großen Viewports nicht „verloren“ wirkt.
- Bestehende Komponenten (Tabellen, Status-Chips, Formulare, Protokoll-Liste) wurden visuell an das neue Farbschema und die neuen Radien angepasst, ohne das Verhalten zu ändern.
### Schritt 14 – UI-Redesign optisch stärker hervorgehoben
- `layout_header.php` weiter angepasst:
- Seitenhintergrund von radialem auf diagonalen Verlauf (`linear-gradient(135deg, #e0e7ff, #f9fafb)`) umgestellt, damit das neue Design deutlicher sichtbar wird.
- Sidebar-Hintergrund von fast weiß auf einen vertikalen Indigo-Verlauf geändert:
- `background: linear-gradient(180deg, rgba(79,70,229,0.16), rgba(79,70,229,0.03));`
- wirkt nun stärker wie eine eigene „App-Leiste“ statt nur ein weißer Block.
- Karten (`.card`) mit stärkerem Shadow und sichtbarer Border versehen:
- Radius auf 24px, Schatten `0 24px 55px rgba(15,23,42,0.18)` und feine helle Linie, um die zentrale Fläche klar vom Hintergrund zu trennen.
- Überschrift (`.card-title`) etwas größer und fetter (1.6rem, `font-weight: 800`, leicht negative Laufweite) für einen deutlichen App-Header.
- Untertitel (`.card-subtitle`) minimal heller, um den Fokus auf die Hauptüberschrift zu legen.
- Tabellenlayout (`.table-modern`):
- Vertikale Padding leicht reduziert, um die Protokollzeilen kompakter zu machen.
- Zebra-Streifen für jede zweite Zeile sowie ein etwas kräftigerer Hover-Hintergrund (`#e5edff`) hinzugefügt, damit viele Protokolle übersichtlicher wirken.
- Ziel:
- Auf den ersten Blick soll das Layout stärker nach „moderner App“ wirken und nicht mehr wie eine klassische, flache Web-Tabelle.
## v22.2 – Komplettes App-Style Redesign (Dark Tablet UI)
### Schritt 15 – Vollständiges UI-Neudesign für Finger-/Tabletbedienung
- `layout_header.php` – Der komplette `<style>`-Block wurde neu aufgebaut, mit Fokus auf:
- **App-ähnliches Dark-Theme**:
- Hintergrund: radialer Verlauf von `#111827` zu `#020617` (dunkles Navy / nahezu schwarz).
- Zentrale Oberflächen (`.card`, `.form-section`) in dunklen, leicht verlaufenden Panels mit kräftigem Glow/Shadow.
- **Seitliches App-Menü (Sidebar)**:
- Dunkler, radialer Hintergrund mit subtiler Indigo-Tönung.
- Logo-Badge als leuchtendes, rundes App-Icon mit Conic-Gradient (`#22c55e` → `#6366f1`).
- Titel „Wohnungsübergabe“ und Subtitel „Objektpflege Hagen“ neu gestylt (`.sidebar-title`, `.sidebar-subtitle`).
- Navigation (`.nav-link`) mit klaren Active-/Hover-Zuständen auf dunklem Hintergrund.
- **Topbar**:
- User-Badge (`admin`) als dunkler Pill-Button mit grünem Statuspunkt.
- Logout-Link als klarer, pill-förmiger Button mit Hover-Schatten.
- **Buttons (Fingerfreundlich)**:
- `min-height: 44px` für `.btn` – optimiert für Touch-Eingaben.
- Primärbutton (`.btn-primary`) mit kräftigem Indigo-Gradient und deutlichem Glow.
- Danger-/Outline-Buttons für klare, sichtbare Aktionen auf dunklem Hintergrund.
- Bestehende kompakte Varianten (`.btn-sm`, `.select-sm`) integriert, aber weiterhin groß genug für Tablet-Bedienung.
- **Protokoll-Tabelle im App-Stil**:
- Kopfzeile mit blauem Verlauf (`.table-modern thead`).
- Zeilen mit dunklen Zebra-Streifen (abwechselnd leicht unterschiedliches Navy).
- Hover hebt Zeile mit kräftigem Blau-Ton hervor.
- Table wrapper (`.table-wrapper`) mit abgerundeten Ecken und Border, damit die Liste wie ein eigenes Modul wirkt.
- **Formulare & Einstellungen**:
- Inputs (`.form-control`) als dunkle, pill-förmige Felder mit deutlicher Fokus-Markierung.
- Form-Sektionen (`.form-section`) als abgesetzte Bereiche mit eigenem Rahmen und Hintergrundverlauf.
- **Responsives Verhalten / Tablet & Mobile**:
- Bis 1024px: Karten und Padding leicht angepasst, um auf kleineren Screens besser zu wirken.
- Unter 820px:
- Layout wechselt auf Spalten-Layout – Sidebar wandert nach oben und wird zur horizontal scrollbaren Navigationsleiste.
- Navigationstitel (ÜBERSICHT / SYSTEM) werden ausgeblendet, nur Icons + Text bleiben.
- `row-actions` in Protokoll-Liste werden spaltenweise gestackt – alle Buttons werden vollbreit, ideal für Touch.
- Formularraster (`.form-grid`) wird einspaltig, damit man Felder auf dem Handy / Tablet bequem nacheinander ausfüllen kann.
- Alle bestehenden Funktionen (Protokoll-Liste, Freigabe-Logik, Einstellungen, Benutzerverwaltung etc.) bleiben unverändert, es handelt sich ausschließlich um ein optisches Redesign.
## v22.2 – Neues helles Tablet-UI (komplettes Redesign)
### Schritt 15 – Komplettes Oberflächen-Redesign für Tablets & Desktop
- `layout_header.php` – gesamter `<style>`-Block neu aufgebaut:
- Neues, klares Farbkonzept in hellen Blau-/Weißtönen:
- Primärfarbe `#2563eb` (Blau), ergänzt durch weiche Akzentfarben (Grün für „Erfolg“ und Rot für Fehler).
- Hintergrund mit leichtem radialen Verlauf (`e5edff → f3f4f8 → fefefe`) für eine moderne App-Anmutung.
- Neues Layout-Raster:
- `.app-shell` nutzt ein zweispaltiges Grid: linke Sidebar (Navigation), rechte Content-Fläche.
- Ab 1024px wird die Sidebar kompakter, ab 768px wandert sie als horizontale Leiste nach oben (mobil-/Tablet-tauglich).
- Sidebar (Navigation) komplett neu gestaltet:
- Frisches App-Logo als farbiger Gradient-Badge mit Glow.
- Typografie für Titel/Untertitel modernisiert.
- Navigationselemente (`.nav-link`) mit größeren Hit-Flächen, pillenförmig, klaren Active-/Hover-Zuständen und Icon-Support.
- Topbar modernisiert:
- User-Chip (`.topbar-user`) mit grünem Statuspunkt und gekapseltem Hintergrund.
- Logout-Link (`.topbar-link`) als kleiner, klar erkennbare Aktion mit Hover-Schatten.
- Karten / Page-Container:
- `.card` mit großem Radius (`24px`), weichem Schatten und klarer Border als zentrale, „schwebende“ Fläche.
- Überschriften (`.card-title`, `.card-subtitle`) typografisch verstärkt, um den Page-Titel wie in einer Tablet-App hervorzuheben.
- Tabellen-Design (`.table-modern`):
- Helle Kopfzeile, Zebra-Streifen im Body und deutlicher Hover-Hintergrund.
- Kompakte, aber fingerfreundliche Zellen, ideal für Protokoll-Übersichten auf Tablets.
- Buttons und Actions:
- Grund-Buttons (`.btn`) auf Touch-Höhe (min. 44px) gebracht, mit pillenförmiger Optik.
- Primär-, Outline- und Danger-Varianten neu abgestimmt auf die helle App-Optik.
- `btn-sm`, `.row-actions` und `.select-sm` angepasst, damit auch in der Protokoll-Liste alles gut mit dem Finger bedienbar bleibt.
- Formulare & Einstellungen:
- Neue Sektionen (`.form-section`) mit weichem Hintergrund, Border und abgerundeten Ecken.
- `form-grid` für 3-Spalten-Layout am Desktop, automatisch einspaltig auf kleineren Screens.
- Inputs (`.form-control`) pillenförmig, mit deutlich sichtbarem Fokus-Ring in Primärfarbe.
- Responsive Behaviour:
- ≤ 1024px: Sidebar schmaler, Titel/Untertitel ausgeblendet – Fokus auf Icons & klare Navigation.
- ≤ 768px: Sidebar oben, Navigation horizontal scrollbar, Content-Karten kompakter, Formulare einspaltig, Actions in der Protokoll-Liste werden vollbreit untereinander angeordnet (Daumen-Bedienung).
- Ziel:
- Die Anwendung wirkt wie eine moderne, helle Business-App, ist auf Tablets sehr gut bedienbar und lässt sich auch mobil mit dem Finger komfortabel nutzen.
## v22.4 – Aktionen-Dropdown im Protokoll-Dashboard
- `layout_header.php`:
- Neue CSS-Klassen für ein kompaktes Aktions-Dropdown je Protokollzeile hinzugefügt:
- `.actions-cell`, `.actions-menu`, `.actions-toggle`, `.actions-dropdown`.
- Mobile-Optimierung: Unter 820px wird das Dropdown als zentriertes Panel am unteren Bildschirmrand angezeigt, damit die Aktionen auch auf dem Tablet/Smartphone gut mit dem Finger erreichbar sind.
- Neues JavaScript eingebunden:
- `toggleActionsMenu(btn)` öffnet/schließt das Menü für die gewählte Zeile.
- Ein globaler `click`-Listener schließt offene Menüs, wenn man außerhalb klickt.
- `dashboard.php`:
- Die bisherige „Button-Leiter“ in der Spalte **Aktionen** wurde durch eine kompakte Struktur ersetzt:
- In der Tabelle sieht man jetzt nur noch einen Button **„Aktionen“**.
- Beim Klick öffnet sich ein Dropdown-Menü mit:
- Vorschau
- Bearbeiten / Anzeigen
- Kopieren
- „Für alle Nutzer freigeben“ / „Freigabe für alle entfernen“
- Benutzer-spezifische Freigabe (Benutzer wählen + Für Benutzer freigeben)
- Freigabe entfernen für … (Dropdown) + Button
- Löschen
- Alle bisherigen Funktionen bleiben erhalten, sind nun aber übersichtlich gruppiert.
- Ziel:
- Die Spalte „Aktionen“ ist deutlich schmaler, wodurch mehr Protokolle gleichzeitig sichtbar sind, ohne Funktionalität zu verlieren.
## v22.5 – Aktionen-Dropdown ausgerichtet & Spalten verschmälert
### Änderungen
- `layout_header.php`:
- `.actions-dropdown` so angepasst, dass das Menü konsequent an der rechten Kante des „Aktionen“-Buttons andockt und sich nach links ausklappt:
- `right: 0; left: auto; transform-origin: top right;`
- Dadurch ragt das Menü nicht mehr rechts aus dem Bildschirm hinaus.
- `dashboard.php`:
- Tabellenkopf der Protokoll-Liste verschmälert:
- Spalte **Status** auf feste Breite (80px) und zentriert.
- Spalte **Freigegeben für** auf ca. 160px Breite begrenzt.
- Spalte **Aktionen** auf 120px Breite und zentriert.
- Ziel:
- Mehr Platz für das Aktionen-Dropdown und eine kompaktere Protokoll-Liste, so dass mehr als zwei Protokolle gleichzeitig sichtbar sind, ohne dass Buttons abgeschnitten werden.
## v22.7 – Personen- & Raum-Formulare ans neue UI angepasst
### Änderungen
- `layout_header.php`:
- Neues Layout für ältere Formularseiten eingeführt (z.B. **edit_persons.php**, **room_details.php**):
- Klassen `.row` und `.col-2` neu definiert:
- Flex-Layout mit automatischer Zeilenumbruchslogik und Spaltenbreiten, die zum Tablet-Design passen.
- Labels und Eingabefelder in diesen Formularen an das neue, moderne UI angepasst:
- Einheitliche Typografie für Labels (`0.82rem`, dezente Textfarbe).
- Textfelder und Textareas mit abgerundeten Ecken, klarer Border und Fokus-Ring im Primär-Blau.
- Allgemeine Formular-Styles in Karten (`.card form ...`) ergänzt:
- Standard-Inputs und Textareas innerhalb von Karten nutzen jetzt ebenfalls die neuen Input-Styles, sodass Raumdetails und Mängel-Bearbeitungsformulare optisch zum Rest des Systems passen.
- Ziel:
- Das durch das Redesign verschobene Layout der Personen- und Raum-/Mängel-Seiten wieder „aufzuräumen“ und optisch an das neue Tablet-UI anzupassen, ohne die dahinterliegende Logik zu verändern.
## v22.9 – Zugriffsrechte bei geschlossenen Protokollen
### Änderungen
- **Globale Navigation (`layout_header.php`):**
- Neue Variable `$protocol_locked_for_user`, die von den Bearbeitungsseiten gesetzt wird.
- Wenn ein Protokoll für einen Nutzer gesperrt ist (Status `closed` und kein Admin):
- Alle Navigationspunkte unter *„Protokoll bearbeiten“* (Objektdaten, Personen, Räume & Mängel, Schlüssel, Zähler, Sondervereinbarung, Datenverarbeitung, Vorschau & Abschluss) werden ausgeblendet.
- Es bleibt nur noch **„PDF / Ansicht“** sichtbar.
- **Bearbeitungsseiten (`edit_*.php`, `special_terms.php`, `data_privacy.php`, `preview.php`):**
- Nach Laden des Protokolls wird geprüft:
- `status === 'closed'` und Nutzer **kein Admin** → `$protocol_locked_for_user = true`.
- In diesem Fall:
- Automatische Weiterleitung nach `view_protocol.php?id=…`.
- Dadurch können normale Nutzer geschlossene Protokolle nicht mehr über Direkt-URLs wie `edit_persons.php?id=…` bearbeiten.
- **Ansichtsseite (`view_protocol.php`):**
- Lädt ebenfalls den Protokollstatus und setzt `$protocol_locked_for_user`, damit in der Sidebar nur noch **„PDF / Ansicht“** angezeigt wird, wenn ein geschlossenes Protokoll von einem normalen Nutzer angesehen wird.
**Ziel:**
Geschlossene Protokolle sind für normale Nutzer strikt **read-only** – sowohl über Navigation als auch bei direkten URL-Aufrufen. Nur Admins können weiterhin Änderungen vornehmen oder Protokolle wieder öffnen.
## v22.10 – Adminrechte korrigiert bei geschlossenen Protokollen
- `edit_object.php`, `edit_persons.php`, `edit_rooms.php`, `edit_keys.php`, `edit_meters.php`,
`special_terms.php`, `data_privacy.php`, `preview.php`, `view_protocol.php`:
- Die Ermittlung des Admin-Status erfolgt jetzt wieder wie im Dashboard/Settings:
- `current_user()` laden, Spalten der `users`-Tabelle prüfen und bei vorhandener `is_admin`-Spalte
den Wert aus der Datenbank verwenden.
- Fallback: Wenn es keine `is_admin`-Spalte gibt, wird der Benutzer als Admin behandelt.
- Das zuvor verwendete `$_SESSION['is_admin']` wurde entfernt, da dieser Session-Wert nie gesetzt wurde
und dadurch Admins fälschlich wie normale Benutzer behandelt und aus Bearbeitungsseiten/Navigation
ausgeschlossen wurden.
- `layout_header.php`:
- `$is_admin` wird nicht mehr aus der Session überschrieben, sondern nur verwendet, wenn es von der
aufrufenden Seite gesetzt wurde (`$is_admin = $is_admin ?? false;`).
- Damit greifen die Seiten-spezifischen Admin-Berechnungen wieder korrekt, und Admins sehen alle
Navigationspunkte und Bearbeitungsfunktionen wie vorgesehen.
## v22.11 – Aktionen-Dropdown bei geschlossenem Protokoll
- `dashboard.php`:
- Das Aktionen-Dropdown wurde angepasst:
- Für **geschlossene Protokolle** wird der Punkt **„Vorschau“** für normale Benutzer ausgeblendet.
- Normale User sehen bei geschlossenen Protokollen jetzt nur noch **„Anzeigen“** und **„Kopieren“**.
- Admins behalten weiterhin die **„Vorschau“**-Funktion, unabhängig vom Status.
- Ziel:
- Die Bedienung für User klarer zu machen und doppelte Einträge im Menü zu vermeiden, wenn ein Protokoll bereits abgeschlossen ist.
## v22.12 – Aktionen-Menü ohne „Vorschau“-Eintrag
- `dashboard.php`:
- Den Eintrag **„Vorschau“** im Aktionen-Dropdown der Protokoll-Liste komplett entfernt.
- Dadurch gibt es nur noch **„Anzeigen“** (und ggf. weitere Aktionen wie Kopieren / Freigaben / Löschen).
- Gilt sowohl für normale Benutzer als auch für Admins, um die Bezeichnung zu vereinheitlichen.
## v22.13 – Kopierte Protokolle: Hinweis zur Art (Übergabe/Abnahme)
### Änderungen
- `copy_protocol.php`:
- Nach dem Kopieren eines Protokolls wird nun mit Parametern `copied=1&from_type=...` zu `edit_object.php` weitergeleitet.
- `edit_object.php`:
- Beim ersten Öffnen eines kopierten Protokolls mit Art **Übergabe** erscheint ein Hinweis-Dialog:
- Frage: Ob die Art direkt auf **„Abnahme“** geändert werden soll.
- Bei Bestätigung wird im Formular automatisch der Typ `ABNAHME` ausgewählt.
- Es wird **keine weitere Kopie** erzeugt – es wird nur der Typ des bereits angelegten Kopie-Protokolls angepasst.
- Ziel:
- Typischer Anwendungsfall „Übergabe für Abnahme wiederverwenden“ vereinfachen, ohne zusätzliche Protokollnummern zu erzeugen.
## v22.14 – Protokoll speichern aktualisiert & Art-Wechsel ohne Browser-Popup
### Änderungen
- `save_protocol.php`:
- Speichert Protokolle jetzt **entweder neu oder als Update**:
- Wenn ein `id`-Feld (`> 0`) übergeben wird, wird das bestehende Protokoll per `UPDATE` geändert (keine neue Protokollnummer).
- Wenn keine `id` vorhanden ist (oder `0`), wird wie bisher ein neues Protokoll per `INSERT` angelegt.
- Bei Updates werden bestehende Einträge in `protocol_persons` für dieses Protokoll vor dem erneuten Anlegen gelöscht, sodass Vermieter-/Mieter-Daten konsistent sind.
- `edit_object.php`:
- Beim ersten Öffnen einer **kopierten Übergabe** wird die Art automatisch auf **„ABNAHME“** gestellt.
- Ein dezenter Hinweis-Block informiert darüber:
- „Dieses Protokoll wurde aus einer Übergabe kopiert. Die Art wurde automatisch auf Abnahme gesetzt …“
- Kein Browser-`window.confirm` mehr – alles passiert innerhalb der Weboberfläche, der Benutzer kann die Art bei Bedarf manuell wieder ändern.
- Ziel:
- Verhindern, dass beim Ändern der Art (z. B. von Übergabe auf Abnahme) ungewollt zusätzliche Protokolle entstehen.
- Den Übergang von kopierter Übergabe → Abnahme klar und benutzerfreundlich gestalten.
## v22.15 – Kopierte Abnahmen werden automatisch zu Übergaben
- `edit_object.php`:
- Die Logik für automatisch angepasste Protokollart nach dem Kopieren erweitert:
- Wird eine **Übergabe** kopiert, wird die Art der Kopie automatisch zu **Abnahme** gesetzt (wie bisher).
- Wird eine **Abnahme** kopiert, wird die Art der Kopie automatisch zu **Übergabe** gesetzt.
- Der Hinweistext über dem Formular passt sich nun dynamisch an:
- Zeigt je nach Ursprungstyp an, ob von Übergabe → Abnahme oder von Abnahme → Übergabe gewechselt wurde.
- Ziel:
- Den typischen Wechsel zwischen Übergabe- und Abnahmeprotokollen in beide Richtungen unterstützen, ohne zusätzliche Kopien zu erzeugen.
## v22.16 – Eigene Passwortänderung (separate Seite)
### Änderungen
- `change_password.php` (neu):
- Neue, eigenständige Seite zum Ändern des **eigenen** Passworts für alle eingeloggten Benutzer (inkl. Admins).
- Formular mit:
- „Aktuelles Passwort“
- „Neues Passwort“
- „Neues Passwort wiederholen“
- Validierung:
- Alle Felder sind Pflicht.
- Aktuelles Passwort wird mit `password_verify()` geprüft.
- Neues Passwort und Wiederholung müssen übereinstimmen.
- Bei Erfolg wird `users.password_hash` mit `password_hash()` aktualisiert und eine Erfolgsmeldung angezeigt.
- `layout_header.php`:
- In der Navigationssektion „Einstellungen“ einen neuen Eintrag **„Passwort ändern“** ergänzt, der auf `change_password.php` verweist und einen eigenen Active-State hat.
- Ziel:
- Sichere Passwortänderung ohne Änderungen an der komplexen `settings.php`-Logik, klar getrennt und leicht wartbar.
---