Folgezähler-Deklaration in der Kundenakte (Auto-Propagation)

- Meter.predecessorMeterId (Self-Relation) + Migration
  20260530140000_meter_predecessor mit IF NOT EXISTS
- createMeter akzeptiert optional successorOf:
  {predecessorMeterId, installedAt?, finalReadingPrevious?}.
  Vorgänger wird validiert (gleicher Kunde + Typ); alle Verträge
  mit dem Vorgänger als aktuellen Zähler werden analog zu
  addSuccessorMeter automatisch auf den neuen Zähler umgestellt
  (ContractMeter-Eintrag mit removedAt/finalReading für den
  Vorgänger, neuer ContractMeter mit installedAt + nächster
  Position, energyDetails.meterId aktualisiert)
- MeterModal: Checkbox "Als Folgezähler deklarieren" + Dropdown
  Vorgänger + Wechseldatum + Endstand. Typ/Tarifmodell/Adresse
  werden vom Vorgänger übernommen und disabled. Info-Banner über
  Vertragsauto-Update

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-30 13:48:23 +02:00
parent 6f378d750c
commit ad4c2bae1d
6 changed files with 278 additions and 5 deletions
+28
View File
@@ -97,6 +97,34 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🆕 Folgezähler-Deklaration in der Kundenakte (Auto-Propagation)**
- **Backend**: Neues Feld `Meter.predecessorMeterId`
(Self-Relation, `ON DELETE SET NULL`). Migration
`20260530140000_meter_predecessor` mit `IF NOT EXISTS`.
`createMeter` akzeptiert optional `successorOf: { predecessorMeterId,
installedAt?, finalReadingPrevious? }`. Wenn gesetzt: Vorgänger
wird validiert (gleicher Kunde + gleicher Typ), und für alle
Verträge, die den Vorgänger als aktuellen Zähler nutzen, wird
der ContractMeter-Eintrag analog zu `addSuccessorMeter`
propagiert (vorhandener ContractMeter wird `removedAt` +
`finalReading` gesetzt; neuer ContractMeter wird mit nächster
Position + `installedAt` angelegt; `energyDetails.meterId`
auf den Neuzähler aktualisiert). Idempotent gegen Doppel-Klick.
- **MeterModal** (Kundenakte → Zähler): Bei Neuanlage neue
Checkbox „Diesen Zähler als Folgezähler deklarieren". Wenn
aktiv: Dropdown Vorgänger-Zähler (alle Zähler des Kunden,
inkl. inaktive mit Suffix), Wechseldatum (default heute),
Endstand alter Zähler (optional). Bei Vorgänger-Auswahl werden
Typ, Tarifmodell und Adresse vom Vorgänger übernommen und
disabled. Info-Banner: „Alle Verträge mit dem alten Zähler
werden automatisch umgestellt".
- Audit-Log: „Zähler angelegt als Folgezähler von X für Kunde #N".
- [x] **🆕 Vertragsansicht: Standort + Inaktiv-Badge beim Zähler**
- In den Strom/Gas-Details neben der Zählernummer zusätzlich ein
rotes „Inaktiv"-Badge und eine Zeile mit Standort, falls
hinterlegt.
- [x] **🆕 Zähler → Lieferadresse-Pflichtfeld + Vertragsfilter**
- **Backend**: Neues Feld `Meter.addressId` (optional FK auf
`Address`, `ON DELETE SET NULL`). Migration