February 2026 Client work Client work — confidential PHPMySQLJavaScript

Leave Planning & Management System

An internal HR system where permissions follow the reporting line, not a role table.

No public link — internal system. Screenshots below.

Roles 3
Role
Sole designer and developer — data model, backend, interface, balance engine, reporting and exports
Type
Internal HR system, client work — confidential
Stack
PHP, MySQL, JavaScript
Status
Delivered. Live link: unavailable — internal system.

The problem

Leave planning across mixed working patterns is hard to see and easy to get wrong. Requests arrive by email, entitlements live in spreadsheets, and nobody can answer the only question that matters on a given day: who is off, and can we still cover the shift? The cost is not paperwork — it is discovering a coverage gap too late to fix it.

The approach

One system of record, three views onto the same data. Employees see their own balance, working-day pattern and request history. Managers see their team's coverage and approve against it. HR sees the whole organisation — a full-year planning grid, every request, every balance, and an audit trail of who changed what.

Key decisions

Permissions follow the reporting line, not a role table

Each profile carries a manager, so a manager's own request routes upward while their team's requests route to them. One rule generates the entire hierarchy, and adding a department requires no code.

The app reads the planners' existing spreadsheet

Working patterns were already maintained in an Excel workbook people knew and trusted. Rather than force a migration, the system synchronises from that file automatically and becomes the layer on top of it. Adoption stopped being a negotiation.

Concurrency limits warn, they don't block

Each position and shift has a maximum number of people off at once. When it's reached, the employee sees a warning and a human still decides. Rules that hard-block get worked around; rules that inform get used.

Screenshots

Outcome

Leave moved from scattered email threads and spreadsheets to a single auditable record, with same-day coverage visible to the people who plan it and full-year exports for the people who report on it.

Have a website or web app in mind?

Start a project →