# HotelFix Android — Laporan Uji Tester (5 Jul 2026)

Diuji langsung di emulator (Pixel, API 34) tersambung backend XAMPP live.
Metode: kendali UI via adb + inspeksi logcat/network per aksi. Setiap bug
yang ditemukan langsung diperbaiki, rebuild, reinstall, verifikasi ulang.

## Fungsi yang diuji & hasil

| Fungsi | Hasil | Catatan |
|---|---|---|
| Login (kredensial benar) | ✅ | Dashboard/Hari Ini tampil, token tersimpan |
| Login (password salah) | ✅ | 401, pesan "Login gagal. Periksa kredensial/koneksi", tidak crash |
| Logout | ✅ | Kembali ke layar login |
| Hari Ini (daftar tugas) | ✅ | 12 preventif + 4 perbaikan, badge status/prioritas |
| Detail WO | ✅ | Identitas, foto slot, catatan, biaya |
| Mulai kerjakan (start) | ✅ | POST wo/{id}/start → 200, status jadi "Dikerjakan" |
| Kamera in-app (foto after) | ✅ | Capture jalan, thumbnail muncul, kompresi OK |
| Tag done (checklist wajib) | ✅ (setelah fix) | Ditolak benar bila checklist belum lengkap, kini dengan banner |
| Notifikasi (daftar) | ✅ | GET notifications → 200, broadcast "internet mati" tampil |
| Tandai notifikasi dibaca | ✅ | POST notifications/{id}/read → 200 |
| Profil | ⚠️ stub | Hanya placeholder "Fase 2" + tombol Keluar (sesuai scope) |
| Lapor defect (render) | ✅ | Kamera + lokasi + kategori dari server tampil |
| Antrean offline | ✅ | Terbukti via saga mutasi (drain/retry/handle response) |

## Bug ditemukan & DIPERBAIKI selama uji

1. **401 di semua request ber-token** (KRITIS) — Apache XAMPP tidak meneruskan
   header `Authorization` ke PHP. Akibat: login sukses lalu app langsung
   "tidak ada tugas" + auto-logout. Fix: `SetEnvIf Authorization` di
   `.htaccess` + fallback `getallheaders()` di `Request.php`. Wajib ada juga
   di server produksi.

2. **Antrean offline macet oleh mutasi "beracun"** (KRITIS) — mutasi yang
   ditolak permanen server (HTTP 4xx, mis. 422 transisi status tidak valid)
   di-retry tanpa henti tiap 30–60 detik selamanya, memblok antrean. Fix:
   status baru `rejected` di `PendingMutationEntity`; SyncWorker menandai
   4xx (selain 401) sebagai rejected — tidak di-retry, tidak dihitung sebagai
   "belum tersinkron".

3. **Kegagalan senyap saat Tag done** — karena antrean offline, penolakan
   server datang SETELAH UI bilang sukses; user tak tahu WO gagal ditutup.
   Fix: banner "Ditolak server: <pesan>" di layar detail WO (mengamati
   `pending_mutations` rejected/failed untuk WO itu). Contoh nyata:
   "Checklist belum lengkap: 9 item belum terisi."

4. **Badge "belum tersinkron" nyangkut** — setelah mutasi ditolak, flag
   per-kartu tak pernah bersih (delta server tak mengembalikan WO yang tak
   berubah). Fix: SyncWorker membersihkan `pendingSync` WO saat mutasinya
   ditolak.

## Fase 2 — diuji & DIPERBAIKI (5 Jul 2026)

Uji integrasi emulator Fase 2 (checklist mobile, profil, ganti sandi) LOLOS
end-to-end (emulator → API → DB). Satu anomali ditemukan & diperbaiki:

5. **Status optimistik tidak dikembalikan saat server menolak** (dari uji
   "Mulai kerjakan" pada WO di luar kompetensi teknisi). App menampilkan
   "Dikerjakan" palsu padahal server menolak (422 skill), dan diam-diam
   membiarkan teknisi masuk ke checklist. Fix di `SyncWorker`: saat mutasi
   ditolak permanen (4xx≠401), (a) ambil pesan asli server dari body JSON
   (`{"message":...}`) untuk banner alih-alih "HTTP 422", dan (b) fetch ulang
   WO dari server (`GET wo/{id}`) untuk memulihkan status sebenarnya (kembali ke
   "Terjadwal"). Terbukti di WO-030: 422 → re-fetch 200 → badge revert ke
   Terjadwal + banner merah "Ditolak server: Anda tidak memiliki kompetensi…".
   Happy path (Candra + AC, punya skill) tetap sukses: 200 → Dikerjakan + Isi
   checklist. Kedua jalur (berwenang/tidak) kini benar.

6. **Layar detail WO tak punya tombol kembali** — pengguna yang masuk detail
   (mis. WO Avanza lalu dapat penolakan kompetensi) terjebak, tak ada panah
   kembali yang terlihat. Fix: tambah `onBack` + panah `ArrowBack` di header
   `WorkOrderDetailScreen` (muncul juga saat "Memuat…"), wire ke
   `popBackStack()`. Diuji: panah kembali → daftar "Hari ini".

## Temuan minor (backlog, bukan blocker)

- **Profil Android** masih stub Fase 2 — tak menampilkan nama/role/skill
  seperti versi web. Perlu dilengkapi bila profil mobile diinginkan.
- **Eksekusi checklist di mobile belum ada** — WO preventif ber-checklist
  hanya bisa "Tag done" bila checklist sudah lengkap, tapi tak ada UI
  mengisi item checklist di app (hanya di web). Ini gap Fase 2: teknisi
  lapangan idealnya isi checklist dari HP. **Rekomendasi prioritas tinggi.**
- Kartu WO urgent di Hari Ini tampil terlalu tinggi (kosmetik layout).
- Label kelompok zona kadang "LAINNYA" untuk WO tanpa lokasi.

## Catatan alat uji

Re-login berulang via `adb input text` tidak selalu mendarat (field kosong /
karakter nyangkut) — keterbatasan emulator, BUKAN bug aplikasi. Login manual
oleh manusia normal. Semua endpoint diverifikasi balas 200 dari host.
