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>
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
// 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])));
|
||||
Reference in New Issue
Block a user