diff --git a/public/js/dashboard.js b/public/js/dashboard.js index 3f3eb4b..0472980 100644 --- a/public/js/dashboard.js +++ b/public/js/dashboard.js @@ -1003,13 +1003,9 @@ function updateOvertimeDisplay() { } } - // Überstunden berechnen (wie im Backend: mit adjustedSollStunden) - // totalHours enthält bereits Feiertagsstunden (8h oder gearbeitete Stunden) aus dem Feiertag-Zweig oben + // Variante B: Überstunden/Fehlstunden = Gesamt − Soll (Soll immer vertraglich) const totalHoursWithVacation = totalHours + vacationHours; - const adjustedSollStunden = sollStunden - (fullDayOvertimeDays * fullDayHours); - // overtimeHours = Überstunden diese Woche (wie im Backend berechnet) - // Genommene Überstunden werden abgezogen, um die Netto-Überstunden zu erhalten - const overtimeHours = totalHoursWithVacation - adjustedSollStunden - overtimeTaken; + const overtimeHours = totalHoursWithVacation - sollStunden; // Überstunden-Anzeige aktualisieren const overtimeSummaryItem = document.getElementById('overtimeSummaryItem'); diff --git a/routes/user-routes.js b/routes/user-routes.js index ade56bf..567fbf2 100644 --- a/routes/user-routes.js +++ b/routes/user-routes.js @@ -507,19 +507,14 @@ function registerUserRoutes(app) { } } - // Sollstunden berechnen + // Sollstunden berechnen (Variante B: immer vertraglich, nicht reduziert durch „genommen“) const sollStunden = (wochenstunden / arbeitstage) * workdays; - // Überstunden für diese Woche: (totalHours + vacationHours + holidayHours) - adjustedSollStunden const weekTotalHoursWithVacation = weekTotalHours + weekVacationHours + holidayHours; - const adjustedSollStunden = sollStunden - (fullDayOvertimeDays * fullDayHours); - // weekOvertimeHours = Überstunden diese Woche (wie im Frontend berechnet) - const weekOvertimeHours = weekTotalHoursWithVacation - adjustedSollStunden; + // Überstunden/Fehlstunden = Gesamt − Soll (kann negativ sein) + const weekOvertimeHours = weekTotalHoursWithVacation - sollStunden; // 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; totalOvertimeTaken += weekOvertimeTaken; totalVacationDays += weekVacationDays; @@ -528,10 +523,8 @@ function registerUserRoutes(app) { // Wenn alle Wochen verarbeitet wurden, Antwort senden if (processedWeeks === weeks.length && !hasError) { - // Aktuelle Überstunden = Summe aller Wochen-Überstunden - verbrauchte Überstunden + Offset - // weekOvertimeHours enthält bereits die korrekte Berechnung pro Woche (wie im Frontend) - // weekOvertimeTaken enthält die verbrauchten Überstunden (8 Stunden pro Tag mit 8 Überstunden) - const currentOvertime = (totalOvertimeHours - totalOvertimeTaken) + overtimeOffsetHours; + // Variante B: Verbleibend = Summe Wochen-Überstunden + Offset („genommen“ nur Anzeige) + const currentOvertime = totalOvertimeHours + overtimeOffsetHours; const remainingVacation = urlaubstage - totalVacationDays + vacationOffsetDays; res.json({ @@ -761,11 +754,10 @@ function registerUserRoutes(app) { } } - // Sollstunden berechnen + // Sollstunden berechnen (Variante B: immer vertraglich) const sollStunden = (wochenstunden / arbeitstage) * workdays; const weekTotalHoursWithVacation = weekTotalHours + weekVacationHours + holidayHours; - const adjustedSollStunden = sollStunden - (fullDayOvertimeDays * fullDayHours); - const weekOvertimeHours = weekTotalHoursWithVacation - adjustedSollStunden; + const weekOvertimeHours = weekTotalHoursWithVacation - sollStunden; // Kalenderwoche berechnen const calendarWeek = getCalendarWeek(week.week_start); @@ -780,7 +772,7 @@ function registerUserRoutes(app) { overtime_hours: parseFloat(weekOvertimeHours.toFixed(2)), overtime_taken: parseFloat(weekOvertimeTaken.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)), workdays: workdays }); diff --git a/routes/verwaltung-routes.js b/routes/verwaltung-routes.js index c167e8f..b72f470 100644 --- a/routes/verwaltung-routes.js +++ b/routes/verwaltung-routes.js @@ -597,12 +597,11 @@ function registerVerwaltungRoutes(app) { const weekOvertimeHours = totalHoursWithVacation - sollStunden; // Kumulative Überstunden: Summe aller Wochen bis zur aktuellen Woche - // cumulativeOvertimeHours enthält bereits alle vorherigen Wochen const totalCumulativeOvertimeHours = cumulativeOvertimeHours + weekOvertimeHours; const totalCumulativeOvertimeTaken = cumulativeOvertimeTaken + overtimeTaken; - // Verbleibende Überstunden = kumulative Überstunden - kumulative genommene Überstunden - const remainingOvertime = totalCumulativeOvertimeHours - totalCumulativeOvertimeTaken; + // Variante B: Verbleibend = Summe Wochen-Überstunden („genommen“ nur Anzeige) + const remainingOvertime = totalCumulativeOvertimeHours; const remainingOvertimeWithOffset = remainingOvertime + overtimeOffsetHours; // Verbleibende Urlaubstage (berücksichtigt alle eingereichten Wochen, nicht nur die aktuelle) diff --git a/services/overtime-service.js b/services/overtime-service.js index fd0bcba..d01809a 100644 --- a/services/overtime-service.js +++ b/services/overtime-service.js @@ -171,17 +171,17 @@ function getCurrentOvertimeForUser(userId, db, callback) { } } + // Variante B: Soll immer vertraglich, Verbleibend ohne Abzug „genommen“ const sollStunden = (wochenstunden / arbeitstage) * workdays; const weekTotalHoursWithVacation = weekTotalHours + weekVacationHours + holidayHours; - const adjustedSollStunden = sollStunden - fullDayOvertimeDays * fullDayHours; - const weekOvertimeHours = weekTotalHoursWithVacation - adjustedSollStunden; + const weekOvertimeHours = weekTotalHoursWithVacation - sollStunden; totalOvertimeHours += weekOvertimeHours; totalOvertimeTaken += weekOvertimeTaken; processedWeeks++; if (processedWeeks === weeks.length && !hasError) { - done(totalOvertimeHours - totalOvertimeTaken + overtimeOffsetHours); + done(totalOvertimeHours + overtimeOffsetHours); } }); } diff --git a/views/overtime-breakdown.ejs b/views/overtime-breakdown.ejs index 15d2a53..1f96c57 100644 --- a/views/overtime-breakdown.ejs +++ b/views/overtime-breakdown.ejs @@ -274,14 +274,17 @@ totalOvertimeTaken += week.overtime_taken; }); 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 const totalOvertimeEl = document.getElementById('totalOvertime'); totalOvertimeEl.textContent = - (totalOvertime >= 0 ? '+' : '') + formatHoursMin(totalOvertime); + (displayTotalOvertime >= 0 ? '+' : '') + formatHoursMin(displayTotalOvertime); totalOvertimeEl.className = - 'summary-value ' + (totalOvertime >= 0 ? 'overtime-positive' : 'overtime-negative'); + 'summary-value ' + (displayTotalOvertime >= 0 ? 'overtime-positive' : 'overtime-negative'); const totalOvertimeTakenEl = document.getElementById('totalOvertimeTaken'); totalOvertimeTakenEl.textContent =