Case file 001 · Payroll bureau · Southern Africa
The Payroll Month That Checks Its Own Homework
Thousands of payslips a month, one bank file format older than some of the staff it pays, and a checklist that refuses to let anyone skip a step.
ERPNext · Frappe HR · bank file automation
The brief
A payroll bureau runs payroll for other organisations. That means every mistake is somebody else's rent. The ask was simple: move payroll onto ERPNext, and make the month-end close impossible to do out of order.
The file
- The bank wants its payment file fixed width, CRLF line endings, Latin-1, and — this is the important part — no trailing newline. One extra line break and the bank politely rejects several hundred salaries.
- Payroll month-end was a spreadsheet. The spreadsheet had a tab called "FINAL". There was also a tab called "FINAL (2)". Nobody could say which one the money had followed.
- A payroll run had once been processed before the employee changes for that month were loaded. It was fine. It was fixed. Everyone remembered it anyway, which is how you know it was not fine.
- Our first fix created the checklist automatically. Nothing created the checklist automatically. We found out in testing, which is the correct place to find out.
What we did
- A Payroll Month Checklist inside ERPNext: every step of the close, in order, with an owner and a timestamp.
- Guided gates. You cannot generate the bank file until the anomaly review is signed off. You cannot sign off the anomaly review until the employee change report has been looked at by a human.
- An Employee Change Report and an anomaly board: who joined, who left, whose pay moved by more than it should have, before the money goes, not after.
- A bank file generator that produces the bank's exact format, byte for byte, every month.
- A 2 a.m. audit robot that checks the configuration every night and tells us when something drifted.
Outcome
Month-end is now a sequence, not a ritual. The bank file is boring. Boring is the highest compliment a payroll system can receive.
"FINAL (2)" has been retired. It served with honour.
(Clients, colleagues and numbers stripped out. The dysfunction is ours to share; theirs isn't.)