import { describe, expect, it, vi } from "vitest"; import { orgAsOf } from "@/lib/placement"; // orgAsOf() ist reine Rechnung, liegt aber neben den Ladefunktionen — und die // ziehen über lib/db das Paket `server-only` herein, das ausserhalb von // Next.js beim Import wirft. vi.mock("server-only", () => ({})); // Der Stichtag, zu dem die Organisation einer Person betrachtet wird. // // „Heute" ist die naheliegende und für zwei Gruppen falsche Antwort. Wer // später anfängt oder schon gegangen ist, hat heute keine laufende // Besetzung — om_reporting_lines() liefert dann keine Zeile, und die Akte // behauptet „Keine Führungskraft", obwohl das Team eine hat. Genau so ist es // aufgefallen. const HEUTE = "2026-08-10"; describe("Stichtag der Organisation", () => { it("bleibt heute für eine laufende Beschäftigung", () => { expect(orgAsOf({ entry_date: "2015-03-01", exit_date: null }, HEUTE)).toBe(HEUTE); }); it("nimmt bei künftigem Eintritt den ersten Tag", () => { // Sonst steht in der Akte einer Person, die am 01.09. anfängt, heute // keine Führungskraft — obwohl die Planstelle einer Einheit mit Leitung // zugeordnet ist. expect(orgAsOf({ entry_date: "2026-09-01", exit_date: null }, HEUTE)).toBe("2026-09-01"); }); it("nimmt bei Austritt den letzten Arbeitstag", () => { // exit_date ist ausschliessend wie überall im Modell; am Austrittstag // selbst besteht die Besetzung nicht mehr. Zu diesem Tag gefragt käme // wieder nichts heraus. expect(orgAsOf({ entry_date: "2015-03-01", exit_date: "2026-07-31" }, HEUTE)).toBe("2026-07-30"); }); it("bleibt heute, solange ein künftiger Austritt noch nicht wirksam ist", () => { expect(orgAsOf({ entry_date: "2015-03-01", exit_date: "2026-12-31" }, HEUTE)).toBe(HEUTE); }); it("nimmt am Eintrittstag selbst diesen Tag, nicht den Vortag", () => { // Grenzfall: heute ist der erste Arbeitstag. Die Zuordnung gilt ab // heute, also ist heute richtig. expect(orgAsOf({ entry_date: HEUTE, exit_date: null }, HEUTE)).toBe(HEUTE); }); it("behandelt Ein- und Austritt am selben Tag ohne Sprung ins Nichts", () => { // Wer den Dienst nicht antritt: die Datenbank erlaubt exit = entry. Der // Stichtag liegt dann vor dem Eintritt und liefert nichts — das ist // richtig so, denn eine Organisation hatte diese Person nie. expect(orgAsOf({ entry_date: "2026-07-31", exit_date: "2026-07-31" }, HEUTE)).toBe("2026-07-30"); }); });