Leave is where an HRMS earns trust or loses it. If the balance on screen disagrees with the balance in someone's head, they stop believing the system and go back to asking HR. So it is worth understanding precisely what the calculation does.
The inputs
- Join date — drives pro-rating in the first year.
- Seniority level — junior, senior or director; different levels can carry different annual leave allocations.
- Children's dates of birth — childcare leave entitlement depends on having a child under the qualifying age.
- Gender — maternity and paternity leave are gated accordingly.
- Whether the person receives leave at all — contractors and vendors can have portal access with no leave allocation.
First-year pro-rating
Someone who joins mid-year does not get the full annual allocation. The system pro-rates annual leave by the remaining portion of the calendar year from the join date, then rounds to the nearest half day. Somebody joining in early October gets roughly a quarter of the annual entitlement, not the whole thing.
This is the single most common source of "the system is wrong" reports, and the system is usually right — the expectation was wrong, because the offer letter said "14 days annual leave" without saying "pro-rated in year one". Worth checking your offer letter wording.
Statutory minimums
Under the Employment Act, an employee who has worked at least three months is entitled to paid annual leave, starting at seven days in the first year and increasing by one day per additional year of service up to fourteen. Most companies offer more than the minimum. The system's defaults reflect common Singapore practice rather than the bare floor, and you adjust them to your policy.
The day count
When an application covers a date range, the system counts working days: it walks each date, skips Saturdays and Sundays, and skips any date in the gazetted public holiday table. Half-days count as 0.5 and skip the range logic entirely.
The excluded public holidays are shown to the employee on the apply form before they submit. The same calculation runs on the server when the application is stored and again when the approval email is built, so the number on the form, the number in the database and the number in the email are guaranteed to agree.
The four numbers behind a balance
A balance is deliberately not stored as one figure. Each entitlement row keeps four, and the remaining balance is derived:
| Field | Meaning |
|---|---|
| Total days | The calculated (or overridden) entitlement for the year |
| Carried forward | Brought in from the previous year, with an expiry date |
| Adjustments | Manual corrections, positive or negative |
| Used days | Consumed by approved applications |
Keeping them separate means you can always answer *why* a balance is what it is. Collapsing them into one number makes the balance unauditable the first time someone disputes it.
Overrides versus adjustments
These are different tools and choosing wrongly causes confusion later.
- An override replaces the calculated entitlement for one employee, leave type and year. Use it when the calculation is structurally wrong for that person — a negotiated contract, an opening balance migrated from another system. It survives recalculation.
- An adjustment adds or subtracts days from an otherwise correct entitlement. Use it for one-off corrections — returning days from a cancelled trip, granting extra leave as recognition. Every adjustment is written to an audit table with a mandatory reason.
Backfilling
Entitlements reconcile on read. Add a new leave type in March and every employee who already has rows for the year gets the new type created on their next page load, at the correct calculated value. You do not run a sweep, and there is no window where half the company has the new type and half does not.