Skip to content

payroll — permissions

Returned by PayrollModule.get_permissions() (relative names; the registry namespaces them as payroll.<name>).

PermissionAllowsRequired by
payroll.readList and view profiles, periods, entriesGET /api/v1/payroll/profiles, GET /api/v1/payroll/profiles/{id}, GET /api/v1/payroll/periods, GET /api/v1/payroll/periods/{id}, GET /api/v1/payroll/periods/{id}/entries, GET /api/v1/payroll/entries/{id}
payroll.writeCreate/edit/delete-draft profiles, periods, entries; transitionsPOST /api/v1/payroll/profiles, PATCH /api/v1/payroll/profiles/{id}, POST /api/v1/payroll/periods, POST /api/v1/payroll/periods/{id}/status, DELETE /api/v1/payroll/periods/{id} (empty draft only, 409 otherwise), POST /api/v1/payroll/entries, PATCH /api/v1/payroll/entries/{id}, DELETE /api/v1/payroll/entries/{id} (draft only, 409 otherwise)
payroll.reports.readRead monthly/annual rollupsGET /api/v1/payroll/reports/monthly, GET /api/v1/payroll/reports/annual

Role assignment

Strictly admin (* wildcard). No other role holds payroll permissions in v1 — bank/tax data keeps the blast radius on the admin role (approved scope, issue #229).

See backend/app/modules/payroll/__init__.py for the canonical role table.