One payroll module, two rhythms: on-cycle is scheduled and hands-off for everyone — it runs whether or not a ticket exists — while off-cycle / ad-hoc is the exception path that eats operator time: terminations, bonuses, corrections, each one requested and validated one at a time.
On-cycle — scheduled
The semi-monthly run for the whole population, computed live from PeopleCore comp data. No intake, no approval routing, no booking request — the closest thing in this suite to a non-event.
Latest cycle — pay line detail
Regular gross = annual salary ÷ 24 pay periods. Withholding shown here is an ILLUSTRATIVE flat 20% rate — same honesty rule the off-cycle final-pay tax lines use below. The point is the routine gross→net structure for the whole population, not tax precision.
| Employee | Name | Dept | Gross | Withholding | Net |
|---|---|---|---|---|---|
| No run yet — press “Run this pay cycle” below. | |||||
Off-cycle — ad-hoc
Run final pay
SOP Step 4, live: pick an employee and their last day worked. PeopleCore's salary + PTO balance and CompHub's earned commission / clawback are pulled automatically — nothing hand-keyed.
Payroll generation runs
Each run validates date coherence and amount before it can complete. A run in error is exactly the SOP's "resolve validation errors before continuing" — in the manual flow that's a stop-and-rework; the automation catches it upstream at intake so it never reaches here.
| Run | Employee | Period | Scenario | Gross | Status | Validation |
|---|---|---|---|---|---|---|
| No runs yet — trigger one via /api/run or run the demo. | ||||||
API
GET /api/oncycle/nextPOST /api/oncycle/runPOST /api/runPOST /api/final_payPOST /api/pay_statementGET /api/runs/{id}