Files
craftvia/scripts/test-auftraege-numbering.ts
T
msolarczekandClaude Opus 5 2311b35d8c L2 Aufträge & Backoffice: Service-Schicht Aufträge + Tests
Statusmaschine (transitionWorkOrder inkl. eventData), Zuweisung, Completion-Guards,
Materialvorgabe, Checklisten/Pflichtfotos, Liste/Dashboard-Presets, Suche,
Sync-Konflikte, Einstellungen (Auftragsarten, Vorlagen, Nummernkreise).
Tests: Übergangsmatrix je Rolle, Kernlogik, Scope/Mandantentrennung, Nummernkreis-Parallelität.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 12:29:15 +02:00

42 lines
1.9 KiB
TypeScript

// L2 Aufträge: Nummernkreis unter Parallelität.
//
// (1) 20 parallele createWorkOrder auf einem frischen Mandanten (auch die erste Zeile der Sequenz
// entsteht im Wettlauf) → 20 eindeutige, lückenlose Nummern A-00001 … A-00020
// (2) Zweiter Mandant beginnt unabhängig bei A-00001
//
// Lauf: npx tsx scripts/test-auftraege-numbering.ts
import "dotenv/config";
import { createWorkOrder } from "../src/server/services/work-orders/create";
import { cleanupTenants, createFixture, finish, ok } from "./lib-auftraege-fixtures";
const SLUG_A = "zz-l2-num-a";
const SLUG_B = "zz-l2-num-b";
async function main() {
await cleanupTenants([SLUG_A, SLUG_B]);
const A = await createFixture(SLUG_A);
const B = await createFixture(SLUG_B);
const results = await Promise.allSettled(
Array.from({ length: 20 }, (_, i) => createWorkOrder(A.ctx.backoffice, { title: `Parallel ${i}`, customerId: A.customerId })),
);
const fulfilled = results.filter((r): r is PromiseFulfilledResult<Awaited<ReturnType<typeof createWorkOrder>>> => r.status === "fulfilled");
for (const r of results) if (r.status === "rejected") console.error(r.reason);
ok(fulfilled.length === 20, `20 von 20 parallelen Anlagen erfolgreich (${fulfilled.length})`);
const numbers = fulfilled.map((r) => r.value.number).sort();
ok(new Set(numbers).size === numbers.length, "Alle Nummern eindeutig");
const expected = Array.from({ length: 20 }, (_, i) => `A-${String(i + 1).padStart(5, "0")}`);
ok(JSON.stringify(numbers) === JSON.stringify(expected), "Lückenlos A-00001 … A-00020");
const b = await createWorkOrder(B.ctx.backoffice, { title: "B", customerId: B.customerId });
ok(b.number === "A-00001", "Mandant B hat einen eigenen Nummernkreis");
}
main()
.catch((e) => {
console.error(e);
ok(false, "unerwarteter Fehler");
})
.finally(finish(() => cleanupTenants([SLUG_A, SLUG_B])));