How the Switzerland ferienanspruch calculator is verified

Inputs

InputFieldType
Days you work per weekdaysPerWeeknumber
Your ageagenumber
Full months of employment in this DienstjahrmonthsWorkednumber
Full months absent through your own faultmonthsAbsentOwnFaultnumber
Days already takendaysTakennumber

The formula

Each derived value below is computed by the Valem engine from the expression shown, in this order. Nothing else runs — there is no hidden code path.

Derived valueFieldFormula (JSONata)
Weeks EntitledweeksEntitled($n(age) < $const.ageThresholdYears ? $const.weeksUnderAgeThreshold : $const.baseWeeks)
Full Year DaysfullYearDaysweeksEntitled * $n(daysPerWeek)
Reduction DaysreductionDays($m := $floor($n(monthsAbsentOwnFault)); $m > $const.reductionGateMonths ? fullYearDays * $m / $const.monthsPerYear : 0)
Days EntitleddaysEntitled($m := $clampFloorCap($n(monthsWorked), 0, $const.monthsPerYear); $earned := fullYearDays * $m / $const.monthsPerYear; $round($clampFloorCap($earned - reductionDays, 0, fullYearDays), 1))
Days RemainingdaysRemaining($r := daysEntitled - $n(daysTaken); $r < 0 ? 0 : $round($r, 1))

Rates and thresholds

The expressions above read these as $const. They are the figures the annual refresh replaces, so they live as data rather than being written into the formulas — which is what makes a year-on-year change a one-line diff instead of an edit to arithmetic.

ConstantValue
baseWeeks4
weeksUnderAgeThreshold5
ageThresholdYears20
reductionGateMonths1
monthsPerYear12

Test vectors (11)

Every case is executed against this model on each build, by the Java engine and independently by a JavaScript one. A mismatch of a single cent fails the build, so the page cannot ship advertising a figure the model no longer produces.

Case 1 — N1 four weeks on a five-day week is 20 days

given daysPerWeek5
given age35
given monthsWorked12
given monthsAbsentOwnFault0
given daysTaken0
expect weeksEntitled4
expect fullYearDays20
expect daysEntitled20

Case 2 — N2 under twenty gets five weeks, so 25

given daysPerWeek5
given age19
given monthsWorked12
given monthsAbsentOwnFault0
given daysTaken0
expect weeksEntitled5
expect daysEntitled25

Case 3 — N3 the fifth week goes at the COMPLETED twentieth year, so 20 is on four weeks

given daysPerWeek5
given age20
given monthsWorked12
given monthsAbsentOwnFault0
given daysTaken0
expect weeksEntitled4
expect daysEntitled20

Case 4 — N4 half a Dienstjahr is half the leave

given daysPerWeek5
given age35
given monthsWorked6
given monthsAbsentOwnFault0
given daysTaken0
expect daysEntitled10

Case 5 — N5 one month of culpable absence is AT the gate, so no reduction

given daysPerWeek5
given age35
given monthsWorked12
given monthsAbsentOwnFault1
given daysTaken0
expect reductionDays0
expect daysEntitled20

Case 6 — N6 two months is above the gate, so two twelfths come off

given daysPerWeek5
given age35
given monthsWorked12
given monthsAbsentOwnFault2
given daysTaken0
expect reductionDays3.3333333333333335
expect daysEntitled16.7

Case 7 — N7 a long culpable absence never drives the entitlement below zero

given daysPerWeek5
given age35
given monthsWorked12
given monthsAbsentOwnFault12
given daysTaken0
expect daysEntitled0

Case 8 — N8 a six-day week gets 24 days out of the same four weeks

given daysPerWeek6
given age35
given monthsWorked12
given monthsAbsentOwnFault0
given daysTaken0
expect daysEntitled24

Case 9 — N9 no months in the Dienstjahr earns nothing

given daysPerWeek5
given age35
given monthsWorked0
given monthsAbsentOwnFault0
given daysTaken0
expect daysEntitled0

Case 10 — N10 days already taken come off the remainder

given daysPerWeek5
given age35
given monthsWorked12
given monthsAbsentOwnFault0
given daysTaken8
expect daysRemaining12

Case 11 — N11 taking more than the entitlement never goes negative

given daysPerWeek5
given age35
given monthsWorked12
given monthsAbsentOwnFault0
given daysTaken40
expect daysRemaining0

Sources

Check it yourself — and reuse it

The whole model as JSON — inputs, outputs, formulas, vectors and sources in one re-runnable document.

This model is published under CC BY 4.0: use it, adapt it, build on it, with attribution. The licence covers the model — the expression of each rule and the arrangement of the catalog. The rates and thresholds are law, and nobody licenses those; the sources above are where they come from.

← Back to the Switzerland ferienanspruch calculator

Built with Valem — a live, verifiable calculator you can fork and embed.