Optimiere die Berechnung der Gesamtüberstunden, indem die korrigierte Ereignisfolge für die Tages- und Wochenanzeige verwendet wird.
All checks were successful
Deploy production / deploy (push) Successful in 48s

This commit is contained in:
Torsten Schulz (local)
2026-08-28 08:31:33 +02:00
parent e84f2f38fe
commit 3cbd627219

View File

@@ -1052,27 +1052,13 @@ class TimeEntryService {
ORDER BY DATE(COALESCE(w1_fix.fix_date_time, w1.tstamp))
`;
// Die SQL-Abfrage oben kann nur originale `state`-/`relatedTo`-Paare
// erkennen. Bei Action-Korrekturen fehlen dadurch ganze Arbeitstage in
// der Gesamtstatistik. Verwende dieselbe effektive Ereignisfolge wie
// Timer und Wochenansicht.
const netMinutesByDate = new Map();
this._buildEffectiveWorkBlocks(await this._getEffectiveEntries(userId))
.filter(block => block.end)
.forEach(block => {
const start = new Date(block.start.effectiveTime);
const date = `${start.getFullYear()}-${String(start.getMonth() + 1).padStart(2, '0')}-${String(start.getDate()).padStart(2, '0')}`;
const day = start.getDay();
if (date > endDateStr || day === 0 || day === 6) return;
const pauses = block.pauses.reduce((sum, pause) => sum +
new Date(pause.end.effectiveTime).getTime() - new Date(pause.start.effectiveTime).getTime(), 0);
const minutes = Math.round((new Date(block.end.effectiveTime).getTime() - start.getTime() - pauses) / 60000);
netMinutesByDate.set(date, (netMinutesByDate.get(date) || 0) + minutes);
});
const workDays = [...netMinutesByDate.entries()].map(([work_date, minutes]) => ({
work_date,
net_hours: minutes / 60
}));
// Die Gesamtüberstunden enthalten einen historischen Übertrag. Ihre
// etablierte SQL-Basis bleibt deshalb unverändert; die korrigierte
// Ereignisfolge wird für die laufende Tages- und Wochenanzeige genutzt.
const workDays = await sequelize.query(query, {
replacements: [userId, endDateStr],
type: sequelize.QueryTypes.SELECT
});
// Hole User-Bundesland
const { State: StateModel } = database.getModels();