/** * Unterstuetzung bei Arbeitsblaettern (WOMS-Feld "supporters", JSON-Liste [{ employeeId, name, task }]). * Jede unterstuetzende Person bekommt die Haelfte der Arbeitszeit, aufgerundet auf 15 Minuten * (Abo-Bedingungen ยง 4). Gleiche Regel wie WOMS src/lib/support.js; die Minuten werden nie * gespeichert, sondern immer aus totalTime berechnet. */ const STEP = 15 const MAX_TASK = 200 export function supportMinutes(totalTime) { const total = Number(totalTime) || 0 if (total <= 0) return 0 return Math.ceil(total / 2 / STEP) * STEP } /** Nie eine Exception: kaputte Werte ergeben [] (einmal gemeldet), kaputte Eintraege fallen weg. context z. B. die Worksheet-ID. */ export function parseSupporters(raw, context) { let list = raw if (typeof raw === 'string') { if (!raw.trim()) return [] try { list = JSON.parse(raw) } catch { console.warn('[unterstuetzung] supporters unlesbar', context ?? '') return [] } } if (list == null) return [] if (!Array.isArray(list)) { console.warn('[unterstuetzung] supporters unlesbar', context ?? '') return [] } const seen = new Set() const result = [] for (const entry of list) { if (!entry || typeof entry !== 'object') continue const employeeId = String(entry.employeeId || '').trim() const task = String(entry.task || '').trim().slice(0, MAX_TASK) if (!employeeId || !task || seen.has(employeeId)) continue seen.add(employeeId) result.push({ employeeId, name: String(entry.name || '').trim(), task }) } return result } /** Arbeitszeit des Blatts plus die Unterstuetzung aller Personen */ export function worksheetMinutes(ws) { const base = Number(ws?.totalTime) || 0 return base + parseSupporters(ws?.supporters, ws?.$id).length * supportMinutes(base) } export function firstName(name) { return String(name || '').trim().split(/\s+/)[0] || '' }