From 34e106f2535c10ed1d45bc726ba737c11fe54d03 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 30 May 2026 14:03:01 +0200 Subject: [PATCH] =?UTF-8?q?Fix:=20Folgez=C3=A4hler-Button=20auch=20bei=20S?= =?UTF-8?q?ingle-Meter-Vertr=C3=A4gen=20anzeigen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bei Folgeverträgen / Bestandsverträgen ohne ContractMeter-Eintrag war der "Folgezähler hinzufügen"-Button unsichtbar, weil er nur im Multi-Meter-Zweig gerendert wurde. Zusätzlich im addSuccessorMeter-Backend: bei Single-Meter-Verträgen wird der bisherige energyDetails.meterId jetzt als ContractMeter position 0 backfillt und als removed markiert, damit die Kette lückenlos ist und der alte Zähler im Vertrag dokumentiert bleibt. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/controllers/contract.controller.ts | 31 ++++++++++++++++--- .../src/pages/contracts/ContractDetail.tsx | 24 ++++++++------ 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/backend/src/controllers/contract.controller.ts b/backend/src/controllers/contract.controller.ts index bba63636..2c30a9f4 100644 --- a/backend/src/controllers/contract.controller.ts +++ b/backend/src/controllers/contract.controller.ts @@ -551,19 +551,40 @@ export async function addSuccessorMeter(req: AuthRequest, res: Response): Promis } const ecdId = contract.energyDetails.id; - const existingMeters = contract.energyDetails.contractMeters; + const existingMeters = [...contract.energyDetails.contractMeters]; + const switchAt = installedAt ? new Date(installedAt) : new Date(); + + // Backfill: Bei Single-Meter-Verträgen (kein ContractMeter-Eintrag) den + // bisherigen `energyDetails.meterId` als position 0 nachtragen, damit die + // Folgezähler-Kette lückenlos ist und der alte Zähler nicht aus dem + // Vertrag verschwindet, wenn `energyDetails.meterId` gleich auf den Neuen + // gedreht wird. + if (existingMeters.length === 0 && contract.energyDetails.meterId) { + const backfilled = await prisma.contractMeter.create({ + data: { + energyContractDetailsId: ecdId, + meterId: contract.energyDetails.meterId, + position: 0, + installedAt: null, + }, + }); + existingMeters.push(backfilled); + } + const nextPosition = existingMeters.length > 0 ? Math.max(...existingMeters.map(m => m.position)) + 1 : 0; // Vorherigen Zähler als gewechselt markieren - if (existingMeters.length > 0 && finalReadingPrevious !== undefined) { + if (existingMeters.length > 0) { const prevMeter = existingMeters[existingMeters.length - 1]; await prisma.contractMeter.update({ where: { id: prevMeter.id }, data: { - removedAt: installedAt ? new Date(installedAt) : new Date(), - finalReading: parseFloat(finalReadingPrevious), + removedAt: switchAt, + finalReading: finalReadingPrevious !== undefined + ? parseFloat(finalReadingPrevious) + : prevMeter.finalReading, }, }); } @@ -573,7 +594,7 @@ export async function addSuccessorMeter(req: AuthRequest, res: Response): Promis energyContractDetailsId: ecdId, meterId: parseInt(meterId), position: nextPosition, - installedAt: installedAt ? new Date(installedAt) : new Date(), + installedAt: switchAt, }, include: { meter: { include: { readings: true } } }, }); diff --git a/frontend/src/pages/contracts/ContractDetail.tsx b/frontend/src/pages/contracts/ContractDetail.tsx index 29e0f0b9..e9098f77 100644 --- a/frontend/src/pages/contracts/ContractDetail.tsx +++ b/frontend/src/pages/contracts/ContractDetail.tsx @@ -2675,15 +2675,6 @@ export default function ContractDetail() { /> ) ))} - {/* Folgezähler hinzufügen */} - {hasPermission('contracts:update') && !isCustomer && ( - cm.meterId)} - /> - )} ) : c.energyDetails.meter ? ( ) : null} + {/* Folgezähler hinzufügen – auch bei Verträgen ohne ContractMeter-Eintrag + (z. B. Folgeverträge oder Bestandsverträge im Single-Meter-Modell). */} + {hasPermission('contracts:update') && !isCustomer && (c.energyDetails.meter || (c.energyDetails.contractMeters && c.energyDetails.contractMeters.length > 0)) && ( + 0 + ? c.energyDetails.contractMeters.map((cm: ContractMeter) => cm.meterId) + : c.energyDetails.meter ? [c.energyDetails.meter.id] : [] + } + /> + )} + {/* Verbrauchsberechnung & Kostenvorschau */}