groupe AD, avec priorité (la plus haute l'emporte). */ class AssignmentController extends Controller { use ScopedToTenant; public function index(): View { $tenant = $this->tenantId(); return view('admin.assignments.index', [ 'assignments' => Assignment::where('tenant_id', $tenant) ->with(['template:id,name,html_full', 'group' => fn ($q) => $q->withCount('members')]) ->orderByDesc('priority')->orderBy('id')->get(), 'templates' => Template::where('tenant_id', $tenant)->orderBy('name')->get(['id', 'name', 'html_full', 'is_default']), // Tous les groupes synchronisés, sauf les groupes de rôles du back-office. 'groups' => DirectoryGroup::where('tenant_id', $tenant) ->whereNotIn('display_name', array_values(config('signature.roles'))) ->withCount('members')->orderBy('display_name')->get(), ]); } public function store(Request $request): RedirectResponse { $tenant = $this->tenantId(); $data = $request->validate([ 'template_id' => ['required', Rule::exists('templates', 'id')->where('tenant_id', $tenant)], 'directory_group_id' => [ 'required', Rule::exists('directory_groups', 'id')->where('tenant_id', $tenant), Rule::unique('assignments')->where(fn ($q) => $q->where('template_id', $request->input('template_id'))), ], 'priority' => ['required', 'integer', 'between:0,1000'], ], ['directory_group_id.unique' => 'Ce groupe est déjà affecté à ce template.']); $assignment = Assignment::create($data + ['tenant_id' => $tenant]); AuditLog::record('admin', $this->actor(), 'assignment.create', $assignment, $data); return back()->with('status', 'Affectation ajoutée.'); } public function update(Request $request, Assignment $assignment): RedirectResponse { $this->ensureTenant($assignment); $data = $request->validate(['priority' => ['required', 'integer', 'between:0,1000']]); $old = $assignment->priority; $assignment->update($data); AuditLog::record('admin', $this->actor(), 'assignment.update', $assignment, ['priority' => [$old, $assignment->priority]]); return back()->with('status', 'Priorité mise à jour.'); } public function destroy(Assignment $assignment): RedirectResponse { $this->ensureTenant($assignment); AuditLog::record('admin', $this->actor(), 'assignment.delete', $assignment, [ 'template_id' => $assignment->template_id, 'directory_group_id' => $assignment->directory_group_id, ]); $assignment->delete(); return back()->with('status', 'Affectation supprimée.'); } }