Umstellung der Stundenberechnung auf Sollarbeitszeit.

This commit is contained in:
2026-02-23 23:23:14 +01:00
parent 5e188cace2
commit 7c81095924
5 changed files with 21 additions and 31 deletions

View File

@@ -1003,13 +1003,9 @@ function updateOvertimeDisplay() {
} }
} }
// Überstunden berechnen (wie im Backend: mit adjustedSollStunden) // Variante B: Überstunden/Fehlstunden = Gesamt Soll (Soll immer vertraglich)
// totalHours enthält bereits Feiertagsstunden (8h oder gearbeitete Stunden) aus dem Feiertag-Zweig oben
const totalHoursWithVacation = totalHours + vacationHours; const totalHoursWithVacation = totalHours + vacationHours;
const adjustedSollStunden = sollStunden - (fullDayOvertimeDays * fullDayHours); const overtimeHours = totalHoursWithVacation - sollStunden;
// overtimeHours = Überstunden diese Woche (wie im Backend berechnet)
// Genommene Überstunden werden abgezogen, um die Netto-Überstunden zu erhalten
const overtimeHours = totalHoursWithVacation - adjustedSollStunden - overtimeTaken;
// Überstunden-Anzeige aktualisieren // Überstunden-Anzeige aktualisieren
const overtimeSummaryItem = document.getElementById('overtimeSummaryItem'); const overtimeSummaryItem = document.getElementById('overtimeSummaryItem');

View File

@@ -507,19 +507,14 @@ function registerUserRoutes(app) {
} }
} }
// Sollstunden berechnen // Sollstunden berechnen (Variante B: immer vertraglich, nicht reduziert durch „genommen“)
const sollStunden = (wochenstunden / arbeitstage) * workdays; const sollStunden = (wochenstunden / arbeitstage) * workdays;
// Überstunden für diese Woche: (totalHours + vacationHours + holidayHours) - adjustedSollStunden
const weekTotalHoursWithVacation = weekTotalHours + weekVacationHours + holidayHours; const weekTotalHoursWithVacation = weekTotalHours + weekVacationHours + holidayHours;
const adjustedSollStunden = sollStunden - (fullDayOvertimeDays * fullDayHours); // Überstunden/Fehlstunden = Gesamt Soll (kann negativ sein)
// weekOvertimeHours = Überstunden diese Woche (wie im Frontend berechnet) const weekOvertimeHours = weekTotalHoursWithVacation - sollStunden;
const weekOvertimeHours = weekTotalHoursWithVacation - adjustedSollStunden;
// Kumulativ addieren // Kumulativ addieren
// WICHTIG: weekOvertimeHours enthält bereits die Überstunden dieser Woche (kann negativ sein bei 8 Überstunden)
// weekOvertimeTaken enthält die verbrauchten Überstunden (8 Stunden pro Tag mit 8 Überstunden)
// Die aktuellen Überstunden = Summe aller Wochen-Überstunden - verbrauchte Überstunden
totalOvertimeHours += weekOvertimeHours; totalOvertimeHours += weekOvertimeHours;
totalOvertimeTaken += weekOvertimeTaken; totalOvertimeTaken += weekOvertimeTaken;
totalVacationDays += weekVacationDays; totalVacationDays += weekVacationDays;
@@ -528,10 +523,8 @@ function registerUserRoutes(app) {
// Wenn alle Wochen verarbeitet wurden, Antwort senden // Wenn alle Wochen verarbeitet wurden, Antwort senden
if (processedWeeks === weeks.length && !hasError) { if (processedWeeks === weeks.length && !hasError) {
// Aktuelle Überstunden = Summe aller Wochen-Überstunden - verbrauchte Überstunden + Offset // Variante B: Verbleibend = Summe Wochen-Überstunden + Offset („genommen“ nur Anzeige)
// weekOvertimeHours enthält bereits die korrekte Berechnung pro Woche (wie im Frontend) const currentOvertime = totalOvertimeHours + overtimeOffsetHours;
// weekOvertimeTaken enthält die verbrauchten Überstunden (8 Stunden pro Tag mit 8 Überstunden)
const currentOvertime = (totalOvertimeHours - totalOvertimeTaken) + overtimeOffsetHours;
const remainingVacation = urlaubstage - totalVacationDays + vacationOffsetDays; const remainingVacation = urlaubstage - totalVacationDays + vacationOffsetDays;
res.json({ res.json({
@@ -761,11 +754,10 @@ function registerUserRoutes(app) {
} }
} }
// Sollstunden berechnen // Sollstunden berechnen (Variante B: immer vertraglich)
const sollStunden = (wochenstunden / arbeitstage) * workdays; const sollStunden = (wochenstunden / arbeitstage) * workdays;
const weekTotalHoursWithVacation = weekTotalHours + weekVacationHours + holidayHours; const weekTotalHoursWithVacation = weekTotalHours + weekVacationHours + holidayHours;
const adjustedSollStunden = sollStunden - (fullDayOvertimeDays * fullDayHours); const weekOvertimeHours = weekTotalHoursWithVacation - sollStunden;
const weekOvertimeHours = weekTotalHoursWithVacation - adjustedSollStunden;
// Kalenderwoche berechnen // Kalenderwoche berechnen
const calendarWeek = getCalendarWeek(week.week_start); const calendarWeek = getCalendarWeek(week.week_start);
@@ -780,7 +772,7 @@ function registerUserRoutes(app) {
overtime_hours: parseFloat(weekOvertimeHours.toFixed(2)), overtime_hours: parseFloat(weekOvertimeHours.toFixed(2)),
overtime_taken: parseFloat(weekOvertimeTaken.toFixed(2)), overtime_taken: parseFloat(weekOvertimeTaken.toFixed(2)),
total_hours: parseFloat(weekTotalHoursWithVacation.toFixed(2)), total_hours: parseFloat(weekTotalHoursWithVacation.toFixed(2)),
soll_stunden: parseFloat(adjustedSollStunden.toFixed(2)), soll_stunden: parseFloat(sollStunden.toFixed(2)),
vacation_days: parseFloat(weekVacationDays.toFixed(1)), vacation_days: parseFloat(weekVacationDays.toFixed(1)),
workdays: workdays workdays: workdays
}); });

View File

@@ -597,12 +597,11 @@ function registerVerwaltungRoutes(app) {
const weekOvertimeHours = totalHoursWithVacation - sollStunden; const weekOvertimeHours = totalHoursWithVacation - sollStunden;
// Kumulative Überstunden: Summe aller Wochen bis zur aktuellen Woche // Kumulative Überstunden: Summe aller Wochen bis zur aktuellen Woche
// cumulativeOvertimeHours enthält bereits alle vorherigen Wochen
const totalCumulativeOvertimeHours = cumulativeOvertimeHours + weekOvertimeHours; const totalCumulativeOvertimeHours = cumulativeOvertimeHours + weekOvertimeHours;
const totalCumulativeOvertimeTaken = cumulativeOvertimeTaken + overtimeTaken; const totalCumulativeOvertimeTaken = cumulativeOvertimeTaken + overtimeTaken;
// Verbleibende Überstunden = kumulative Überstunden - kumulative genommene Überstunden // Variante B: Verbleibend = Summe Wochen-Überstunden („genommen“ nur Anzeige)
const remainingOvertime = totalCumulativeOvertimeHours - totalCumulativeOvertimeTaken; const remainingOvertime = totalCumulativeOvertimeHours;
const remainingOvertimeWithOffset = remainingOvertime + overtimeOffsetHours; const remainingOvertimeWithOffset = remainingOvertime + overtimeOffsetHours;
// Verbleibende Urlaubstage (berücksichtigt alle eingereichten Wochen, nicht nur die aktuelle) // Verbleibende Urlaubstage (berücksichtigt alle eingereichten Wochen, nicht nur die aktuelle)

View File

@@ -171,17 +171,17 @@ function getCurrentOvertimeForUser(userId, db, callback) {
} }
} }
// Variante B: Soll immer vertraglich, Verbleibend ohne Abzug „genommen“
const sollStunden = (wochenstunden / arbeitstage) * workdays; const sollStunden = (wochenstunden / arbeitstage) * workdays;
const weekTotalHoursWithVacation = weekTotalHours + weekVacationHours + holidayHours; const weekTotalHoursWithVacation = weekTotalHours + weekVacationHours + holidayHours;
const adjustedSollStunden = sollStunden - fullDayOvertimeDays * fullDayHours; const weekOvertimeHours = weekTotalHoursWithVacation - sollStunden;
const weekOvertimeHours = weekTotalHoursWithVacation - adjustedSollStunden;
totalOvertimeHours += weekOvertimeHours; totalOvertimeHours += weekOvertimeHours;
totalOvertimeTaken += weekOvertimeTaken; totalOvertimeTaken += weekOvertimeTaken;
processedWeeks++; processedWeeks++;
if (processedWeeks === weeks.length && !hasError) { if (processedWeeks === weeks.length && !hasError) {
done(totalOvertimeHours - totalOvertimeTaken + overtimeOffsetHours); done(totalOvertimeHours + overtimeOffsetHours);
} }
}); });
} }

