diff --git a/app/static/app/js/dbcontrol.js b/app/static/app/js/dbcontrol.js index 99814e4..5789c80 100644 --- a/app/static/app/js/dbcontrol.js +++ b/app/static/app/js/dbcontrol.js @@ -408,4 +408,43 @@ function sumDurations(data, type = null, roundToHalfHour = false) { } return totalDuration; +} + +// Gesamtstunden (in Minuten) für ein Dienstjahr berechnen, optional mit "55h-Regel". +// Wenn rule55Active true ist: jeder Kalendermonat, der LDC- oder Sonstiges-Stunden (type 2/3) +// enthält, wird für die Summe auf maximal 55h gedeckelt. Reine Dienststunden (type 1) zählen +// in jedem Monat immer voll, auch wenn sie allein schon über 55h liegen - der Deckel greift +// nur, sobald LDC/Sonstiges dazukommt. +function calculateServiceYearTotal(entries, rule55Active = false) { + if (!rule55Active) { + return sumDurations(entries, null, true); + } + + const CAP_MINUTES = 55 * 60; + + // Einträge nach Kalendermonat gruppieren (Jahr+Monat, damit Dez/Jan nicht vermischt werden) + const monthBuckets = {}; + entries.forEach(entry => { + const entryDate = new Date(entry.date); + const key = `${entryDate.getFullYear()}-${entryDate.getMonth()}`; + if (!monthBuckets[key]) { + monthBuckets[key] = []; + } + monthBuckets[key].push(entry); + }); + + let total = 0; + Object.values(monthBuckets).forEach(bucketEntries => { + const normalMinutes = sumDurations(bucketEntries, 1); + const capRuleMinutes = sumDurations(bucketEntries, 2) + sumDurations(bucketEntries, 3); + let monthTotal = normalMinutes + capRuleMinutes; + + if (capRuleMinutes > 0) { + monthTotal = Math.min(monthTotal, CAP_MINUTES); + } + + total += Math.round(monthTotal / 30) * 30; + }); + + return total; } \ No newline at end of file diff --git a/app/static/app/js/home01.js b/app/static/app/js/home01.js index df77087..d06a10b 100644 --- a/app/static/app/js/home01.js +++ b/app/static/app/js/home01.js @@ -4,10 +4,15 @@ const mins = document.getElementById('minuten'); const NewEntryButton = document.getElementById('newEntrySubmitButton') const SETStudySaveButton = document.getElementById('SETStudySaveButton') const SETMonthGoalSaveButton = document.getElementById('SETMonthGoalSaveButton') +const rule55hCheck = document.getElementById('rule55hCheck') var allowToSend = false; const monate = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]; const currentDate = new Date(); +// 55h-Regel (Jahresansicht): wird beim Start aus den Settings geladen und beim Umschalten +// live aktualisiert, damit getActualDataAndFillView() sie synchron verwenden kann. +var rule55Active = false; + // // Trigger @@ -15,19 +20,62 @@ const currentDate = new Date(); // Wenn das Dokument komplett geladen ist document.addEventListener('DOMContentLoaded', (event) => { - initDB().then(() => { + initDB().then(async () => { console.log('IndexedDB erfolgreich initialisiert.'); // Hier kannst du die App weiter initialisieren, z.B. Daten laden oder die UI aufbauen + // 55h-Regel Einstellung laden, bevor die erste Jahresansicht berechnet wird + await loadRule55Setting(); + // Bildschirm mit dem Inhalt für den aktuellen Tag füllen getActualDataAndFillView(); - + //loadInitialData(); }).catch((error) => { console.error('Fehler bei der Initialisierung der IndexedDB:', error); }); }); +// Lädt die 55h-Regel Einstellung (SettingsID 3) aus der DB, setzt rule55Active +// und synchronisiert die Checkbox sowie den Badge in der Jahres-Card. +async function loadRule55Setting() { + const result = await getAllEntries('settings') + const setting = result.find(element => element.SettingsID === 3) + rule55Active = (setting == undefined) ? false : !!parseInt(setting.SettingsValue) + rule55hCheck.checked = rule55Active + updateRule55Badge() +} + +// Zeigt/versteckt den "55h-Regel aktiv"-Hinweis an der Jahres-Card +function updateRule55Badge() { + document.getElementById('rule55Badge').classList.toggle('d-none', !rule55Active) +} + +// Einstellungen wenn die 55h-Regel umgeschaltet wird +rule55hCheck.addEventListener('change', () => { + rule55Active = rule55hCheck.checked + updateRule55Badge() + + const Rule55SettingsData = { + SettingsID: 3, + SettingsValue: rule55Active ? 1 : 0, + } + + getAllEntries('settings') + .then(function(result) { + const SETDBData = result.find(element => element.SettingsID === 3) + + if (SETDBData != undefined) { + updateEntry(SETDBData.id, 'settings', Rule55SettingsData) + } else { + addEntry(Rule55SettingsData, 'settings') + } + + // Jahresansicht mit/ohne Deckel neu berechnen + getActualDataAndFillView(cursorMonth, cursorYear) + }) +}) + // Änderungen überwachen damit die das Formular nicht zu früh abgesendet wird @@ -216,12 +264,15 @@ async function getActualDataAndFillView(monat = currentDate.getMonth(), jahr = c document.getElementById('monthHourOther').innerText = formatDuration(sumDurations(filteredEntries,3,true), true) // Jahres Ansicht füllen (Dienstjahr, gekoppelt an den gerade angezeigten Monat/Jahr) + // Bei aktiver 55h-Regel wird jeder Monat mit LDC/Sonstiges-Anteil auf max. 55h gedeckelt, + // reine Dienststunden zählen dabei immer voll (siehe calculateServiceYearTotal). var requestServiceYear = getServiceYear(new Date(jahr, monat, 1)); - var yearData = await filterEntriesByServiceYear(requestServiceYear) - yearData = formatDuration(sumDurations(yearData, null, true), true) + var yearEntries = await filterEntriesByServiceYear(requestServiceYear) + var yearData = formatDuration(calculateServiceYearTotal(yearEntries, rule55Active), true) document.getElementById('yearHours').innerText = yearData document.getElementById('yearRest').innerText = 600 - parseInt(yearData) document.getElementById('prBarYear').style.width = `${Math.round((100/600)*parseInt(yearData))}%` + updateRule55Badge() } catch (error) { console.error('Fehler bei der Initialisierung oder Filterung:', error); diff --git a/app/templates/app/base.html b/app/templates/app/base.html index 1a8fade..d0fe66e 100644 --- a/app/templates/app/base.html +++ b/app/templates/app/base.html @@ -44,6 +44,10 @@ +
  • + 55h-Regel (Jahr): + +
  • Kontakt
  • WhatsApp Community diff --git a/app/templates/app/home.html b/app/templates/app/home.html index abe4f4d..d2cc2ba 100644 --- a/app/templates/app/home.html +++ b/app/templates/app/home.html @@ -45,7 +45,7 @@
    -

    Jahr: h/600h

    +

    Jahr: h/600h55h

    Offen: h