import { db } from '@/lib/db'
import { loadDocumentSections } from '@/lib/documents/service'
import { resolvePhotoUrls } from '@/lib/files/service'
import { Sheet } from '@/components/documents/Sheet'
import { de } from '@/lib/i18n/de'
import { isInputField, fillPlaceholders } from '@/lib/templates/fields'
import type { EffectivePermissions } from '@/lib/auth/permissions'
/**
* Der Druckbogen eines Dokuments, ohne die Seite drumherum.
*
* Kein Verlauf, keine Kopfdatentabelle einer Akte - das Dokument selbst, so
* wie seine Vorlage es vorsieht. Ein Aktenblatt kommt als Aktenblatt heraus,
* ein Vertrag als Vertrag. Siehe docs/08-suche-und-export.md.
*
* Ausgelagert aus derselben Not wie CaseSheet: das Dossier einer Person hängt
* alle Dokumente hintereinander, und zwar in genau dieser Darstellung.
*/
export type DocumentForPrint = {
id: string
documentNumber: string
title: string
templateId: string
templateKey: string
layout: string
status: string
classification: number
createdAt: Date
retractedAt: Date | null
}
export async function DocumentSheet({
permissions,
displayName,
doc,
/** Im Dossier steht der Deckel schon vorn; dann nur der Inhalt. */
withCover = true,
}: {
permissions: EffectivePermissions
displayName: string
doc: DocumentForPrint
withCover?: boolean
}) {
const [sections, template, foundationLevels, levels] = await Promise.all([
loadDocumentSections(permissions, doc),
db.documentTemplate.findUnique({
where: { id: doc.templateId },
select: { sheetTitle: true, sheetSubtitle: true, name: true },
}),
db.foundationClearance.findMany({ orderBy: { sortOrder: 'asc' } }),
db.clearanceLevelConfig.findMany({ orderBy: { level: 'asc' } }),
])
const photoUrls = await resolvePhotoUrls(
permissions,
sections.map((section) => ({
fieldKey: section.fieldKey,
visible: section.visible,
value: section.visible ? section.value : null,
type: section.field.type,
})),
)
const levelName = new Map(levels.map((l) => [l.level, l.name]))
const werte = Object.fromEntries(
sections.filter((s) => s.visible).map((s) => [s.fieldKey, s.value]),
)
// Das Aktenblatt bringt sein eigenes Aussehen mit und braucht keinen
// Berichtsrahmen darum.
if (doc.layout === 'DOSSIER') {
return (
{doc.documentNumber}
{doc.documentNumber} · {de.document.statusNames[doc.status] ?? doc.status}
{doc.title}
{de.case.status}
{de.document.statusNames[doc.status] ?? doc.status}
{de.document.kind}
{doc.templateKey}
{de.export.retrievedBy}
{displayName}
{de.export.asOf}
{new Date().toLocaleString('de-DE')} · {de.clearance.label}{' '}
{permissions.clearanceLevel}
{doc.title}
{de.document.statusNames.RETRACTED}
) : null} {sections.map((section) => { const field = section.field if (!isInputField(field)) { if (field.type === 'pagebreak') { return } const text = fillPlaceholders(field.text ?? '', werte) return field.type === 'heading' ? ({text}
) } if (field.type === 'signature') { return ({fillPlaceholders(field.label, werte)}
{field.label}
{!section.visible ? ({' '} {de.export.redactedAt( section.value.requiredLevel, levelName.get(section.value.requiredLevel) ?? '', )}
) : ({String(section.value ?? '-')}
)}