/* Powermieter — Vertrag digital abschließen (fokussierter Signatur-Screen / Overlay) */ const { useState: useSgS, useRef: useSgR, useEffect: useSgE } = React; function SignaturePad({ onInk }) { const ref = useSgR(null); const drawing = useSgR(false); const last = useSgR(null); const inked = useSgR(false); useSgE(() => { const c = ref.current; if (!c) return; const dpr = window.devicePixelRatio || 1; const rect = c.getBoundingClientRect(); c.width = rect.width * dpr; c.height = rect.height * dpr; const ctx = c.getContext('2d'); ctx.scale(dpr, dpr); ctx.lineWidth = 2.4; ctx.lineCap = 'round'; ctx.lineJoin = 'round'; ctx.strokeStyle = getComputedStyle(c).getPropertyValue('--accent').trim() || '#0E7C86'; }, []); const pos = e => { const r = ref.current.getBoundingClientRect(); const p = e.touches ? e.touches[0] : e; return { x: p.clientX - r.left, y: p.clientY - r.top }; }; const start = e => { e.preventDefault(); drawing.current = true; last.current = pos(e); }; const move = e => { if (!drawing.current) return; e.preventDefault(); const ctx = ref.current.getContext('2d'); const p = pos(e); ctx.beginPath(); ctx.moveTo(last.current.x, last.current.y); ctx.lineTo(p.x, p.y); ctx.stroke(); last.current = p; if (!inked.current) { inked.current = true; onInk(true); } }; const end = () => { drawing.current = false; }; const clear = () => { const c = ref.current; const ctx = c.getContext('2d'); ctx.clearRect(0, 0, c.width, c.height); inked.current = false; onInk(false); }; return (
); } function SigningScreen({ form, model = 'mieterstrom', onClose, onDone }) { const mdl = VERTRAGSMODELLE[model] || VERTRAGSMODELLE.mieterstrom; const name = [form.vorname, form.nachname].filter(Boolean).join(' ') || 'Max Mustermann'; const adr = [form.strasse + ' ' + (form.hausnr || ''), [form.plz, form.ort].filter(Boolean).join(' ')].filter(s => s.trim()).join(', ') || 'Musterstraße 12, 10115 Berlin'; const today = new Date().toLocaleDateString('de-DE', { day: '2-digit', month: 'long', year: 'numeric' }); const [mode, setMode] = useSgS('draw'); const [hasInk, setHasInk] = useSgS(false); const [typed, setTyped] = useSgS(''); const [place, setPlace] = useSgS(form.ort || 'Berlin'); const [confirm, setConfirm] = useSgS(false); const [phase, setPhase] = useSgS('sign'); // sign → signing → done const docName = model === 'ggv' ? 'Teilnahme- & Verteilvereinbarung' : 'Teilnahme- & Stromliefervertrag'; const docs = (ROLE_CONTRACTS[mieterSetFor(model)] || ROLE_CONTRACTS.mieter_mieterstrom).items; const signedOk = (mode === 'draw' ? hasInk : typed.trim().length > 1) && confirm; const submit = () => { if (!signedOk) return; setPhase('signing'); setTimeout(() => setPhase('done'), 1700); }; return (
PowerHouse 360
Vertrag digital abschließen
{mdl.label} {mdl.legal}
{phase !== 'done' ? (
{/* Document preview */}
PowerHouse 360
PM-TN-{model.slice(0, 3).toUpperCase()} · v2.1

{docName}

zwischen {LEGAL_ENTITY.name} (Betreiber) und dem nachstehenden Teilnehmer für die Versorgung im Objekt {OBJEKT.name}.

Teilnehmer{name}
Anschrift{adr}
Modell{mdl.label}
TarifPowermieter Lokalstrom · 28,9 ct/kWh
Laufzeit12 Monate · 1 Monat Kündigungsfrist
LieferbeginnSchnellstmöglich

Mit der Unterzeichnung bestätigt der Teilnehmer die Geltung der beigefügten Vertragsdokumente und Preisinformationen. Das gesetzliche Widerrufsrecht von 14 Tagen bleibt unberührt.

{docs.slice(0, 5).map((d, i) => {d.name})}
{/* Signing panel */}

Ihre Unterschrift

}, { value: 'type', label: 'Tippen', icon: }, ]} /> {mode === 'draw' ?

Mit Maus oder Finger im Feld unterschreiben.

:
setTyped(e.target.value)} /> {name}

Die getippte Eingabe gilt als digitale Unterschrift.

}
Ort setPlace(e.target.value)} />
Datum{today}
Verschlüsselte Übertragung · revisionssicher protokolliert (contract_events)
) : (

Vertrag digital abgeschlossen

Ihr {docName} wurde unterzeichnet und an {form.email || 'Ihre E-Mail-Adresse'} gesendet. Eine Kopie liegt in Ihrem Powermieter-Portal.

Dokument{docName}
Unterzeichner{name}
Signatur{place}, {today}
Status Unterzeichnet
)}
); } Object.assign(window, { SigningScreen });