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 */}