diff --git a/app.js b/app.js index d038743..8600466 100644 --- a/app.js +++ b/app.js @@ -792,7 +792,8 @@ function feriefridageRemainingAfterApprovedPlans(settings, entries, today, balan function allocateDay(entry, date, balances, settings, fraction = 1) { const source = entry.source; const allowUnpaid = Boolean(Number(entry.allow_unpaid)); - const dayHours = hoursForDate(date, settings) * fraction; + const baseDayHours = hoursForDate(date, settings); + const dayHours = baseDayHours * fraction; let { vacationBalance, feriefridageBalance, flexBalance } = balances; const result = { usedVacation: 0, usedFeriefridage: 0, usedFlex: 0, usedFlexDays: 0, usedUnpaid: 0 }; @@ -824,8 +825,8 @@ function allocateDay(entry, date, balances, settings, fraction = 1) { if (allowUnpaid && flexBalance < dayHours) { const useHours = Math.max(0, flexBalance); result.usedFlex += useHours; - result.usedFlexDays += useHours / hoursForDate(date, settings); - result.usedUnpaid += fraction - (useHours / hoursForDate(date, settings)); + result.usedFlexDays += useHours / baseDayHours; + result.usedUnpaid += fraction - (useHours / baseDayHours); flexBalance = 0; } else { result.usedFlex += dayHours; @@ -843,19 +844,37 @@ function allocateDay(entry, date, balances, settings, fraction = 1) { } else if (source === 'flex') { useFlex(); } else { - if (feriefridageBalance >= fraction && isBeforeFeriefridageExpiry(date, settings)) { - useFeriefridag(); - } else if (vacationBalance >= fraction) { - useVacation(); - } else if (flexBalance >= dayHours) { - useFlex(); - } else if (allowUnpaid) { - const use = Math.max(0, vacationBalance); + let remaining = fraction; + + if (remaining > 0 && feriefridageBalance > 0 && isBeforeFeriefridageExpiry(date, settings)) { + const use = Math.min(feriefridageBalance, remaining); + result.usedFeriefridage += use; + feriefridageBalance -= use; + remaining -= use; + } + + if (remaining > 0 && vacationBalance > 0) { + const use = Math.min(vacationBalance, remaining); result.usedVacation += use; - result.usedUnpaid += fraction - use; - vacationBalance = 0; - } else { - useVacation(); + vacationBalance -= use; + remaining -= use; + } + + if (remaining > 0 && flexBalance > 0) { + const use = Math.min(flexBalance / baseDayHours, remaining); + result.usedFlex += use * baseDayHours; + result.usedFlexDays += use; + flexBalance -= use * baseDayHours; + remaining -= use; + } + + if (remaining > 0) { + if (allowUnpaid) { + result.usedUnpaid += remaining; + } else { + result.usedVacation += remaining; + vacationBalance -= remaining; + } } }