Eine Organisationseinheit aus dem Organigramm heraus anlegen
Bisher gab es dafuer nur den Import. Jetzt sitzt auf jeder Einheit im Organigramm -- in der Grafik wie in der Liste -- ein Plus, das eine untergeordnete Einheit anlegt, wahlweise gleich mit Leitungsplanstelle. Bewusst nur dieser eine Fall. Umbenennen, verschieben und schliessen fehlen nicht aus Zeitmangel: org_units.parent_id traegt kein Datum, ein Verschieben aenderte damit auch jede Auswertung auf einen vergangenen Stichtag, und der fruehere Stand waere danach nirgends mehr ablesbar. Anlegen stellt diese Frage nicht, weil vorher nichts da war -- und es kann dabei auch kein Kreis entstehen, was hier mehr wiegt als es klingt: die rekursive Abfrage in om_reporting_lines hat weder Tiefenbegrenzung noch Kreiserkennung. Die Leitungsplanstelle entsteht ueber create_position statt durch eine zweite Fassung derselben Logik -- dort haengen Jobkatalog, Nummernvergabe und die Pruefung "je Einheit genau eine Leitung". Die Orgnummer wird eingetragen, nicht vergeben. Vorgeschlagen wird die naechste freie Nummer der bestehenden Reihe, und nur dann, wenn sich im Bestand genau eine Systematik ablesen laesst -- eine plausibel aussehende, aber erfundene Nummer prueft niemand nach. Das Datum kommt nicht aus dem Stichtag der Ansicht. Wer sich die Struktur zum letzten Jahresende ansieht und auf Plus drueckt, will in aller Regel eine Einheit von heute anlegen.
This commit is contained in:
46
lib/org-nummer.ts
Normal file
46
lib/org-nummer.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
// 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")}`;
|
||||
}
|
||||
@@ -761,6 +761,10 @@ export type Database = {
|
||||
// Kopie einer bestehenden Planstelle — gleiche Einheit, Tätigkeit und
|
||||
// Kontierung, neue Nummer, unbesetzt. Leitungsplanstellen ausgenommen.
|
||||
clone_position: { Args: { payload: Record<string, unknown> }; Returns: string };
|
||||
// Eine Organisationseinheit unter einer bestehenden. Nur anlegen:
|
||||
// parent_id trägt kein Datum, ein Verschieben änderte deshalb auch die
|
||||
// Vergangenheit — siehe Migration 20260929120000.
|
||||
create_org_unit: { Args: { payload: Record<string, unknown> }; Returns: string };
|
||||
update_position: { Args: { payload: Record<string, unknown> }; Returns: void };
|
||||
set_position_cost_center: { Args: { payload: Record<string, unknown> }; Returns: void };
|
||||
set_onboarding_task: { Args: { payload: Record<string, unknown> }; Returns: void };
|
||||
|
||||
Reference in New Issue
Block a user