import { db } from '@/lib/db' import { de } from '@/lib/i18n/de' import type { EffectivePermissions } from '@/lib/auth/permissions' /** * Der Druckbogen einer Personalakte: die Kopfdaten selbst. * * Die Personalakte trägt keine Vorlage mit Abschnitten wie eine Fallakte - was * über die Person aktenkundig ist, steht in ihren Dokumenten. Deshalb ist * dieser Bogen kurz; das Gewicht des Dossiers liegt in dem, was dahinter * kommt. Siehe lib/export/dossier.ts. */ export type PersonnelForPrint = { id: string userId: string | null displayName: string rank: string | null classification: number statusTags: string[] note: string | null department: { key: string; name: string } | null createdAt: Date } export async function PersonnelSheet({ permissions, displayName, akte, withCover = true, }: { permissions: EffectivePermissions displayName: string akte: PersonnelForPrint withCover?: boolean }) { const [levels, etiketten] = await Promise.all([ db.clearanceLevelConfig.findMany({ orderBy: { level: 'asc' } }), akte.statusTags.length === 0 ? [] : db.personnelStatusTag.findMany({ where: { key: { in: akte.statusTags } }, orderBy: { sortOrder: 'asc' }, select: { key: true, name: true }, }), ]) const levelName = new Map(levels.map((l) => [l.level, l.name])) const stufe = `${akte.classification} · ${levelName.get(akte.classification) ?? de.common.unknown}` return ( <> {withCover ? (
{stufe}

{akte.rank ? `[${akte.rank}] ` : ''} {akte.displayName}

{de.personnel.one}

{de.export.coverNote}

) : (
{stufe}

{akte.rank ? `[${akte.rank}] ` : ''} {akte.displayName}

{akte.department?.name ?? de.personnel.noDepartment}

)} tag.name).join(', ') } />
) } function Zeile({ label, value }: { label: string; value: string }) { return ( {label} {value} ) }