56 lines
1.9 KiB
JavaScript
56 lines
1.9 KiB
JavaScript
/**
|
|
* 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] || ''
|
|
}
|