Building the base first
January was the busiest month of the early history. Almost all of it went into foundations rather than features, and at this point the codebase still served an earlier, unrelated project. None of it was payroll yet, but most of it is still in use in Mintage today.
The first job was sign-in and access control. We added Laravel Sanctum for token-based API authentication and a roles-and-permissions package so that different users could see and do different things. An admin module, admin user model and seeders for demo roles followed within the same day.
Modules and an audit trail
We also adopted a modular structure, where each area of the application lives in its own module with its own routes, models and migrations. That choice turned out to matter a great deal: when payroll arrived later, it arrived as a set of modules rather than a rewrite.
Business software needs a memory, so we added two kinds of tracking. One records the previous and new values whenever a record changes. The other stamps each record with the user who created or last updated it. For payroll, where someone will eventually ask why a figure changed, this kind of trail is essential.
We also set up an automated test pipeline and added a spreadsheet library, which later became the backbone of our payroll exports.
Trying things and backing out
Not every choice survived the month. We tried one authentication scaffold and a separate login module, then removed both in favour of a dedicated sign-in and consent module. A debugging toolbar came and went. Later in the month we added a repository layer, camelCase model attributes, typed enums and a timezone fix. Reversing a decision in week two is much cheaper than living with it for years.
This article was written from Mintage Payroll’s commit history for January 2021. See Mintage Payroll today