/* Powermieter — Vertrags-Wizard (Overlay, Hausverwaltung) */
const WZ_STEPS = [
{ n: 1, label: 'Modell', icon: 'grid' },
{ n: 2, label: 'Parteien', icon: 'users' },
{ n: 3, label: 'Tarif', icon: 'wallet' },
{ n: 4, label: 'Dokumente', icon: 'doc' },
{ n: 5, label: 'Signatur', icon: 'signature' },
{ n: 6, label: 'Status', icon: 'chart' },
];
function ContractWizard({ model, setModel, unit, onClose }) {
const [step, setStep] = React.useState(unit ? 2 : 1);
const [m, setM] = React.useState(model);
const [gen, setGen] = React.useState(false);
const [sent, setSent] = React.useState(false);
const docs = unitDocs(unit || { status: 'entwurf', missing: [], docVer: 'v2.1' }, m);
const title = unit ? `${unit.whg} · ${unit.name}` : 'Neuer Vertrag · Objektweit';
const next = () => setStep(s => Math.min(6, s + 1));
const back = () => setStep(s => Math.max(1, s - 1));
return (
{WZ_STEPS.map((s, i) => (
{i < WZ_STEPS.length - 1 && }
))}
{step === 1 && (
Vertragsmodell wählen
Das Modell bestimmt automatisch die erzeugte Vertragsstrecke. Mieterstrom (§ 42a) und gGV (§ 42b) sind rechtlich getrennt.
{MODELL_ORDER.map(id => {
const v = VERTRAGSMODELLE[id];
return (
);
})}
)}
{step === 2 && (
Vertragsparteien prüfen
Pflichtdaten auf Legal-Entity-Ebene — nicht auf Gebäude-Ebene.
Betreiber / Legal Entity
{[['Name', LEGAL_ENTITY.name], ['Rechtsform', LEGAL_ENTITY.form], ['Steuernummer', LEGAL_ENTITY.steuernr], ['IBAN', LEGAL_ENTITY.iban], ['Ansprechpartner', LEGAL_ENTITY.ansprech], ['Rolle', LEGAL_ENTITY.rolle]].map(([k, v]) => (
{k}{v}
))}
Objekt & Teilnehmer
{[['Objekt', `${OBJEKT.name}, ${OBJEKT.plz}`], ['Wohneinheiten', `${OBJEKT.we} · ${OBJEKT.aufgaenge} Aufgänge`], ['Zählpunkte', String(OBJEKT.zaehlpunkte)], ['Messkonzept', OBJEKT.messkonzept], ['Abrechnung', OBJEKT.abrechnung], ['Teilnehmer', unit ? `${unit.name} (${unit.whg})` : 'Alle bewohnten Einheiten']].map(([k, v]) => (
{k}{v}
))}
{unit && unit.missing && unit.missing.length > 0 &&
Noch offen: {unit.missing.join(', ')} — vor dem Versand zu ergänzen.}
)}
{step === 3 && (
Tarif auswählen
Tarifversion wird beim Start eingefroren (contract_tariff_versions).
{[
{ n: 'Powermieter Lokalstrom', ap: '28,9', gp: '8,90', solar: '73%', on: true },
{ n: 'Powermieter Lokalstrom Plus', ap: '27,5', gp: '11,90', solar: '90%', on: false },
].map(t => (
{t.n}{t.on && gewählt}
{t.ap} ct/kWh · GP {t.gp} €/Mon.
{t.solar} Solar
))}
)}
{step === 4 && (
Dokumente generieren
Aus Templates werden versionierte PDF-/HTML-Dokumente erzeugt — je mit Template-ID, Objekt- & Einheitenbezug.
{!gen
?
} onClick={() => setGen(true)}>{docs.length} Dokumente jetzt erzeugen
:
{docs.map((d, i) => (
{d.name}
PM-{d.code}-{m.slice(0,3).toUpperCase()} · v2.1 generiert
Generiert
))}
}
)}
{step === 5 && (
Signatur versenden
Versand per E-Mail-Link. MVP: digitale Zustimmung / einfacher Signatur-Flow. Später: eIDAS-Signatur.
{sent ? : }
{sent ? 'Unterlagen versendet' : 'Bereit zum Versand'}
{sent ? `An ${unit ? unit.name : 'alle Teilnehmer'} versendet — Status wechselt auf „Versendet“.` : `Empfänger: ${unit ? unit.name : 'alle bewohnten Einheiten'}. Frist 14 Tage Widerruf inklusive.`}
{!sent &&
}
)}
{step === 6 && (
Status verfolgen
Jeder Vertrag durchläuft revisionssicher die Statuskette. Sichtbar im Cockpit & Audit-Log.
{['Entwurf', 'Daten geprüft', 'Versendet', 'Angesehen', 'Unterzeichnet', 'Gegengezeichnet', 'Aktiv'].map((s, i) => (
{i <= 2 ? : i + 1}
{s}
{i === 3 && aktuell}
))}
)}
);
}
Object.assign(window, { ContractWizard });