/* 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 (
Vertrags-Wizard

{title}

{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 ? :
{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 });