View File

@@ -274,14 +274,17 @@
totalOvertimeTaken += week.overtime_taken; totalOvertimeTaken += week.overtime_taken;
}); });
const overtimeOffset = data.overtime_offset_hours || 0; const overtimeOffset = data.overtime_offset_hours || 0;
const remainingOvertime = totalOvertime - totalOvertimeTaken + overtimeOffset; // Variante B: Verbleibend = Summe Wochen-Überstunden + Offset („genommen“ nur Anzeige)
const remainingOvertime = totalOvertime + overtimeOffset;
// Gesamt Überstunden = Verbleibend + Genommen (kumuliert inkl. bereits verbrauchter)
const displayTotalOvertime = remainingOvertime + totalOvertimeTaken;
// Zusammenfassung anzeigen // Zusammenfassung anzeigen
const totalOvertimeEl = document.getElementById('totalOvertime'); const totalOvertimeEl = document.getElementById('totalOvertime');
totalOvertimeEl.textContent = totalOvertimeEl.textContent =
(totalOvertime >= 0 ? '+' : '') + formatHoursMin(totalOvertime); (displayTotalOvertime >= 0 ? '+' : '') + formatHoursMin(displayTotalOvertime);
totalOvertimeEl.className = totalOvertimeEl.className =
'summary-value ' + (totalOvertime >= 0 ? 'overtime-positive' : 'overtime-negative'); 'summary-value ' + (displayTotalOvertime >= 0 ? 'overtime-positive' : 'overtime-negative');
const totalOvertimeTakenEl = document.getElementById('totalOvertimeTaken'); const totalOvertimeTakenEl = document.getElementById('totalOvertimeTaken');
totalOvertimeTakenEl.textContent = totalOvertimeTakenEl.textContent =