From a1c4770de8457732ddc8875ba11be367efd01384 Mon Sep 17 00:00:00 2001 From: Carsten Graf Date: Wed, 25 Feb 2026 00:59:45 +0100 Subject: [PATCH] Umstellung Auf h:mm in verwaltung --- public/js/format-hours.js | 60 +++++++++++++++++++++++++++++++++++++++ views/verwaltung.ejs | 35 +++++++++++++---------- 2 files changed, 80 insertions(+), 15 deletions(-) diff --git a/public/js/format-hours.js b/public/js/format-hours.js index 31d73b9..0cf7823 100644 --- a/public/js/format-hours.js +++ b/public/js/format-hours.js @@ -15,5 +15,65 @@ var prefix = sign < 0 ? '-' : ''; return prefix + h + 'h ' + min + 'min'; } + + /** Dezimalstunden in h:mm (z. B. 1.5 -> "1:30", -0.75 -> "-0:45") */ + function decimalHoursToHhMm(decimalHours) { + if (decimalHours == null || !Number.isFinite(Number(decimalHours))) return '0:00'; + var n = Number(decimalHours); + var sign = n < 0 ? -1 : 1; + var absVal = Math.abs(n); + var h = Math.floor(absVal); + var min = Math.round((absVal - h) * 60); + if (min >= 60) { + h += 1; + min = 0; + } + var prefix = sign < 0 ? '-' : ''; + return prefix + h + ':' + String(min).padStart(2, '0'); + } + + /** + * Parst h:mm oder Xh Ymin zu Dezimalstunden. + * Beispiele: "1:30" -> 1.5, "-0:45" -> -0.75, "1h 30min" -> 1.5. + * @returns {number|null} Dezimalstunden oder null bei ungültiger Eingabe + */ + function parseHoursMin(str) { + if (str == null) return null; + var s = String(str).trim(); + if (s === '') return 0; + var sign = 1; + if (s.charAt(0) === '-') { + sign = -1; + s = s.slice(1).trim(); + } else if (s.charAt(0) === '+') { + s = s.slice(1).trim(); + } + // h:mm oder h:mm:ss + var colonMatch = s.match(/^(\d+):(\d{1,2})(?::(\d{1,2}))?$/); + if (colonMatch) { + var hours = parseInt(colonMatch[1], 10); + var minutes = parseInt(colonMatch[2], 10); + if (minutes >= 60) return null; + var sec = colonMatch[3] != null ? parseInt(colonMatch[3], 10) : 0; + if (sec >= 60) return null; + var decimal = hours + minutes / 60 + sec / 3600; + return sign * decimal; + } + // Xh Ymin (optional Leerzeichen) + var hmMatch = s.match(/^(\d+)\s*h\s*(\d{1,2})?\s*min$/i); + if (hmMatch) { + var h = parseInt(hmMatch[1], 10); + var m = (hmMatch[2] != null) ? parseInt(hmMatch[2], 10) : 0; + if (m >= 60) return null; + return sign * (h + m / 60); + } + // Nur Zahl (Dezimalstunden) zulassen als Fallback + var num = parseFloat(s.replace(',', '.')); + if (!Number.isFinite(num)) return null; + return sign * num; + } + window.formatHoursMin = formatHoursMin; + window.decimalHoursToHhMm = decimalHoursToHhMm; + window.parseHoursMin = parseHoursMin; })(); diff --git a/views/verwaltung.ejs b/views/verwaltung.ejs index 8790ca2..3ee1559 100644 --- a/views/verwaltung.ejs +++ b/views/verwaltung.ejs @@ -99,13 +99,13 @@
Überstunden-Korrektur: + value="0:00" + placeholder="z. B. 1:30, 10:30 oder -0:45" + style="width: 110px; padding: 4px 6px; border: 1px solid #ddd; border-radius: 4px;" + title="Korrektur in h:mm (z. B. 1:30, 10:30 oder -0:45). Nach dem Speichern wird das Feld auf 0:00 gesetzt." />