Salary disbursement (bank-agnostic)
Generate bulk-payment files for any Indian bank, or push payouts via Razorpay X — straight from a finalized payroll period.
Workflow at a glance
Finalize payroll for month
↓
Disbursements → Batches → Generate
↓
DRAFT ← review lines, fix bank gaps
↓ approve
READY
↓ download
EXPORTED → upload file to bank portal
↓ paste UTRs back into StafFixHR.com
SETTLED → employees notified ("Salary credited")Supported banks (out of the box)
- ICICI — Connected Banking (CIB) CSV
- HDFC — ENet bulk-payment text
- SBI — Cash Management Portal (CMP) fixed-width
- Axis — Corporate Internet Banking CSV
- Kotak — Biz CSV
- Yes Bank — Corporate Banking CSV
- Razorpay X — API payouts (mock until 2 env keys land)
- Generic NEFT — RBI-style CSV accepted by most PSU / co-op banks
Need a bank we don't support? Drop one file under apps/api/src/disbursements/adapters/ implementing the BankAdapter interface, register it in registry.ts, no other code changes.
Setup checklist (HR)
- Open /admin/disbursements → Bank profiles tab.
- Add a profile per bank account you pay from (label it "ICICI Primary" etc.).
- Pick the bank format → fill any required client codes shown.
- Switch to the Employee bank accounts tab and enter (or verify) each employee's account + IFSC.
- Run payroll for the month → it must reach FINALIZED status.
- Back on Batches → Generate from payroll → pick period, value date, bank profile.
- Review the draft → fix skipped employees (no account / zero net pay) → approve.
- Download the file → upload to your bank portal → paste UTRs back to settle.
Razorpay X (auto-payouts)
Set RAZORPAY_X_KEY_ID and RAZORPAY_X_KEY_SECRET on Railway to enable live API mode. Until then the adapter generates a JSON payload you can paste into Razorpay X Bulk Payouts.
Audit & safety
- Bank details are snapshotted onto every line when the batch is generated — editing the employee's account later does not change a settled batch.
- Two-person rule: creator and approver are recorded separately (config TBD; both can be the same HR_ADMIN today).
- Batches are immutable once EXPORTED. Mistakes are corrected by a new batch + reconciliation note, never edits to history.
- Storage: bank file copy lives at
disbursements/<companyId>/<batchId>/in R2.