// Ein Vorschlag für die nächste Orgnummer. // // Die Nummer wird eingetragen, nicht erzeugt — wie die Personalnummer, und aus // demselben Grund: sie stammt aus dem führenden System des Kunden, und eine // selbst vergebene Nummer wäre eine, die dort niemand kennt. Ein leeres Feld // in einem Dialog, der sonst zwei Klicks braucht, ist aber die Stelle, an der // jemand ins Stocken gerät. // // Deshalb ein **Vorschlag** und keine Vergabe: erkennbar ist nur, was sich aus // dem Bestand ablesen lässt, und wenn sich nichts ablesen lässt, steht hier // nichts. Geraten wird nicht — eine plausibel aussehende, aber erfundene // Systematik wäre schlimmer als ein leeres Feld, weil sie niemand nachprüft. // // Erkannt wird genau ein Muster: gleichbleibender Vorspann, dann Ziffern // („OE-0013“, „10000001“). Führende Nullen bleiben in der Breite erhalten, die // der Bestand führt. const MUSTER = /^(.*?)(\d+)$/; export function naechsteOrgnummer(vorhandene: readonly string[]): string | undefined { if (vorhandene.length === 0) return undefined; let vorspann: string | null = null; let breite = 0; let hoechste = 0; for (const nummer of vorhandene) { const treffer = MUSTER.exec(nummer.trim()); if (!treffer) return undefined; const [, kopf, ziffern] = treffer; // Zwei Systematiken nebeneinander („OE-0013“ und „B7“) — dann gibt es // keine nächste Nummer, sondern zwei Reihen, und welche gemeint ist, // weiss nur der Mensch vor dem Dialog. if (vorspann === null) vorspann = kopf; else if (vorspann !== kopf) return undefined; breite = Math.max(breite, ziffern.length); hoechste = Math.max(hoechste, Number(ziffern)); } const naechste = hoechste + 1; // Wächst die Zahl über die bisherige Breite hinaus, wird sie eben länger — // abzuschneiden hiesse, eine bereits vergebene Nummer vorzuschlagen. return `${vorspann}${String(naechste).padStart(breite, "0")}`; }