# Employees / direktori organisasi — ringkasan BE

**Handoff + QA:** [`BE_HANDOFF_ORG_DIVISIONS_AND_MEMBERS.md`](./BE_HANDOFF_ORG_DIVISIONS_AND_MEMBERS.md)

**Model & CRUD divisi / anggota:** [`BE_SPEC_ORG_DIVISIONS_MASTER_AND_CRUD.md`](./BE_SPEC_ORG_DIVISIONS_MASTER_AND_CRUD.md)

**Jika FE mendapat 404 pada `GET /api/v1/org/divisions`:** [`BE_DEPLOY_ORG_DIVISIONS_API_404_RESOLUSI.md`](./BE_DEPLOY_ORG_DIVISIONS_API_404_RESOLUSI.md) — itu diagnosis **deploy / proxy / binary**, bukan perubahan kontrak URL di BE.

**Path dokumen ini (repo FE):** `FE/docs/BE_SPEC_EMPLOYEE_ORG_MANAGEMENT.md`

---

## Baca (superadmin) — dari laporan (analytics)

Tetap berguna untuk metrik per periode; sumber nilai divisi = **`reports.division`**.

| Endpoint | Fungsi |
|----------|--------|
| `GET /api/v1/analytics/org/by-division?period=` | Divisi + `reportCount` dari **`reports.division`**. |
| `GET /api/v1/analytics/org/reporters-by-division?period=&division=` | Pelapor + `reportCount` per bucket divisi laporan. |

Detail: [`BE_SPEC_TEAM_MONITORING_DIVISIONS.md`](./BE_SPEC_TEAM_MONITORING_DIVISIONS.md).

---

## Mutasi — master divisi & anggota (FE “Simpan” / Employees)

| Kebutuhan | Endpoint | Catatan |
|-----------|----------|---------|
| Daftar divisi master | `GET /api/v1/org/divisions` | Pagination, filter `active`. |
| Buat / ubah / nonaktif | `POST` / `PATCH` / `DELETE /api/v1/org/divisions` | `DELETE` = soft. `POST`/`PATCH`: **`description`** opsional. |
| Daftar anggota + peran | `GET /api/v1/org/divisions/:id/members` | `orgRole` per baris (mis. `staff`, `supervisor`, `manager`; string hingga 64 karakter). |
| Sinkron anggota + peran | `PUT /api/v1/org/divisions/:id/members` | Body: **`members`: `[{ "userId", "orgRole?" }]`** (disarankan), dan/atau legacy **`userIds`** (semua `staff`). Kosongkan keduanya untuk menghapus semua anggota dari divisi ini. |
| Tambah / ubah satu | `POST /api/v1/org/divisions/:id/members` | `{ "userId", "orgRole?" }` — upsert. |
| Hapus anggota | `DELETE /api/v1/org/divisions/:id/members/:userId` | |

Mutasi di atas (selain `GET` daftar dengan filter superadmin-only): **`authMiddleware` + `requireSuperadmin`**. Lihat [`BE_SPEC_ORG_DIVISIONS_MASTER_AND_CRUD.md`](./BE_SPEC_ORG_DIVISIONS_MASTER_AND_CRUD.md) untuk detail auth per route.

---

## Migrasi

- `000005_org_division_members.*` — tabel **`org_division_members`**, kolom **`org_divisions.description`**, migrasi dari **`users.primary_org_division_id`** lalu drop kolom tersebut (setelah 000003–000004).

---

## Realtime

Polling di FE; push opsional — [`BE_SPEC_TEAM_MONITORING_DIVISIONS.md`](./BE_SPEC_TEAM_MONITORING_DIVISIONS.md).

---

## Status FE

| Bagian | Status |
|--------|--------|
| Halaman Employees superadmin | **Ada** — `pages/employees.vue` memanggil **`/api/v1/org/divisions`** + members (`useWorkpulseOrgDivisions`). |
| Pencarian user untuk tambah anggota | **Ada** — `GET /api/v1/admin/users` (`useWorkpulseAdminUsers`). |
| Sinkron penuh `PUT .../members` di UI | **Belum** — penyesuaian anggota lewat `POST` / `DELETE` per baris. |
