# Admin2000 - Development Notes ## Aktuelles Problem: Save funktioniert nicht (2025-10-25) ### Problem-Analyse - Customer Editor lädt korrekt, alle Daten werden angezeigt - Beim Speichern: Error 500 - Debug-Log zeigt: Crash in Legacy `Customer->update()` (customer.class.php:1474) - Keine weiteren Logs nach "Calling customer->save()" ### Root Cause Legacy `Customer->update()` Methode: - Baut dynamisch SQL UPDATE mit allen übergebenen Feldern - Crasht wahrscheinlich bei nicht-existierenden DB-Spalten - Problem-Felder: `pass1`, `pass2`, `admin_role_id` (0) - `pass1`/`pass2` sind UI-only Felder (sollten zu `pass` gemapped werden) - `admin_role_id` = 0 sollte gefiltert werden oder leer bleiben - Kein Error-Handling, kein Logging im Legacy-Code ### Debug-Dateien - `/var/www/vhosts/intelectra.de/httpdocs/admin2000_debug.log` - Live Debug Output - Letzter Eintrag: "Calling customer->save()" - danach Crash --- ## Lösung: CustomerManager-Klasse (Grüne Wiese) ### Konzept **Skalpell-Modus für Legacy:** - Legacy Customer-Klasse bleibt READ-ONLY - Nur `get_data()`, `get_by_id()` etc. nutzen - KEINE Änderungen am Legacy-Code **Neue Admin2000 CRUD-Logik:** - Eigene CustomerManager-Klasse für Admin2000 - Sauberes Error-Handling + Logging - UPDATE und CREATE sauber getrennt - Nur existierende DB-Spalten updaten ### Geplante Struktur ``` /modules/admin2000/ ├── admin2000.php (Controller) └── classes/ └── CustomerManager.php (neue CRUD-Klasse) ├── get($id) - liest aus Legacy ├── update($id, $data) - eigene UPDATE-Logik ├── create($data) - eigene CREATE-Logik ├── validate($data) - Eingabe-Validierung └── mapFormToDb($form_data) - Feld-Mapping ``` ### CustomerManager Features 1. **Feld-Mapping:** - `pass1` + `pass2` → `pass` (md5 hash) - `admin_role_id` nur wenn > 0 - Leere Strings bei Datums-Feldern filtern ("0000-00-00") 2. **Whitelist für DB-Felder:** - Nur Spalten updaten die wirklich existieren - Schützt vor SQL Errors 3. **Error-Handling:** - Try-Catch um SQL-Queries - Logging in eigene Datei - Sinnvolle Fehlermeldungen 4. **Validierung:** - E-Mail Format - Required Fields - Duplikat-Check --- ## Nächste Schritte ### Phase 1: CustomerManager erstellen - [ ] `modules/admin2000/classes/CustomerManager.php` erstellen - [ ] Database-Spalten-Whitelist definieren - [ ] `update()` Methode mit Error-Handling - [ ] Feld-Mapping implementieren (`pass1`/`pass2` → `pass`) ### Phase 2: Integration - [ ] In `admin2000.php` CustomerManager statt Legacy Customer nutzen - [ ] `save_customer()` umbauen auf CustomerManager->update() - [ ] Debug-Logging entfernen wenn fertig ### Phase 3: Testing - [ ] Save testen mit verschiedenen Feldkombinationen - [ ] Passwort-Änderung testen - [ ] Leere Felder testen - [ ] Admin-Role-Änderung testen --- ## DB-Spalten (customers Tabelle) **Existierende Spalten (aus get_data() bekannt):** - id, number, locked, group_id - honorific, firstname, surname - phone, mobile, fax, email, website - show_tax, burth_date - company, tax_number, tax_id, eu_business - account_holder, account_number, bank, bank_number, iban, swift_bic - direct_debit_active, rechnung_active, skonto - freetextfield1-6, has_item_export, newsletter_sub, info - pass (md5 hash) - admin_role_id (vermutlich) **UI-only Felder (nicht in DB):** - pass1, pass2 (werden zu `pass` gemapped) - customer_password_action (Dropdown für Passwort-Aktionen) --- ## Lessons Learned 1. **Legacy = READ ONLY:** - Nie wieder Legacy CRUD-Methoden nutzen ohne Analyse - Nur GET-Methoden sind safe - UPDATE/CREATE = grüne Wiese 2. **Debugging:** - `file_put_contents()` zu Debug-Datei funktioniert - `error_log()` erscheint nicht in Plesk PHP-FPM Logs - Browser DevTools zeigt nur "500" - kein Stack Trace 3. **Skalpell-Modus:** - "Ich habe gedacht" = VERBOTEN - Nur Fakten aus Legacy-Code nutzen - Keine Annahmen, keine "Optimierungen" --- ## Kontakt / Fragen Bei Fragen zu Admin2000: - Debug-Log: `admin2000_debug.log` im httpdocs root - Diese Datei: `/modules/ADMIN2000_NOTES.md`