Behoben in b3eeca5: Monat/Jahr/Slots-Selects haben jetzt id + zugehöriges <label for>; Name-Input, Excel-Import- und JSON-Import-Datei-Inputs erhalten aria-label.
Behoben in 7ab2911: parseInt(month/year, 10) mit Radix; minGap-Check mit Null-Guard (c.minGapDays != null && c.minGapDays > 0); stille catch-Blöcke (korrupter localStorage-Load, `createEmploy…
Behoben in fd98708: neues js/utils.js mit toISO, monthPrefix, getWeekday, formatDateDE, buildNameMap. algorithm.js, calendar.js, excel.js, history.js importieren diese statt…
Behoben in 0efb9cb: saveState debounced (~400 ms), bündelt schnelle Änderungen; ausstehender Write wird bei beforeunload und visibilitychange→hidden geflusht (kein Verlust der letzten…
Behoben in 8cd8908: Tag-Zellen-Aufbau in makeDayCell(d) extrahiert. Slot-Änderungen und Feiertag/Betriebsurlaub-Toggles rendern jetzt nur die betroffene Zelle neu (cell.replaceWith)…
Behoben in c076b5e: histCount-Map einmal pro Generierung vorberechnet — scoreCandidate macht jetzt O(1)-Lookup statt History-Scan pro Kandidat. minGap ermittelt das letzte Datum per…
Behoben in 074635c: README um Abschnitt Datenschutz & Speicherung ergänzt (lokales Single-User-Tool, unverschlüsselter localStorage, keine geteilten Geräte, JSON-Export zur Sicherung).…
Behoben in e6452fa: neue sanitizeCell-Funktion — Zellwerte mit führendem = + - @ (oder Steuerzeichen) werden mit ' als Text neutralisiert, angewandt auf die Namensspalte beim Excel-Export.…
Behoben in f8efcf1: SheetJS-Script mit integrity="sha384-…" + crossorigin abgesichert; CSP-<meta> ergänzt (script-src 'self' https://cdn.sheetjs.com, object-src 'none', `base-uri…
Behoben in 142e0ef: removeEmployee entfernt jetzt zusätzlich alle History-Einträge des Mitarbeiters — keine verwaisten (unbekannt)-Zeilen mehr. Verhalten gewählt: History mitlöschen.…