132 lines
4.3 KiB
JavaScript
132 lines
4.3 KiB
JavaScript
// Helper-Funktionen für das Stundenerfassungs-System
|
|
|
|
// Helper: Prüft ob User eine bestimmte Rolle hat
|
|
function hasRole(req, role) {
|
|
if (!req.session.roles || !Array.isArray(req.session.roles)) {
|
|
return false;
|
|
}
|
|
return req.session.roles.includes(role);
|
|
}
|
|
|
|
// Helper: Bestimmt die Standard-Rolle (höchste Priorität: admin > verwaltung > mitarbeiter)
|
|
function getDefaultRole(roles) {
|
|
if (!Array.isArray(roles) || roles.length === 0) {
|
|
return 'mitarbeiter';
|
|
}
|
|
if (roles.includes('admin')) return 'admin';
|
|
if (roles.includes('verwaltung')) return 'verwaltung';
|
|
return roles[0]; // Fallback auf erste Rolle
|
|
}
|
|
|
|
// Helper: Gibt aktuelles Datum als YYYY-MM-DD zurück
|
|
function getCurrentDate() {
|
|
const now = new Date();
|
|
const year = now.getFullYear();
|
|
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
const day = String(now.getDate()).padStart(2, '0');
|
|
return `${year}-${month}-${day}`;
|
|
}
|
|
|
|
// Helper: Gibt aktuelle Zeit als HH:MM zurück
|
|
function getCurrentTime() {
|
|
const now = new Date();
|
|
const hours = String(now.getHours()).padStart(2, '0');
|
|
const minutes = String(now.getMinutes()).padStart(2, '0');
|
|
return `${hours}:${minutes}`;
|
|
}
|
|
|
|
// Helper: Berechnet Pausenzeit in Minuten zwischen zwei Zeiten
|
|
function calculateBreakMinutes(pauseStart, pauseEnd) {
|
|
if (!pauseStart || !pauseEnd) return 0;
|
|
|
|
const [startHours, startMinutes] = pauseStart.split(':').map(Number);
|
|
const [endHours, endMinutes] = pauseEnd.split(':').map(Number);
|
|
|
|
const startTotalMinutes = startHours * 60 + startMinutes;
|
|
const endTotalMinutes = endHours * 60 + endMinutes;
|
|
|
|
return endTotalMinutes - startTotalMinutes;
|
|
}
|
|
|
|
// Helper: Berechnet total_hours basierend auf start_time, end_time und break_minutes
|
|
function updateTotalHours(startTime, endTime, breakMinutes) {
|
|
if (!startTime || !endTime) return 0;
|
|
|
|
const [startHours, startMinutes] = startTime.split(':').map(Number);
|
|
const [endHours, endMinutes] = endTime.split(':').map(Number);
|
|
|
|
const startTotalMinutes = startHours * 60 + startMinutes;
|
|
const endTotalMinutes = endHours * 60 + endMinutes;
|
|
|
|
const totalMinutes = endTotalMinutes - startTotalMinutes - (breakMinutes || 0);
|
|
return totalMinutes / 60; // Konvertiere zu Stunden
|
|
}
|
|
|
|
// Helper: Formatiert Datum für Anzeige (DD.MM.YYYY)
|
|
function formatDate(dateStr) {
|
|
const date = new Date(dateStr);
|
|
return date.toLocaleDateString('de-DE');
|
|
}
|
|
|
|
// Helper: Formatiert Datum und Zeit für Anzeige
|
|
function formatDateTime(dateStr) {
|
|
const date = new Date(dateStr);
|
|
return date.toLocaleString('de-DE');
|
|
}
|
|
|
|
// Helper: Berechnet Kalenderwoche aus einem Datum (ISO 8601)
|
|
function getCalendarWeek(dateStr) {
|
|
const date = new Date(dateStr);
|
|
const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
|
|
const dayNum = d.getUTCDay() || 7;
|
|
d.setUTCDate(d.getUTCDate() + 4 - dayNum);
|
|
const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
|
|
const weekNo = Math.ceil((((d - yearStart) / 86400000) + 1) / 7);
|
|
return weekNo;
|
|
}
|
|
|
|
// Helper: Berechnet week_start (Montag) und week_end (Sonntag) aus Jahr und Kalenderwoche (ISO 8601)
|
|
function getWeekDatesFromCalendarWeek(year, weekNumber) {
|
|
// ISO 8601: Woche beginnt am Montag, erste Woche enthält den 4. Januar
|
|
const jan4 = new Date(Date.UTC(year, 0, 4));
|
|
const jan4Day = jan4.getUTCDay() || 7; // 1 = Montag, 7 = Sonntag
|
|
const daysToMonday = jan4Day === 1 ? 0 : 1 - jan4Day;
|
|
|
|
// Montag der ersten Woche
|
|
const firstMonday = new Date(Date.UTC(year, 0, 4 + daysToMonday));
|
|
|
|
// Montag der gewünschten Woche (Woche 1 = erste Woche)
|
|
const weekMonday = new Date(firstMonday);
|
|
weekMonday.setUTCDate(firstMonday.getUTCDate() + (weekNumber - 1) * 7);
|
|
|
|
// Sonntag der Woche (6 Tage nach Montag)
|
|
const weekSunday = new Date(weekMonday);
|
|
weekSunday.setUTCDate(weekMonday.getUTCDate() + 6);
|
|
|
|
// Format: YYYY-MM-DD
|
|
const formatDate = (date) => {
|
|
const y = date.getUTCFullYear();
|
|
const m = String(date.getUTCMonth() + 1).padStart(2, '0');
|
|
const d = String(date.getUTCDate()).padStart(2, '0');
|
|
return `${y}-${m}-${d}`;
|
|
};
|
|
|
|
return {
|
|
week_start: formatDate(weekMonday),
|
|
week_end: formatDate(weekSunday)
|
|
};
|
|
}
|
|
|
|
module.exports = {
|
|
hasRole,
|
|
getDefaultRole,
|
|
getCurrentDate,
|
|
getCurrentTime,
|
|
calculateBreakMinutes,
|
|
updateTotalHours,
|
|
formatDate,
|
|
formatDateTime,
|
|
getCalendarWeek,
|
|
getWeekDatesFromCalendarWeek
|
|
};
|