Vorgemerkte Planstellen, Stichtag fuer Einheiten, Kuendigungsschutz und Elternteilzeit
Some checks failed
CI / Migrationen auf leerer Datenbank (push) Has been cancelled
CI / Lint, Typen, Tests, Build (push) Has been cancelled

F.24 -- eine Planstelle, auf die eine Versetzung vorgemerkt ist, galt als frei.
Die Vormerkung steht in pending_org_changes, "besetzt?" wurde allein an
position_assignments gefragt. Auffallen wuerde es erst in der Nacht des
Wirksamkeitstages: dort legt der Nachtlauf die zweite Besetzung an und laeuft in
den Teilindex, der genau eine laufende Besetzung je Planstelle zulaesst. Er
arbeitet in einer Transaktion ueber alle faelligen Vorgaenge -- eine einzige
solche Buchung haette ihn vollstaendig zum Stehen gebracht, auch fuer alle
anderen. Neue Auskunft planstelle_vorgemerkt, abgefragt in hire_employee,
rehire_employee, transfer_employee und promote_employee, mit Datum in der
Meldung. Die eigene Vormerkung zaehlt nicht als Hindernis.

D.06 -- die Struktursicht zeigte Einheiten, die es am gewaehlten Stichtag noch
nicht gab: org_units wurde ungefiltert gelesen, waehrend Planstellen und
Besetzungen daneben auf den Stichtag eingeschraenkt waren. Die Druckansicht
filterte schon immer richtig; jetzt tun es alle drei Stellen.

H.09 -- der Kuendigungsschutz stand in der Akte nur als "bis TT.MM.JJJJ",
obwohl Personenkreis, Beginn, Ende und die ganze Begunstigung erfasst werden.
Der Personenkreis ist die eigentliche Auskunft. Die Behinderung bekommt eine
eigene Zeile: sie fuehrt oft zu Kuendigungsschutz, ist aber ein eigener
Bescheid.

Elternteilzeit und Wiedereingliederungsteilzeit sind jetzt auch bei der
Stundenaenderung waehlbar. Sie standen nur bei der Rueckkehr aus einer
Abwesenheit, mit der Begruendung, dass sie typischerweise dann beginnen --
typischerweise ist aber nicht immer. Die Ueberschneidung der beiden Listen ist
damit gewollt; der Test prueft nicht mehr auf Partition, sondern darauf, dass
keine Teilzeit an keinem der beiden Wege haengt.
This commit is contained in:
2026-09-29 19:10:31 +02:00
parent 990ebdbc84
commit 89ba34c901
6 changed files with 343 additions and 16 deletions

View File

@@ -50,7 +50,20 @@ export const RUECKKEHR_GRUENDE = ["Wiedereingliederungsteilzeit", "Elternteilzei
* geregelte Teilzeiten, die man später wiederfinden können muss — im
* Zweifel Jahre danach, wenn jemand fragt, warum die Stunden damals sanken.
*/
export const STUNDEN_GRUENDE = ["Vertragliche Stundenänderung", "Bildungsteilzeit", "Pflegeteilzeit"] as const;
export const STUNDEN_GRUENDE = [
"Vertragliche Stundenänderung",
"Bildungsteilzeit",
"Pflegeteilzeit",
// Die beiden standen zuerst nur in RUECKKEHR_GRUENDE, weil sie typischerweise
// dann beginnen, wenn eine Abwesenheit endet. Typischerweise ist aber nicht
// immer: eine Elternteilzeit kann auch vereinbart werden, ohne dass in
// diesem System je eine Karenz stand — etwa beim zweiten Elternteil oder
// wenn die Karenz vor der Einführung lag. Gemeldet von Lara am 29.09.:
// „Teilzeitvariante Elternteilzeit fehlt". Der Bericht konnte schon immer
// nach allen vier filtern; erfassen liessen sich nur zwei.
"Elternteilzeit",
"Wiedereingliederungsteilzeit",
] as const;
export type StundenGrund = (typeof STUNDEN_GRUENDE)[number];

View File

@@ -60,7 +60,16 @@ export async function loadOrgAsOf(tx: Tx, asOf: string): Promise<OrgAsOfResult>
// Ohne die 1000-Zeilen-Grenze der API-Schicht fällt das seitenweise
// Nachladen weg: sechs Abfragen, jede vollständig.
const [units, positions, assignments, employees, pending, earliest] = await Promise.all([
tx.selectFrom("org_units").select(["id", "parent_id"]).orderBy("id").execute(),
// Zum Stichtag, wie die Planstellen und die Besetzungen darunter. Hier
// stand die Tabelle ungefiltert: eine Einheit, die es 2020 noch nicht gab,
// erschien in der Organisation von 2020. Gemeldet am 29.09. (D.06).
tx
.selectFrom("org_units")
.select(["id", "parent_id"])
.where("valid_from", "<=", asOf)
.where((eb) => eb.or([eb("valid_to", "is", null), eb("valid_to", ">", asOf)]))
.orderBy("id")
.execute(),
tx
.selectFrom("om_positions as p")