04Shared codebase
SLA clocks that stop when the clock should stop
An internal IT service desk used across the group.
- The problem
- SLA clocks kept running while tickets waited on the person who raised them, so reports blamed operators for delays they did not cause.
- What I built
- Pause-aware SLA tracking, recomputation when a category’s targets change, and most of the screens requesters use.
- The result
- A breach flag means an actual breach — on the backend and on the screen.
About 12% of the service backend — 1,452 of 11,579 lines — and 56% of the requester pages in the main platform, 1,372 of 2,433 lines. Sole author of the pause tracking and the recomputation path; the escalation command and the operator console are colleagues’ work, not mine.
An SLA clock that keeps running while a ticket is waiting on the person who raised it measures the wrong thing. Someone asks for a VPN account, the operator asks which system, the requester goes on leave for three days, and the resolution target breaches. The report then says the operator was slow, which is both false and the sort of number people stop trusting.
I built the pause and resume tracking: the clock stops when a request moves into a waiting state and starts again when it comes back, and the elapsed time is accumulated rather than recomputed from the creation stamp. I added priority-based overrides on top, so a P1 does not inherit a category's ordinary targets.
The part that turned out to matter most was recomputation. Targets live on the category, and when someone edits a category's first-response or resolution time, the tickets already open under it have to move too. Without that, the matrix on screen and the deadlines in the database quietly disagree, and only the database is enforced. I also made cancel and reopen comments typed, so reopening adjusts the resolution due-date — a reopened ticket that keeps its original deadline is already breached the moment it reopens.
On the requester's side I wrote most of what people see: cancelling or reopening a request with a required reason, rating a resolved one, attachments, and half of the chat front door, including messages that mix Arabic and Latin script in one line. The client-side breach check follows one rule from the backend: while the clock is paused, an open target cannot show as breached, so the breach highlight never contradicts the "paused" chip next to it.
Screens

The category taxonomy and its SLA targets. Editing a row here has to move the deadlines on every ticket already open under it, which is the recomputation path. 
Where a request starts: a conversation that gets classified into a ticket. Product name blurred. 
The requester’s list. A cancelled ticket is never marked breached, and one waiting on its requester would not be either — the check follows the paused clock.
- Laravel
- PHP
- PostgreSQL
- Queued Jobs
- Next.js
- TypeScript
- PHPUnit
Need something like this built?
Taking freelance work · ~20h/week.