feat(kunden): Eigenbedarf fuer eigene Hosts (#044)
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>
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
@@ -41,6 +41,7 @@ function laufzeit(überschreibungen: Partial<LaufzeitDaten> = {}): LaufzeitDaten
|
||||
hostname: "pve-01",
|
||||
kundeId: "k1",
|
||||
kundeName: "Brandl Elektrotechnik GmbH",
|
||||
kundeEigenbedarf: false,
|
||||
key: "pve1c-aaaa",
|
||||
start: inTagen(-100),
|
||||
ende: inTagen(265),
|
||||
|
||||
Reference in New Issue
Block a user