Leave
Leave nobody has to recount
Leave types matching your policy, a work schedule per employee and public holidays that cost no hours. The request form shows, live, exactly which number gets stored and why.
To your policy, not to law written in code
You define the leave types yourself: vacation, sick, unpaid, special leave, each with its own accrual, carry-over and expiry rules. No country's law is hardcoded, so you model statutory and extra-statutory days exactly as your collective agreement knows them. Sick leave is its own type and never comes off the vacation balance.
The server does the math, not the browser
Every request is computed by the API, day by day; the browser only shows the result. The request form reveals, live, which number will be stored: 40 h ≈ 5 working days, with the public holiday visible at 0 h in the breakdown. Edit the request into the Christmas week and it gets cheaper on its own, because the hours are recomputed on every change.
- Not a scheduled working day: 0 h.
- An active public holiday: 0 h.
- An ordinary day: the scheduled window intersected with the requested one, minus every break that falls inside it.
- Rounding happens once, on the summed minutes.
A schedule per employee
A schedule is a week per employee: for each weekday a working block with any number of break windows inside it. A break is a window, not a duration — you don't subtract '30 minutes' from a day, you say when the break falls. The schedule lives on the person (Settings → Users), because it is contract data, and the hours per week roll out of it automatically. Public holidays come from a generator that derives them from Easter, so 2028 needs no code change; if you work Good Friday, you switch it off and a re-import never brings it back.
A balance that holds, even on an advance
The balance is accrual plus carry-over minus taken minus pending, per employee, type and year. Ask for more than is left and the form warns but the request still goes through: an advance is the manager's call, the balance reads negative, and the approver sees the shortfall again on the pending list. Overlapping requests and zero-hour spans stay hard errors. Entitlement pots for the current and next year seed themselves, and a December cron rolls the whole staff forward.
Approval, and the rest of the platform
Self-approval is off by default: whoever may approve is, on their own requests, an ordinary requester, and Settings → Leave restores that for a trusted approver. When a schedule can't express something (four hours on a day no one was scheduled), a manager sets the hours by hand, recorded against their name. Approved leave shows on the timesheet and falls outside billable capacity; it is never counted a second time as a time entry.
Want to know more?
The documentation describes every module in detail, from installation to permissions.