---
title: "HR"
description: "Mitarbeitende und Abwesenheiten. Jede App ist ein Modul auf einem gemeinsamen Datenmodell."
canonical: "https://obop.dev/de/apps/hr/"
lang: "de"
---

# HR

## Wofür sie gedacht ist

A register of employees, departments and leave requests, with strict data classes: pay, bank details and national id are visible to managers only and health or union data only to a special reader group. Agents never see the sensitive classes.

## Was das Paket leistet und was nicht

Employees, departments and leave requests. Personal data is classified strictly: pay, bank and national id are visible to managers only, and health and union data to the special reader group.

## Modelle

### `hr_department`

A team or department of the company

Lesegruppe: `hr.user`. Schreibgruppe: `hr.manager`.

| Feld | Art | Datenklasse | Personenbezogene Daten | Gruppe | Agenten sehen | Beschreibung |
|---|---|---|---|---|---|---|
| `name` | text | `none` | nein | `hr.user` | im Klartext | Department name |
| `head` | text | `public_directory` | ja | `hr.user` | maskiert | Name of the department head |
| `cost_centre` | text | `none` | nein | `hr.user` | im Klartext | Cost centre code used by finance |

### `hr_employee`

A person employed by the company

Lesegruppe: `hr.user`. Schreibgruppe: `hr.manager`.

| Feld | Art | Datenklasse | Personenbezogene Daten | Gruppe | Agenten sehen | Beschreibung |
|---|---|---|---|---|---|---|
| `name` | text | `public_directory` | ja | `hr.user` | maskiert | Full name |
| `job_title` | text | `public_directory` | ja | `hr.user` | maskiert | Job title |
| `work_email` | text | `public_directory` | ja | `hr.user` | maskiert | Work email address |
| `work_phone` | text | `public_directory` | ja | `hr.user` | maskiert | Work phone number |
| `department_id` | ref → hr_department | `none` | nein | `hr.user` | im Klartext | The department the person belongs to |
| `reports_to_id` | ref → hr_employee | `none` | nein | `hr.user` | im Klartext | The person's line manager |
| `hired_on` | date | `internal` | ja | `hr.user` | maskiert | First day of employment (YYYY-MM-DD) |
| `contract_type` | select (permanent, fixed_term, contractor, intern) | `confidential_hr` | ja | `hr.manager` | zurückgehalten | Type of employment contract: permanent, fixed_term, contractor, intern |
| `private_email` | text | `confidential_hr` | ja | `hr.manager` | zurückgehalten | Private email address |
| `private_phone` | text | `confidential_hr` | ja | `hr.manager` | zurückgehalten | Private phone number |
| `home_address` | longtext | `confidential_hr` | ja | `hr.manager` | zurückgehalten | Private home address |
| `birth_date` | date | `confidential_hr` | ja | `hr.manager` | zurückgehalten | Date of birth (YYYY-MM-DD) |
| `national_id` | text | `confidential_hr` | ja | `hr.manager` | zurückgehalten | National identity or social security number |
| `emergency_contact` | text | `confidential_hr` | ja | `hr.manager` | zurückgehalten | Name and phone of the person to call in an emergency |
| `salary` | money | `financial` | ja | `hr.manager` | zurückgehalten | Gross annual salary (minor currency units, e.g. cents) |
| `bank_iban` | text | `financial` | ja | `hr.manager` | zurückgehalten | Bank account salary is paid into |
| `union_member` | bool | `special_category` | ja | `hr.special_reader` | zurückgehalten | Whether the person is a trade union member |
| `work_permit_expiry` | date | `special_category` | ja | `hr.special_reader` | zurückgehalten | Date the work permit expires, for non-citizens (YYYY-MM-DD) |
| `health_note` | longtext | `special_category` | ja | `hr.special_reader` | zurückgehalten | Health condition or disability relevant to the workplace |
| `state` | select (onboarding, active, offboarded) | `none` | nein | `hr.user` | im Klartext | Employment status: onboarding, active, offboarded |

### `hr_leave_request`

A request for time off

Lesegruppe: `hr.user`. Schreibgruppe: `hr.user`.

