tenantId(); foreach (array_diff(array_keys(VariableMap::FIELDS), self::EXCLUDED) as $key) { EditableField::firstOrCreate( ['tenant_id' => $tenant, 'field' => $key], ['label' => VariableMap::FIELDS[$key]['label'], 'enabled' => false, 'validation_rule' => in_array($key, ['telephone', 'mobile'], true) ? 'phone' : 'text'], ); } $usage = UserOverride::query() ->join('directory_users', 'directory_users.id', '=', 'user_overrides.directory_user_id') ->where('directory_users.tenant_id', $tenant) ->selectRaw('user_overrides.field, count(*) as n')->groupBy('user_overrides.field')->pluck('n', 'field'); return view('admin.fields.index', [ 'fields' => EditableField::where('tenant_id', $tenant)->whereNotIn('field', self::EXCLUDED) ->get()->sortBy(fn ($f) => array_search($f->field, array_keys(VariableMap::FIELDS)))->values(), 'types' => ProfileService::TYPES, 'usage' => $usage, ]); } public function update(Request $request): RedirectResponse { $tenant = $this->tenantId(); $data = $request->validate([ 'fields' => ['array'], 'fields.*.enabled' => ['nullable', 'boolean'], 'fields.*.label' => ['required', 'string', 'max:60'], 'fields.*.type' => ['required', Rule::in(array_keys(ProfileService::TYPES))], ]); $changes = []; foreach ($data['fields'] ?? [] as $key => $row) { $field = EditableField::where('tenant_id', $tenant)->where('field', $key)->whereNotIn('field', self::EXCLUDED)->first(); if (! $field) { continue; } $field->fill(['enabled' => (bool) ($row['enabled'] ?? false), 'label' => $row['label'], 'validation_rule' => $row['type']]); if ($field->isDirty()) { $changes[$key] = $field->getDirty(); $field->save(); } } if ($changes) { AuditLog::record('admin', $this->actor(), 'fields.update', null, $changes, $tenant); } return back()->with('status', $changes ? 'Champs modifiables enregistrés : effet immédiat dans l\'add-in et le portail.' : 'Aucun changement.'); } }