feat(anhaenge): Fotos und Dateien an einem Schritt (#52) (#59)
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s

This commit was merged in pull request #59.
This commit is contained in:
2026-10-05 20:49:26 +00:00
parent 855164066c
commit 3ccf3aa2d9
25 changed files with 1989 additions and 47 deletions
+19
View File
@@ -1,6 +1,7 @@
import { LaufStatus, SchrittTyp, SchrittZustand } from "@/generated/prisma/enums";
import { prisma } from "@/lib/db";
import { nurGeltende } from "@/lib/geltende-abschnitte";
import { anhaengeDesLaufs } from "@/server/services/anhaenge";
import { platzhalterErsetzen } from "@/lib/platzhalter-werte";
import { kundenEbeneSichtbar, sichtbareKundenIds, type HandelnderBenutzer } from "@/server/mandant";
import { kommentareDesLaufs, type KommentarZeile } from "@/server/queries/laeufe";
@@ -87,6 +88,13 @@ export type DruckSchritt = {
readonly bearbeitetVon: string | null;
readonly bearbeitetAm: Date | null;
readonly kommentare: readonly KommentarZeile[];
/** Anhaenge an diesem Schritt (#032). Bilder als Miniatur, PDF als Zeile. */
readonly anhaenge: readonly {
readonly id: string;
readonly dateiname: string;
readonly medientyp: string;
readonly groesse: number;
}[];
};
export type DruckAbschnitt = {
@@ -216,6 +224,9 @@ export async function laufZumDrucken(
// Lesemodell fuer dieselben Zeilen waere eine Stelle mehr, die sie vergessen
// kann.
const alleKommentare = await kommentareDesLaufs(laufId, benutzer);
// Nur Metadaten: der Ausdruck verweist auf die Adresse, er traegt die Datei
// nicht in sich (#032).
const alleAnhaenge = await anhaengeDesLaufs(laufId);
const ergebnisse = new Map(lauf.ergebnisse.map((ergebnis) => [ergebnis.vorlagenSchrittId, ergebnis]));
let nummer = 0;
@@ -264,6 +275,14 @@ export async function laufZumDrucken(
ergebnis?.aktualisiertVon?.name ?? (zustand === SchrittZustand.OFFEN ? null : "System"),
bearbeitetAm: zustand === SchrittZustand.OFFEN ? null : (ergebnis?.aktualisiertAm ?? null),
kommentare: alleKommentare.filter((kommentar) => kommentar.schrittergebnisId === ergebnis?.id),
anhaenge: alleAnhaenge
.filter((anhang) => anhang.schrittergebnisId === ergebnis?.id)
.map((anhang) => ({
id: anhang.id,
dateiname: anhang.dateiname,
medientyp: anhang.medientyp,
groesse: anhang.groesse,
})),
};
});