shop-old/modules/ADMIN2000_NOTES.md
2026-04-20 01:03:43 +02:00

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`