import 'server-only' import type { BerichtArt } from '@prisma/client' import { aktiveBetreute, erfordereBenutzer, erfordereZugang } from '@/lib/auth/sitzung' import { signierteUrl } from '@/lib/speicher' import { db, nichtGeloescht } from '@/lib/db' import { formatDatum } from '@/lib/utils' import type { BerichtsZeile } from '@/components/berichte/berichts-liste' /** * Der gemeinsame Vorspann aller Berichtsseiten. * * Wie ueberall gilt: Die aktive betreute Person kommt aus dem Cookie, ob * sie angezeigt werden darf, entscheidet erfordereZugang() gegen die * Datenbank. Ein manipuliertes Cookie kaeme hoechstens bis hierher. */ export async function berichtskontext(art: 'lesen' | 'schreiben' = 'lesen') { const benutzer = await erfordereBenutzer('/berichte') const gewaehlt = await aktiveBetreute(benutzer) if (!gewaehlt) throw new Error('Es ist keine betreute Person ausgewählt.') const kontext = await erfordereZugang(gewaehlt.id, 'BERICHTE', art) return { ...kontext, betreuteId: gewaehlt.id, darfBerichteSchreiben: kontext.darfSchreiben('BERICHTE'), } } export const BERICHTSART_BESCHRIFTUNG: Record = { VERMOEGENSVERZEICHNIS: 'Vermögensverzeichnis (§ 1835 BGB)', JAHRESBERICHT: 'Jahresbericht (§ 1863 BGB)', VERMOEGENSUEBERSICHT: 'Vermögensübersicht (§ 1859 BGB)', RECHNUNGSLEGUNG: 'Rechnungslegung (§ 1865 BGB)', BELEGMAPPE: 'Belegmappe', UNTERLAGENPAKET_BEZIRK: 'Unterlagenpaket für den Träger', VOLLEXPORT: 'Vollexport', } /** * Laedt die protokollierten Berichte und erzeugt zu jeder abgelegten Datei * eine kurzlebige, signierte Adresse. Die Adresse wird bei jedem * Seitenaufbau neu erzeugt und laeuft nach fuenf Minuten ab - ein * versehentlich weitergegebener Link ist dann wertlos. */ export async function berichtsZeilenLaden( betreuteId: string, darfSchreiben: boolean, ): Promise { const berichte = await db.bericht.findMany({ where: { betreuteId, ...nichtGeloescht }, include: { erstelltVon: { select: { name: true } } }, orderBy: { erstelltAm: 'desc' }, take: 200, }) return Promise.all( berichte.map(async (bericht) => ({ id: bericht.id, art: bericht.art, artBeschriftung: BERICHTSART_BESCHRIFTUNG[bericht.art], titel: bericht.titel, zeitraum: bericht.zeitraumVon || bericht.zeitraumBis ? `${formatDatum(bericht.zeitraumVon)} – ${formatDatum(bericht.zeitraumBis)}` : bericht.stichtag ? `Stand ${formatDatum(bericht.stichtag)}` : null, erstelltAm: bericht.erstelltAm.toISOString(), erstelltVon: bericht.erstelltVon?.name ?? null, dateiname: bericht.dateiname, downloadUrl: bericht.objektSchluessel ? await signierteUrl(bericht.objektSchluessel).catch(() => null) : null, abgegebenAm: bericht.abgegebenAm ? bericht.abgegebenAm.toISOString() : null, abgegebenAn: bericht.abgegebenAn, bearbeitbar: darfSchreiben && bericht.art === 'JAHRESBERICHT', })), ) }