Unterstützung: eigene Zeilen und Gesamtzeit in den Projektdetails

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-09-30 15:08:16 +00:00
1 parent 7c6b0c906b
commit 7da4452bbd
8 files changed
+136 -8

No files matched your search

+18 -2
View File
@@ -5,6 +5,8 @@
* Admin-Ansichten nutzen weiter die Rohdaten.
*/
import { parseSupporters, supportMinutes, firstName } from './worksheetMinutes.js'
const GENERIC_UPDATE = 'Website aktualisiert'
/* --------------------------------------------------------------- Commits --- */
@@ -204,15 +206,20 @@ function customerWorkEntry(sheet, { includeUpdates }) {
const [kind, label] = WORK_KINDS[type] || OTHER_WORK
const date = isoDay(sheet.date || sheet.endDate || sheet.startDate)
const minutes = Number(sheet.totalTime) || 0
// Unterstuetzung: eigene Zeilen, je Person die Haelfte der Arbeitszeit (aufgerundet auf 15 min)
const supports = parseSupporters(sheet.supporters, sheet.$id)
.map((s) => ({ name: firstName(s.name), task: s.task, minutes: supportMinutes(minutes) }))
.filter((s) => s.minutes > 0)
const withSupports = (entry) => (supports.length ? { ...entry, supports } : entry)
if (isGit) {
// In den Projektdetails stehen die Aenderungen schon unter "Letzte Änderungen";
// dort zaehlt ein Push nur, wenn Arbeitszeit nachgetragen wurde
if (!includeUpdates && !minutes) return null
const changes = changesFromPushDetails(sheet.details)
return changes.length ? { kind, label, date, minutes, changes } : null
return changes.length ? withSupports({ kind, label, date, minutes, changes }) : null
}
return { kind, label, date, minutes, person: String(sheet.employeeName || '').trim(), text: String(sheet.details || '').trim() }
return withSupports({ kind, label, date, minutes, person: String(sheet.employeeName || '').trim(), text: String(sheet.details || '').trim() })
}
/** Worksheets (roh aus Appwrite oder aus getCustomerActivity) -> Eintraege fuer den Kunden. */
@@ -225,9 +232,18 @@ export function customerWorkEntries(sheets = [], { includeUpdates = true } = {})
if (entry.kind === 'update' && prev?.kind === 'update' && prev.date === entry.date) {
prev.minutes += entry.minutes
prev.changes.push(...entry.changes.filter((change) => !prev.changes.includes(change)))
if (entry.supports) prev.supports = [...(prev.supports || []), ...entry.supports]
continue
}
entries.push(entry)
}
return entries
}
/** Arbeitszeit gesamt fuer den Projektkopf: alle Schritte inkl. Unterstuetzung */
export function workTotalMinutes(entries = []) {
return entries.reduce(
(sum, e) => sum + (Number(e.minutes) || 0) + (e.supports || []).reduce((s, x) => s + (Number(x.minutes) || 0), 0),
0
)
}