77 lines
3.0 KiB
PHP
77 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Admin\Concerns\ScopedToTenant;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\AuditLog;
|
|
use App\Models\EditableField;
|
|
use App\Models\UserOverride;
|
|
use App\Signature\ProfileService;
|
|
use App\Signature\VariableMap;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Validation\Rule;
|
|
use Illuminate\View\View;
|
|
|
|
/** Choix des champs que les agents peuvent modifier eux-mêmes (add-in et portail). */
|
|
class EditableFieldController extends Controller
|
|
{
|
|
use ScopedToTenant;
|
|
|
|
/** L'adresse e-mail n'est jamais modifiable : elle doit rester celle de la boîte. */
|
|
private const EXCLUDED = ['email'];
|
|
|
|
public function index(): View
|
|
{
|
|
$tenant = $this->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.');
|
|
}
|
|
}
|