function Profil({ accent }) { const [loading, setLoading] = React.useState(true); const [saving, setSaving] = React.useState(false); const [savedAt, setSavedAt] = React.useState(null); const [error, setError] = React.useState(null); const [activeTab, setActiveTab] = React.useState('schule'); const [form, setForm] = React.useState({ schule_name: '', schule_strasse: '', schule_plz: '', schule_ort: '', schule_telefon: '', schule_email: '', schulleiter_name: '', schule_iban: '', schule_bic: '', schule_bank: '', schuljahr_aktuell: '', schuljahr_naechster_beginn: '', versetzung_sperre_aktiv: 'true', mail_smtp_host: '', mail_smtp_port: '587', mail_smtp_username: '', mail_smtp_password: '', mail_smtp_use_starttls: 'true', mail_smtp_use_ssl: 'false', mail_from_email: '', mail_from_name: '', mail_reply_to: '', mail_subject_template: '', mail_body_template: '', }); React.useEffect(() => { let alive = true; setLoading(true); setError(null); window.api.einstellungen.get() .then((data) => { if (!alive) return; setForm((prev) => ({ ...prev, ...pickProfileFields(data || {}), })); }) .catch((err) => { if (!alive) return; setError(err.message || 'Einstellungen konnten nicht geladen werden.'); }) .finally(() => { if (alive) setLoading(false); }); return () => { alive = false; }; }, []); const setField = (key, value) => { setForm((prev) => ({ ...prev, [key]: value })); }; const save = async () => { setSaving(true); setError(null); try { const payload = sanitizeForm(form); await window.api.einstellungen.update(payload); setSavedAt(new Date()); } catch (err) { setError(err.message || 'Speichern fehlgeschlagen.'); } finally { setSaving(false); } }; if (loading) { return
Lade Einstellungen...
; } const fieldStyle = { width: '100%', padding: '9px 11px', border: '1px solid #e2e8f0', borderRadius: 8, background: '#fff', color: '#0f172a', fontSize: 13.5, fontFamily: 'inherit', outline: 'none', }; const labelStyle = { fontSize: 11.5, color: '#475569', fontWeight: 500, marginBottom: 5, display: 'block', }; const textAreaStyle = { ...fieldStyle, minHeight: 96, resize: 'vertical', lineHeight: 1.45, whiteSpace: 'pre-wrap', }; const hintStyle = { fontSize: 11, color: '#94a3b8', marginTop: 3, }; const TABS = [ { id: 'schule', label: 'Schule' }, { id: 'bank', label: 'Bankdaten' }, { id: 'email', label: 'E-Mail-Konfiguration' }, { id: 'info', label: 'Info' }, ]; return (
{/* Header */}

Einstellungen

Schuldaten, Bankverbindung und E-Mail-Versand konfigurieren.
{saving ? 'Speichern...' : 'Speichern'}
{/* Meldungen */} {error && (
{error}
)} {savedAt && (
Gespeichert um {savedAt.toLocaleTimeString('de-DE')} Uhr.
)} {/* Tab-Leiste */}
{TABS.map((tab) => { const active = activeTab === tab.id; return ( ); })}
{/* Tab: Schule */} {activeTab === 'schule' && (
Schulinformationen
setField('schule_name', e.target.value)} style={fieldStyle} />
setField('schule_strasse', e.target.value)} style={fieldStyle} />
setField('schule_plz', e.target.value)} style={fieldStyle} />
setField('schule_ort', e.target.value)} style={fieldStyle} />
setField('schule_telefon', e.target.value)} style={fieldStyle} />
setField('schule_email', e.target.value)} style={fieldStyle} />
setField('schulleiter_name', e.target.value)} placeholder="z.B. Dr. Max Mustermann" style={fieldStyle} />
Wird automatisch in Rechnung- und Gutschrift-PDFs verwendet.
Schuljahr
setField('schuljahr_aktuell', e.target.value)} placeholder="z.B. 2026/2027" style={fieldStyle} />
setField('schuljahr_naechster_beginn', e.target.value)} style={fieldStyle} /> {(() => { if (!form.schuljahr_naechster_beginn) return null; const heute = new Date(); heute.setHours(0, 0, 0, 0); const termin = new Date(form.schuljahr_naechster_beginn); const tage = Math.ceil((termin - heute) / 86400000); let text, farbe; const sperreAktiv = form.versetzung_sperre_aktiv === 'true'; if (tage === 0) { text = 'Heute — erster Tag des neuen Schuljahres.'; farbe = '#047857'; } else if (tage < 0) { text = `Vor ${Math.abs(tage)} ${Math.abs(tage) === 1 ? 'Tag' : 'Tagen'} begonnen.`; farbe = '#b91c1c'; } else if (sperreAktiv){ text = `Noch ${tage} ${tage === 1 ? 'Tag' : 'Tage'} bis zum Schuljahresbeginn — Klassenversetzung gesperrt.`; farbe = '#b45309'; } else { text = `Noch ${tage} ${tage === 1 ? 'Tag' : 'Tage'} bis zum Schuljahresbeginn.`; farbe = '#2563eb'; } return
{text}
; })()}
Steuert den Countdown auf dem Start-Screen und die Versetzungssperre.
)} {/* Tab: Bankdaten */} {activeTab === 'bank' && (
Bankverbindung
setField('schule_bank', e.target.value)} style={fieldStyle} />
setField('schule_iban', e.target.value)} style={fieldStyle} />
setField('schule_bic', e.target.value)} style={fieldStyle} />
)} {/* Tab: Info */} {activeTab === 'info' && (
App-Informationen
Details zur installierten Anwendung.
Name Libera
Version 1.0.0
Entwickler
Entwickelt und betreut von BP Mediawork GmbH.
Unternehmen BP Mediawork GmbH
E-Mail buero@bpmediawork.de
Website www.bpmediawork.de
Support
Bei Fragen oder Problemen wenden Sie sich direkt an den Support.
Support E-Mail kiscouts@bpmediawork.de
)} {/* Tab: E-Mail & Versand */} {activeTab === 'email' && (
SMTP-Zugangsdaten
Ausgehender Mailserver für den Rechnungsversand aus der Buchhaltung.
setField('mail_smtp_host', e.target.value)} placeholder="z.B. smtp.office365.com" style={fieldStyle} />
setField('mail_smtp_port', e.target.value)} placeholder="587" style={fieldStyle} />
setField('mail_smtp_username', e.target.value)} style={fieldStyle} />
setField('mail_smtp_password', e.target.value)} style={fieldStyle} />
Absender & Templates
setField('mail_from_email', e.target.value)} placeholder="sekretariat@schule.de" style={fieldStyle} />
setField('mail_from_name', e.target.value)} placeholder="Schulsekretariat" style={fieldStyle} />
setField('mail_reply_to', e.target.value)} placeholder="optional" style={fieldStyle} />
setField('mail_subject_template', e.target.value)} style={fieldStyle} />