Skip to content

RBAC matrix — roles × permissions

What it is

The canonical reference for who can do what in ManpowerIQ: the full role × permission matrix, reproduced from a live read of the seeded roles / permissions / role_permissions tables (BU 1, Demo Business Unit, 2026-06-10). The verified totals are 97 permissions across 9 roles.

This is the authoritative source the Roles & permissions user-guide page points to, and the gating used by the Phase-4 task pages. Source: Sprint/RBAC_RolePermission_Extract.md.

Why it's built this way

ManpowerIQ's access model is permission-centric (see Authentication & RBAC): a global catalog of permission codes, BU-scoped roles that bundle them, and runtime [Authorize("x.y")] checks. The matrix below is the concrete grant data behind that model — the actual rows seeded into role_permissions. It is presented grouped by capability so a developer adding a guarded action can find the relevant permission and see which roles already hold it.

The 9 roles

The MIQ-003 baseline seeded 7 roles; HR_DIRECTOR and COO were added in later sprints (post-baseline), both with a narrow attendance + reconciliation scope.

id Code Abbr. Name Scope
1 SYS_ADMIN SA System Administrator Full access — all 97 permissions
2 HR_ADMIN HRA HR Administrator Employees, skills/certs, leave config, audit (65 perms)
3 PLANNER PLN Planner Demand, rosters, allocation runs (55 perms)
4 MANAGER MGR Department Manager Approve/publish, approvals, validate attendance (46 perms)
5 SUPERVISOR SUP Supervisor Capture/validate attendance, team views (34 perms)
6 EMPLOYEE EMP Employee Self-service only (6 perms)
7 VIEWER VWR Viewer Read-only across the product (23 perms)
8 HR_DIRECTOR HRD HR Director Post-baseline — attendance + reconciliation (7 perms)
9 COO COO Chief Operating Officer Post-baseline — attendance + reconciliation (8 perms)

How to read the matrix

  • Columns use the abbreviations above (SA HRA PLN MGR SUP EMP VWR HRD COO).
  • A ✓ means the role holds that permission.
  • SYS_ADMIN holds every permission, so its column is ✓ on every row by definition.

