Skip to main content

Departments and positions

Departments and positions are the structure every employee record hangs from. An employee is assigned to a position, and a position belongs to a department, so the order of work when setting up a new area of the business is always: department, then position, then employee.

Both pages need hr.employees.view to open. Every change on either page — create, edit, archive, restore, delete — needs hr.employees.manage. Without it the pages are read-only: no Add button, and the row menus offer only the actions that read.

The shared toolbar behaviour is described in the HR Administrator overview.

Departments

/departments manages the hierarchy. Departments can nest: a department with a parent is a sub-department, and one without a parent is top-level.

Four tabs with counts: All, Top-Level, Sub-Departments and Archived.

Three columns: Department, Parent Department and Description. Parent Department is display-only — it cannot be sorted or filtered, because it is resolved from the hierarchy rather than stored on the row.

Add a department

  1. Select Add Department.
  2. Enter the Department Name. It is required and must be unique — a name already in use is rejected with a message saying so.
  3. Choose a Parent Department, or leave it on — None (top-level) —.
  4. Write a Description if you want one. The description field is a rich text editor, so headings, lists and emphasis are preserved.
  5. Select the save button at the bottom of the drawer.

To create a child directly under an existing department, choose Add Sub-department from that department's row menu instead. The drawer opens with the parent already chosen and its name in the title.

Read, edit and export a single department

  • View, or a double-click on the row, opens a drawer showing the department, what it reports to, its description, and a list of its sub-departments. An Edit button in the footer takes you straight into the form.
  • Edit opens the same drawer used for creating. Changing the parent moves the department in the hierarchy; a department cannot be made its own parent.
  • Download opens an export dialog for that one department. Choose a format — CSV for spreadsheets or JSON for structured data — and a scope: This department only, or Include sub-departments, which walks the whole subtree.

Archive, restore, delete

Archive moves a department into the Archived tab and out of the working view; its row menu there offers Restore. Nothing is lost, and the record keeps its history.

Delete removes the record permanently, and the server refuses it in two cases:

  • the department still has positions assigned to it, or
  • the department still has sub-departments.

Reassign or remove those first. In practice, archiving is the right answer for a department that has been retired but that historical records still point at, and deleting is for something created in error.

Positions

/positions manages job positions. Each belongs to exactly one department, and a position name must be unique within its department — the same title in two different departments is allowed.

Four tabs with counts: All, Filled, Vacant and Archived. Filled and Vacant split by whether anyone currently holds the position, which makes Vacant a quick read on what recruitment might be for.

Three columns: Position Name, Department and Description.

Add a position

  1. Select Add Position.
  2. Enter the Position Name — the official job title.
  3. Choose the Department it belongs to. The department has to exist already.
  4. Write a Description if you want one; this field is also a rich text editor.
  5. Select the save button.

Edit in the row menu, or a double-click on the row, reopens the same form.

Archive, restore, delete

Archive and Restore work as they do for departments. Delete is refused while any employee is still assigned to the position — move those employees to another position first.

Why this matters for imports

The bulk employee import matches positions and departments by name. If a name in your CSV does not match an existing record, that row fails and tells you so. Setting up the structure here before importing is the difference between a clean import and a list of failures — see Import employees from a CSV.