BROKEN
This commit is contained in:
@@ -190,12 +190,12 @@ function registerTimesheetRoutes(app) {
|
||||
const { week_start, week_end, version_reason } = req.body;
|
||||
const userId = req.session.userId;
|
||||
|
||||
// Validierung: Prüfen ob alle 7 Tage der Woche ausgefüllt sind
|
||||
db.all(`SELECT id, date, start_time, end_time, vacation_type, sick_status, updated_at FROM timesheet_entries
|
||||
WHERE user_id = ? AND date >= ? AND date <= ?
|
||||
ORDER BY date, updated_at DESC, id DESC`,
|
||||
[userId, week_start, week_end],
|
||||
(err, entries) => {
|
||||
// Validierung: Prüfen ob alle 7 Tage der Woche ausgefüllt sind
|
||||
db.all(`SELECT id, date, start_time, end_time, vacation_type, sick_status, overtime_taken_hours, updated_at FROM timesheet_entries
|
||||
WHERE user_id = ? AND date >= ? AND date <= ?
|
||||
ORDER BY date, updated_at DESC, id DESC`,
|
||||
[userId, week_start, week_end],
|
||||
(err, entries) => {
|
||||
if (err) {
|
||||
return res.status(500).json({ error: 'Fehler beim Prüfen der Daten' });
|
||||
}
|
||||
@@ -221,81 +221,100 @@ function registerTimesheetRoutes(app) {
|
||||
// Prüfe nur Werktage (Montag-Freitag, erste 5 Tage)
|
||||
// Samstag und Sonntag sind optional
|
||||
// Bei ganztägigem Urlaub (vacation_type = 'full') ist der Tag als ausgefüllt zu betrachten
|
||||
// Bei 8 Überstunden (ganzer Tag) ist der Tag auch als ausgefüllt zu betrachten
|
||||
// week_start ist bereits im Format YYYY-MM-DD
|
||||
const startDateParts = week_start.split('-');
|
||||
const startYear = parseInt(startDateParts[0]);
|
||||
const startMonth = parseInt(startDateParts[1]) - 1; // Monat ist 0-basiert
|
||||
const startDay = parseInt(startDateParts[2]);
|
||||
|
||||
let missingDays = [];
|
||||
|
||||
for (let i = 0; i < 5; i++) {
|
||||
// Datum direkt berechnen ohne Zeitzonenprobleme
|
||||
const date = new Date(startYear, startMonth, startDay + i);
|
||||
const year = date.getFullYear();
|
||||
const month = String(date.getMonth() + 1).padStart(2, '0');
|
||||
const day = String(date.getDate()).padStart(2, '0');
|
||||
const dateStr = `${year}-${month}-${day}`;
|
||||
const entry = entriesByDate[dateStr];
|
||||
|
||||
// Wenn ganztägiger Urlaub oder Krank, dann ist der Tag als ausgefüllt zu betrachten
|
||||
const isSick = entry && (entry.sick_status === 1 || entry.sick_status === true);
|
||||
if (entry && (entry.vacation_type === 'full' || isSick)) {
|
||||
continue; // Tag ist ausgefüllt
|
||||
// User-Daten laden für Überstunden-Berechnung
|
||||
db.get('SELECT wochenstunden FROM users WHERE id = ?', [userId], (err, user) => {
|
||||
if (err) {
|
||||
return res.status(500).json({ error: 'Fehler beim Laden der User-Daten' });
|
||||
}
|
||||
|
||||
// Bei halbem Tag Urlaub oder keinem Urlaub müssen Start- und Endzeit vorhanden sein
|
||||
// start_time und end_time könnten null, undefined oder leer strings sein
|
||||
const hasStartTime = entry && entry.start_time && entry.start_time.toString().trim() !== '';
|
||||
const hasEndTime = entry && entry.end_time && entry.end_time.toString().trim() !== '';
|
||||
const wochenstunden = user?.wochenstunden || 0;
|
||||
const fullDayHours = wochenstunden > 0 ? wochenstunden / 5 : 8;
|
||||
|
||||
if (!entry || !hasStartTime || !hasEndTime) {
|
||||
missingDays.push(dateStr);
|
||||
}
|
||||
}
|
||||
|
||||
if (missingDays.length > 0) {
|
||||
return res.status(400).json({
|
||||
error: `Nicht alle Werktage (Montag bis Freitag) sind ausgefüllt. Fehlende Tage: ${missingDays.join(', ')}. Bitte füllen Sie alle Werktage mit Start- und Endzeit aus. Wochenende ist optional.`
|
||||
});
|
||||
}
|
||||
|
||||
// Alle Tage ausgefüllt - Woche abschicken (immer neue Version erstellen)
|
||||
// Prüfe welche Version die letzte ist
|
||||
db.get(`SELECT MAX(version) as max_version FROM weekly_timesheets
|
||||
WHERE user_id = ? AND week_start = ? AND week_end = ?`,
|
||||
[userId, week_start, week_end],
|
||||
(err, result) => {
|
||||
if (err) return res.status(500).json({ error: 'Fehler beim Prüfen der Version' });
|
||||
let missingDays = [];
|
||||
|
||||
for (let i = 0; i < 5; i++) {
|
||||
// Datum direkt berechnen ohne Zeitzonenprobleme
|
||||
const date = new Date(startYear, startMonth, startDay + i);
|
||||
const year = date.getFullYear();
|
||||
const month = String(date.getMonth() + 1).padStart(2, '0');
|
||||
const day = String(date.getDate()).padStart(2, '0');
|
||||
const dateStr = `${year}-${month}-${day}`;
|
||||
const entry = entriesByDate[dateStr];
|
||||
|
||||
const maxVersion = result && result.max_version ? result.max_version : 0;
|
||||
const newVersion = maxVersion + 1;
|
||||
|
||||
// Wenn bereits eine Version existiert, ist version_reason erforderlich
|
||||
if (maxVersion > 0 && (!version_reason || version_reason.trim() === '')) {
|
||||
return res.status(400).json({
|
||||
error: 'Bitte geben Sie einen Grund für die neue Version an.'
|
||||
});
|
||||
// Wenn ganztägiger Urlaub oder Krank, dann ist der Tag als ausgefüllt zu betrachten
|
||||
const isSick = entry && (entry.sick_status === 1 || entry.sick_status === true);
|
||||
if (entry && (entry.vacation_type === 'full' || isSick)) {
|
||||
continue; // Tag ist ausgefüllt
|
||||
}
|
||||
|
||||
// Neue Version erstellen (nicht überschreiben)
|
||||
db.run(`INSERT INTO weekly_timesheets (user_id, week_start, week_end, version, status, version_reason)
|
||||
VALUES (?, ?, ?, ?, 'eingereicht', ?)`,
|
||||
[userId, week_start, week_end, newVersion, version_reason ? version_reason.trim() : null],
|
||||
(err) => {
|
||||
if (err) return res.status(500).json({ error: 'Fehler beim Abschicken' });
|
||||
|
||||
// Status der Einträge aktualisieren (optional - für Nachverfolgung)
|
||||
db.run(`UPDATE timesheet_entries
|
||||
SET status = 'eingereicht'
|
||||
WHERE user_id = ? AND date >= ? AND date <= ?`,
|
||||
[userId, week_start, week_end],
|
||||
(err) => {
|
||||
if (err) return res.status(500).json({ error: 'Fehler beim Aktualisieren des Status' });
|
||||
res.json({ success: true, version: newVersion });
|
||||
});
|
||||
});
|
||||
});
|
||||
// Prüfe ob 8 Überstunden (ganzer Tag) eingetragen sind
|
||||
const overtimeValue = entry && entry.overtime_taken_hours ? parseFloat(entry.overtime_taken_hours) : 0;
|
||||
const isFullDayOvertime = overtimeValue > 0 && Math.abs(overtimeValue - fullDayHours) < 0.01;
|
||||
|
||||
if (isFullDayOvertime) {
|
||||
continue; // Tag ist ausgefüllt (8 Überstunden = ganzer Tag)
|
||||
}
|
||||
|
||||
// Bei halbem Tag Urlaub oder keinem Urlaub müssen Start- und Endzeit vorhanden sein
|
||||
// start_time und end_time könnten null, undefined oder leer strings sein
|
||||
const hasStartTime = entry && entry.start_time && entry.start_time.toString().trim() !== '';
|
||||
const hasEndTime = entry && entry.end_time && entry.end_time.toString().trim() !== '';
|
||||
|
||||
if (!entry || !hasStartTime || !hasEndTime) {
|
||||
missingDays.push(dateStr);
|
||||
}
|
||||
}
|
||||
|
||||
if (missingDays.length > 0) {
|
||||
return res.status(400).json({
|
||||
error: `Nicht alle Werktage (Montag bis Freitag) sind ausgefüllt. Fehlende Tage: ${missingDays.join(', ')}. Bitte füllen Sie alle Werktage mit Start- und Endzeit aus. Wochenende ist optional.`
|
||||
});
|
||||
}
|
||||
|
||||
// Alle Tage ausgefüllt - Woche abschicken (immer neue Version erstellen)
|
||||
// Prüfe welche Version die letzte ist
|
||||
db.get(`SELECT MAX(version) as max_version FROM weekly_timesheets
|
||||
WHERE user_id = ? AND week_start = ? AND week_end = ?`,
|
||||
[userId, week_start, week_end],
|
||||
(err, result) => {
|
||||
if (err) return res.status(500).json({ error: 'Fehler beim Prüfen der Version' });
|
||||
|
||||
const maxVersion = result && result.max_version ? result.max_version : 0;
|
||||
const newVersion = maxVersion + 1;
|
||||
|
||||
// Wenn bereits eine Version existiert, ist version_reason erforderlich
|
||||
if (maxVersion > 0 && (!version_reason || version_reason.trim() === '')) {
|
||||
return res.status(400).json({
|
||||
error: 'Bitte geben Sie einen Grund für die neue Version an.'
|
||||
});
|
||||
}
|
||||
|
||||
// Neue Version erstellen (nicht überschreiben)
|
||||
db.run(`INSERT INTO weekly_timesheets (user_id, week_start, week_end, version, status, version_reason)
|
||||
VALUES (?, ?, ?, ?, 'eingereicht', ?)`,
|
||||
[userId, week_start, week_end, newVersion, version_reason ? version_reason.trim() : null],
|
||||
(err) => {
|
||||
if (err) return res.status(500).json({ error: 'Fehler beim Abschicken' });
|
||||
|
||||
// Status der Einträge aktualisieren (optional - für Nachverfolgung)
|
||||
db.run(`UPDATE timesheet_entries
|
||||
SET status = 'eingereicht'
|
||||
WHERE user_id = ? AND date >= ? AND date <= ?`,
|
||||
[userId, week_start, week_end],
|
||||
(err) => {
|
||||
if (err) return res.status(500).json({ error: 'Fehler beim Aktualisieren des Status' });
|
||||
res.json({ success: true, version: newVersion });
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user