5.2: gemeinsamen Firmen-Sync-Kern als User::syncCompaniesWithRoles() gezogen

Analyse der beiden ~40/160-Zeilen-save()-Methoden (users/create vs edit): sie
teilen nur den User-Attribut-Payload und den byte-identischen Firmen-Sync-Loop
(Bearbeiten hat zusaetzlich Profil/Kontakte/volle Billing-CRUD). Ein voller
UserUpsertService waere Over-Engineering (ueberwiegend Branches) — daher nur
der wirklich gemeinsame Persistenz-Kern:

User::syncCompaniesWithRoles(array $companyIds, array $roles) baut das
Pivot-Payload (fehlende Rolle => 'member') und synct. Beide Formulare nutzen
es; im Bearbeiten kommen die linkedCompanyIds nun direkt aus $validated.

Test: UserSyncCompaniesTest (Rollen-Zuordnung, member-Default, Detach).
29 User-Tests gruen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-02 08:47:23 +00:00
parent 2b9d1b6339
commit 9e6f775e1b
4 changed files with 57 additions and 15 deletions

View file

@ -127,13 +127,7 @@ new #[Layout('components.layouts.app'), Title('Benutzer anlegen')] class extends
$user->syncRoles($validated['selectedRoles']);
$companySyncPayload = [];
foreach ($validated['linkedCompanyIds'] as $companyId) {
$companySyncPayload[$companyId] = [
'role' => $validated['companyRoles'][$companyId] ?? 'member',
];
}
$user->companies()->sync($companySyncPayload);
$user->syncCompaniesWithRoles($validated['linkedCompanyIds'], $validated['companyRoles']);
if ($this->billingIsComplete()) {
$user->billingAddress()->create([