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.