import { notFound } from 'next/navigation'; import { InfoCard, InfoGrid, InfoRow } from '@/app/(app)/equipe/[id]/InfoCard'; import { ScopeForm, TeamsForm, } from '@/app/(app)/equipe/[id]/planification/PlacementPanel'; import { Badge } from '@/components/ui/Badge'; import { can } from '@/domain/access/authorize'; import { requireSession } from '@/server/context'; import { getEmployee, getMemberPlacement, listPlacementOptions, } from '@/server/employees/queries'; export const dynamic = 'force-dynamic'; /** * Rattachement et périmètre. * * L'établissement de rattachement reste en lecture seule : il est porté par le * contrat, et le changer sans avenant ferait diverger le planning du document * opposable. */ export default async function PlacementTab({ params, }: { params: Promise<{ id: string }>; }) { const { id } = await params; const employee = await getEmployee(id); if (!employee) notFound(); const [placement, locations, session] = await Promise.all([ getMemberPlacement(id), listPlacementOptions(), requireSession(), ]); const canScope = can(session.actor, 'settings.roles.manage'); const canTeams = can(session.actor, 'settings.teams.manage'); return ( 0 ? placement.teams .map((team) => team.isPrimary ? `${team.name} (principale)` : team.name, ) .join(', ') : '' } />

L’établissement vient du contrat : il se change par avenant, pas ici.

{canTeams ? (
) : null}
Accès généralisé
{placement?.allLocations ? ( Tous les établissements ) : ( Limité )}
{canScope ? (
) : (

Élargir un périmètre revient à distribuer des droits : la capacité « Gérer les rôles » est requise.

)}
); }