The challenge
The payroll product held everything and told them nothing: a missing PAN, a bank account with a malformed IFSC or a date of joining after the date of confirmation only surfaced when a provident fund filing was rejected or a salary transfer bounced, by which point it was month-end.
What we built
We built a two-tool add-on that reads the product's own employee database directly - an old Access-format file with a renamed extension, read through a pure-python parser so no database driver has to be installed on the client's machine, and never written to. The first tool grades every gap in the employee master by severity, checking only what actually applies to each person, so an ESI number is asked for only where ESI applies and bank details only for those paid by bank. The second mails every active employee their monthly payslip as a PDF encrypted with their own PAN, refusing to send where there is no email address or no matching payslip so nobody is silently skipped, and using a fixed marker where no PAN is on file rather than sending unprotected. What used to be a manual attach-and-send afternoon is a ticked list and one button, and the data behind it is checked before it goes out.
The result
Before: an afternoon of attach-and-send. Now: a ticked list and one button.