Aktenzeichen-Muster je Vorlage, Startskript für die Entwicklung

Richtigstellung zuerst: der vorige Commit trägt die Nachricht "Nichts davon
gebaut", enthält aber bereits die Schema-Änderung an CaseTemplate und
CaseCounter. Ein abgebrochener Aufruf hatte die Datei schon geschrieben, und
das nachfolgende `git add -A` hat sie mitgenommen. Die Nachricht war damit
falsch. Hier ist die Änderung vollständig und geprüft.

Das Muster des Aktenzeichens gehört zur Vorlage: Präfix und Stellenzahl je
Fallart, ein Nummernkreis je Präfix und Jahr. Die Abteilung führt gewachsene
Präfixe wie AKT-PA-2026-62843 neben dem AfiS-2026-0042 aus dem Glossar.

Die Migration ist von Hand geschrieben, weil der Wechsel des Primärschlüssels
auf CaseCounter den bestehenden Zähler erhalten muss: eine zurückgesetzte
Nummer wäre ein doppeltes Aktenzeichen. Vorher und nachher geprüft.

parseCaseNumber zerlegt von hinten, damit Präfixe mit Bindestrich funktionieren.
Ein Test belegt, dass AKT-PA und AfiS getrennte Nummernkreise führen.

Dazu start.sh für die lokale Entwicklung, solange der Dockge-Stack nicht läuft:
Datenbank hochfahren, Migrationen, Grundzustand, Worker und Web. Mit
--ohne-worker für Arbeit ohne Discord und --nur-db für die Datenbank allein.
This commit is contained in:
Harlekin
2026-09-02 12:10:34 +02:00
parent 4d926ee603
commit 66ad19c456
6 changed files with 259 additions and 28 deletions
@@ -0,0 +1,20 @@
-- Aktenzeichen-Muster je Vorlage, siehe docs/13-entscheidungen.md.
--
-- Die Abteilung führt gewachsene Präfixe wie "AKT-PA" mit fünfstelliger
-- Nummer. Das Muster gehört deshalb zur Vorlage, nicht ins Programm.
ALTER TABLE "CaseTemplate"
ADD COLUMN "numberPrefix" TEXT NOT NULL DEFAULT 'AfiS',
ADD COLUMN "numberPadding" INTEGER NOT NULL DEFAULT 4;
-- Der Nummernkreis läuft ab jetzt je Präfix und Jahr. Bestehende Zähler
-- gehören zum bisherigen Präfix "AfiS" und werden nicht zurückgesetzt:
-- eine erneut vergebene Nummer wäre ein doppeltes Aktenzeichen.
ALTER TABLE "CaseCounter" ADD COLUMN "prefix" TEXT NOT NULL DEFAULT 'AfiS';
ALTER TABLE "CaseCounter" DROP CONSTRAINT "CaseCounter_pkey";
ALTER TABLE "CaseCounter" ADD CONSTRAINT "CaseCounter_pkey" PRIMARY KEY ("prefix", "year");
-- Der Vorgabewert hat nur die vorhandenen Zeilen umgestellt; neue Zeilen
-- nennen ihr Präfix ausdrücklich.
ALTER TABLE "CaseCounter" ALTER COLUMN "prefix" DROP DEFAULT;
+27 -7
View File
@@ -36,7 +36,13 @@ const CLEARANCE_LEVELS = [
* mit allen Feldtypen baut Phase 3, hier steht nur, was eine Akte zum Laufen
* braucht.
*/
const TEMPLATES = [
const TEMPLATES: {
key: string
name: string
description: string
numberPrefix?: string
numberPadding?: number
}[] = [
{
key: 'korruptionsverdacht',
name: 'Korruptionsverdacht',
@@ -96,18 +102,32 @@ async function main(): Promise<void> {
for (const template of TEMPLATES) {
await db.caseTemplate.upsert({
where: { key_version: { key: template.key, version: 1 } },
create: { ...template, version: 1, fields: TEMPLATE_FIELDS, isActive: true },
create: {
...template,
numberPrefix: template.numberPrefix ?? 'AfiS',
numberPadding: template.numberPadding ?? 4,
version: 1,
fields: TEMPLATE_FIELDS,
isActive: true,
},
// Muster und Felder bleiben unangetastet: was der Leiter im
// Vorlagen-Editor eingestellt hat, überschreibt der Seed nicht.
update: { name: template.name, description: template.description },
})
}
console.log(`[seed] ${TEMPLATES.length} Startvorlagen`)
// Ein Nummernkreis je Präfix und Jahr. Angelegt wird er beim ersten Fall
// von selbst; hier steht er nur, damit ein frischer Bestand nachvollziehbar
// bei null beginnt.
const year = new Date().getFullYear()
await db.caseCounter.upsert({
where: { year },
create: { year, lastNumber: 0 },
update: {},
})
for (const prefix of [...new Set(TEMPLATES.map((t) => t.numberPrefix ?? 'AfiS'))]) {
await db.caseCounter.upsert({
where: { prefix_year: { prefix, year } },
create: { prefix, year, lastNumber: 0 },
update: {},
})
}
console.log(`[seed] Aktenzeichen-Zähler für ${year}`)
// entry.edit_own, entry.edit_any und entry.retract sind bewusst keiner Rolle