| Feld | Art | Datenklasse | Personenbezogene Daten | Gruppe | Agenten sehen | Beschreibung |
|---|---|---|---|---|---|---|
| `employee_id` | ref → hr_employee | `none` | nein | `hr.user` | im Klartext | The employee asking for time off |
| `leave_kind` | select (paid, unpaid, parental, study, other) | `confidential_hr` | ja | `hr.user` | zurückgehalten | Kind of leave: paid, unpaid, parental, study, other |
| `start_on` | date | `internal` | ja | `hr.user` | maskiert | First day of absence (YYYY-MM-DD) |
| `end_on` | date | `internal` | ja | `hr.user` | maskiert | Last day of absence (YYYY-MM-DD) |
| `days` | number | `none` | nein | `hr.user` | im Klartext | Working days requested |
| `reason` | longtext | `confidential_hr` | ja | `hr.manager` | zurückgehalten | Why the leave is requested |
| `is_sick_leave` | bool | `special_category` | ja | `hr.special_reader` | zurückgehalten | Whether the absence is due to illness |
| `medical_note` | longtext | `special_category` | ja | `hr.special_reader` | zurückgehalten | Reference to the medical certificate, if any |
| `state` | select (draft, requested, approved, refused) | `none` | nein | `hr.user` | im Klartext | Request status: draft, requested, approved, refused |

## Workflows

### `hr_employee`

| Aktion | Bewegt | Wer sie ausführen darf | Freigabe |
|---|---|---|---|
| `hr_employee.activate` | state: onboarding → active | `hr.manager` | nein |
| `hr_employee.offboard` | state: active → offboarded | `hr.manager` | ja |

### `hr_leave_request`

| Aktion | Bewegt | Wer sie ausführen darf | Freigabe |
|---|---|---|---|
| `hr_leave_request.request` | state: draft → requested | `hr.user` | nein |
| `hr_leave_request.approve` | state: requested → approved | `hr.manager` | ja |
| `hr_leave_request.refuse` | state: requested → refused | `hr.manager` | ja |

## Berechtigungsgruppen

Von dieser App verwendete Gruppen:

- `hr.manager`
- `hr.special_reader`
- `hr.user`

## Freigabeschritte

Schritte, die ein Agent nur vorschlagen kann:

- `hr_employee.offboard`
- `hr_leave_request.approve`
- `hr_leave_request.refuse`

## Was Agenten tun können und was nicht

Ein Agent kann Datensätze dieser App lesen, durchsuchen, anlegen und aktualisieren sowie Aktionen ausführen, die keine Freigabe brauchen, und zwar innerhalb der Berechtigungsgruppen seines Tokens.

Diese Schritte kann er nur vorschlagen, und eine Person muss sie freigeben: `hr_employee.offboard`, `hr_leave_request.approve`, `hr_leave_request.refuse`, `hr_department.delete`, `hr_employee.delete`, `hr_leave_request.delete`.

Personenbezogene Daten werden als Platzhalter maskiert: `hr_department.head`, `hr_employee.name`, `hr_employee.job_title`, `hr_employee.work_email`, `hr_employee.work_phone`, `hr_employee.hired_on`, `hr_leave_request.start_on`, `hr_leave_request.end_on`.

Diese Felder werden Agenten vollständig vorenthalten: `hr_employee.contract_type`, `hr_employee.private_email`, `hr_employee.private_phone`, `hr_employee.home_address`, `hr_employee.birth_date`, `hr_employee.national_id`, `hr_employee.emergency_contact`, `hr_employee.salary`, `hr_employee.bank_iban`, `hr_employee.union_member`, `hr_employee.work_permit_expiry`, `hr_employee.health_note`, `hr_leave_request.leave_kind`, `hr_leave_request.reason`, `hr_leave_request.is_sick_leave`, `hr_leave_request.medical_note`.

## Abhängigkeiten

Keine.

## Installation

Installieren Sie sie in der App Customize (Marktplatz) oder über die Kommandozeile:

```bash
obop modules install-from hr
```

Erfordert eine Datenbank und Administratorrechte.

## Selbst bauen

[Der Modulleitfaden zeigt, wie Apps wie diese geschrieben werden](/de/docs/reference/module-manifest/)
