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>
42 lines
1.9 KiB
TypeScript
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])));
|