import type { Metadata } from 'next' import { db } from '@/lib/db' import { requireUser } from '@/lib/auth/current' import { de } from '@/lib/i18n/de' import { PERMISSIONS } from '@/lib/auth/permissions' import { StampMark } from '@/components/StampMark' import { pendingApprovals } from '@/lib/export/service' import { Approvals } from '../export/Approvals' export const metadata: Metadata = { title: de.overview.heading } export const dynamic = 'force-dynamic' /** * Zwischenstand aus TASKS.md Phase 1: zeigt Name, Rollen, errechnete Stufe und * Rechte. Das ist die Seite, an der die Abteilungsleitung nachvollziehen kann, * warum jemand etwas sieht oder eben nicht. */ export default async function OverviewPage() { const user = await requireUser() const [roles, level] = await Promise.all([ db.userRole.findMany({ where: { userId: user.id }, select: { discordRoleId: true }, }), db.clearanceLevelConfig.findUnique({ where: { level: user.permissions.clearanceLevel } }), ]) const mappings = await db.roleMapping.findMany({ where: { discordRoleId: { in: roles.map((r) => r.discordRoleId) } }, orderBy: [{ category: 'asc' }, { sortOrder: 'desc' }], }) const byId = new Map(mappings.map((m) => [m.discordRoleId, m])) const granted = [...user.permissions.permissions].sort() // Offene Exportfreigaben stehen hier, weil die Leitung diese Seite ohnehin // öffnet. Eine Anfrage, die niemand sieht, ist keine Freigabe. const offen = await pendingApprovals(user.permissions) const beschriftet = await beschrifte(offen) return (
{beschriftet.length > 0 ? (

{de.export.approvals}

) : null}

{de.overview.heading}

{de.overview.intro}

{de.overview.person}
{user.displayName}
{de.overview.discordId}
{user.id}
{de.overview.clearance}
{user.permissions.isAdmin ? (

{de.overview.bootstrapAdmin}

) : null}

{de.overview.roles}

{roles.length === 0 ? (

{de.overview.noRoles}

) : ( )}

{de.overview.permissions}

{granted.length === 0 ? (

{de.overview.noPermissions}

) : ( )}
) } /** * Der Freigabeliste fehlen die Namen: der Auftrag kennt nur Kennungen. Sie * werden hier nachgeschlagen, damit die Leitung sieht, worum es geht — mehr * als Aktenzeichen und Anfragender steht dort bewusst nicht. */ async function beschrifte( jobs: Awaited>, ): Promise< { id: string; kind: string; label: string; requestedBy: string; clearanceAtTime: number; createdAt: string }[] > { if (jobs.length === 0) return [] const [faelle, dokumente, nutzer] = await Promise.all([ db.case.findMany({ where: { id: { in: jobs.filter((j) => j.kind === 'CASE').map((j) => j.targetId ?? '') } }, select: { id: true, caseNumber: true }, }), db.document.findMany({ where: { id: { in: jobs.filter((j) => j.kind === 'DOCUMENT').map((j) => j.targetId ?? '') } }, select: { id: true, documentNumber: true }, }), db.user.findMany({ where: { id: { in: jobs.map((j) => j.requestedById) } }, select: { id: true, displayName: true }, }), ]) const nummer = new Map([ ...faelle.map((f) => [f.id, f.caseNumber] as const), ...dokumente.map((d) => [d.id, d.documentNumber] as const), ]) const name = new Map(nutzer.map((n) => [n.id, n.displayName])) return jobs.map((job) => ({ id: job.id, kind: job.kind, label: nummer.get(job.targetId ?? '') ?? '—', requestedBy: name.get(job.requestedById) ?? job.requestedById, clearanceAtTime: job.clearanceAtTime, createdAt: job.createdAt.toISOString(), })) }