import type { Metadata } from 'next' import { db } from '@/lib/db' import { visibleDepartmentEntryWhere } from '@/lib/access/departmentFilter' import { permissionsForPrint } from '@/lib/export/printAccess' import { departmentMembers, effectiveCap, loadVisibleDepartmentForPrint, } from '@/lib/export/dossier' import { DossierBody } from '@/components/print/DossierBody' import { de } from '@/lib/i18n/de' import { NotAvailable } from '../../../NotAvailable' export const dynamic = 'force-dynamic' export const metadata: Metadata = { title: de.export.dossier, robots: { index: false, follow: false }, } /** * Druckansicht einer Abteilung: die Abteilung selbst, dahinter je Mitglied ein * vollständiges Dossier. * * Getrennt nach Mitgliedern und nicht als ein grosser Topf: eine Abteilung hat * keine eigenen Fallakten, sie hat Mitglieder, die in Fallakten vorkommen. * Alles ineinandergeschüttet stünde dieselbe Akte mehrfach da, ohne dass man * sähe, über wen sie hier steht. * * Das wird umfangreich. Genau deshalb ist die Höchststufe hier keine Zierde. */ export default async function PrintDepartmentDossierPage({ params, searchParams, }: { params: Promise<{ key: string }> searchParams: Promise<{ token?: string; stufe?: string }> }) { const { key } = await params const { token, stufe } = await searchParams const zugang = await permissionsForPrint(token) if (!zugang) return const { permissions, displayName } = zugang const abteilung = await loadVisibleDepartmentForPrint(permissions, key) if (!abteilung) return const cap = effectiveCap(permissions, Number(stufe ?? permissions.clearanceLevel)) const [{ members, omittedMembers }, vermerke, levels, autoren] = await Promise.all([ departmentMembers(permissions, abteilung.id, cap), db.departmentEntry.findMany({ where: { AND: [visibleDepartmentEntryWhere(permissions), { departmentId: abteilung.id }], }, orderBy: [{ createdAt: 'asc' }], select: { id: true, body: true, minClearance: true, authorId: true, createdAt: true, version: true, editedAt: true, retractedAt: true, retractionReason: true, }, }), db.clearanceLevelConfig.findMany({ orderBy: { level: 'asc' } }), db.user.findMany({ select: { id: true, displayName: true } }), ]) const levelName = new Map(levels.map((l) => [l.level, l.name])) const nameVon = new Map(autoren.map((a) => [a.id, a.displayName])) return (
{abteilung.minClearance} ·{' '} {levelName.get(abteilung.minClearance) ?? de.common.unknown}

{abteilung.name}

{abteilung.key}

{de.department.members} {de.department.memberCount(members.length)}
{de.export.retrievedBy} {displayName}
{de.export.asOf} {new Date().toLocaleString('de-DE')} ·{' '} {de.export.cappedAt(cap, levelName.get(cap) ?? '')}
{abteilung.description ? (

{abteilung.description}

) : null}

{de.export.coverNote}

{omittedMembers > 0 ? (

{de.export.omittedHeading}

{de.export.omittedMembers(omittedMembers)}

) : null}

{de.department.entries}

{vermerke.length === 0 ? (

{de.department.entriesEmpty}

) : ( vermerke.map((vermerk) => (

{nameVon.get(vermerk.authorId) ?? vermerk.authorId} ·{' '} {vermerk.createdAt.toLocaleString('de-DE')} {vermerk.editedAt ? ` · ${de.export.editedAt(vermerk.version, vermerk.editedAt.toLocaleDateString('de-DE'))}` : ''}

{vermerk.retractedAt ? (

{de.entry.retracted( vermerk.retractedAt.toLocaleDateString('de-DE'), nameVon.get(vermerk.authorId) ?? vermerk.authorId, vermerk.retractionReason ?? '', )}

) : (

{vermerk.body}

)}
)) )}

{de.export.membersHeading}

{members.length === 0 ? (

{de.export.noMembers}

) : ( members.map((mitglied) => (
)) )}
) }