Files
web-antrean/docs/DEVLOG.md
T

681 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 📓 DEVLOG — Development Log
**Project:** Web Antrean — Sistem Manajemen Antrean Rawat Jalan RSSA
**Author:** Akbar
**Stack:** JavaScript · Vue 3 · TypeScript · Nuxt 3 · Vuetify 3 · Pinia
---
## 🧠 AI Prompt — Cara Menggunakan Dokumen Ini
> Salin prompt berikut ke Claude untuk membantu mengisi DEVLOG harian:
```
Kamu adalah technical writer. Bantu aku menulis DEVLOG untuk hari ini.
Context:
- Project: Web Antrean — Sistem Manajemen Antrean Rawat Jalan RSSA
- Stack: Nuxt 3, Vue 3, TypeScript, Vuetify 3, Pinia, WebSocket, Keycloak
- Yang dikerjakan hari ini: [ceritakan bebas]
- Masalah yang ditemui: [ceritakan]
- Solusi yang diterapkan: [ceritakan]
Format output:
## [Tanggal] — [Judul Singkat]
**Yang dikerjakan:** ...
**Keputusan teknis:** ...
**Masalah & solusi:** ...
**Besok:** ...
```
---
## Format Entry
```markdown
## [YYYY-MM-DD] — [Judul Singkat Pekerjaan]
**Sprint/Phase:** [nama sprint atau fase]
**Durasi:** [X jam]
**Status:** ✅ Done | 🔄 In Progress | ⏸ Blocked
### Yang Dikerjakan
- ...
### Keputusan Teknis
> Jelaskan keputusan arsitektur/implementasi penting dan alasannya
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| | | |
### Besok
- [ ] ...
### Referensi
- [link]
```
---
## Log Entries
<!-- Tambahkan entry baru di bawah baris ini, urutan terbaru di atas -->
## 2026-06-23 — Refactoring queueStore.js ke TypeScript (Phase 2: WebSocket & Typings)
**Sprint/Phase:** Phase 6 (Verifikasi Akun & Kiosk) / Refactoring Technical Debt
**Durasi:** 1 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Membuat composable mandiri `composables/useQueueSync.ts` dan memindahkan lebih dari 200 baris logika *WebSocket* (`onWsMessage`, `connect`, `startAutoSync`) dari dalam *store*.
- Menjalankan *scripting* untuk me-resolve sebagian besar error peringatan `implicit any type` dan `catch(error: any)` di dalam `queueStore.ts`.
- Menerapkan injeksi dependencies dari `queueStore` ke dalam parameter `useQueueSync()` tanpa memutus *reactivity* dari Pinia state.
### Keputusan Teknis
> **Dependency Injection pada Composable:** Karena fungsionalitas WebSocket membutuhkan akses terhadap state (`allPatients`, `currentProcessingPatient`) dan actions (`fetchPatientsForLoket`, dll), maka variabel-variabel tersebut dilempar (injected) melalui parameter `deps` ke dalam fungsi `useQueueSync(deps)`. Hal ini mencegah masalah *circular dependencies* di ekosistem Nuxt/Pinia.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Pinia-Plugin-PersistedState *type mismatch* pada `paths` config | Menambahkan flag `// @ts-ignore` untuk properti `paths` karena kompatibel secara *runtime* namun melanggar validasi tipe di rilis plugin yang terpasang. | QMD: Technical Debt |
### Besok
- Menguji secara manual interaksi antar *terminal* (Anjungan, Loket, Klinik) untuk memverifikasi fungsionalitas `useQueueSync`.
- Menulis Unit Tests (jika platform sudah siap).
---
## 2026-06-23 — Refactoring queueStore.js ke TypeScript (Phase 1)
**Sprint/Phase:** Phase 6 (Verifikasi Akun & Kiosk) / Refactoring Technical Debt
**Durasi:** 1 jam
**Status:** 🔄 In Progress
### Yang Dikerjakan
- Mengubah ekstensi file `queueStore.js` menjadi `queueStore.ts`.
- Membuat file definisi tipe antrean di `types/queue.ts` (`QueuePatient`).
- Mengekstrak raw fetch API calls (Loket, Visit, Update, Selesai Tiket) ke composable mandiri `composables/useQueueAPI.ts`.
- Melakukan transisi pada fungsi-fungsi besar (`fetchPatientsForLoket`, `callNext`, `callMultiplePatients`, `processPatient`) di dalam `queueStore.ts` untuk menggunakan `useQueueAPI` guna memangkas boilerplate fetch.
### Keputusan Teknis
> **Incremental Refactoring:** Menghindari pecahnya `queueStore` secara drastis dengan tetap mempertahankan satu *store instance* (`useQueueStore`) namun mengabstraksi beban logikanya keluar (*API* & *Sync layer*). Ini meminimalisasi *blast radius* / *breaking changes* ke komponen UI yang sudah jalan.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Pembengkakan ukuran *store file* (>3500 baris, 145KB). | Mulai memisahkan logika pemanggilan API eksternal dan mendefinisikan strukturnya dengan TypeScript. | QMD: Technical Debt |
### Besok
- Membuat tipe yang strict untuk `state` dan seluruh *method signatures* di `queueStore.ts`.
- Mengekstraksi fungsionalitas WebSocket ke `composables/useQueueSync.ts`.
- Jika sudah ringan, memecah *store* menjadi `loketQueueStore` dan `clinicQueueStore`.
---
## 2026-06-19 — Fitur Detail Akun Verifikasi
**Sprint/Phase:** Phase 6 — Verifikasi Akun
**Durasi:** ~4 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Penambahan halaman `DetailAkun.vue` (`400bfcd`)
- Update `VerifikasiAkun.vue` untuk integrasi dengan detail akun
- Modifikasi konfigurasi Vuetify di `plugins/vuetify.ts`
### Keputusan Teknis
> Pembuatan halaman detail akun terpisah untuk memberikan view lengkap informasi akun yang sedang diverifikasi, memperbaiki user experience admin saat memvalidasi data user.
---
## 2026-06-0809 — Voice Over Antrean & Manajemen Loket/Klinik
**Sprint/Phase:** Phase 5 — Stabilisasi & Kiosk Features
**Durasi:** ~12 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Implementasi sistem notifikasi suara (voice over) untuk antrean loket dan klinik (`8b9c472`)
- Update UI `AdminLoket/[id].vue` dan `Anjungan/AntrianLoket/[id].vue` untuk support voice announcement
- Modifikasi `queueStore.js` untuk integrasi status antrean
- Resolusi isu WebSocket dan CORS policy pada endpoint api antrean
### Keputusan Teknis
> Menggunakan voice synthesis/announcement otomatis untuk pendaftaran antrean agar pasien dengan keterbatasan visual dapat dipanggil secara otomatis dan jelas di area loket maupun klinik.
---
## 2026-06-0205 — Proxy Routes & Fitur Pindah Klinik
**Sprint/Phase:** Phase 5 — Integrasi API & Queue System
**Durasi:** ~16 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Implementasi proxy routes untuk `klinik-api`, `stats-api`, `visit-api` menghindari CORS issues (`0928e78`)
- Fitur pindah klinik pada dashboard admin (`f81dd57`)
- Penambahan dialog konfirmasi (CheckIn, Unfinished Patient) di queue features
- Store lokalisasi menggunakan Pinia untuk loket, klinik, dan queue management (`047b390`)
- Pembaruan DEVLOG, DEVPLAN, PRD, QMD, dan EVLOG
### Keputusan Teknis
> Menggunakan proxy routes di sisi server (Nitro) untuk mem-bypass CORS ketika memanggil backend API. Hal ini memperkuat keamanan dan menstabilkan fetch data dari aplikasi Vue frontend ke service backend.
## 2026-05-25 — Perbaikan & Dokumentasi Project
**Sprint/Phase:** Phase 5 — Stabilisasi & Dokumentasi
**Durasi:** ~4 jam
**Status:** 🔄 In Progress
### Yang Dikerjakan
- Push perbaikan berbagai bug (`ffdb88d`)
- Pembuatan dokumentasi project: PRD, QMD, DEVLOG
- Stabilisasi WebSocket sync dengan deterministic client ID
- Penambahan polling fallback 30 detik di semua admin interface
### Keputusan Teknis
> Membuat dokumentasi lengkap (PRD, QMD, DEVLOG) untuk meningkatkan maintainability project ke depan. Semua dokumen diisi berdasarkan kondisi aktual project, bukan template kosong.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Dokumentasi project belum ada | Buat PRD, QMD, DEVLOG di folder `docs/` | — |
### Besok
- [ ] Review dan finalisasi dokumen
- [ ] Lanjutkan stabilisasi fitur penunjang
---
## 2026-05-22 — Stabilisasi WebSocket & Tooltips Dashboard
**Sprint/Phase:** Phase 5 — Stabilisasi
**Durasi:** ~8 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Standardisasi header konfigurasi (origin & referer) di `stats-api`, `visit-api`, `klinik-api` ke `http://10.10.150.175:3000`
- Penambahan tooltips di komponen Dashboard
- Standardisasi WebSocket client ID menjadi deterministic untuk reliable cross-device messaging
- Implementasi polling fallback 30 detik di semua admin interface
- Audit semua halaman yang bergantung WebSocket
### Keputusan Teknis
> WebSocket client ID diubah dari random ke deterministic agar server bisa menargetkan pesan ke device tertentu. Polling 30 detik ditambahkan sebagai safety net jika WebSocket disconnect — ini menghindari data drift antar display.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Header origin/referer tidak konsisten antar proxy route | Standardisasi ke `http://10.10.150.175:3000` di semua route handler | `server/routes/` |
| Data antrean tidak sinkron antar display saat WS drop | Polling fallback 30 detik + deterministic WS client ID | `useWebSocket.ts` |
---
## 2026-05-21 — Perbaikan Layar Info & Isolasi Loket
**Sprint/Phase:** Phase 5 — Stabilisasi
**Durasi:** ~6 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Fix: info klinik ruang tidak muncul di layar informasi (`ec9dac0`)
- Isolasi state `currentProcessingPatient` menggunakan unique storage key per loket
- Perbaikan `processNextQueue` dan `callNext` — strict filter berdasarkan `loketId`
- Validasi WebSocket event handler agar tidak ada update lintas loket yang tidak sah
- Memastikan `allPatients` tetap single source of truth
### Keputusan Teknis
> Masalah kritis: loket A memproses pasien loket B karena `currentProcessingPatient` menggunakan key yang sama. Solusi: setiap loket mendapat unique persisted state key (`currentPatient_loket_{id}`).
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Cross-loket interference pada `currentProcessingPatient` | Unique storage key per loket di persisted state | `queueStore.js` |
| `processNextQueue` memproses pasien dari loket lain | Strict filter berdasarkan `loketId` dan service mapping | `useQueue.js` |
| WebSocket event mengupdate loket yang salah | Guard check di event handler | `useWebSocket.ts` |
---
## 2026-05-20 — Subspesialis & Perbaikan Bug Loket
**Sprint/Phase:** Phase 4 — Fitur Eksekutif
**Durasi:** ~7 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Penambahan fitur subspesialis di PatientCard (`1446e87`)
- Display subspesialis sebagai pill/chip di samping status badge
- Perbaikan bug tampilan loket (`f622052`)
- UI enhancement: PatientCard menampilkan info ruang/subspesialis secara kondisional
### Keputusan Teknis
> Subspesialis ditampilkan sebagai pill/chip di PatientCard agar admin klinik bisa langsung melihat spesialisasi pasien tanpa perlu buka detail. Conditional rendering — tampilkan ruang ATAU subspesialis, tergantung data yang tersedia.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Info subspesialis tidak tampil di card pasien | Tambah conditional pill/chip di `PatientCard.vue` | `components/features/queue/PatientCard.vue` |
| Bug tampilan loket | Fix layout dan data binding | `pages/AdminLoket.vue` |
---
## 2026-05-19 — Docker & Anjungan Eksekutif
**Sprint/Phase:** Phase 4 — Fitur Eksekutif & Deployment
**Durasi:** ~8 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Penambahan Dockerfile dan docker-compose untuk deployment (`bc74b98`)
- Refinement UI anjungan eksekutif — pilihan subspesialis
- Peningkatan kontras dan visibilitas button seleksi (border tebal, shadow, hover state)
- Implementasi handler function untuk selection state yang robust
### Keputusan Teknis
> Docker ditambahkan untuk standardisasi deployment. Anjungan eksekutif mendapat UI khusus dengan radio-style button yang lebih intuitif — target user adalah pasien dengan tech level rendah, jadi kontras dan ukuran harus maksimal.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Deployment manual dan tidak konsisten | Dockerfile + docker-compose | `Dockerfile`, `docker-compose.yml` |
| Button seleksi subspesialis kurang kontras | Thicker border, deeper shadow, distinct hover/selected state | Anjungan pages |
---
## 2026-05-18 — Optimasi Performa & Memory
**Sprint/Phase:** Phase 5 — Stabilisasi
**Durasi:** ~6 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Perbaikan memory usage dan load performance (`cb3310b`)
- Verifikasi status kunjungan operasi
- Pengecekan semua API endpoint yang sudah terintegrasi
- Pembersihan `console.log` verbose di high-frequency path
### Keputusan Teknis
> Mengurangi memory footprint dengan: (1) membersihkan verbose logging di WebSocket handler dan QR scanner, (2) implementasi blacklist untuk endpoint yang terus-menerus gagal agar tidak spam request.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| `doctorStore.js` terus retry endpoint yang 500 | Implementasi blacklist endpoint gagal | `stores/doctorStore.js` |
| `console.log` verbose di `useWebSocket.ts` | Cleanup logging di high-frequency path | `composables/useWebSocket.ts` |
| Memory usage terus naik | Reduce excessive API retry + cleanup logging | — |
---
## 2026-04-20 — Update Hak Akses & Perbaikan Tiket
**Sprint/Phase:** Phase 3 — Hak Akses & Permission
**Durasi:** ~6 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Update sistem hak akses berbasis Keycloak role & group (`2bf00ef`)
- Perbaikan API pembuatan tiket antrean
- Standardisasi user role slugs dari Keycloak groups
- Implementasi slugification utility untuk role normalization
### Keputusan Teknis
> Role dari Keycloak group path (`/Instalasi STIM/Devops/Superadmin`) di-slugify menjadi URL-friendly (`instalasi-stim-devops-superadmin`) untuk konsistensi di permission API dan internal user data.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Role dari Keycloak tidak URL-friendly | Implementasi slugification utility | `composables/useHakAkses.ts` |
| Tiket antrean gagal digenerate | Perbaikan API endpoint pembuatan tiket | `server/api/` |
---
## 2026-04-15 — Update Favicon
**Sprint/Phase:** Phase 3 — Polish
**Durasi:** ~1 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Ganti favicon aplikasi web-antrean
- Update konfigurasi `app.head` di `nuxt.config.ts` untuk mengarah ke file icon baru
### Keputusan Teknis
> Favicon diletakkan di folder `public/` dan direferensi via `nuxt.config.ts` → `app.head.link`.
---
## 2026-04-13 — Integrasi Keycloak Role Access
**Sprint/Phase:** Phase 3 — Hak Akses & Permission
**Durasi:** ~8 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Verifikasi dan standardisasi akses Keycloak role
- Implementasi middleware `auth.ts`, `guest.ts`, `permissions.ts`, `checkPageAccess.ts`
- Setup permission store (`permissionStore.ts`)
- Integrasi permission API endpoint (`server/api/permission.get.ts`)
### Keputusan Teknis
> Menggunakan 4 layer middleware: (1) `auth.ts` — cek login, (2) `guest.ts` — redirect jika sudah login, (3) `permissions.ts` — cek hak akses halaman, (4) `checkPageAccess.ts` — validasi granular per page. Model ini memastikan defense-in-depth untuk access control.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Role dari Keycloak format path, bukan slug | Konversi ke slug untuk matching di permission API | `middleware/permissions.ts` |
---
## 2026-02-24 — Perbaikan Ambil Tiket
**Sprint/Phase:** Phase 2 — Fitur Inti
**Durasi:** ~4 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Fix bug pengambilan tiket antrean di anjungan (`94ff9f5`)
- Perbaikan flow generate nomor antrean
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Tiket gagal digenerate pada kondisi tertentu | Fix logic generate nomor antrean | `composables/useQRGenerator.ts` |
---
## 2026-02-19 — Implementasi Anjungan (Kiosk) & Queue Store
**Sprint/Phase:** Phase 2 — Fitur Inti
**Durasi:** ~10 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Implementasi modul Anjungan (Kiosk) lengkap (`0c4019c`)
- Halaman pilih klinik, klinik ruang, penunjang
- Halaman antrian per klinik, klinik ruang, penunjang
- Check-in pasien via QR
- Admin anjungan
- Implementasi Pinia store baru untuk queue management (`4342cdc`)
- Integrasi dengan Visit API dan Antrian API
- WebSocket integration untuk real-time update
- Halaman admin dan kiosk display
### Keputusan Teknis
> `queueStore.js` dibuat sebagai central store untuk semua operasi antrean — ini menjadi single source of truth untuk `allPatients`. Keputusan ini mempermudah sinkronisasi real-time tapi membuat file menjadi sangat besar (saat ini 141KB). Perlu dipecah di masa depan.
---
## 2026-02-18 — Core Anjungan Display & Verification
**Sprint/Phase:** Phase 2 — Fitur Inti
**Durasi:** ~8 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Implementasi core display system anjungan (`7d07a4f`)
- Display antrean klinik ruang
- Display antrean masuk
- Display antrean loket
- Tambah verification store dan konfigurasi endpoint baru (`f78bbea`)
- `verificationApiBaseUrl``http://10.10.123.140:8089/api/v1`
- `ekstrakExpertiseUrl` endpoint
- Fix wsBaseUrl fallback di Nuxt config (`d03fa63`)
### Keputusan Teknis
> Dual backend API architecture: Visit API (port 8084) untuk data kunjungan utama, Antrian API (port 8089) untuk verifikasi dan data klinik/dokter. Proxy layer Nitro digunakan untuk bypass CORS dan menyembunyikan IP backend dari client.
---
## 2026-02-13 — Admin Loket, Klinik Ruang & Queue Management
**Sprint/Phase:** Phase 2 — Fitur Inti
**Durasi:** ~10 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Implementasi halaman Admin Loket detail (`8c6b3fd`)
- Manajemen antrian pasien per loket
- Aksi pasien: panggil, skip, recall, selesai
- Dialog seleksi (pilih loket, pilih layanan)
- Implementasi `AdminKlinikRuang` page (`67a5514`)
- Manajemen antrian per klinik ruang
- Processing, calling, filtering, global search
- Implementasi komprehensif patient queue management (`dbc9054`)
- Pinia store untuk queue
- API integration
- Admin counter page
- Tambah komponen `PatientCard`, `CurrentPatientCard` (`95ff830`)
- Fitur queue management untuk klinik ruang dan counter (`4df13cb`)
### Keputusan Teknis
> Memisahkan queue components menjadi 4 komponen: `PatientCard` (card per pasien), `CurrentPatientCard` (pasien sedang dilayani), `QueueActionsCard` (tombol aksi), `TabelPatientData` (tabel lengkap). Ini memastikan reusability di halaman admin loket, klinik, dan penunjang.
---
## 2026-02-12 — Anjungan Pages, WebSocket & Queue API
**Sprint/Phase:** Phase 2 — Fitur Inti
**Durasi:** ~10 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Introduce halaman Anjungan untuk antrian klinik, klinik ruang, dan counter (`a5ab338`)
- Tambah halaman check-in pasien
- Implementasi core queue management system dengan WebSocket (`0e3ee37`)
- Pinia store untuk queue
- WebSocket integration
- Halaman check-in dan kiosk display
- Update post API klinik dan loket di queueStore (`4985aef`)
- Fix status pasien selesai di klinik ruang (`c08941a`)
- Various merge dan bugfix
### Keputusan Teknis
> WebSocket dipilih sebagai primary communication channel untuk real-time sync karena latensi < 2 detik krusial di rumah sakit — pasien harus langsung melihat nomor panggil berubah di layar display.
---
## 2026-02-1011 — WebSocket Bug Fixing
**Sprint/Phase:** Phase 2 — Stabilisasi WebSocket
**Durasi:** ~12 jam (2 hari)
**Status:** ✅ Done
### Yang Dikerjakan
- Fix bug WebSocket di check-in loket (`b6dc252`)
- Fix socket check-in flow (`e686dda`)
- Update socket data dan token handling (`fb70237`)
- Fix duplikasi data dan ticket menghilang di admin klinik loket (`c02905e`)
- Update WS untuk admin loket dan check-in (`a7a654b`)
- Fix missing function error (`23164bc`)
- Perbaikan sorting pasien di next process (`6af3f58`)
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Duplikasi tiket di admin klinik | Fix logic deduplication di WebSocket handler | `useWebSocket.ts` |
| Tiket menghilang setelah check-in | Fix state update flow — pastikan re-render setelah WS event | `queueStore.js` |
| Socket check-in tidak trigger update | Fix event listener binding | `composables/useCheckIn.ts` |
---
## 2026-02-09 — Integrasi WebSocket
**Sprint/Phase:** Phase 2 — Real-time
**Durasi:** ~6 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Setup dan implementasi WebSocket client (`101dc38`)
- Koneksi ke `ws://10.10.123.135:8084/api/v1/ws`
- Implementasi `useWebSocket.ts` composable
### Keputusan Teknis
> Menggunakan native browser WebSocket API dibungkus composable (`useWebSocket.ts`) daripada library seperti `socket.io` — mengurangi dependency dan lebih ringan untuk environment LAN internal.
---
## 2026-02-0206 — API Integration & Display Screen
**Sprint/Phase:** Phase 2 — Integrasi API
**Durasi:** ~20 jam (5 hari)
**Status:** ✅ Done
### Yang Dikerjakan
- Update tampilan layar screen display (`cf54ded`)
- Penambahan API klinik ruang (`a29838e`, `b327997`, `c2d9023`)
- Update logika pemanggilan admin loket by payment (`efeb42e`)
- Fix HTTPS implementation dan check-in (`c899a71`)
- Update session dan WebSocket (`0428017`)
- Update status klinik ruang (`6696881`)
- Update tampilan anjungan (`329ac9c`)
- Fixing admin loket dan blokade loket yang tidak tersedia (`5d139c8`)
- Update verifikasi dan lainnya (`2838016`)
- Update post API status dan data pasien ruang (`e2a5d43`)
### Keputusan Teknis
> Logika pemanggilan admin loket diubah menjadi payment-based — pasien yang sudah bayar diprioritaskan. Loket yang tidak tersedia di-blokade otomatis agar petugas tidak melihat loket yang bukan tanggung jawabnya.
---
## 2026-01-2830 — Master Data & API Queue Store
**Sprint/Phase:** Phase 1 — Fondasi
**Durasi:** ~12 jam (3 hari)
**Status:** ✅ Done
### Yang Dikerjakan
- Update master data berdasarkan jenis layanan (`9f0f6a7`)
- Update API antrean masuk dan minor changes (`507f415`)
- Fix session dan tampilan screen (`8dd94ed`)
- Fix loop dan duplikasi data (`0bd5311`)
- Update fetch API (`cccefb0`)
- Update layout semua halaman (`ae8b06d`)
- Update queueStore dari API (`19633af`)
- Minor update anjungan (`59e42f3`)
---
## 2026-01-2227 — Admin Loket & API Integrasi
**Sprint/Phase:** Phase 1 — Fondasi
**Durasi:** ~16 jam (4 hari)
**Status:** ✅ Done
### Yang Dikerjakan
- Update logika penarikan API dan tampilan anjungan (`e900c5a`)
- Update No RM dan desain (`2ccb378`)
- Update API master loket dan antrian loket (`75a9638`)
- Update anjungan (`8de89cb`)
- Update master klinik ruang (`6c08352`)
- Update sidebar check-in dan antrian loket (`525322b`)
- Update API loket admin (`083fe3e`)
- Push update admin loket (`f606045`)
---
## 2026-01-1921 — Layout, Sidebar, Dashboard & Monitoring
**Sprint/Phase:** Phase 1 — Fondasi
**Durasi:** ~20 jam (3 hari)
**Status:** ✅ Done
### Yang Dikerjakan
- Update flow klinik ruang dan design consistency (`cbd8f44`)
- Update sidebar, profile, dan loket (`f2efd83`)
- Update loket dan monitoring (`81b877b`, `c00c18e`)
- Update page header komponen (`00bb954`)
- Sidebar change (`3db912a`)
- Update header, card, dialog (`fde7111`, `531ca10`, `f7a3b20`)
- Perubahan update sidebar, dashboard, monitoring, antrean loket, verifikasi (`bb71955`)
- Update check-in tampilan dan function (`482294b`)
### Keputusan Teknis
> Layout system menggunakan Vuetify navigation drawer (`SideBar.vue`) + custom `PageHeader.vue`. Design consistency diterapkan via SCSS variables (`_variables.scss`, `_colors.scss`) untuk warna, spacing, dan typography.
---
## 2026-01-15 — Login Page, Check-in & Antrean Masuk
**Sprint/Phase:** Phase 1 — Fondasi
**Durasi:** ~8 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Implementasi login page dan check-in (`e99a0ab`)
- Update color palette dan konsultasi pasien (`a8a55b9`)
- Tampilan antrean masuk (`ed57e2d`)
- Edit manual check-in (`928be7c`)
- Update logika pemanggilan, sticky konten, tampilan card (`96c6376`)
- Perbaikan generate dan scan tiket QR (`8aa5ab2`)
### Keputusan Teknis
> QR code digunakan untuk tiket antrean — pasien mendapat QR saat ambil antrean, lalu scan QR saat check-in. Library `html5-qrcode` dipilih untuk scanner dan `qrcode.vue` untuk generator.
---
## 2026-01-1214 — Loket, Klinik Ruang & Fast Track
**Sprint/Phase:** Phase 1 — Fondasi
**Durasi:** ~16 jam (3 hari)
**Status:** ✅ Done
### Yang Dikerjakan
- Update layout klinik dan WebSocket layar klinik (`6e7160c`)
- Update klinik ruang dan status fast track (`27209de`)
- Perubahan tiket dan alur antrean (`5c14227`)
- Push loket baru (`42fe62c`)
- Loket perbaikan "sedang dilayani" (`48e4aab`)
- Anjungan fast track dan tampilan ruang (`3817b2d`)
- Perbaikan loket dan total antrean (`a000ba0`, `0a8e11a`, `9ccbaba`)
- Check-in tampilan (`0c7b33a`)
- Fixing layar loket dan status pasien (`e80032f`)
- QRcode update (`6c80c08`)
- Update warna dan klinik ruang (`f3e90ad`)
- Perubahan antrean masuk (`c5b623f`)
- Update seed data dan fungsi pindah/konsul klinik (`89c3549`)
---
## 2026-01-0809 — Klinik Ruang, QR & Print
**Sprint/Phase:** Phase 1 — Fondasi
**Durasi:** ~12 jam (2 hari)
**Status:** ✅ Done
### Yang Dikerjakan
- Layar baru antrean klinik dan antrean masuk (`2d3d589`)
- Update klinik ruang (`ca5913c`)
- Nav items (`8a4bb44`)
- Update print admin loket, logika klinik ruang, numbering antrian baru (`676bdc0`)
- Update QR function (`22d7205`)
- Perubahan format No Antrean (`6d5d565`)
- Check-in footers detail (`1b7a142`)
- Klinik ruang dan update admin loket (`9ea8300`)
### Keputusan Teknis
> Format nomor antrean: `[KodeKlinik]-[NomorUrut]` (contoh: `PDL-001`). Thermal print diimplementasi via `useThermalPrint.ts` composable untuk cetak tiket langsung dari browser ke printer thermal via Web API.
---
<!-- Tambahkan entry baru di atas baris ini, urutan terbaru di atas -->
---
## 📊 Summary Stats
| Metrik | Value |
|--------|-------|
| Total hari dev | ~50+ hari (Jan 2026 — Mei 2026) |
| Fase project | 5 fase (Setup → Fondasi → Hak Akses → Eksekutif → Stabilisasi) |
| Fitur selesai | 8 modul utama (Anjungan, Check-in, Loket, Klinik, Penunjang, Dashboard, Setting, Hak Akses) |
| Total commits | 80+ commits |
| Bug ditemukan | 15+ (WebSocket, loket interference, memory, display sync) |
| Bug diselesaikan | 15+ |
| Halaman dibuat | 28 halaman |
| Composables | 16 composable |
| Pinia Stores | 13 stores |
| Komponen | 20+ komponen |