Eigene Hosts brauchen einen Kunden - sonst stehen sie unter "Nicht zugeordnet" und fehlen in jeder Auswertung. Als gewoehnlicher Kunde erzeugen sie aber Aufgaben, die es nicht gibt: Kundenrechnung erstellen, Kundenrechnung unbezahlt, dazu eine negative Marge in jeder Summe. Das Kennzeichen Eigenbedarf am Kunden nimmt die Verkaufsseite heraus: kein Formular fuer die Kundenrechnung, keine Warnungen darueber, keine Aufgabe, keine Marge - und in den Summen zaehlt der Einkauf mit, Verkauf und Marge nicht. Die Einkaufsseite bleibt vollstaendig: Eigene Hosts kosten echtes Geld, und die Rechnung von Proxmox will bezahlt werden. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
80 lines
2.5 KiB
TypeScript
80 lines
2.5 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
||
import { alleRegelnPruefen, type LaufzeitDaten, type RegelKontext } from "@/server/alerts/regeln";
|
||
|
||
/** Eigenbedarf: eigene Hosts ohne Weiterberechnung (#044). */
|
||
|
||
const JETZT = new Date("2026-10-04T12:00:00Z");
|
||
|
||
function laufzeit(überschreibungen: Partial<LaufzeitDaten> = {}): LaufzeitDaten {
|
||
return {
|
||
id: "l1",
|
||
hostId: "h1",
|
||
hostname: "hv-ste-pve-01",
|
||
kundeId: "k1",
|
||
kundeEigenbedarf: false,
|
||
kundeName: "Florian Wilde IT SysOp",
|
||
key: "pve2s-aaaa",
|
||
start: new Date("2026-06-03"),
|
||
ende: new Date("2027-06-02"),
|
||
einkaufNummer: "291017",
|
||
einkaufBetrag: 990,
|
||
einkaufBezahlt: true,
|
||
einkaufFaelligAm: new Date("2026-10-17"),
|
||
verkaufNummer: null,
|
||
verkaufBetrag: null,
|
||
verkaufErstellt: false,
|
||
verkaufBezahlt: false,
|
||
verkaufDatum: null,
|
||
...überschreibungen,
|
||
};
|
||
}
|
||
|
||
function kontext(laufzeiten: LaufzeitDaten[]): RegelKontext {
|
||
return { jetzt: JETZT, hosts: [], laufzeiten, einstellungen: new Map() };
|
||
}
|
||
|
||
function regeln(k: RegelKontext, name: string) {
|
||
return alleRegelnPruefen(k).filter((kandidat) => kandidat.regel === name);
|
||
}
|
||
|
||
describe("Eigenbedarf", () => {
|
||
it("mahnt bei einem normalen Kunden die fehlende Kundenrechnung an", () => {
|
||
expect(regeln(kontext([laufzeit()]), "kundenrechnung-fehlt")).toHaveLength(1);
|
||
});
|
||
|
||
it("schweigt beim Eigenbedarf – es gibt niemanden, dem man schreibt", () => {
|
||
expect(regeln(kontext([laufzeit({ kundeEigenbedarf: true })]), "kundenrechnung-fehlt")).toHaveLength(0);
|
||
});
|
||
|
||
it("mahnt beim Eigenbedarf keine unbezahlte Kundenrechnung an", () => {
|
||
const k = kontext([
|
||
laufzeit({
|
||
kundeEigenbedarf: true,
|
||
verkaufErstellt: true,
|
||
verkaufDatum: new Date("2026-01-01"),
|
||
verkaufBezahlt: false,
|
||
}),
|
||
]);
|
||
expect(regeln(k, "kundenrechnung-unbezahlt")).toHaveLength(0);
|
||
});
|
||
|
||
it("meldet beim Eigenbedarf nicht „Kunde hat bezahlt“", () => {
|
||
const k = kontext([
|
||
laufzeit({ kundeEigenbedarf: true, verkaufBezahlt: true, einkaufBezahlt: false }),
|
||
]);
|
||
expect(regeln(k, "kunde-bezahlt-einkauf-offen")).toHaveLength(0);
|
||
});
|
||
|
||
it("lässt die Einkaufsseite unberührt", () => {
|
||
// Die Proxmox-Rechnung muss auch für eigene Hosts bezahlt werden.
|
||
const k = kontext([
|
||
laufzeit({
|
||
kundeEigenbedarf: true,
|
||
einkaufBezahlt: false,
|
||
einkaufFaelligAm: new Date("2026-10-06"),
|
||
}),
|
||
]);
|
||
expect(regeln(k, "proxmox-rechnung-faellig")).toHaveLength(1);
|
||
});
|
||
});
|