add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
# Benutzerdefinierte Felder (V1) Kurzreferenz
|
|
|
|
|
|
2026-03-06 12:25:18 +01:00
|
|
|
Letzte Aktualisierung: 2026-03-06
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
|
|
|
|
|
## Ziel
|
|
|
|
|
|
|
|
|
|
Tenant-spezifische Zusatzfelder für User:
|
|
|
|
|
|
|
|
|
|
- Definitionen und Optionen werden pro Tenant gepflegt.
|
|
|
|
|
- Werte werden pro User gespeichert.
|
|
|
|
|
- Address-Book-Filter nutzen dynamische Query-Parameter.
|
|
|
|
|
|
|
|
|
|
## Berechtigungen
|
|
|
|
|
|
|
|
|
|
- `custom_fields.manage`
|
|
|
|
|
- Definitionen/Optionen im Tenant-Tab pflegen.
|
|
|
|
|
- `custom_fields.edit_values`
|
|
|
|
|
- Werte im User-Tab pflegen.
|
|
|
|
|
|
|
|
|
|
## Tabellen
|
|
|
|
|
|
|
|
|
|
- `tenant_custom_field_definitions`
|
|
|
|
|
- Felddefinition pro Tenant (Label, Typ, aktiv, filterbar, `field_key` intern).
|
|
|
|
|
- `tenant_custom_field_options`
|
|
|
|
|
- Optionen für `select`/`multiselect` je Definition.
|
|
|
|
|
- `user_custom_field_values`
|
|
|
|
|
- Gespeicherter Wert pro `user_id + definition_id` (unique).
|
|
|
|
|
- `user_custom_field_value_options`
|
|
|
|
|
- N:M-Optionen für Multiselect-Werte.
|
|
|
|
|
|
|
|
|
|
## Typen und Verhalten
|
|
|
|
|
|
|
|
|
|
- `text`, `textarea`
|
|
|
|
|
- Eingabe am User möglich.
|
|
|
|
|
- Nicht als Address-Book-Filter zugelassen.
|
|
|
|
|
- `select`, `multiselect`, `boolean`, `date`
|
|
|
|
|
- Eingabe am User möglich.
|
|
|
|
|
- Optional als Address-Book-Filter (wenn `is_filterable=1`).
|
|
|
|
|
|
|
|
|
|
## Wichtige Regeln
|
|
|
|
|
|
|
|
|
|
- `field_key`
|
|
|
|
|
- Wird serverseitig aus Label erzeugt und tenant-weit eindeutig gehalten.
|
|
|
|
|
- Kein manuelles UI-Feld.
|
|
|
|
|
- User-Werte sind in V1 optional (keine Pflichtvalidierung).
|
|
|
|
|
- Bei Tenant-Wechsel am User werden Werte außerhalb der aktuellen User-Tenants bereinigt.
|
|
|
|
|
|
|
|
|
|
## Query-Parameter im Address Book
|
|
|
|
|
|
|
|
|
|
- `cf_<definition_uuid>`
|
|
|
|
|
- scalar/select/boolean
|
|
|
|
|
- `cfm_<definition_uuid>`
|
|
|
|
|
- multiselect (CSV mit Option-IDs)
|
|
|
|
|
- `cfd_<definition_uuid>_from`
|
|
|
|
|
- `cfd_<definition_uuid>_to`
|
|
|
|
|
- date-range
|
|
|
|
|
|
|
|
|
|
Unbekannte/manipulierte Parameter werden ignoriert.
|
|
|
|
|
|
|
|
|
|
## Relevante Pfade
|
|
|
|
|
|
|
|
|
|
- Tenant-Tab Formular:
|
|
|
|
|
- `/pages/admin/tenants/_form.phtml`
|
|
|
|
|
- Tenant Actions:
|
|
|
|
|
- `/pages/admin/tenants/custom-field-create($id).php`
|
|
|
|
|
- `/pages/admin/tenants/custom-field-update($id).php`
|
|
|
|
|
- `/pages/admin/tenants/custom-field-delete($id).php`
|
|
|
|
|
- User-Werte:
|
|
|
|
|
- `/lib/Service/CustomField/UserCustomFieldValueService.php`
|
|
|
|
|
- `/lib/Repository/CustomField/*`
|
|
|
|
|
- Address-Book-Filter:
|
|
|
|
|
- `/pages/address-book/index().php`
|
|
|
|
|
- `/pages/address-book/index(default).phtml`
|
|
|
|
|
|
|
|
|
|
## Troubleshooting (kurz)
|
|
|
|
|
|
|
|
|
|
- Multiselect speichert nichts:
|
|
|
|
|
- Feldname ohne doppeltes `[]` prüfen.
|
|
|
|
|
- Optionen sind leer:
|
|
|
|
|
- Label-Key für MultiSelect auf `label`/`description` prüfen.
|
|
|
|
|
- Filterbar ist deaktiviert:
|
|
|
|
|
- Typ ist nicht in `select|multiselect|boolean|date`.
|