Refactor SQL scripts for index creation in sick and vacation tables; implement checks to prevent duplicate index creation and streamline execution process. Update TimeEntryService to remove obsolete overtime calculation method for cleaner code.

This commit is contained in:
Torsten Schulz (local)
2025-10-20 08:34:27 +02:00
parent 44fb9a0bdd
commit e7c2d54468
4 changed files with 80 additions and 13 deletions

View File

@@ -1,11 +1,23 @@
-- SQL Script: Index zur sick-Tabelle hinzufügen -- SQL Script: Index zur sick-Tabelle hinzufügen
-- Verbessert die Performance beim Abrufen von Krankheitseinträgen -- Verbessert die Performance beim Abrufen von Krankheitseinträgen
-- Ausführen mit: mysql -u root -p stechuhr < add-sick-index.sql -- Ausführen mit: mysql -u root -p timeclock < add-sick-index.sql
USE stechuhr;
-- Index für user_id und first_day (für effiziente Abfragen nach User und Datum) -- Index für user_id und first_day (für effiziente Abfragen nach User und Datum)
CREATE INDEX IF NOT EXISTS idx_sick_user_first_day ON sick (user_id, first_day DESC); -- Prüfe zuerst ob der Index bereits existiert
SELECT COUNT(*) INTO @index_exists
FROM information_schema.statistics
WHERE table_schema = DATABASE()
AND table_name = 'sick'
AND index_name = 'idx_sick_user_first_day';
SELECT 'Index idx_sick_user_first_day erfolgreich erstellt oder bereits vorhanden.' AS status; SET @sql = IF(@index_exists = 0,
'CREATE INDEX idx_sick_user_first_day ON sick (user_id, first_day DESC)',
'SELECT "Index idx_sick_user_first_day existiert bereits" AS Info'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT 'Index idx_sick_user_first_day erfolgreich erstellt oder bereits vorhanden.' AS Status;

View File

@@ -1,9 +1,22 @@
-- Füge Index für vacation Tabelle hinzu -- Füge Index für vacation Tabelle hinzu
-- Optimiert die Abfrage: WHERE user_id = ? AND first_day >= ? ORDER BY first_day DESC -- Optimiert die Abfrage: WHERE user_id = ? AND first_day >= ? ORDER BY first_day DESC
-- Ausführen mit: mysql -u root -p timeclock < add-vacation-index.sql
CREATE INDEX idx_vacation_user_first_day -- Prüfe zuerst ob der Index bereits existiert
ON vacation (user_id, first_day DESC); SELECT COUNT(*) INTO @index_exists
FROM information_schema.statistics
WHERE table_schema = DATABASE()
AND table_name = 'vacation'
AND index_name = 'idx_vacation_user_first_day';
-- Prüfe ob der Index erstellt wurde SET @sql = IF(@index_exists = 0,
SHOW INDEX FROM vacation WHERE Key_name = 'idx_vacation_user_first_day'; 'CREATE INDEX idx_vacation_user_first_day ON vacation (user_id, first_day DESC)',
'SELECT "Index idx_vacation_user_first_day existiert bereits" AS Info'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT 'Index idx_vacation_user_first_day erfolgreich erstellt oder bereits vorhanden.' AS Status;

View File

@@ -0,0 +1,46 @@
-- Overtime Offset anpassen
-- Ziel: Überstunden von 95h auf 3h reduzieren
-- Datum: 2025-10-20
-- Aktuellen Wert anzeigen
SELECT
id,
full_name,
overtime_offset_minutes as 'Aktueller Offset (Minuten)',
CONCAT(
IF(overtime_offset_minutes >= 0, '+', '-'),
FLOOR(ABS(overtime_offset_minutes) / 60),
':',
LPAD(ABS(overtime_offset_minutes) % 60, 2, '0')
) as 'Aktueller Offset (formatiert)'
FROM user
WHERE id = 1;
-- Berechnung:
-- Aktuell: +95h Überstunden (mit Offset +5620 min)
-- Gewünscht: +3h Überstunden
-- Differenz: 95 - 3 = 92h = 5520 min
-- Neuer Offset: 5620 - 5520 = 100 min = +1:40h
-- Setze neuen Offset
UPDATE user
SET overtime_offset_minutes = 100
WHERE id = 1;
-- Neuen Wert anzeigen
SELECT
id,
full_name,
overtime_offset_minutes as 'Neuer Offset (Minuten)',
CONCAT(
IF(overtime_offset_minutes >= 0, '+', '-'),
FLOOR(ABS(overtime_offset_minutes) / 60),
':',
LPAD(ABS(overtime_offset_minutes) % 60, 2, '0')
) as 'Neuer Offset (formatiert)'
FROM user
WHERE id = 1;
SELECT 'Overtime Offset erfolgreich auf +1:40h gesetzt!' AS Status;
SELECT 'Überstunden sollten jetzt ca. +3h anzeigen (nach Reload)' AS Hinweis;

View File

@@ -462,9 +462,6 @@ class TimeEntryService {
// Neue Berechnung: Timewish-basiert // Neue Berechnung: Timewish-basiert
const totalOvertimeResult = await this._calculateTotalOvertime(uid, runningEntry); const totalOvertimeResult = await this._calculateTotalOvertime(uid, runningEntry);
// Alte Berechnung: weekly_worktime-basiert (zum Vergleich)
const totalOvertimeOldStyleResult = await this._calculateTotalOvertimeOldStyle(uid, runningEntry);
// Berechne Überstunden für die aktuelle Woche // Berechne Überstunden für die aktuelle Woche
const weekData = await this.getWeekOverview(uid, 0); const weekData = await this.getWeekOverview(uid, 0);
@@ -783,7 +780,6 @@ class TimeEntryService {
regularEnd: null, regularEnd: null,
overtime: overtime, // Überstunden für die aktuelle Woche overtime: overtime, // Überstunden für die aktuelle Woche
totalOvertime: totalOvertimeResult.formatted, // Überstunden über den gesamten Zeitraum (timewish-basiert) totalOvertime: totalOvertimeResult.formatted, // Überstunden über den gesamten Zeitraum (timewish-basiert)
totalOvertimeOldStyle: totalOvertimeOldStyleResult.formatted, // Überstunden (weekly_worktime-basiert, zum Vergleich)
weekWorktime: weekWorktime, weekWorktime: weekWorktime,
nonWorkingHours: nonWorkingHoursFormatted, nonWorkingHours: nonWorkingHoursFormatted,
openForWeek: openForWeekFormatted, openForWeek: openForWeekFormatted,