# BE — Team Monitoring: drill-down dari jumlah laporan ke daftar / detail laporan

Konteks UI: halaman **Pemantauan tim** (`FE/pages/team.vue`), mode **superadmin**, accordion per **divisi**, tabel **pelapor** dengan kolom **Laporan** berisi angka (`reportCount`) dari `GET /api/v1/analytics/org/reporters-by-division`.

Pertanyaan produk:

> *“Angka laporan di sini harusnya bisa diklik dan laporan bisa dilihat, benar?”*

---

## 1. Apakah ekspektasi itu wajar?

**Ya**, untuk peran **superadmin / pemantau organisasi**, wajar jika dari ringkasan **N laporan** per pelapor bisa **drill-down** ke daftar laporan (lalu ke isi/detail).

---

## 2. Perilaku & kode saat ini (gap)

| Lapisan | Perilaku |
|---------|----------|
| **FE** | Kolom **Laporan** hanya menampilkan teks `{{ r.reportCount }}` — **bukan** link, tidak ada aksi buka daftar/detail. |
| **`GET /api/v1/analytics/org/reporters-by-division`** | Hanya agregat: `userId`, `name`, `email`, `isActive`, `reportCount` — **tanpa** daftar `report_id`. Implementasi: `BE/internal/api/analytics_org.go` (`analyticsOrgReportersByDivision`). |
| **`GET /api/v1/reports`** | Filter `division` / `from` / `to` opsional, tetapi **`WHERE user_id = pemilik token` saja** — superadmin **tidak** bisa memuat laporan milik user lain lewat endpoint ini. `BE/internal/api/rest.go` (`listReports`). |
| **`GET /api/v1/reports/:id`** | Akses: pemilik **atau** anggota **tim** yang sama dengan `reports.team_id`. Bukan pemilik dan bukan anggota tim → **403**. Superadmin yang tidak ada di `team_members` tim itu **tidak** otomatis bisa membaca. `BE/internal/api/rest.go` (`getReport`). |

Jadi: meskipun FE dibuat “klikable”, **belum ada API** yang aman dan konsisten untuk:

1. Daftar ID laporan per `(userId, division, period)` selaras dengan hitungan `reporters-by-division`, dan  
2. Membaca **body** laporan orang lain sebagai superadmin.

---

## 3. Rekomendasi BE (minimal — disarankan)

### 3a. Endpoint daftar laporan per pelapor (superadmin)

Tambah di grup yang sudah **`requireSuperadmin`** (sama seperti `analytics/org/*`), misalnya:

`GET /api/v1/analytics/org/reports-by-reporter`

**Query wajib / opsional:**

| Query | Wajib | Keterangan |
|-------|--------|------------|
| `userId` | Ya | Pelapor target (`uint64`). |
| `division` | Ya | Sama aturan normalisasi / `(none)` seperti `reporters-by-division`. |
| `period` | Tidak | Default `30d` — **pakai fungsi yang sama** dengan `orgReportsTimeFilter` / `orgPeriodLabel` seperti di `analyticsOrgReportersByDivision` agar angka di UI **cocok** dengan drill-down. |

**Respons (contoh):**

```json
{
  "period": "30d",
  "division": "it",
  "userId": 123,
  "reports": [
    { "id": 456, "title": "…", "status": "submitted", "reportDate": "2026-05-14", "updatedAt": "…" }
  ]
}
```

- SQL: `SELECT r.id, r.title, r.status, r.report_date, r.updated_at FROM reports r WHERE r.user_id = $1 AND (` + time filter + `) AND (` + division predicate sama seperti reporters-by-division + `) ORDER BY r.updated_at DESC LIMIT 200`.
- **Tidak wajib** mengembalikan `body` di list (bisa field terpisah atau `GET /reports/:id` setelah §3b).

### 3b. Izin baca detail laporan untuk superadmin

Pilih **satu** kebijakan (dokumentasikan di OpenAPI / internal README):

- **Opsi i — Perluasan `getReport`:** Jika JWT `role === superadmin` → izinkan `GET /reports/:id` untuk laporan apa pun (atau hanya jika laporan memenuhi filter organisasi, jika ingin lebih ketat).
- **Opsi ii — Endpoint mirror read-only:** `GET /api/v1/analytics/org/reports/:id` superadmin-only, isi sama `getReport` tanpa mengubah perilaku user biasa.

**Patch / edit** tetap hanya pemilik (tetap seperti `patchReport` hari ini).

---

## 4. FE (setelah BE siap) — ringkas

- Jadikan angka **Laporan** (atau baris) **link / button** → panggil `reports-by-reporter` → drawer atau halaman daftar → tiap baris `GET /reports/:id` (setelah §3b).
- Tidak perlu mengubah kontrak `reporters-by-division` jika endpoint baru ditambahkan.

---

## 5. Referensi file

| File | Peran |
|------|--------|
| `FE/pages/team.vue` | Tabel pelapor, kolom Laporan |
| `FE/composables/useWorkpulseOrgTeamMonitoring.ts` | `getReportersByDivision` |
| `BE/internal/api/analytics_org.go` | `analyticsOrgReportersByDivision`, helper periode |
| `BE/internal/api/rest.go` | `listReports`, `getReport` |
| `BE/internal/api/router.go` | Grup `orgAn` + `requireSuperadmin` |
| `FE/docs/BE_SPEC_TEAM_MONITORING_DIVISIONS.md` | Ringkasan endpoint monitoring saat ini |

---

*Dokumen ini permintaan fitur drill-down + spesifikasi BE; implementasi kode BE/FE belum termasuk kecuali tim memutuskan dan mengembangkan §3.*
