diff --git a/docs/todo.md b/docs/todo.md
index 5937d2ac..983bbc85 100644
--- a/docs/todo.md
+++ b/docs/todo.md
@@ -97,6 +97,26 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
+- [x] **🆕 Vorvertrag-Verbrauch als Schätzwert im Folgevertrag**
+ - **ContractForm** (Strom/Gas): Wenn ein `previousContractId`
+ gesetzt ist, wird der Vorvertrag samt Readings nachgeladen und
+ der Verbrauch clientseitig über
+ `calculateMultiMeterConsumption` / `calculateConsumption`
+ berechnet. Unter dem Jahresverbrauch-Feld erscheint
+ `Vorvertrag: 1.698 kWh (hochgerechnet) [Übernehmen]` mit
+ Ein-Klick-Button, der den Wert ins Feld kopiert. Bei Gas
+ erscheint der Hinweis sowohl unter „Jahresverbrauch (m³)"
+ (mit m³-Wert) als auch unter „Jahresverbrauch (kWh)".
+ - **ContractDetail** (Strom/Gas): Wenn `annualConsumption` leer
+ ist und ein berechenbarer Vorvertrag existiert, wird die
+ Jahresverbrauch-Zelle stattdessen mit `~1.698 kWh` in blau
+ angezeigt, darunter klein „geschätzt aus Vorvertrag
+ (hochgerechnet)". Verschwindet automatisch, sobald der Wert
+ im Vertrag eingetragen ist.
+ - Funktioniert nur bei Verträgen mit explizitem `previousContract`
+ (Folgevertrag-Kette). Ohne Vorvertrag oder ohne genügend
+ Zählerstände kommt kein Hinweis.
+
- [x] **🆕 Endstand alter Zähler fließt in Verbrauchsberechnung ein**
- Bisher wurde der Wert „Letzter Stand alter Zähler" zwar als
`ContractMeter.finalReading` gespeichert, aber nirgends gelesen
diff --git a/frontend/src/pages/contracts/ContractDetail.tsx b/frontend/src/pages/contracts/ContractDetail.tsx
index 78245045..71524935 100644
--- a/frontend/src/pages/contracts/ContractDetail.tsx
+++ b/frontend/src/pages/contracts/ContractDetail.tsx
@@ -1718,6 +1718,23 @@ export default function ContractDetail() {
}
const c = data.data;
+ // Verbrauch aus Vorvertrag als Hinweis, wenn der Jahresverbrauch im aktuellen
+ // Vertrag noch leer ist. Greift nur bei Strom/Gas mit einem berechenbaren
+ // Vorvertrag.
+ const previousConsumption = (() => {
+ const pc = c.previousContract;
+ if (!pc?.energyDetails || !pc.startDate || !pc.endDate) return null;
+ if (c.type !== 'ELECTRICITY' && c.type !== 'GAS') return null;
+ const cms = pc.energyDetails.contractMeters || [];
+ if (cms.length > 0) {
+ return calculateMultiMeterConsumption(cms, pc.startDate, pc.endDate, c.type);
+ }
+ const readings = pc.energyDetails.meter?.readings || [];
+ if (readings.length === 0) return null;
+ return calculateConsumption(readings, pc.startDate, pc.endDate, c.type);
+ })();
+ const previousConsumptionUsable = previousConsumption
+ && (previousConsumption.type === 'exact' || previousConsumption.type === 'projected');
const fallbackBack = isCustomerPortal ? '/contracts' : (c.customer ? `/customers/${c.customer.id}?tab=contracts` : '/contracts');
const back = popHistory(location.state, fallbackBack);
@@ -2595,7 +2612,7 @@ export default function ContractDetail() {
)}
- {c.energyDetails.annualConsumption && (
+ {c.energyDetails.annualConsumption ? (