diff --git a/CHANGELOG.md b/CHANGELOG.md index ae86731..b1858a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,11 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/). ### Sicherheit +## [0.26.0] – 2026-10-04 + +### Hinzugefügt +- Kennzeichen **Eigenbedarf** am Kunden: für eigene Hosts entfallen Kundenrechnung, die zugehörigen Warnungen, die Aufgabe „Kundenrechnung erstellen“ und die Marge – die Proxmox-Rechnung wird weiterhin geführt (#044) + ## [0.25.0] – 2026-10-03 ### Hinzugefügt diff --git a/DEVLOG.md b/DEVLOG.md index d2b2afd..9897b79 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -2,7 +2,7 @@ ## Zeitübersicht -**Gesamt:** 23 h 58 min +**Gesamt:** 24 h 38 min | Issue | Zeit | |---|---| @@ -49,6 +49,7 @@ | #041 Doppelte Hosts | 0 h 50 min | | #042 QDevice im Cluster | 0 h 20 min | | #043 Laufzeiten bearbeiten | 1 h 05 min | +| #044 Eigenbedarf | 0 h 40 min | | Meilenstein | Zeit | |---|---| @@ -71,7 +72,7 @@ ## 2026-09-17 · Sitzung 1 · 19:36–laufend **Issue:** #001–#007 (Meilensteine v0.1.0 bis v0.4.0) -**Version:** 0.25.0 +**Version:** 0.26.0 ### Erledigt - Auftrag gelesen, Rückfragen gestellt @@ -220,6 +221,9 @@ - Laufzeiten (#043): Anlegen gab es nur als Server-Aktion ohne Oberfläche, Ändern und Zusammenführen gar nicht. Dabei tritt der Doppelfall zwangsläufig auf, sobald das gemeldete Ablaufdatum von der Bestellung abweicht - Beim Zusammenführen muss die Quelle ihre Rechnungsposition zuerst loslassen – die Datenbank lässt eine Position nur an einer Laufzeit zu. Der Test hat die falsche Reihenfolge sofort gezeigt +- Eigenbedarf (#044): Eigene Hosts brauchen einen Kunden, sonst fehlen sie in jeder Auswertung – als gewöhnlicher Kunde erzeugen sie aber Aufgaben, die es nicht gibt, und eine negative Marge +- Die Einkaufsseite bleibt vollständig: Eigene Hosts kosten echtes Geld + ### Nächster Schritt - #016 Benutzerhandbuch mit Screenshots, danach #017 Favicons und #019 CI-Pipeline - Für 1.0.0 fehlt noch: PMG (kein Host verfügbar) und der Fall „aktive Subscription auf PBS“ (#023) diff --git a/docs/anleitung/README.md b/docs/anleitung/README.md index dba61ce..5b9ea12 100644 --- a/docs/anleitung/README.md +++ b/docs/anleitung/README.md @@ -237,6 +237,16 @@ mit Marge. Die vier Kästen oben fassen Hosts, Einkauf, Verkauf und Marge zusamm Standorte sind optional und lohnen sich bei Kunden mit mehreren Filialen: Sie erscheinen in der Host-Tabelle und lassen sich bei der Zuweisung mit angeben. +### Eigene Hosts + +Auch die eigenen Hosts gehören einem Kunden zugeordnet – sonst fehlen sie in jeder Auswertung und +lösen die Warnung „Host ohne Kunde“ aus. Lege dafür dich selbst als Kunden an und setze im +Kundenformular den Haken **Eigenbedarf**. + +Für solche Kunden entfällt alles, was mit Weiterberechnung zu tun hat: keine Kundenrechnung, keine +Warnungen darüber, keine Aufgabe „Kundenrechnung erstellen“ und keine Marge. Die Proxmox-Rechnung +wird weiterhin geführt und erinnert ans Bezahlen – die Kosten fallen ja an. + --- ## 6. Laufzeiten und Rechnungen diff --git a/docs/issues/044-eigenbedarf.md b/docs/issues/044-eigenbedarf.md new file mode 100644 index 0000000..35f4f74 --- /dev/null +++ b/docs/issues/044-eigenbedarf.md @@ -0,0 +1,38 @@ +# #044 Eigene Hosts ohne Weiterberechnung +**Status:** erledigt +**Meilenstein:** v0.26.0 +**Labels:** backend, ui, alerts +**Geschätzt:** 2 h **Tatsächlich:** 0 h 40 min + +## Auslöser +„Ich habe mich auch selbst als Kunden angelegt, da ich ja auch Hosts habe. Aber mir selbst schreibe +ich ja keine E-Mails.“ + +## Das Problem +Die eigenen Hosts brauchen einen Kunden – sonst stehen sie unter *Nicht zugeordnet* und lösen die +Warnung „Host ohne Kunde“ aus. Als gewöhnlicher Kunde erzeugen sie aber lauter Aufgaben, die es nicht +gibt: „Kundenrechnung erstellen“, „Kundenrechnung unbezahlt“, dazu eine negative Marge in jeder +Summe, weil dem Einkauf kein Verkauf gegenübersteht. + +## Behebung +Kennzeichen **Eigenbedarf** am Kunden. Für dessen Hosts gilt: + +| | Verhalten | +|---|---| +| Proxmox-Rechnung | unverändert – die Kosten fallen ja an | +| Kundenrechnung | entfällt; das Formular wird durch eine Erklärung ersetzt | +| Warnungen „Kundenrechnung fehlt / unbezahlt“ | entfallen | +| Warnung „Kunde hat bezahlt – Einkauf offen“ | entfällt | +| Aufgabe „Kundenrechnung erstellen“ | entfällt | +| Marge | bleibt leer statt negativ | +| Summen | Einkauf zählt mit, Verkauf und Marge nicht | + +Dazu ein Abzeichen in der Kundenliste und auf der Laufzeit. + +## Entscheidung +Die Einkaufsseite bleibt vollständig erhalten. Eigene Hosts kosten echtes Geld, und die Rechnung von +Proxmox will bezahlt werden – nur die Weiterberechnung entfällt. + +Die Alternative wäre gewesen, eigene Hosts ohne Kunden zu lassen und die Warnung „Host ohne Kunde“ +abzuschalten. Dann fehlten sie aber in jeder Auswertung nach Kunde, und der Einkauf ließe sich nicht +mehr zuordnen. diff --git a/docs/issues/README.md b/docs/issues/README.md index b136294..a4ea154 100644 --- a/docs/issues/README.md +++ b/docs/issues/README.md @@ -47,4 +47,5 @@ Details und Architektur: [../architektur.md](../architektur.md). Zeiten werden a | [#041](041-doppelte-hosts.md) | Gleichnamige Hosts erkennen und stilllegen | erledigt | v0.24.0 | 3 h | 0 h 50 min | | [#042](042-qdevice-cluster.md) | Cluster-Knoten falsch gelesen bei QDevice | erledigt | v0.24.1 | 1 h | 0 h 20 min | | [#043](043-laufzeiten-bearbeiten.md) | Laufzeiten anlegen, bearbeiten, zusammenführen | erledigt | v0.25.0 | 4 h | 1 h 05 min | -| | **Summe** | | | **173 h** | **23 h 58 min** | +| [#044](044-eigenbedarf.md) | Eigene Hosts ohne Weiterberechnung | erledigt | v0.26.0 | 2 h | 0 h 40 min | +| | **Summe** | | | **175 h** | **24 h 38 min** | diff --git a/package.json b/package.json index 212ddb1..ffb611d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "proxledger", - "version": "0.25.0", + "version": "0.26.0", "private": true, "scripts": { "dev": "next dev", diff --git a/prisma/migrations/20261004090000_kunde_eigenbedarf/migration.sql b/prisma/migrations/20261004090000_kunde_eigenbedarf/migration.sql new file mode 100644 index 0000000..aec73ff --- /dev/null +++ b/prisma/migrations/20261004090000_kunde_eigenbedarf/migration.sql @@ -0,0 +1,3 @@ +-- Eigenbedarf: Kunden, die man selbst ist (#044). +-- Für sie gibt es keine Kundenrechnung – und damit auch keine Warnungen darüber und keine Marge. +ALTER TABLE "Kunde" ADD COLUMN "eigenbedarf" BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 5dd09ed..22c4bec 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -61,6 +61,9 @@ model Kunde { ansprechpartner String? email String? telefon String? + /// Eigenbedarf: eigene Hosts, die nicht weiterberechnet werden. Für sie entfallen + /// Kundenrechnung, die zugehörigen Warnungen und die Marge (#044). + eigenbedarf Boolean @default(false) notizen String? erstelltAm DateTime @default(now()) geaendertAm DateTime @updatedAt diff --git a/src/app/(dashboard)/kunden/[id]/bearbeiten/page.tsx b/src/app/(dashboard)/kunden/[id]/bearbeiten/page.tsx index 27e1380..54d40b3 100644 --- a/src/app/(dashboard)/kunden/[id]/bearbeiten/page.tsx +++ b/src/app/(dashboard)/kunden/[id]/bearbeiten/page.tsx @@ -38,6 +38,7 @@ export default async function KundeBearbeitenSeite({ params }: { params: Promise ansprechpartner: kunde.ansprechpartner, email: kunde.email, telefon: kunde.telefon, + eigenbedarf: kunde.eigenbedarf, notizen: kunde.notizen, }} /> diff --git a/src/app/(dashboard)/kunden/page.tsx b/src/app/(dashboard)/kunden/page.tsx index 086bd37..3ccfddd 100644 --- a/src/app/(dashboard)/kunden/page.tsx +++ b/src/app/(dashboard)/kunden/page.tsx @@ -60,6 +60,9 @@ export default async function KundenSeite() { {kunde.name} + {kunde.eigenbedarf ? ( + Eigenbedarf + ) : null}
{kunde.ansprechpartner ?? "–"}
diff --git a/src/app/(dashboard)/rechnungen/[id]/page.tsx b/src/app/(dashboard)/rechnungen/[id]/page.tsx index 404bf3f..7a35721 100644 --- a/src/app/(dashboard)/rechnungen/[id]/page.tsx +++ b/src/app/(dashboard)/rechnungen/[id]/page.tsx @@ -55,6 +55,7 @@ export default async function LaufzeitSeite({ params }: { params: Promise<{ id: verkaufBetrag ?? (einkaufBetrag === null ? null : Math.round(einkaufBetrag * (1 + vorgaben.margeProzent / 100) * 100) / 100); + const eigenbedarf = laufzeit.host.kunde?.eigenbedarf ?? false; const zeitraum = `${formatDatum(laufzeit.start)} – ${formatDatum(laufzeit.ende)}`; return ( @@ -226,11 +227,22 @@ export default async function LaufzeitSeite({ params }: { params: Promise<{ id: + eigenbedarf ? ( + Eigenbedarf + ) : ( + + ) } > + {eigenbedarf ? ( +

+ {laufzeit.host.kunde?.name} ist als Eigenbedarf gekennzeichnet – diese + Hosts werden nicht weiterberechnet. Deshalb gibt es hier keine Kundenrechnung, keine + Warnung darüber und keine Marge. Die Proxmox-Rechnung wird weiterhin geführt. +

+ ) : ( + )}
diff --git a/src/components/kunden/KundeFormular.tsx b/src/components/kunden/KundeFormular.tsx index f29a3cb..376c2e1 100644 --- a/src/components/kunden/KundeFormular.tsx +++ b/src/components/kunden/KundeFormular.tsx @@ -11,6 +11,7 @@ export interface KundeFormularWerte { ansprechpartner: string | null; email: string | null; telefon: string | null; + eigenbedarf: boolean; notizen: string | null; } @@ -98,6 +99,26 @@ export function KundeFormular({ werte }: { werte?: KundeFormularWerte }) { +
+
+ + +
+ Für solche Kunden entfällt die Kundenrechnung: keine Warnungen darüber, keine Marge. Die + Einkaufsrechnung von Proxmox wird weiterhin geführt. +
+
+
+