Case file · InternshipSection 01
17/20
Archiving payroll data
Software engineering internship · Teal Partners, Antwerp · Feb – May 2025
The assignment
Teal Partners builds an established payroll product: payslips, gross-to-net, employer cost. My job was to move historical payroll calculations out of the live database into long-term storage, without losing the ability to read them later. It had to fit an existing .NET and Angular codebase, its domain model and its conventions.
The flow I built
- SQL Serverpayroll data
- NHibernatenamed queries
- Archive modelsstable JSON contract
- Azure Blobdeterministic paths
- Reader API.NET · Swagger
- Angular viewerpayslip-style view
Full stack, in someone else's codebase. One feature that touched the database, the ORM, backend services, cloud storage, an API and a new frontend.
No screenshots: the code is proprietary. So here is the architecture.
Case file · InternshipSection 02
How it came together
Explore
Learn the domain and the dataTraced how payroll calculations, employment relations, payslips and configuration relate in SQL Server.
Prototype
Prove it quicklyA first export with SQL Server's FOR JSON PATH showed the data could be extracted, and which data the archive needed.
Refactor
Fit the architectureMoved to NHibernate named queries and mapped the results into dedicated Archive models, so the archive no longer mirrors database entities.
Store
Write it to AzureSerialised to JSON through the app's IFileStorage abstraction, grouped by employer, year, month, employment relation and payslip. Records are marked archived once the export succeeds.
Read back
Make it retrievableA reader service and API endpoints load archived calculations from storage, independent of the live payroll screens.
Present
Show it to a personA new Angular viewer displays them, moving from raw structures toward a payslip-style view.
Case file · InternshipSection 03
What I took from it
- Prototype, then fit in. The SQL proof showed the idea worked. The real work was rebuilding it in the codebase's own patterns.
- An archive is a contract. Exporting database entities directly would tie history to today's schema. Dedicated archive models keep it readable later.
- Learn the domain first. Gross-to-net, employer cost and employment relations decided what belonged in the archive.
- Interfaces pay off. Storage and reading sit behind abstractions, so the infrastructure can change without rewriting the logic.
Built with