Attend to pay: the monthly cycle
Modules ATT, LVE, PAY, CLM, NTF, RPT · Release R1 · Specs Attendance, Leave, Payroll
Context
The reference product's strongest idea is the attendance → leave → payroll chain that turns punches into payable days [Observed] (see Spryple analysis §5, §6, §7 and §16). It has no documented period lock or run lifecycle [Inferred]. Spyrl keeps the chain and adds a lock on each side: the attendance period lock freezes inputs, and the pay-run lock freezes outputs. Anything that changes after a lock becomes an input to the next cycle.
The example below uses an October pay month with an attendance cut-off on the 25th (window 26 September to 25 October), salary paid on the last working day, and a calendar salary basis.
Calendar of typical dates
Statutory due dates are examples to verify each year and per state; the product reads them from the statutory pack.
| Date (example) | Milestone | Owner | Module |
|---|---|---|---|
| 1 to 25 Oct | Daily punches, requests and approvals; day computation runs continuously | Employees, managers | ATT, LVE |
| 20 Oct | Reminder: pending requests and missed punches for the window | System | NTF |
| 22 Oct | Payroll inputs due: variable pay, arrears, deductions, approved claims cut-off | payroll_manager | PAY, CLM |
| 25 Oct | Attendance window closes | — | ATT |
| 26 Oct | Attendance pre-lock check; managers clear blockers | hr_manager, line_manager | ATT |
| 27 Oct | Attendance period locked; att.period.locked | hr_manager | ATT |
| 27 Oct | Pay run created and calculated | payroll_manager | PAY |
| 28 Oct | Review: warnings, variance, holds; recalculate as needed | payroll_manager | PAY |
| 29 Oct | Run approved (different person from the preparer) | finance_admin | PAY |
| 30 Oct | Run locked; payslips generated; bank file generated and uploaded | payroll_manager | PAY |
| 31 Oct | Salary credited; bank confirmation; payslips published | payroll_manager | PAY, NTF |
| 7 Nov | TDS deposit for October (example due date) | finance_admin | PAY |
| 15 Nov | EPF ECR upload and payment; ESIC contribution (example due dates) | payroll_manager | PAY |
| State dates | PT and LWF per state rules | payroll_manager | PAY |
| 26 Oct to 25 Nov | Next window; post-lock changes queued as adjustments | — | ATT, PAY |
Diagram
Steps
| # | Actor | Action | System response | Module | Notifications |
|---|---|---|---|---|---|
| 1 | System | Sends reminders five days before cut-off | Lists of pending requests and days needing action per manager and employee | ATT, NTF | Push and email to employees and managers |
| 2 | payroll_manager | Enters or uploads one-time inputs | pay_input rows; approved claims and encashments arrive automatically | PAY, CLM, LVE | — |
| 3 | hr_manager | Starts the attendance lock | Pre-lock check: pending requests, missed punches, unmapped biometric users, unprocessed imports | ATT | — |
| 4 | line_manager | Clears blockers (approve or reject, regularize) | Days recomputed | ATT, NTF | Task reminders |
| 5 | hr_manager | Locks (or overrides blockers with a reason) | Days Locked; att.period.locked | ATT | Payroll manager notified |
| 6 | payroll_manager | Creates and calculates the run | Snapshot built per employee: compensation, payable days, inputs, statutory versions, declarations; engine runs gross to net | PAY | Preparer notified on completion |
| 7 | payroll_manager | Reviews warnings and variance; holds employees; fixes inputs | Recalculation of affected employees only (input hash) | PAY | — |
| 8 | payroll_manager | Submits for approval | Run InReview; approver task | PAY, NTF | Task to approver |
| 9 | finance_admin | Approves | Run Approved; SoD check passes | PAY | — |
| 10 | payroll_manager | Locks the run | Immutable; payslips rendered; pay.run.locked | PAY | — |
| 11 | payroll_manager | Generates bank file per debit account | File with row count and total; checksum shown | PAY | — |
| 12 | payroll_manager | Uploads to the bank and confirms payment | Run Paid; claims marked Paid; F&F settlements updated | PAY, CLM, EXT | — |
| 13 | System | Publishes payslips (on lock or scheduled) | Payslips visible in web and mobile | PAY | Push and email with secure link |
| 14 | payroll_manager | Generates ECR, ESIC, PT, LWF files and TDS data | Files stored with adapter version | PAY | Due-date reminders |
| 15 | System | Opens the next period | New window; queued adjustments attach to the next run | ATT, PAY | — |
Exception paths
| Situation | Handling |
|---|---|
| Late biometric data after lock | Punches stored; day recompute creates att_adjustment; next run gets LOP_REVERSAL |
| Leave cancelled for a locked date | Needs HR approval; adjustment flows to next run |
| Attendance must be reopened | att.period.unlocked allowed only while the run is not locked; draft run invalidated and recalculated |
| Error found after the run is locked | Reversal run plus corrected off-cycle run, or correction through next month's inputs (policy choice) |
| Employee missing bank details | Blocking validation; hold the employee or pay by cheque or cash mode with audit |
| Negative net pay | Net floor applied; non-statutory recoveries deferred to next period with warning |
| Bank rejects some rows | Mark rows failed; regenerate a file for failed rows after bank detail correction |
| Back-dated increment approved after lock | Arrears calculated against locked periods and added to the next run |
| Statutory rate changes mid-year | New statutory pack version with effective date; runs pick the version valid for the period |
| Payroll window change freeze | Platform defers non-urgent releases from the 25th to the 5th; hotfixes follow extra review |