A note on completeness. The source extract enumerates the grants of the 8 non-admin roles explicitly — 92 distinct permission codes — and records that SYS_ADMIN holds all 97. The matrix below lists those 92, plus allocation_run.debug (named in the extract's quick-reference) and admin.config / admin.roles / admin.users (recovered from the Phase-6 controller scan) — all SYS_ADMIN-only — = 96 named permissions. That leaves 1 of the 97 held by SYS_ADMIN only and not yet named (97 − 92 = 5 SYS_ADMIN-only; 4 now named, 1 still unnamed). Rather than invent a code, it's left as the unenumerated residue; to recover it, query permissions directly at HEAD.

The matrix (by capability)

Administration & audit

Permission SA HRA PLN MGR SUP EMP VWR HRD COO
admin.audit ✓ ✓
admin.config ✓
admin.roles ✓
admin.users ✓

admin.config / admin.roles / admin.users are SYS_ADMIN-only administrative permissions, recovered from the Phase-6 controller scan (they gate Settings-write, Roles/Permissions, and Users respectively). They were among the previously-unnamed SYS_ADMIN-only residue — see the completeness note above.

Allocation rules & runs

Permission SA HRA PLN MGR SUP EMP VWR HRD COO
allocation_rule.execute ✓ ✓
allocation_rule.read ✓ ✓ ✓ ✓ ✓ ✓
allocation_rule.write ✓ ✓
allocation_run.debug ✓
allocation_run.execute ✓ ✓
allocation_run.lock ✓ ✓
allocation_run.read ✓ ✓ ✓ ✓ ✓ ✓
allocation_run.write ✓ ✓

Demand planning

Permission SA HRA PLN MGR SUP EMP VWR HRD COO
demand.confirm ✓ ✓ ✓
demand.create ✓ ✓
demand.edit ✓ ✓
demand.override ✓ ✓
demand.read ✓ ✓ ✓ ✓ ✓ ✓
demand.template_manage ✓ ✓
demand.template_read ✓ ✓ ✓ ✓
demand.view ✓ ✓ ✓ ✓
demand.write ✓ ✓ ✓
demand_reason.config ✓ ✓ ✓
demand_reason.view ✓ ✓ ✓ ✓ ✓ ✓

Rostering & publish

Permission SA HRA PLN MGR SUP EMP VWR HRD COO
roster.approve ✓ ✓
roster.create ✓ ✓
roster.edit ✓ ✓
roster.publish ✓ ✓ ✓
roster.view ✓ ✓ ✓ ✓ ✓
roster.view_own ✓ ✓
shift_assignments.override_certification ✓ ✓ ✓

Attendance & reconciliation

Permission SA HRA PLN MGR SUP EMP VWR HRD COO
attendance.capture ✓ ✓
attendance.edit ✓ ✓ ✓ ✓ ✓
attendance.import ✓ ✓ ✓ ✓ ✓
attendance.review ✓ ✓ ✓
attendance.validate ✓ ✓ ✓
attendance.view.all ✓ ✓ ✓ ✓ ✓ ✓
attendance.view.own ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
attendance.view.scoped ✓ ✓ ✓
attendance_status.config ✓ ✓ ✓
attendance_status.view ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
reconciliation.validate ✓ ✓ ✓ ✓
reconciliation.view ✓ ✓ ✓ ✓ ✓ ✓ ✓

Leave

Permission SA HRA PLN MGR SUP EMP VWR HRD COO
leave.approve ✓ ✓
leave.config ✓ ✓
leave.request ✓ ✓
leave.view ✓ ✓ ✓ ✓ ✓ ✓
leave_request.approve ✓ ✓ ✓ ✓
leave_request.submit ✓ ✓ ✓ ✓ ✓ ✓
leave_request.view_all ✓ ✓ ✓ ✓
leave_request.view_own ✓ ✓ ✓ ✓ ✓ ✓

Cross-pool, overtime & early-release

Permission SA HRA PLN MGR SUP EMP VWR HRD COO
cross_pool.approve ✓ ✓
cross_pool.request ✓ ✓
early_release.approve ✓ ✓
early_release.submit ✓ ✓
ot.approve ✓ ✓

Employees, skills & certifications

Permission SA HRA PLN MGR SUP EMP VWR HRD COO
cert.create ✓ ✓
cert.edit ✓ ✓
cert.view ✓ ✓ ✓ ✓ ✓
certifications.manage ✓ ✓ ✓
certifications.read ✓ ✓ ✓ ✓ ✓ ✓
employee.create ✓ ✓
employee.delete ✓ ✓
employee.edit ✓ ✓
employee.import ✓ ✓
employee.view ✓ ✓ ✓ ✓ ✓ ✓
employee_group.read ✓ ✓ ✓ ✓ ✓
employee_group.write ✓ ✓ ✓
grade.config ✓ ✓ ✓
grade.view ✓ ✓ ✓ ✓ ✓ ✓
skill.assign ✓ ✓
skill.config ✓ ✓ ✓
skill.create ✓ ✓
skill.delete ✓ ✓
skill.edit ✓ ✓
skill.view ✓ ✓ ✓ ✓ ✓ ✓

Pools

Permission SA HRA PLN MGR SUP EMP VWR HRD COO
pool.read ✓ ✓ ✓ ✓ ✓
pool.write ✓ ✓ ✓
pool_lending_rule.read ✓ ✓ ✓ ✓ ✓
pool_lending_rule.write ✓ ✓ ✓

Calendars, shifts & holidays

Permission SA HRA PLN MGR SUP EMP VWR HRD COO
calendar.config ✓ ✓
calendar.view ✓ ✓ ✓ ✓ ✓ ✓
holiday.config ✓ ✓ ✓
holiday.view ✓ ✓ ✓ ✓ ✓ ✓
shift_pattern.config ✓ ✓ ✓
shift_pattern.view ✓ ✓ ✓ ✓ ✓ ✓
shift_template.config ✓ ✓ ✓
shift_template.view ✓ ✓ ✓ ✓ ✓ ✓

Org reference data

Permission SA HRA PLN MGR SUP EMP VWR HRD COO
node_type.config ✓ ✓ ✓
node_type.view ✓ ✓ ✓ ✓ ✓ ✓
terminal.config ✓ ✓ ✓
terminal.view ✓ ✓ ✓ ✓ ✓ ✓

Imports

Permission SA HRA PLN MGR SUP EMP VWR HRD COO
imports.run ✓ ✓ ✓
imports.view_history ✓ ✓

Dashboards & self-service

Permission SA HRA PLN MGR SUP EMP VWR HRD COO
dashboard.view ✓ ✓ ✓ ✓ ✓ ✓
dept_dashboard.view ✓ ✓ ✓
profile.view_own ✓ ✓ ✓ ✓ ✓ ✓ ✓

Gotchas / constraints

  • allocation_rule.write is SYS_ADMIN + HR_ADMIN only. A PLANNER can run the engine (allocation_run.execute) but cannot edit rule sets. A common mis-assumption.
  • allocation_run.debug is SYS_ADMIN only — this gates the ineligibility-reason detail on a run (finding F6). Planners can't see why a candidate was excluded without it.
  • Leave has two gating styles. A newer chain (leave_request.submit / leave_request.approve) and a legacy gate (leave.approve = SYS_ADMIN + MANAGER) coexist. Check which an endpoint uses.
  • HR_DIRECTOR and COO are narrow, not senior-of-everything. Despite the executive names, each holds only 7–8 attendance/reconciliation permissions — not a superset of HR_ADMIN.
  • This is the BU-1 seed. Roles are tenant-scoped, so another BU's roles could in principle be edited away from this seed; this matrix is the shipped default.
  • SYS_ADMIN totals 97, but only 96 are named here — see the completeness note above. Don't treat the named rows as the entire catalog (1 SYS_ADMIN-only code remains unenumerated).

Build status

Available — RBAC schema, the 9-role seed, and the 97-permission catalog all ship and are runtime-enforced (sheet 01 §build-status). The matrix is a live extract from the seeded tables (Sprint/RBAC_RolePermission_Extract.md, 2026-06-10).