# Kalender: tim, divisi, & data organisasi (WorkPulse)

Halaman **Kalender** di FE (`pages/calendar.vue`) memakai data nyata:

| Endpoint | Fungsi |
|----------|--------|
| `GET /api/v1/teams` | Daftar tim yang **anggota Anda** ikuti (`id`, `name`, `slug`). Dipakai chip filter & nama tim pada acara. |
| `GET /api/v1/calendar/events?from=&to=` | Acara bentrok rentang waktu; **`from` / `to`** wajib (`YYYY-MM-DD` atau RFC3339). Respons: array `{ id, userId, title, startsAt, endsAt, allDay, createdAt, teamId?, teamName? }`. Query opsional **`teamId`** (filter server-side). |
| `GET /api/v1/calendar/org-events` | **Superadmin** — acara **semua** user; query `from`,`to` wajib; opsional `teamId`, `division` (via `reports.division` pemilik acara), `userId`. Field tambahan **`organizerName`**. Lihat [`../BE/docs/BE_SPEC_CALENDAR_TEAMS_AND_DIVISIONS.md`](../BE/docs/BE_SPEC_CALENDAR_TEAMS_AND_DIVISIONS.md). |

Acara pribadi difilter di **SQL** dengan `user_id = pemilik token` — **`/calendar/events`**. Endpoint organisasi terpisah di atas.

---

## Yang sering diminta berikutnya (untuk tim BE)

### 1. Nama tim di respons acara (tanpa ronde ekstra di FE)

- **`GET /calendar/events`** menambahkan field opsional `teamName` (join `teams` pada `team_id`) agar label konsisten walau cache tim di FE kosong.

**Status:** **Sudah** di BE.

### 2. Filter server-side

- Query opsional `teamId=…` agar payload lebih kecil saat user hanya ingin satu tim.

**Status:** **Sudah** di BE (`GET /calendar/events`).

### 3. Kalender “divisi / organisasi”

- Endpoint terpisah mis. **`GET /api/v1/calendar/org-events`** (role admin / anggota divisi) dengan filter `division` atau `teamId`, yang mengembalikan acara **semua anggota** relevan — membutuhkan aturan izin dan model data divisi (bukan hanya `teams.slug`).

**Status:** **`GET /calendar/org-events`** di BE — saat ini **`superadmin`**; filter `division` memakai **`reports.division`** untuk user pemilik acara. Perlu role tambahan / master divisi bisa ditambah kemudian.

### 4. Realtime

- **SSE / WebSocket** untuk perubahan acara — sama seperti notifikasi, perhatikan auth (`EventSource` tanpa header `Authorization`).

**Status:** belum — tetap polling di FE.

---

## File kode BE (saat ini)

- `internal/api/rest.go` — `listTeams`, `listCalendar`
- `internal/api/calendar_org.go` — `listCalendarOrg`
- `internal/api/router.go` — `/teams`, `/calendar/events`, `/calendar/org-events` (superadmin)

**Path dokumen ini (repo FE):** `FE/docs/BE_SPEC_CALENDAR_TEAMS_AND_DIVISIONS.md`  
**Detail BE:** [`../BE/docs/BE_SPEC_CALENDAR_TEAMS_AND_DIVISIONS.md`](../BE/docs/BE_SPEC_CALENDAR_TEAMS_AND_DIVISIONS.md)

Setelah menambah endpoint baru: build API + restart PM2 `workpulse-api`.
