# Team Monitoring: divisi, pelapor, & tim (WorkPulse)

Halaman **Team Monitoring** di FE (`pages/team.vue`) memakai data API (bukan tabel dummy). Tampilan direktori terpisah (kartu, superadmin): **`pages/employees.vue`** — lihat [`BE_SPEC_EMPLOYEE_ORG_MANAGEMENT.md`](./BE_SPEC_EMPLOYEE_ORG_MANAGEMENT.md).

---

## Peran & tampilan

| Peran | Sumber data | Perilaku ringkas |
|--------|-------------|------------------|
| **Superadmin** | Analytics organisasi | Accordion **divisi** dari agregat laporan; per baris bisa dibuka untuk daftar **pelapor** di divisi itu (periode `7d` / `30d` / `90d` / `all`). |
| **Bukan superadmin** | Tim milik user | Accordion **tim** dari `GET /teams`; dibuka memuat **anggota** + peran. |

---

## Endpoint yang dipakai FE

| Endpoint | Query / catatan |
|----------|-----------------|
| `GET /api/v1/analytics/org/by-division` | `period` — sama aturan dengan analytics org lainnya. **Superadmin** saja. Respons: daftar divisi (kode/label + agregat). |
| `GET /api/v1/analytics/org/reporters-by-division` | `period`, **`division`** (wajib) — kode divisi sama dengan yang dipakai `by-division`. **Superadmin** saja. Respons: `userId`, `name`, `email`, `isActive`, `reportCount` (pelapor yang punya laporan di divisi tersebut, sesuai logika `COALESCE(NULLIF(TRIM(division),''), '(none)')` di BE). |
| `GET /api/v1/analytics/org/reports-by-reporter` | `period`, **`division`** (wajib), **`userId`** (wajib), opsional **`include=summary`** — drill-down: daftar laporan (maks. 200), filter sama `reporters-by-division`. Tanpa `include`: `id`, `title`, `status`, `reportDate`, `updatedAt`. Dengan **`include=summary`**: tiap baris tambah objek **`summary`** (`taskCounts` todo/doing/done, `blockersPreview` ≤120 rune, `workStart`, `workEnd`) dari parse `workpulse.report.v1` di BE — **bukan** `body` penuh. |
| `GET /api/v1/reports/:id` | Detail laporan (termasuk `body`). **Superadmin** boleh baca laporan user mana pun; user biasa tetap aturan pemilik / anggota tim. |
| `PATCH /api/v1/reports/:id` | Pemilik laporan **atau superadmin** (koreksi typo/isian). Superadmin: log aktivitas `report.admin_updated`. |
| `GET /api/v1/teams` | Daftar tim untuk user biasa. |
| `GET /api/v1/teams/:id/members` | Anggota tim; setiap anggota memuat **`isActive`** (`users.is_active`). |

**Status BE:** endpoint di atas **tersedia** di repo BE saat ini. Detail: [`../BE/docs/BE_SPEC_TEAM_MONITORING_DIVISIONS.md`](../BE/docs/BE_SPEC_TEAM_MONITORING_DIVISIONS.md).

**Perbaikan BE (SQL `created_at` ambigu pada `reporters-by-division`):** [`BE_FIX_ANALYTICS_REPORTERS_BY_DIVISION_AMBIGUOUS_CREATED_AT.md`](./BE_FIX_ANALYTICS_REPORTERS_BY_DIVISION_AMBIGUOUS_CREATED_AT.md).

---

## “Divisi” vs master data

- Saat ini **divisi = nilai `division` pada laporan** yang ter-agregasi; tidak ada CRUD “tambah divisi” terpisah di BE/FE.
- Jika produk membutuhkan **master divisi** (tombol tambah divisi, daftar resmi, anggota divisi, dsb.), lihat proposal terpisah: **[`BE_SPEC_ORG_DIVISIONS_MASTER_AND_CRUD.md`](./BE_SPEC_ORG_DIVISIONS_MASTER_AND_CRUD.md)** (model tabel, endpoint contoh, dampak FE).

---

## Realtime

- FE saat ini memakai **polling ~45 detik** untuk menyegarkan ringkasan divisi / tim dan (jika baris terbuka) daftar pelapor atau anggota.
- **Push (SSE/WebSocket)** untuk Team Monitoring belum ada; jika ingin benar-benar realtime, BE bisa menambahkan stream peristiwa (laporan baru, perubahan anggota tim, dsb.) dan FE mengganti atau melengkapi polling.

---

## File kode BE (referensi)

- `internal/api/analytics_org.go` — `by-division`, `reporters-by-division`, `reports-by-reporter`
- `internal/api/org_report_body_summary.go` — ringkasan `include=summary` untuk modal monitoring
- `internal/api/rest.go` — `listTeams`, `teamMembers`, `getReport` (superadmin read)
- `internal/api/router.go` — grup `analytics/org` + `teams`

**Path dokumen ini (repo FE):** `FE/docs/BE_SPEC_TEAM_MONITORING_DIVISIONS.md`  
**Kontrak BE (salinan):** [`../BE/docs/BE_SPEC_TEAM_MONITORING_DIVISIONS.md`](../BE/docs/BE_SPEC_TEAM_MONITORING_DIVISIONS.md)

Setelah mengubah API: build binary API + restart PM2 `workpulse-api`; deploy FE + restart `workpulse-fe` bila perlu.
