From a1b5e191f303c394f97fbfff81f3f73d88ea17c0 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Mon, 20 Oct 2025 16:41:11 +0200 Subject: [PATCH] Refactor StatusBox component to improve end time calculations using server data. Update logic to handle elapsed time accurately, including pause states, and enhance display of currently worked hours. Adjust formatting for time outputs to ensure clarity in the user interface. --- frontend/src/components/StatusBox.vue | 51 ++++++++++++++++++++------- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/StatusBox.vue b/frontend/src/components/StatusBox.vue index d0a738b..ded00f7 100644 --- a/frontend/src/components/StatusBox.vue +++ b/frontend/src/components/StatusBox.vue @@ -252,15 +252,35 @@ const updateOpenTime = () => { // Ausgabe ohne zusätzlichen Pausen-Hinweis; Zeit stammt bereits inkl. Pausen aus Backend regularEndTime.value = `${endHours.toString().padStart(2, '0')}:${endMinutes.toString().padStart(2, '0')}:${endSeconds.toString().padStart(2, '0')} Uhr` - // Override: Berechne Normales Arbeitsende deterministisch aus Start + 8h + fehlende Pausen - if (workStartTime.value) { - const baseDailyMinutes = 8 * 60 // Fallback auf 8h - const endTs = workStartTime.value + (baseDailyMinutes + (missingBreakMinutes.value || 0)) * 60 * 1000 - const endDt = new Date(endTs) - const eh = endDt.getHours() - const em = endDt.getMinutes() - const es = endDt.getSeconds() - regularEndTime.value = `${eh.toString().padStart(2, '0')}:${em.toString().padStart(2, '0')}:${es.toString().padStart(2, '0')} Uhr` + // Override: Berechne Normales Arbeitsende aus Server "open" Zeit + // Nur überschreiben wenn wir Server-Daten haben + if (serverOpenTime.value && serverTimestamp.value) { + // Parse Server-Offen-Zeit + const openParts = serverOpenTime.value.split(':') + const openSeconds = parseInt(openParts[0]) * 3600 + parseInt(openParts[1]) * 60 + parseInt(openParts[2] || 0) + + // Berechne vergangene Zeit seit Server-Timestamp + const now = Date.now() + const elapsedMs = now - serverTimestamp.value + let elapsedSeconds = Math.floor(elapsedMs / 1000) + + // Wenn in Pause, zähle die Zeit nicht + if (currentState.value === 'start pause') { + elapsedSeconds = 0 + } + + const remainingSeconds = openSeconds - elapsedSeconds + + if (remainingSeconds > 0) { + const endTs = now + (remainingSeconds * 1000) + const endDt = new Date(endTs) + const eh = endDt.getHours() + const em = endDt.getMinutes() + const es = endDt.getSeconds() + regularEndTime.value = `${eh.toString().padStart(2, '0')}:${em.toString().padStart(2, '0')}:${es.toString().padStart(2, '0')} Uhr` + } else { + regularEndTime.value = 'Erreicht' + } } } else { openTime.value = 'Arbeitsende erreicht' @@ -381,9 +401,14 @@ onBeforeUnmount(() => { }) const displayRows = computed(() => { + // Verwende Server-Wert für "Derzeit gearbeitet" wenn verfügbar (zeigt gesamte Tagesarbeitszeit) + const workedDisplay = (stats.value?.currentlyWorked && stats.value.currentlyWorked !== '—') + ? stats.value.currentlyWorked + ' h' + : (currentlyWorkedTime.value === '—' ? currentlyWorkedTime.value : currentlyWorkedTime.value + ' h'); + const rows = { - 'Derzeit gearbeitet': currentlyWorkedTime.value === '—' ? currentlyWorkedTime.value : currentlyWorkedTime.value + ' h', - 'Offen': openTime.value === '—' ? openTime.value : openTime.value + ' h', + 'Derzeit gearbeitet': workedDisplay, + 'Offen': openTime.value === '—' || openTime.value.includes('erreicht') ? openTime.value : openTime.value + ' h', 'Normales Arbeitsende': regularEndTime.value // Verwende berechneten Wert (hat bereits "Uhr") } @@ -421,8 +446,8 @@ const displayRows = computed(() => { const displayValue = isNegative ? val.substring(1) + ' h' : val + ' h'; // Entferne Minus-Zeichen, füge " h" hinzu rows[displayLabel] = displayValue; } else if (key === 'adjustedEndTodayGeneral' || key === 'adjustedEndTodayWeek') { - // Füge " Uhr" zu Uhrzeiten hinzu - rows[label] = val + ' Uhr'; + // Füge " Uhr" zu Uhrzeiten hinzu (außer bei "Arbeitsende erreicht") + rows[label] = val.includes('erreicht') ? val : val + ' Uhr'; } else if (key === 'weekWorktime' || key === 'openForWeek' || key === 'nonWorkingHours') { // Füge " h" zu Zeiten hinzu (außer bei "—") rows[label] = val === '—' ? val : val + ' h';