feat(protokoll): Protokoll ansehen, mit Filtern und Mandantensicht (#45)
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s

This commit was merged in pull request #45.
This commit is contained in:
2026-10-04 16:06:26 +00:00
parent f5936327a0
commit e1f244e4e8
23 changed files with 1103 additions and 22 deletions
+4 -1
View File
@@ -568,7 +568,7 @@ async function abschlussSchreiben(
uebersprungen: number,
): Promise<void> {
await prisma.$transaction(async (tx) => {
await tx.verzeichnisquelle.update({
const quelle = await tx.verzeichnisquelle.update({
where: { id: quelleId },
data: {
letzterAbgleichAm: new Date(),
@@ -578,6 +578,9 @@ async function abschlussSchreiben(
});
await tx.protokoll.create({
data: {
// Aus der Aktualisierung, nicht aus einer zweiten Abfrage: der Kunde
// steht in derselben Zeile, die gerade geschrieben wurde (#023).
kundeId: quelle.kundeId,
entitaet: "Verzeichnisquelle",
entitaetId: quelleId,
aktion:
+3
View File
@@ -100,6 +100,7 @@ export async function abteilungAnlegen(
});
await tx.protokoll.create({
data: {
kundeId: abteilung.kundeId,
entitaet: "Abteilung",
entitaetId: abteilung.id,
aktion: "Abteilung angelegt",
@@ -169,6 +170,7 @@ export async function abteilungBearbeiten(
const nachher = await tx.abteilung.update({ where: { id: abteilungId }, data: daten });
await tx.protokoll.create({
data: {
kundeId: vorher.kundeId,
entitaet: "Abteilung",
entitaetId: abteilungId,
aktion: `${geaendert.join(" und ")} geändert`,
@@ -202,6 +204,7 @@ export async function abteilungArchivieren(
const nachher = await tx.abteilung.update({ where: { id: abteilungId }, data: { archiviert } });
await tx.protokoll.create({
data: {
kundeId: vorher.kundeId,
entitaet: "Abteilung",
entitaetId: abteilungId,
aktion: archiviert ? "Abteilung archiviert" : "Abteilung wieder freigegeben",
+1
View File
@@ -81,6 +81,7 @@ export async function einstellungenSpeichern(
await prisma.kunde.update({ where: { id: vorher.eigeneOrganisation.id }, data: { name } });
await prisma.protokoll.create({
data: {
kundeId: vorher.eigeneOrganisation.id,
entitaet: "Kunde",
entitaetId: vorher.eigeneOrganisation.id,
aktion: "Name der eigenen Organisation geändert",
+4
View File
@@ -197,6 +197,7 @@ async function geraetSchreiben(auftrag: SchreibAuftrag): Promise<Geraet> {
});
await tx.protokoll.create({
data: {
kundeId: geraet.kundeId,
entitaet: "Geraet",
entitaetId: geraet.id,
aktion: auftrag.aktion,
@@ -314,6 +315,7 @@ export async function geraetBearbeiten(
const nachher = await tx.geraet.update({ where: { id: geraetId }, data: daten });
await tx.protokoll.create({
data: {
kundeId: vorher.kundeId,
entitaet: "Geraet",
entitaetId: geraetId,
aktion: `${geaendert.join(" und ")} geändert`,
@@ -371,6 +373,7 @@ export async function geraetArchivieren(
await tx.geraet.update({ where: { id: geraetId }, data: { archiviert } });
await tx.protokoll.create({
data: {
kundeId: geraet.kundeId,
entitaet: "Geraet",
entitaetId: geraetId,
aktion: archiviert ? "Gerät archiviert" : "Gerät wieder freigegeben",
@@ -418,6 +421,7 @@ export async function geraetLoeschen(geraetId: string, benutzer: HandelnderBenut
await tx.geraet.delete({ where: { id: geraetId } });
await tx.protokoll.create({
data: {
kundeId: geraet.kundeId,
entitaet: "Geraet",
entitaetId: geraetId,
aktion: "Gerät gelöscht",
+3
View File
@@ -114,6 +114,7 @@ export async function kundeAnlegen(eingabe: NeuerKunde, durchBenutzerId: string)
await prisma.protokoll.create({
data: {
kundeId: kunde.id,
entitaet: "Kunde",
entitaetId: kunde.id,
aktion: "Kunde angelegt",
@@ -181,6 +182,7 @@ export async function kundeBearbeiten(
await prisma.protokoll.create({
data: {
kundeId: id,
entitaet: "Kunde",
entitaetId: id,
aktion: `${felder.map((feld) => FELD_TEXT[feld]).join(" und ")} geändert`,
@@ -215,6 +217,7 @@ export async function kundeArchivieren(
await prisma.kunde.update({ where: { id }, data: { archiviert } });
await prisma.protokoll.create({
data: {
kundeId: id,
entitaet: "Kunde",
entitaetId: id,
aktion: archiviert ? "Kunde archiviert" : "Kunde wieder freigegeben",
+4
View File
@@ -131,6 +131,7 @@ export async function mitarbeiterAnlegen(
});
await tx.protokoll.create({
data: {
kundeId: mitarbeiter.kundeId,
entitaet: "Mitarbeiter",
entitaetId: mitarbeiter.id,
aktion: vermerk?.aktion ?? "Mitarbeiter angelegt",
@@ -200,6 +201,7 @@ export async function mitarbeiterBearbeiten(
const nachher = await tx.mitarbeiter.update({ where: { id: mitarbeiterId }, data: daten });
await tx.protokoll.create({
data: {
kundeId: vorher.kundeId,
entitaet: "Mitarbeiter",
entitaetId: mitarbeiterId,
aktion: `${geaendert.join(" und ")} geändert`,
@@ -260,6 +262,7 @@ export async function vorgesetztenSetzen(
});
await tx.protokoll.create({
data: {
kundeId: vorher.kundeId,
entitaet: "Mitarbeiter",
entitaetId: mitarbeiterId,
aktion: gewuenscht === null ? "Vorgesetzter entfernt" : `Vorgesetzter auf ${name} gesetzt`,
@@ -321,6 +324,7 @@ export async function mitarbeiterAktivSetzen(
const nachher = await tx.mitarbeiter.update({ where: { id: mitarbeiterId }, data: { aktiv } });
await tx.protokoll.create({
data: {
kundeId: vorher.kundeId,
entitaet: "Mitarbeiter",
entitaetId: mitarbeiterId,
aktion: aktiv ? "Mitarbeiter wieder aktiviert" : "Mitarbeiter deaktiviert",
+3
View File
@@ -210,6 +210,7 @@ export async function quelleAnlegen(
});
await tx.protokoll.create({
data: {
kundeId: angelegt.kundeId,
entitaet: "Verzeichnisquelle",
entitaetId: angelegt.id,
aktion: "Verzeichnisquelle angelegt",
@@ -316,6 +317,7 @@ export async function quelleBearbeiten(
const nachher = await tx.verzeichnisquelle.update({ where: { id }, data: daten });
await tx.protokoll.create({
data: {
kundeId: vorher.kundeId,
entitaet: "Verzeichnisquelle",
entitaetId: id,
aktion: `${geaendert.join(", ")} geändert`,
@@ -354,6 +356,7 @@ export async function quelleLoeschen(id: string, benutzer: HandelnderBenutzer):
await tx.verzeichnisquelle.delete({ where: { id } });
await tx.protokoll.create({
data: {
kundeId: quelle.kundeId,
entitaet: "Verzeichnisquelle",
entitaetId: id,
aktion: "Verzeichnisquelle gelöscht",
@@ -177,6 +177,7 @@ export async function vorlageImportieren(
await tx.protokoll.create({
data: {
kundeId: vorlage.kundeId,
entitaet: "Vorlage",
entitaetId: vorlage.id,
aktion: "Vorlage importiert",
+21 -2
View File
@@ -61,6 +61,7 @@ export async function vorlageAnlegen(
});
await tx.protokoll.create({
data: {
kundeId: vorlage.kundeId,
entitaet: "Vorlage",
entitaetId: vorlage.id,
aktion: "Vorlage angelegt",
@@ -147,6 +148,7 @@ export async function vorlageBearbeiten(
const nachher = await tx.vorlage.update({ where: { id: vorlageId }, data: daten });
await tx.protokoll.create({
data: {
kundeId: nachher.kundeId,
entitaet: "Vorlage",
entitaetId: vorlageId,
aktion: `${geaendert.join(" und ")} geändert`,
@@ -263,6 +265,12 @@ async function entwurfKopieren(
durchBenutzerId: string,
): Promise<VorlagenVersion> {
return prisma.$transaction(async (tx) => {
// Der Kunde fuer den Protokolleintrag; ein indizierter Lesevorgang auf dem
// Primaerschluessel (#023).
const vorlage = await tx.vorlage.findUniqueOrThrow({
where: { id: vorlageId },
select: { kundeId: true },
});
const entwurf = await tx.vorlagenVersion.create({
data: { vorlageId, version: naechste, status: VersionStatus.ENTWURF },
});
@@ -304,6 +312,7 @@ async function entwurfKopieren(
await tx.protokoll.create({
data: {
kundeId: vorlage.kundeId,
entitaet: "VorlagenVersion",
entitaetId: entwurf.id,
aktion: "Entwurf aus veröffentlichter Version erstellt",
@@ -485,7 +494,7 @@ export async function versionVeroeffentlichen(
const kopf = await tx.vorlagenVersion.findUniqueOrThrow({
where: { id: versionId },
select: {
vorlage: { select: { archiviert: true, name: true } },
vorlage: { select: { archiviert: true, name: true, kundeId: true } },
_count: { select: { abschnitte: true } },
},
});
@@ -518,6 +527,7 @@ export async function versionVeroeffentlichen(
await tx.protokoll.create({
data: {
kundeId: kopf.vorlage.kundeId,
entitaet: "VorlagenVersion",
entitaetId: versionId,
aktion: "Version veröffentlicht",
@@ -545,7 +555,13 @@ export async function versionVeroeffentlichen(
export async function entwurfVerwerfen(versionId: string, durchBenutzerId: string): Promise<void> {
const version = await prisma.vorlagenVersion.findUnique({
where: { id: versionId },
select: { id: true, status: true, version: true, vorlageId: true },
select: {
id: true,
status: true,
version: true,
vorlageId: true,
vorlage: { select: { kundeId: true } },
},
});
if (!version) throw new VorlagenFehler("Diese Version gibt es nicht.");
versionMussEntwurfSein(version);
@@ -563,6 +579,7 @@ export async function entwurfVerwerfen(versionId: string, durchBenutzerId: strin
await tx.vorlagenVersion.delete({ where: { id: versionId } });
await tx.protokoll.create({
data: {
kundeId: version.vorlage.kundeId,
entitaet: "VorlagenVersion",
entitaetId: versionId,
aktion: "Entwurf verworfen",
@@ -661,6 +678,7 @@ export async function vorlageDuplizieren(
await tx.protokoll.create({
data: {
kundeId: kopie.kundeId,
entitaet: "Vorlage",
entitaetId: kopie.id,
aktion: "Vorlage dupliziert",
@@ -693,6 +711,7 @@ export async function vorlageArchivieren(
await tx.vorlage.update({ where: { id: vorlageId }, data: { archiviert } });
await tx.protokoll.create({
data: {
kundeId: vorlage.kundeId,
entitaet: "Vorlage",
entitaetId: vorlageId,
aktion: archiviert ? "Vorlage archiviert" : "Vorlage wieder freigegeben",