feat(vorlagen): Abschnitte nur fuer bestimmte Abteilungen (#58)
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s

This commit was merged in pull request #58.
This commit is contained in:
2026-10-04 18:04:51 +00:00
parent 80870133b8
commit 855164066c
24 changed files with 815 additions and 37 deletions
+6 -1
View File
@@ -1,5 +1,6 @@
import { LaufStatus, SchrittTyp, SchrittZustand } from "@/generated/prisma/enums";
import { prisma } from "@/lib/db";
import { nurGeltende } from "@/lib/geltende-abschnitte";
import { platzhalterErsetzen } from "@/lib/platzhalter-werte";
import { kundenEbeneSichtbar, sichtbareKundenIds, type HandelnderBenutzer } from "@/server/mandant";
import { kommentareDesLaufs, type KommentarZeile } from "@/server/queries/laeufe";
@@ -163,6 +164,8 @@ export async function laufZumDrucken(
zugewiesenAn: { select: { name: true } },
abgeschlossenVon: { select: { name: true } },
archiviertVon: { select: { name: true } },
// Beim Start festgeschriebene Abschnittsauswahl (#031).
geltendeAbschnitte: true,
vorlagenVersion: {
select: {
version: true,
@@ -219,7 +222,9 @@ export async function laufZumDrucken(
let anzahlSchritte = 0;
let anzahlVomTisch = 0;
const abschnitte = lauf.vorlagenVersion.abschnitte.map((abschnitt, index) => {
// Dieselbe Auswahl wie in der Abarbeitung – nicht mehr und nicht weniger (#031).
const geltende = nurGeltende(lauf.vorlagenVersion.abschnitte, lauf.geltendeAbschnitte);
const abschnitte = geltende.map((abschnitt, index) => {
const schritte = abschnitt.schritte.map((schritt) => {
nummer += 1;
anzahlSchritte += 1;
+25 -1
View File
@@ -1,6 +1,7 @@
import type { Prisma } from "@/generated/prisma/client";
import { LaufStatus, SchrittTyp, SchrittZustand } from "@/generated/prisma/enums";
import { prisma } from "@/lib/db";
import { nurGeltende } from "@/lib/geltende-abschnitte";
import { platzhalterErsetzen } from "@/lib/platzhalter-werte";
import { platzhalterAusserhalbAnfuehrungszeichen, skriptBauen, wertMaskieren, type Shell } from "@/lib/shell";
import { STANDARD_SHELL } from "@/lib/editor-aufbau";
@@ -236,6 +237,8 @@ export async function laufZumAbarbeiten(
const lauf = await prisma.lauf.findUniqueOrThrow({
where: { id: laufId },
select: {
// Beim Start festgeschriebene Abschnittsauswahl (#031).
geltendeAbschnitte: true,
vorlagenVersion: {
select: {
abschnitte: {
@@ -294,7 +297,8 @@ export async function laufZumAbarbeiten(
let anzahlPflicht = 0;
let anzahlPflichtOffen = 0;
const abschnitte = lauf.vorlagenVersion.abschnitte.map((abschnitt, index) => {
const geltende = nurGeltende(lauf.vorlagenVersion.abschnitte, lauf.geltendeAbschnitte);
const abschnitte = geltende.map((abschnitt, index) => {
const befehle: { titel: string; shell: Shell; befehl: string }[] = [];
const schritte = abschnitt.schritte.map((schritt) => {
@@ -599,6 +603,17 @@ export type StartbareVorlage = {
readonly optionen: readonly string[];
readonly pflicht: boolean;
}[];
/**
* Abschnitte, die nur fuer bestimmte Abteilungen gelten (#031).
*
* Der Start-Dialog sagt damit **vorher**, was die gewaehlte Abteilung
* hinzunimmt. Ohne das waere die Zahl der Schritte eine Ueberraschung, und wer
* sich bei der Abteilung vertippt, merkt es erst in der Abarbeitung.
*/
readonly abteilungsAbschnitte: readonly {
readonly titel: string;
readonly abteilungen: readonly string[];
}[];
};
/**
@@ -641,6 +656,11 @@ export async function startbareVorlagen(benutzer: HandelnderBenutzer): Promise<r
pflicht: true,
},
},
abschnitte: {
where: { NOT: { nurFuerAbteilungen: { isEmpty: true } } },
orderBy: { position: "asc" },
select: { titel: true, nurFuerAbteilungen: true },
},
},
},
},
@@ -659,6 +679,10 @@ export async function startbareVorlagen(benutzer: HandelnderBenutzer): Promise<r
version: version.version,
kategorie: vorlage.kategorie,
variablen: version.variablen,
abteilungsAbschnitte: version.abschnitte.map((abschnitt) => ({
titel: abschnitt.titel,
abteilungen: abschnitt.nurFuerAbteilungen,
})),
});
}
return startbare;
+2
View File
@@ -266,6 +266,8 @@ export async function versionMitAufbau(
})),
abschnitte: version.abschnitte.map((abschnitt) => ({
titel: abschnitt.titel,
nurFuerAbteilungen: abschnitt.nurFuerAbteilungen,
...(abschnitt.bausteinVersionId === null ? {} : { bausteinVersionId: abschnitt.bausteinVersionId }),
schritte: abschnitt.schritte.map((schritt) => ({
titel: schritt.titel,
...(schritt.hilfetext === null ? {} : { hilfetext: schritt.hilfetext }),