Job Level Module
Peruntukan: Dokumen ini adalah Product Requirements Document (PRD) untuk Job Level Module — modul master yang mengelola level jabatan (job level), sebagai hierarki di atas job grade. Untuk detail teknis dan aturan validasi, lihat TEKNIS dan VALIDATION-RULES.
Overview
Job Level Module mengelola job level (level jabatan) sebagai master data. Setiap job level memiliki nama, key (unique, di-generate dari nama), deskripsi opsional, dan order_index untuk urutan tampilan. Job level menjadi parent untuk job grade dan referensi untuk job title.
Modul ini menyediakan CRUD dasar (create, list, get by id, update, soft delete) dengan tenant isolation dan audit fields.
Goals
- Menyediakan master data untuk level jabatan (job level)
- Mendukung key unik per tenant (auto-generated slug dari nama)
- Mendukung order_index untuk urutan tampilan
- Menjadi parent untuk job grade dan referensi job title
- Operasi sederhana: create, list, detail, update, soft delete
- Tenant isolation dan audit trail
Core Concepts
1. Job Level
- Name — Nama tampilan (contoh: Junior, Middle, Senior, Manager)
- Key — Identifier unik, di-generate otomatis dari nama (slug)
- Description — Opsional; deskripsi level
- order_index — Urutan tampilan (auto: max + 1 pada create)
- is_active — Status aktif (default true pada create)
2. Tenant & Audit
- Setiap record terikat tenant_id
- Audit: created_by, created_at, updated_by, updated_at, deleted_by, deleted_at (soft delete)
3. Relasi
- JobGrade — JobGrade.level_id → JobLevel.id
- JobTitle — JobTitle.level_id → JobLevel.id
Contoh Data
Format isian Create:
| Field | Keterangan | Required | Contoh |
|---|---|---|---|
name | Nama job level | ✅ | "Junior", "Senior" |
description | Deskripsi opsional | - | "Entry level" |
Key di-generate otomatis dari name. order_index di-set otomatis (max + 1).
Catatan: Key harus unik; jika nama menghasilkan slug yang sudah ada, create akan gagal (beda dengan job-family yang pakai suffix).
Format Update (semua optional):
| Field | Keterangan | Contoh |
|---|---|---|
key | Key (manual override) | "senior" |
name | Nama | "Senior" |
description | Deskripsi | null atau string |
order_index | Urutan | 3 |
is_active | Status aktif | true |
Supported Operations
| Operasi | Ringkasan |
|---|---|
| Create | Buat job level; key dari name, order_index = max+1; validasi key unik |
| List | Daftar dengan filter search, is_active, pagination, sorting |
| Get by ID | Detail satu job level by UUID |
| Update | Update (key, name, description, order_index, is_active) |
| Soft Delete | Set deleted_at, deleted_by |
Tidak ada hard delete di API; soft delete saja.
Data Integrity Rules
- Key unik per tenant
- order_index untuk urutan (boleh duplicate, dipakai untuk sort)
- Create: validasi key belum dipakai (validateExistence)
- Update: validasi record ada (validateNotFound)
Integrasi
| Modul / Tabel | Hubungan |
|---|---|
| JobGrade | JobGrade.level_id → JobLevel.id |
| JobTitle | JobTitle.level_id → JobLevel.id |
| Tenant | Semua data di-scope per tenant_id |
Technical Characteristics
- Identifier: UUID
- Base route:
/job-levels - Auth: Bearer token (AuthGuard); tenant dari current user
- RLS: Tenant-scoped client (createTenantClient)
Referensi
- Technical: TEKNIS
- Validation rules: VALIDATION-RULES