Case study · Public Transport
One system from attendance to plate for a metro rail operator.
Meal counts compiled by hand from attendance sheets, catering requests on paper, and a kitchen with no view of stock or cost. We replaced it with one system that starts from who actually turned up for the shift.
- Client
- Metro rail operator(anon.)
- Industry
- Public Transport
- Duration
- On-premise, phased
- Team
- Senior pod, FORGE
The challenge
What stood in the way.
A metro rail operator feeds a shift-based workforce along 27 km of elevated track. Meal counts were compiled by hand from attendance sheets, catering requests arrived on paper, riders carried meals out with no record of who received what, and the kitchen had no view of stock or cost.
Our approach
How we framed it.
Start from attendance. If the system knows who is on shift, where, it can forecast what each site needs, route it, and record the hand-over against an employee code. Everything downstream, menu planning, stock, purchasing, cost per meal, hangs off that one feed. The platform runs in the client's own data centre on IIS and SQL Server, integrated hourly with the HRIS.
The solution
What we built.
- Hourly attendance sync from the HRIS
- Forecasting by shift, department and location
- Rider routing to sites with duplicate-meal protection; every meal recorded against an employee code
- Menu planning, stock, purchasing and cost-per-meal in the same system
- Public portal and a nightly digest
- Angular 18 (standalone components, signals) on ASP.NET Core 9 with MediatR/CQRS; SQL Server reporting; Hangfire for sync and digest
Results
What changed.
Three meals a day for more than a thousand staff across thirty-plus sites, each one forecast from real attendance and recorded at hand-over. The kitchen sees stock and cost per meal for the first time.
Stack
Tools used in production.
- Angular 18
- Tailwind
- Angular Material
- ASP.NET Core 9
- MediatR
- CQRS
- EF Core
- FluentValidation
- SQL Server
- Hangfire
- IIS
Talk to us
Have a similar problem? Bring it to a senior engineer.
A senior engineer plus the relevant department lead joins the first call. No discovery gauntlet, no junior reps.