140 lines
4.1 KiB
Markdown
140 lines
4.1 KiB
Markdown
# 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`
|