Enhance TimeEntryService to improve handling of timefix corrections by ensuring UTC timestamps are correctly formatted for local time representation. Added detailed logging for start and end timefixes to aid in debugging and verification of time adjustments.

This commit is contained in:
Torsten Schulz (local)
2025-10-20 09:12:27 +02:00
parent 3a4b0c48db
commit 4c9189865f

View File

@@ -1340,10 +1340,18 @@ class TimeEntryService {
const originalEndTime = workEndUTC; const originalEndTime = workEndUTC;
if (startFix) { if (startFix) {
workStartUTC = new Date(startFix.fix_date_time); // DB speichert UTC - füge 'Z' hinzu für korrekte Interpretation
const fixTime = typeof startFix.fix_date_time === 'string'
? startFix.fix_date_time.replace(' ', 'T') + 'Z'
: startFix.fix_date_time;
workStartUTC = new Date(fixTime);
} }
if (endFix) { if (endFix) {
workEndUTC = new Date(endFix.fix_date_time); // DB speichert UTC - füge 'Z' hinzu für korrekte Interpretation
const fixTime = typeof endFix.fix_date_time === 'string'
? endFix.fix_date_time.replace(' ', 'T') + 'Z'
: endFix.fix_date_time;
workEndUTC = new Date(fixTime);
} }
// Parse Zeit-String (YYYY-MM-DD HH:MM:SS) direkt // Parse Zeit-String (YYYY-MM-DD HH:MM:SS) direkt
@@ -1462,10 +1470,16 @@ class TimeEntryService {
const originalPEndTime = pEndTime; const originalPEndTime = pEndTime;
if (pauseStartFix) { if (pauseStartFix) {
pStartTime = pauseStartFix.fix_date_time; // DB speichert UTC - füge 'Z' hinzu für korrekte Interpretation
pStartTime = typeof pauseStartFix.fix_date_time === 'string'
? pauseStartFix.fix_date_time.replace(' ', 'T') + 'Z'
: pauseStartFix.fix_date_time;
} }
if (pauseEndFix) { if (pauseEndFix) {
pEndTime = pauseEndFix.fix_date_time; // DB speichert UTC - füge 'Z' hinzu für korrekte Interpretation
pEndTime = typeof pauseEndFix.fix_date_time === 'string'
? pauseEndFix.fix_date_time.replace(' ', 'T') + 'Z'
: pauseEndFix.fix_date_time;
} }
// Berechne Dauer (aus Strings) // Berechne Dauer (aus Strings)
@@ -1542,6 +1556,10 @@ class TimeEntryService {
day.statusText = 'Abgeschlossen'; day.statusText = 'Abgeschlossen';
} else { } else {
// Laufender Arbeitstag // Laufender Arbeitstag
// Prüfe auf Timefix-Korrektur für Start
const startFix = timefixMap.get(pair.id)?.find(f => f.fix_type === 'start work');
const parseTimeString = (timeStr) => { const parseTimeString = (timeStr) => {
if (typeof timeStr === 'string') { if (typeof timeStr === 'string') {
const parts = timeStr.split(' ')[1]; // "HH:MM:SS" const parts = timeStr.split(' ')[1]; // "HH:MM:SS"
@@ -1552,13 +1570,30 @@ class TimeEntryService {
return { hours: timeStr.getHours(), minutes: timeStr.getMinutes() }; return { hours: timeStr.getHours(), minutes: timeStr.getMinutes() };
}; };
const start = parseTimeString(pair.start_time); // Verwende korrigierte Zeit falls vorhanden
let displayStartTime = pair.start_time;
if (startFix) {
// DB speichert UTC - füge 'Z' hinzu für korrekte Interpretation
const fixTime = typeof startFix.fix_date_time === 'string'
? startFix.fix_date_time.replace(' ', 'T') + 'Z'
: startFix.fix_date_time;
displayStartTime = new Date(fixTime);
}
const start = parseTimeString(displayStartTime);
const startHours = start.hours; const startHours = start.hours;
const startMinutes = start.minutes; const startMinutes = start.minutes;
workBlock.workTime = `${startHours.toString().padStart(2,'0')}:${startMinutes.toString().padStart(2,'0')} - jetzt`; workBlock.workTime = `${startHours.toString().padStart(2,'0')}:${startMinutes.toString().padStart(2,'0')} - jetzt`;
workBlock.workTimeFixed = !!startFix;
workBlock.completed = false; workBlock.completed = false;
if (startFix) {
// Original-Zeit für Tooltip
const origStart = parseTimeString(pair.start_time);
workBlock.workTimeOriginal = `${origStart.hours.toString().padStart(2,'0')}:${origStart.minutes.toString().padStart(2,'0')} - jetzt`;
}
// Prüfe auf Pausen NUR für diesen laufenden Arbeitsblock // Prüfe auf Pausen NUR für diesen laufenden Arbeitsblock
const blockEntries = allEntries.filter(e => { const blockEntries = allEntries.filter(e => {
// Parse state if it's a JSON string // Parse state if it's a JSON string