Where it lives
/payroll— month picker and per-employee row view./employee-wages— hourly rate management and wage history./staff/panel— "Earnings" section shows the staff member their own wages for the current and past periods.
A monthly cycle
- Open — pick the month from
/payroll. The system pre-populates a row for every active employee with gross derived from the contract: hourly employees get hourly_rate × actual hours; salaried employees get the monthly gross from their contract. - Adjust — add deductions, bonuses, or advances per employee as line items on their row. Each adjustment has a description and amount; the row total updates inline.
- Review — the page totals at the bottom by brand and by location. Compare against the prior month to catch outliers.
- Lock — locking the month freezes every row. Editing a locked period requires unlocking, which writes an entry to the activity log.
- Mark paid — flag each row paid with a method (bank transfer, cash, in kind). Staff see the paid status on their own panel.
- Export — CSV with one row per employee (gross, deductions, bonuses, net, payment method, payment date). Hand to your accountant or upload to your bank's bulk-pay tool.
Who sees what
- Company portal — full payroll detail.
- Staff portal — own row only, on
/staff/panel. Other employees' wages are never visible. - Accountant portal — does not see payroll detail. The accountant scope is intentionally limited to invoices and KSeF.
Where actual hours come from
Hours that drive hourly payroll come from the Shifts module:
- Tablet check-in / check-out captured during the shift.
- Manual edits via
/edit-hourswhen reality didn't match the plan. - Auto-checkout entries from the daily cron (capped at the 30-minute post-end window).
If actual hours are missing for a paid hourly employee on the day of payroll, the row flags red and you have to resolve before locking.