# 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`
