Icons, Footer, Stundenformel

This commit is contained in:
2026-02-05 13:27:39 +01:00
parent 7d6951334f
commit 3c282a0f3c
17 changed files with 100 additions and 28 deletions

View File

@@ -440,12 +440,17 @@ function renderWeek() {
// Stunden zur Summe hinzufügen
// Bei ganztägigem Urlaub oder Krank sollten es bereits 8 Stunden sein (vom Backend gesetzt)
// Feiertag: 8h Basis + gearbeitete Stunden (jede gearbeitete Stunde = Überstunde)
// Feiertag Werktag: 8h Basis + gearbeitete Stunden (jede gearbeitete Stunde = Überstunde)
// Feiertag am Wochenende: keine Tagesarbeitsstunden, nur gearbeitete Stunden (z. B. Reise)
// Bei halbem Tag Urlaub werden die Urlaubsstunden später in der Überstunden-Berechnung hinzugezählt
// Wochenend-Prozentsätze: Nur auf tatsächlich gearbeitete Stunden anwenden (nicht auf Urlaub, Krankheit, Feiertage)
let hoursToAdd = 0;
if (isHoliday) {
hoursToAdd = fullDayHours + (hours || 0); // (Wochenarbeitszeit / Arbeitstage) Feiertag + gearbeitete Stunden (= Überstunden)
if (isWeekend) {
hoursToAdd = hours || 0; // Feiertag am Wochenende: keine Tagesarbeitsstunden
} else {
hoursToAdd = fullDayHours + (hours || 0); // (Wochenarbeitszeit / Arbeitstage) Feiertag + gearbeitete Stunden (= Überstunden)
}
} else {
hoursToAdd = hours || 0;
// Wochenend-Prozentsatz anwenden (nur wenn weekend_travel aktiviert UND es ist ein Wochenendtag)
@@ -488,6 +493,9 @@ function renderWeek() {
}
} else if (isSick) {
hoursDisplay = fullDayHours.toFixed(2) + ' h (Krank)';
} else if (isHoliday && isWeekend) {
// Feiertag am Wochenende: keine Tagesarbeitsstunden
hoursDisplay = (hours ? hours.toFixed(2) : '0') + ' h (Feiertag)';
} else if (isHoliday && !hours) {
hoursDisplay = fullDayHours.toFixed(2) + ' h (Feiertag)';
} else if (isHoliday && hours) {
@@ -818,7 +826,9 @@ function updateOvertimeDisplay() {
} else if (sickStatus) {
totalHours += fullDayHours; // Krank = (Wochenarbeitszeit / Arbeitstage) Stunden
} else if (currentHolidayDates.has(dateStr)) {
// Feiertag: (Wochenarbeitszeit / Arbeitstage) Basis + gearbeitete Stunden (jede Stunde = Überstunde)
// Feiertag: Werktag = Basis + gearbeitete Stunden; Wochenende = nur gearbeitete Stunden (keine Tagesarbeitsstunden)
const dayOfWeek = date.getDay();
const isWeekendHoliday = (dayOfWeek === 6 || dayOfWeek === 0);
const startInput = document.querySelector(`input[data-date="${dateStr}"][data-field="start_time"]`);
const endInput = document.querySelector(`input[data-date="${dateStr}"][data-field="end_time"]`);
const startTime = startInput ? startInput.value : '';
@@ -833,7 +843,11 @@ function updateOvertimeDisplay() {
} else if (currentEntries[dateStr]?.total_hours) {
worked = parseFloat(currentEntries[dateStr].total_hours) || 0;
}
totalHours += fullDayHours + worked; // (Wochenarbeitszeit / Arbeitstage) Feiertag + gearbeitete Stunden (= Überstunden)
if (isWeekendHoliday) {
totalHours += worked; // Feiertag am Wochenende: keine Tagesarbeitsstunden
} else {
totalHours += fullDayHours + worked; // (Wochenarbeitszeit / Arbeitstage) Feiertag + gearbeitete Stunden (= Überstunden)
}
} else {
// Wenn 8 Überstunden (ganzer Tag) eingetragen sind, zählt der Tag als 0 Stunden
if (isFullDayOvertime) {
@@ -922,7 +936,8 @@ function updateOvertimeDisplay() {
const totalHoursWithVacation = totalHours + vacationHours;
const adjustedSollStunden = sollStunden - (fullDayOvertimeDays * fullDayHours);
// overtimeHours = Überstunden diese Woche (wie im Backend berechnet)
const overtimeHours = totalHoursWithVacation - adjustedSollStunden;
// Genommene Überstunden werden abgezogen, um die Netto-Überstunden zu erhalten
const overtimeHours = totalHoursWithVacation - adjustedSollStunden - overtimeTaken;
// Überstunden-Anzeige aktualisieren
const overtimeSummaryItem = document.getElementById('overtimeSummaryItem');
@@ -1206,8 +1221,12 @@ async function saveEntry(input) {
currentEntries[date].total_hours = totalHours;
} else {
// Zurück zu normaler Anzeige basierend auf anderen Status
const d = new Date(date);
const isWeekendHoliday = isHoliday && (d.getDay() === 6 || d.getDay() === 0);
if (isSick) {
hoursElement.textContent = fullDayHours.toFixed(2) + ' h (Krank)';
} else if (isWeekendHoliday) {
hoursElement.textContent = (hours ? hours.toFixed(2) : '0') + ' h (Feiertag)';
} else if (isHoliday && !hours) {
hoursElement.textContent = fullDayHours.toFixed(2) + ' h (Feiertag)';
} else if (isHoliday && hours) {
@@ -1369,11 +1388,17 @@ async function saveEntry(input) {
currentEntries[date].total_hours = totalHours;
} else if (isSick) {
hoursText = fullDayHours.toFixed(2) + ' h (Krank)';
} else if (isHoliday && result.total_hours <= fullDayHours) {
hoursText = fullDayHours.toFixed(2) + ' h (Feiertag)';
} else if (isHoliday && result.total_hours > fullDayHours) {
const overtime = result.total_hours - fullDayHours;
hoursText = fullDayHours.toFixed(2) + ' + ' + overtime.toFixed(2) + ' h (Überst.)';
} else if (isHoliday) {
const d = new Date(date);
const isWeekendHoliday = (d.getDay() === 6 || d.getDay() === 0);
if (isWeekendHoliday) {
hoursText = (result.total_hours || 0).toFixed(2) + ' h (Feiertag)';
} else if (result.total_hours <= fullDayHours) {
hoursText = fullDayHours.toFixed(2) + ' h (Feiertag)';
} else {
const overtime = result.total_hours - fullDayHours;
hoursText = fullDayHours.toFixed(2) + ' + ' + overtime.toFixed(2) + ' h (Überst.)';
}
}
hoursElement.textContent = hoursText;
@@ -1973,8 +1998,12 @@ function toggleSickStatus(dateStr) {
currentEntries[dateStr].total_hours = fullDayHours;
} else {
// Zurück zu normaler Anzeige basierend auf anderen Status
const d = new Date(dateStr);
const isWeekendHoliday = isHoliday && (d.getDay() === 6 || d.getDay() === 0);
if (isFullDayVacation) {
hoursElement.textContent = fullDayHours.toFixed(2) + ' h (Urlaub)';
} else if (isWeekendHoliday) {
hoursElement.textContent = (hours ? hours.toFixed(2) : '0') + ' h (Feiertag)';
} else if (isHoliday && !hours) {
hoursElement.textContent = fullDayHours.toFixed(2) + ' h (Feiertag)';
} else if (isHoliday && hours) {