// 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>> => 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])));