# Handoff BE/Produk — tugas Daily Report (Kanban) vs Kalender & Team Monitoring

Pertanyaan umum: *“Saya sudah isi/upload task di Daily Report; kenapa tidak muncul di Kalender dan Team Monitoring?”*

Dokumen ini menjelaskan **perilaku sistem saat ini** (bukan bug tunggal di satu endpoint), **ekspektasi yang benar**, dan **opsi pengembangan BE** jika produk ingin data itu “terhubung”.

**Mirror FE (narasi sama):** [`../FE/docs/BE_SPEC_DAILY_REPORT_TASKS_VS_CALENDAR_AND_TEAM.md`](../FE/docs/BE_SPEC_DAILY_REPORT_TASKS_VS_CALENDAR_AND_TEAM.md).

---

## 1. Jawaban singkat: apakah “harusnya muncul”?

Dengan implementasi **sekarang**: **tidak otomatis**.

- **Tugas papan Kanban** disimpan di **`reports.body`** sebagai string JSON (schema `workpulse.report.v1`, array `tasks`). Itu adalah **isi laporan**, bukan entitas terpisah di database.
- **Kalender** hanya menampilkan baris dari tabel **`calendar_events`** lewat `GET /api/v1/calendar/events` (filter `user_id` pemilik token, rentang `from` / `to`). **Tidak ada** join atau parse ke `reports.body` untuk tugas Kanban.
- **Team Monitoring** (`FE/pages/team.vue`) memuat:
  - **Superadmin:** agregat organisasi per **divisi** / daftar **pelapor** (endpoint analytics), bukan daftar kartu tugas per orang.
  - **User biasa:** daftar **tim** + **anggota** dari `GET /api/v1/teams` dan `GET /api/v1/teams/:id/members`. Bukan feed “task hari ini” dari laporan.

User yang mengharapkan “task di laporan = acara di kalender = baris di team monitoring” akan **tidak melihat** itu kecuali produk menambah alur baru (lihat §4).

---

## 2. Kalender — sumber data

| Sumber | Keterangan |
|--------|------------|
| Tabel **`calendar_events`** | `user_id`, `title`, `starts_at`, `ends_at`, `team_id`, `all_day`, … |
| API | `GET /api/v1/calendar/events?from=…&to=…` — [`internal/api/rest.go`](../internal/api/rest.go) (`listCalendar`). |
| Buat acara dari Daily Report | Di repo ini **tidak** ada `INSERT` ke `calendar_events` dari alur Daily Report. Acara bisa dari seed, skrip admin, atau fitur lain. |

**Kesimpulan:** mengisi Kanban di Daily Report **tidak** mengisi Kalender.

---

## 3. Team Monitoring & dashboard “no team”

| Kondisi | Dampak di UI |
|---------|----------------|
| User **bukan anggota** `team_members` | `GET /api/v1/teams` kosong → Team Monitoring (mode user) minim; dashboard “pending di tim / snapshot” → **no team** / ajakan join tim. |
| User **superadmin** | Tampilan per **divisi** dari analytics — **bukan** kartu Kanban per laporan. |

Agregat laporan per tim memakai join **`reports`** ↔ **`team_members`** (mis. [`teamSummary`](../internal/api/rest.go) di `rest.go`), **bukan** isi JSON task per kartu.

---

## 4. Opsi pengembangan (jika produk ingin “muncul”)

| # | Opsi | Catatan BE |
|---|------|------------|
| 1 | **Proyeksi tugas → `calendar_events`** | Pada `PATCH`/`POST` report (atau job async): task → baris kalender; deduplikasi, update drag, hapus task, izin tim. |
| 2 | **Endpoint baca** `GET /api/v1/reports/tasks-in-range?from=&to=&teamId=` | Parse / `JSONB` `body` di server; FE gambar layer kedua tanpa mengubah `calendar_events` dulu. |
| 3 | **Tabel `report_tasks`** | Normalisasi + sinkron dari body; kalender & query baca dari sini. |
| 4 | **Team board** | Endpoint filter laporan per tim + expand `body` (read-only Kanban) + policy. |
| 5 | **Operasional** | Pastikan user di **`team_members`** — tanpa tim, fitur bergantung `teams` tetap kosong. |

---

## 5. Referensi file

| Area | Path |
|------|------|
| Skema body Kanban | [`BE_SPEC_REPORT_KANBAN_BODY_SCHEMA.md`](./BE_SPEC_REPORT_KANBAN_BODY_SCHEMA.md) |
| FE Daily Report | `../FE/pages/report.vue`, `../FE/utils/report-kanban-payload.ts` |
| FE Kalender | `../FE/pages/calendar.vue` |
| FE Team Monitoring | `../FE/pages/team.vue`, [`BE_SPEC_TEAM_MONITORING_DIVISIONS.md`](./BE_SPEC_TEAM_MONITORING_DIVISIONS.md) |
| BE kalender | `internal/api/rest.go` (`listCalendar`), migrasi `calendar_events` |
| BE ringkasan tim | `internal/api/rest.go` (`teamSummary`) |

---

*Menjawab gap ekspektasi user; tidak mengubah kontrak API kecuali produk memilih opsi di §4.*
