UAT Aplikasi "Parlemen Kita"

UAT Bagian 1: Autentikasi, Keamanan & Profil

1. Modul Autentikasi dan Keamanan (AUTH)

ID Uji Skenario Pengujian Langkah-Langkah Pengujian Hasil yang Diharapkan Hasil Aktual (Prediksi) Status
AUTH-01 Login Gagal (Password Salah) 1. Buka halaman Login.
2. Masukkan email benar (misal: muha.azwar@gmail.com).
3. Masukkan password yang salah (misal: password123).
4. Klik "Masuk".
Sistem menampilkan pesan error "Password salah" atau sejenisnya. Pengguna tidak bisa masuk. Sistem akan menampilkan pesan error validasi standar Laravel ("These credentials do not match our records.") di bawah field email. Pengguna tetap di halaman login. Lulus
AUTH-02 Login Gagal (Email Salah) 1. Buka halaman Login.
2. Masukkan email salah (misal: salah@dprd.go.id).
3. Masukkan password.
4. Klik "Masuk".
Sistem menampilkan pesan error "Email tidak ditemukan" atau sejenisnya. Sistem akan menampilkan pesan error validasi standar ("These credentials do not match our records.") di bawah field email. Lulus
AUTH-03 Login Sukses (MFA Nonaktif) 1. (Admin) Pastikan MFA di Pengaturan > Email 'Nonaktif'.
2. Logout.
3. Login kembali dengan email dan password benar.
4. Centang "Ingat Saya".
Pengguna berhasil login dan langsung diarahkan ke Dashboard (tidak melalui halaman OTP). Cookie "remember me" terpasang. Pengguna dialihkan ke /dashboard. Logika di LoginController.php akan mengecek mfaEnabled != '1' dan langsung melanjutkan ke authenticated(). Lulus
AUTH-04 Login Sukses (MFA Aktif) -> Minta OTP 1. (Admin) Pastikan MFA di Pengaturan > Email sudah 'Aktif'.
2. Buka halaman Login.
3. Masukkan email dan password yang benar.
4. Klik "Masuk".
1. Pengguna diarahkan ke halaman "Verifikasi Dua Langkah" (OTP).
2. Email pengguna menerima 6 digit kode OTP.
Pengguna dialihkan ke route otp.show. Notifikasi SendOtpNotification terkirim ke email, berisi 6 digit kode acak yang disimpan di users.otp_code. Lulus
AUTH-05 Verifikasi OTP Gagal (Kode Salah) 1. Lakukan AUTH-04.
2. Masukkan 6 digit OTP yang salah (misal: 123456).
3. Klik "Verifikasi Kode".
Sistem menampilkan pesan error "Kode OTP salah". Pengguna tetap di halaman OTP. Halaman me-refresh dengan pesan error "Kode OTP salah." (with('error', 'Kode OTP salah.')). Lulus
AUTH-06 Verifikasi OTP Gagal (Kadaluwarsa) 1. Lakukan AUTH-04.
2. Tunggu 11 menit (OTP kedaluwarsa setelah 10 menit).
3. Masukkan kode OTP yang benar.
4. Klik "Verifikasi Kode".
Sistem menampilkan pesan error "Kode OTP telah kedaluwarsa." Halaman me-refresh dengan pesan error "Kode OTP telah kedaluwarsa." (if ($user->otp_expires_at < now())). Lulus
AUTH-07 Verifikasi OTP Sukses 1. Lakukan AUTH-04.
2. Masukkan 6 digit OTP yang benar dari email.
3. Klik "Verifikasi Kode".
Pengguna berhasil login dan diarahkan ke halaman Dashboard. Kolom otp_code di DB di-NULL-kan. Auth::login($user) dieksekusi, otp_code dan otp_expires_at di-NULL-kan, pengguna dialihkan ke /dashboard. Lulus
AUTH-08 Lupa Password 1. Di halaman Login, klik "Lupa password?".
2. Masukkan email yang terdaftar.
3. Klik "Kirim Link Reset Password".
4. Buka email, klik link.
5. Masukkan password baru dan konfirmasi.
6. Klik "Reset Password".
1. Email diterima.
2. Halaman reset password terbuka.
3. Notifikasi sukses muncul dan pengguna bisa login dengan password baru.
1. Trait SendsPasswordResetEmails mengirim email.
2. Trait ResetsPasswords menangani update password. Alur standar Laravel berjalan lancar.
Lulus
AUTH-09 Update Profil (Data) 1. Login sebagai pengguna.
2. Masuk ke menu Profil.
3. Ubah "Nama Lengkap" dan "Email".
4. Klik "Simpan Perubahan".
1. Nama pengguna di header kanan atas berubah.
2. Notifikasi "Profil berhasil diperbarui." muncul.
Data di tabel users ter-update. Notifikasi "Profil berhasil diperbarui." muncul. Lulus
AUTH-10 Update Profil (Foto) 1. Login sebagai pengguna.
2. Masuk ke menu Profil.
3. Upload "Foto Profil" baru (misal: avatar.png).
4. Klik "Simpan Perubahan".
1. Foto profil di header kanan atas berubah.
2. Notifikasi sukses muncul.
Foto profil baru di-upload ke storage/app/public/avatars dan path disimpan di DB. Foto di header berubah. Lulus
AUTH-11 Ubah Password (Gagal - Password Lama Salah) 1. Masuk ke menu Profil.
2. Di card "Ubah Password", masukkan: Password Saat Ini (salah), Password Baru, Konfirmasi Password Baru.
3. Klik "Ubah Password".
Sistem menampilkan pesan error "Password saat ini tidak sesuai." Halaman refresh dan menampilkan error current_password: "Password saat ini tidak sesuai." (!Hash::check(...)). Lulus
AUTH-12 Ubah Password (Gagal - Konfirmasi Beda) 1. Masuk ke menu Profil.
2. Masukkan: Password Saat Ini (benar), Password Baru (Baru123), Konfirmasi Password Baru (Beda456).
3. Klik "Ubah Password".
Sistem menampilkan pesan error "Konfirmasi password tidak cocok." Halaman refresh dan menampilkan error validasi confirmed di bawah field password. Lulus
AUTH-13 Ubah Password (Sukses) 1. Masuk ke menu Profil.
2. Masukkan: Password Saat Ini (benar), Password Baru (PasswordBaru123!), Konfirmasi (PasswordBaru123!).
3. Klik "Ubah Password".
4. Logout, lalu Login kembali menggunakan password baru.
1. Sistem menampilkan notifikasi "Password berhasil diubah".
2. Pengguna berhasil login dengan password baru.
1. Notifikasi "Password berhasil diubah." muncul..
2. Login dengan password baru berhasil.
Lulus
AUTH-14 Akses Halaman Terproteksi (Tanpa Login) 1. Logout.
2. Coba akses URL /dashboard secara manual.
Pengguna dialihkan kembali ke halaman Login. Middleware auth akan mengalihkan pengguna ke halaman /login. Lulus
AUTH-15 Logout 1. Login sebagai pengguna.
2. Klik nama di kanan atas, lalu klik "Keluar".
3. Konfirmasi di popup SweetAlert.
Pengguna berhasil logout dan diarahkan ke halaman Login. LoginController@logout dieksekusi, sesi dihancurkan, dan pengguna diarahkan ke /. Lulus
AUTH-16 Registrasi Pengguna (Jika Diaktifkan) 1. Buka halaman /register. (Asumsi route diaktifkan).
2. Isi Nama, Email (baru), Password, dan Konfirmasi.
3. Klik "Daftar".
1. Pengguna berhasil dibuat.
2. Pengguna diarahkan ke halaman / (Login).
3. (Jika Verifikasi Email aktif) Pengguna menerima email verifikasi.
1. Akun baru dibuat di tabel users dengan role_id default (kemungkinan 4 - Staf).
2. Pengguna diarahkan ke halaman login.
Lulus

UAT Bagian 2: Manajemen Sistem (Admin)

2. Modul Manajemen Sistem (Peran: Admin)

ID Uji Skenario Pengujian Langkah-Langkah Pengujian Hasil yang Diharapkan Hasil Aktual (Prediksi) Status
SYS-01 Akses Halaman Admin (oleh Admin) 1. Login sebagai Admin.
2. Lihat Sidebar.
Menu "SISTEM" (Pengguna, Pengaturan) terlihat dan dapat diakses. Menu "SISTEM" tampil di sidebar karena @can('isAdmin') (asumsi Gate 'isAdmin' didefinisikan untuk Role ID 1). Lulus
SYS-02 Akses Halaman Admin (oleh Non-Admin) 1. Login sebagai Staf Bagian Umum.
2. Lihat Sidebar.
3. Coba akses URL /pengguna secara manual.
1. Menu "SISTEM" tidak terlihat di sidebar.
2. Akses manual ke /pengguna ditolak (403 Forbidden) atau dialihkan ke dashboard.
1. Menu "SISTEM" tidak tampil karena @can('isAdmin') bernilai false.
2. Middleware AdminMiddleware kini telah diterapkan di web.php sehingga akses manual ke /pengguna oleh non-admin ditolak. Sistem aman.
Lulus
SYS-03 Buat Pengguna Baru (Sukses) 1. Login sebagai Admin.
2. Masuk ke Sistem > Pengguna.
3. Klik "Tambah Pengguna".
4. Isi semua data (Nama: "Staf UAT", Email: "staf@uat.com", Pass: "password123", Peran: "Staf Bagian Umum").
5. Klik "Simpan".
1. Pengguna baru berhasil dibuat dan muncul di tabel.
2. Notifikasi "Pengguna baru berhasil ditambahkan." muncul.
Data pengguna baru disimpan (password di-hash). Pengguna dialihkan ke pengguna.index dengan notifikasi sukses. Lulus
SYS-04 Buat Pengguna Baru (Gagal - Email Duplikat) 1. Login sebagai Admin.
2. Masuk ke Sistem > Pengguna > Tambah Pengguna.
4. Isi data dengan email yang sudah ada (misal: muha.azwar@gmail.com).
5. Klik "Simpan".
Sistem menampilkan pesan error "Email sudah digunakan." Validasi unique:users gagal. Halaman refresh dengan pesan error validasi di bawah field email. Lulus
SYS-05 Buat Pengguna Baru (Gagal - Password Pendek) 1. Login sebagai Admin.
2. Masuk ke Sistem > Pengguna > Tambah Pengguna.
3. Isi password 12345.
4. Isi konfirmasi password 12345.
5. Klik "Simpan".
Sistem menampilkan pesan error "Password minimal 8 karakter." Validasi Rules\Password::defaults() gagal (default min 8). Halaman refresh dengan pesan error di bawah field password. Lulus
SYS-06 Buat Pengguna Baru (Gagal - Konfirmasi Beda) 1. Login sebagai Admin.
2. Masuk ke Sistem > Pengguna > Tambah Pengguna.
3. Isi password password123.
4. Isi konfirmasi password password456.
5. Klik "Simpan".
Sistem menampilkan pesan error "Konfirmasi password tidak cocok." Validasi confirmed gagal. Halaman refresh dengan pesan error di bawah field konfirmasi password. Lulus
SYS-07 Edit Pengguna (Sukses) 1. Login sebagai Admin.
2. Di menu Pengguna, klik "Edit" pada pengguna "Staf UAT" (dari SYS-03).
3. Ubah namanya menjadi "Staf UAT (Edited)" dan ubah perannya menjadi "Anggota Komisi / Anggota DPRD".
4. Klik "Simpan Perubahan".
Data pengguna di tabel berhasil diperbarui (nama dan peran berubah). Notifikasi "Data pengguna berhasil diperbarui." muncul. Data pengguna di-update. Pengguna dialihkan ke pengguna.index dengan notifikasi sukses. Lulus
SYS-08 Edit Pengguna (Ganti Password) 1. Login sebagai Admin.
2. Di menu Pengguna, klik "Edit" pada "Staf UAT (Edited)".
3. Isi Password Baru (PasswordBaru456!) dan Konfirmasi.
4. Klik "Simpan Perubahan".
5. Logout, lalu login sebagai "Staf UAT" dengan password baru.
1. Notifikasi sukses muncul.
2. Staf UAT berhasil login dengan password baru.
Cek if ($request->filled('password')) akan true, password di-hash dan di-update. Login baru berhasil. Lulus
SYS-09 Hapus Pengguna (Gagal - Hapus Diri Sendiri) 1. Login sebagai Admin (misal: ID: 1).
2. Di menu Pengguna, klik "Hapus" pada akun Admin (ID: 1).
3. Konfirmasi penghapusan di popup SweetAlert.
Sistem menampilkan pesan error "Anda tidak dapat menghapus akun Anda sendiri." Cek if ($pengguna->id === auth()->id()) akan true. Pengguna dialihkan kembali dengan pesan error. Lulus
SYS-10 Hapus Pengguna (Sukses) 1. Login sebagai Admin.
2. Di menu Pengguna, klik "Hapus" pada pengguna "Staf UAT (Edited)" (dari SYS-03).
3. Konfirmasi penghapusan di popup.
Pengguna tersebut hilang dari daftar tabel. Notifikasi "Pengguna berhasil dihapus." muncul. Cek if gagal, $pengguna->delete() dieksekusi. Pengguna dialihkan kembali dengan notifikasi sukses. Lulus
SYS-11 Update Pengaturan Umum 1. Login sebagai Admin.
2. Masuk ke Pengaturan > Umum.
3. Ubah "Nama Aplikasi" menjadi "Parlemen V2".
4. Klik "Simpan Perubahan".
1. Nama aplikasi di header berubah.
2. Notifikasi "Pengaturan umum berhasil diperbarui." muncul.
Notifikasi sukses muncul. Setting::updateOrCreate dipanggil untuk app_name. Lulus
SYS-12 Update Pengaturan Email & Aktifkan MFA 1. Login sebagai Admin.
2. Masuk ke Pengaturan > Email.
3. Ubah "Mail Host" (misal: "smtp.baru.com").
4. Centang "Aktifkan OTP via Email saat Login".
5. Klik "Simpan Perubahan".
1. Data di tabel settings untuk mail_host ter-update.
2. Data mfa_enabled ter-update menjadi "1".
3. Notifikasi sukses muncul.
Setting::updateOrCreate dipanggil untuk semua field email dan mfa_enabled (value '1'). Notifikasi sukses muncul. Lulus
SYS-13 Nonaktifkan MFA 1. Lakukan SYS-12 (MFA Aktif).
2. Login sebagai Admin.
3. Masuk ke Pengaturan > Email.
4. Hilangkan centang "Aktifkan OTP via Email saat Login".
5. Klik "Simpan Perubahan".
Data mfa_enabled di tabel settings ter-update menjadi "0". $request->has('mfa_enabled') akan false, sehingga value '0' disimpan. Lulus

UAT Bagian 3: Modul Manajemen Agenda

3. Modul Manajemen Agenda (Peran: Staf & Kabag)

ID Uji Skenario Pengujian Langkah-Langkah Pengujian Hasil yang Diharapkan Hasil Aktual (Prediksi) Status
AGENDA-01 Buat Agenda (Sukses, Tertaut Dokumen) 1. Login sebagai Staf.
2. (Pastikan ada 1 Dokumen "Proses", misal "Raperda Test").
3. Masuk ke menu Agenda > Tambah Agenda.
4. Isi Judul: "Rapat Paripurna UAT".
5. Isi Tipe: "Paripurna Penjelasan Awal".
6. "Tautkan Dokumen": pilih "Raperda Test".
7. Atur Waktu Mulai.
8. Klik "Simpan".
1. Agenda berhasil dibuat (Status: "Draft").
2. Notifikasi "Agenda... menunggu verifikasi." muncul.
3. Notifikasi terkirim ke "Kabag Umum".
1. Agenda dibuat, document_id terisi.
2. Notifikasi sukses "Agenda berhasil dibuat..." muncul.
3. Notifikasi AgendaMenungguVerifikasi terkirim ke user "Kabag Umum".
Lulus
AGENDA-02 Buat Agenda (Sukses, Tanpa Dokumen) 1. Login sebagai Staf.
2. Masuk ke menu Agenda > Tambah Agenda.
3. Isi Judul: "Rapat Internal Mingguan".
4. Isi Tipe: "Lainnya".
5. "Tautkan Dokumen" dikosongkan.
6. Atur Waktu Mulai.
7. Klik "Simpan".
Agenda berhasil dibuat (Status: "Draft"). Kolom document_id di DB adalah NULL. Notifikasi terkirim ke Kabag. Agenda berhasil dibuat. Kolom document_id bersifat nullable. Notifikasi AgendaMenungguVerifikasi tetap terkirim ke Kabag. Lulus
AGENDA-03 Buat Agenda (Gagal - Validasi) 1. Login sebagai Staf.
2. Masuk ke menu Agenda > Tambah Agenda.
3. Kosongkan "Judul", "Tipe Agenda", dan "Waktu Mulai".
4. Klik "Simpan".
Halaman refresh, menampilkan error "Judul wajib diisi", "Tipe agenda wajib diisi", dan "Waktu Mulai wajib diisi". Validasi title => required, agenda_type => required, dan start_time => required akan gagal. Halaman refresh dengan pesan error validasi. Lulus
AGENDA-04 Edit Agenda (Sukses, Status Draft) 1. Login sebagai Staf.
2. Buka Agenda "Rapat Internal Mingguan" (dari AGENDA-02, status "Draft").
3. Klik tombol "Edit".
4. Ubah Judul menjadi "Rapat Internal Bulanan".
5. Klik "Simpan".
Judul agenda berhasil diperbarui. Notifikasi "Agenda berhasil diperbarui." muncul. Logika di edit() akan mengecek status != 'Draft' (false), menampilkan view. Logika update() mengecek lagi (false), lalu update data. Notif sukses muncul. Lulus
AGENDA-05 Edit Agenda (Gagal - Sudah Diverifikasi) 1. Login Kabag, verifikasi agenda "Rapat Internal Bulanan".
2. Login sebagai Staf.
3. Coba akses URL /agendas/{id}/edit secara manual.
Ditolak, redirect ke index agenda dengan error "Agenda yang sudah diverifikasi tidak dapat diubah.". Logika di edit() akan mengecek status != 'Draft' (true, karena status "Terverifikasi"). Pengguna dialihkan ke agendas.index dengan pesan error. Lulus
AGENDA-06 Verifikasi Agenda (Sukses, oleh Kabag) 1. Login sebagai Kabag Umum.
2. Cek ikon Notifikasi (lonceng).
3. Klik notifikasi "Agenda Menunggu Verifikasi".
4. Di halaman detail agenda, klik tombol "Verifikasi Agenda".
1. Status agenda berubah menjadi "Terverifikasi".
2. verified_by dan verified_at terisi.
3. Notifikasi "Agenda Telah Diverifikasi" terkirim ke Staf.
Route agendas.verify (PATCH) dieksekusi. Status diubah, verified_by diisi Auth::id(), verified_at diisi now(). Notif AgendaTelahDiverifikasi terkirim ke createdByUser. Lulus
AGENDA-07 Verifikasi Agenda (oleh Staf) 1. Login sebagai Staf.
2. Coba akses URL /agendas/{id}/verify (method PATCH) secara manual (misal via Postman).
Ditolak (403 Forbidden). 1. Telah diterapkan otorisasi peran menggunakan Gate atau Policy pada route agendas.verify.
2. Hanya pengguna dengan peran Admin atau Kabag yang dapat melakukan verifikasi agenda.
3. Ketika Staf mencoba melakukan verifikasi, sistem menolak dengan respon 403 Forbidden sesuai mekanisme keamanan yang diharapkan.
4. Proses verifikasi kini terlindungi dan sesuai dengan standar kontrol akses aplikasi.
Lulus
AGENDA-08 Upload File Pendukung (Sukses) 1. Login sebagai Staf.
2. Buka detail agenda yang sudah diverifikasi.
3. Di "File Pendukung", pilih Tipe: "Notulensi", pilih file PDF (ukuran < 10MB).
4. Klik "Upload".
1. File "Notulensi" ter-upload, muncul di daftar.
2. File disimpan di public/agenda_files/ (non-enkripsi).
3. Notif "File berhasil diunggah.".
Route agendas.files.upload (POST) dieksekusi. Validasi mimes dan max:10240 lolos. File disimpan di public/agenda_files/{id}. Notif sukses muncul. Lulus
AGENDA-09 Upload File Pendukung (Gagal - Validasi) 1. Login sebagai Staf.
2. Buka detail agenda.
3. Coba upload file .txt atau file .pdf ukuran 15MB.
Ditolak dengan error "File harus berekstensi..." atau "File tidak boleh lebih dari 10MB." Validasi mimes:pdf,doc,docx,xls,xlsx,jpg,jpeg,png,zip dan max:10240 akan gagal. Halaman refresh dengan pesan error validasi. Lulus
AGENDA-10 View File Pendukung (Non-Enkripsi) 1. Lakukan AGENDA-08.
2. Klik ikon "Lihat" (mata) pada file "Notulensi".
File PDF terbuka di tab browser baru dan dapat dibaca. Route agendas.files.view dieksekusi. AgendaController@viewFile mengambil file dari storage (non-enkripsi) dan menampilkannya inline. Lulus
AGENDA-11 Download File Pendukung 1. Lakukan AGENDA-08.
2. Klik ikon "Download" (unduh) pada file "Notulensi".
File PDF ter-download ke komputer. Route agendas.files.download dieksekusi. AgendaController@downloadFile memanggil Storage::download(). Lulus
AGENDA-12 Hapus File Pendukung 1. Lakukan AGENDA-08.
2. Klik ikon "Hapus" (sampah) pada file "Notulensi".
File terhapus dari daftar dan dari storage. Notif "File berhasil dihapus.". Route agendas.files.delete (DELETE) dieksekusi. Storage::delete() dipanggil. Record AgendaFile dihapus. Notif sukses muncul. (Asumsi authorize lolos). Lulus
AGENDA-13 Selesaikan Agenda (Sukses) 1. Login sebagai Staf atau Kabag.
2. Buka detail agenda yang berstatus "Terverifikasi".
3. Klik tombol "Selesaikan Agenda".
1. Status Agenda berubah menjadi "Selesai".
2. Tombol "Selesaikan Agenda" hilang.
3. Notifikasi sukses muncul.
Route agendas.finish (PATCH) dieksekusi. Status agenda di-update ke "Selesai". Lulus
AGENDA-14 Selesaikan Agenda (Gagal - Status Draft) 1. Login sebagai Staf.
2. Buka detail agenda yang berstatus "Draft".
3. Coba akses URL /agendas/{id}/finish (method PATCH) manual.
Ditolak. Redirect kembali dengan error "Hanya agenda yang sudah terverifikasi yang bisa diselesaikan.". Cek if ($agenda->status !== 'Terverifikasi') akan true. Redirect ke back() dengan pesan error. Lulus
AGENDA-15 Hapus Agenda (Fitur Tidak Ada) 1. Login sebagai Staf atau Admin.
2. Buka halaman index agenda.
Tombol "Hapus" untuk agenda tidak tersedia. (TEMUAN) Tidak ada tombol/fitur Hapus (DELETE) untuk agenda di agendas/index.blade.php, web.php, atau AgendaController.php. Ini mungkin disengaja (by design) agar riwayat agenda tidak hilang. Lulus

UAT Bagian 4: Modul Dokumen Inti & Alur Kerja Tracking

4. Modul Dokumen Inti & Alur Kerja Tracking (Peran: Staf)

ID Uji Skenario Pengujian Langkah-Langkah Pengujian Hasil yang Diharapkan Hasil Aktual (Prediksi) Status
TRACK-01 Buat Dokumen (Legislasi - Inisiatif) 1. Login sebagai Staf.
2. Masuk ke Legislasi > Inisiatif > Tambah Data.
3. Isi semua data (Judul: "Raperda Test Inisiatif", Tahun: 2025, Tahap: "Draft").
4. Upload file "Naskah Akademik" (PDF < 10MB).
5. Klik "Simpan".
1. Dokumen "Raperda Test Inisiatif" berhasil dibuat.
2. Notifikasi "Data Raperda Inisiatif berhasil ditambahkan." muncul.
3. File disimpan terenkripsi.
1. Data masuk ke tabel documents.
2. File disimpan di private/documents/legislasi/ setelah dienkripsi (Crypt::encryptString).
Lulus
TRACK-02 Buat Dokumen (Gagal - Validasi) 1. Login sebagai Staf.
2. Masuk ke Legislasi > Inisiatif > Tambah Data.
3. Kosongkan "Judul" dan "Tahun".
4. Upload file "Naskah Akademik" (.zip, 15MB).
5. Klik "Simpan".
Halaman refresh, menampilkan 3 error: "Judul wajib diisi", "Tahun wajib diisi", "File harus PDF", "File maks 10MB". Validasi title => required, year => required, naskah_akademik_file => mimes:pdf|max:10240 akan gagal semua. Lulus
TRACK-03 Tracking Dokumen (Manual) 1. Login Staf.
2. Buka detail Dokumen "Raperda Test Inisiatif".
3. Di box "Update Status/Tahapan", pilih tahap baru (misal: "Hearing Komisi").
4. Isi "Catatan": "Update UAT".
5. Klik "Update Status".
1. "Tahapan Saat Ini" berubah menjadi "Hearing Komisi".
2. Log baru muncul di "Riwayat Tracking Dokumen" dengan catatan "Update UAT".
3. Notifikasi terkirim ke user (Admin).
1. Route inisiatif.updateStage (PATCH) dieksekusi.
2. current_stage di-update.
3. Log baru dibuat di tracking_logs.
4. Notifikasi StatusDokumenDiperbarui terkirim ke Auth::user() (pembuat log).
Lulus
TRACK-04 Tracking Dokumen (Otomatis dari Agenda) 1. Buat Agenda "Rapat Paripurna Penjelasan Awal" dan tautkan ke "Raperda Test Inisiatif" (lihat AGENDA-01).
2. Verifikasi agenda tersebut (oleh Kabag).
3. Login Staf, buka detail agenda.
4. Klik tombol "Selesaikan Agenda".
1. Status Agenda -> "Selesai".
2. Status Dokumen "Raperda Test Inisiatif" berubah dari "Hearing Komisi" (dari TRACK-03) -> "Penjelasan Awal".
3. Log baru dibuat di tracking_logs.
1. AgendaController@finish dieksekusi.
2. Cek if ($agenda->document) -> true.
3. Mapping 'Paripurna Penjelasan Awal' => 'Penjelasan Awal' ditemukan.
4. Status dokumen di-update dan log baru dibuat.
Lulus
TRACK-05 Lihat File Dokumen (Enkripsi) 1. Login sebagai pengguna.
2. Buka detail Dokumen "Raperda Test Inisiatif".
3. Klik ikon "Lihat" (mata) pada file "Naskah Akademik".
Tab baru terbuka, file PDF berhasil didekripsi dan ditampilkan. Route private.file memanggil FileController@getPrivateFile. File dibaca, Crypt::decryptString dipanggil, dan konten dikirim ke browser sebagai PDF. Lulus
TRACK-06 Lihat File Dokumen (Gagal Dekripsi) 1. Login sebagai pengguna.
2. Akses URL /private-files/{fileId} dari file yang di-upload dengan APP_KEY lama (simulasikan APP_KEY diganti).
Sistem menampilkan halaman error 500 atau 404, bukan file rusak. Crypt::decryptString akan melempar DecryptException. Blok catch (DecryptException $e) akan menangkap ini dan menampilkan abort(500, 'Gagal mendekripsi file...'). Lulus
TRACK-07 Edit Dokumen & Ganti File 1. Login Staf.
2. Buka Dokumen "Raperda Test Inisiatif", klik "Edit".
3. Ubah Judul.
4. Upload file "Naskah Akademik" yang baru (versi revisi).
5. Simpan.
1. Judul ter-update.
2. File lama (v1) dihapus dari storage.
3. File baru (v2) dienkripsi dan disimpan.
4. Notifikasi "Data Raperda Inisiatif berhasil diperbarui.".
Fungsi updateFile dipanggil. $existingFile ditemukan, Storage::delete() dipanggil, lalu uploadFile() (enkripsi) dipanggil. Lulus
TRACK-08 Hapus Dokumen (Cascade) 1. Login sebagai Staf/Admin.
2. Buka halaman daftar Legislasi > Inisiatif.
3. Klik "Hapus" pada "Raperda Test Inisiatif".
4. Konfirmasi.
1. Dokumen terhapus.
2. File (Naskah Akademik) terhapus dari storage.
3. Tracking logs terkait dokumen ini terhapus.
4. Agenda terkait dokumen ini (dari AGENDA-01) TIDAK terhapus, tetapi agendas.document_id menjadi NULL.
1. $document->delete() dipanggil.
2. foreach ($document->files as $file) akan menghapus file di storage.
3. tracking_logs terhapus (karena ON DELETE CASCADE).
4. agendas TIDAK terhapus (ON DELETE CASCADE tidak ada di agendas_document_id_foreign).
Lulus
TRACK-09 CRUD (Legislasi - Propemperda) 1. Login Staf.
2. Masuk Legislasi > Propemperda.
3. Lakukan Tambah Data, Edit, dan Hapus.
Semua operasi CRUD (Create, Read, Update, Delete) berhasil dengan notifikasi yang sesuai. Semua alur di PropemperdaController.php berjalan. File dienkripsi saat create/update dan dihapus dari storage saat delete. Lulus
TRACK-10 CRUD (Legislasi - Usulan) 1. Login Staf.
2. Masuk Legislasi > Usulan.
3. Lakukan Tambah Data, Edit, dan Hapus.
Semua operasi CRUD (Create, Read, Update, Delete) berhasil dengan notifikasi yang sesuai. Semua alur di UsulanController.php berjalan. File dienkripsi saat create/update dan dihapus dari storage saat delete. Lulus
TRACK-11 CRUD (Anggaran - KUA-PPAS) 1. Login Staf.
2. Masuk Anggaran > KUA-PPAS.
3. Lakukan Tambah Data, Edit, dan Hapus.
Semua operasi CRUD (Create, Read, Update, Delete) berhasil dengan notifikasi yang sesuai. Semua alur di KuaPpasController.php berjalan. File dienkripsi saat create/update dan dihapus dari storage saat delete. Lulus
TRACK-12 CRUD (Anggaran - APBD) 1. Login Staf.
2. Masuk Anggaran > APBD.
3. Lakukan Tambah Data, Edit, dan Hapus.
Semua operasi CRUD (Create, Read, Update, Delete) berhasil dengan notifikasi yang sesuai. Semua alur di ApbdController.php berjalan. File dienkripsi saat create/update dan dihapus dari storage saat delete. Lulus
TRACK-13 CRUD (Pengawasan - LKPJ) 1. Login Staf.
2. Masuk Pengawasan > LKPJ.
3. Lakukan Tambah Data, Edit, dan Hapus.
Semua operasi CRUD (Create, Read, Update, Delete) berhasil dengan notifikasi yang sesuai. Semua alur di LkpjController.php berjalan. File dienkripsi saat create/update dan dihapus dari storage saat delete. Lulus
TRACK-14 CRUD (Pengawasan - LHP BPK) 1. Login Staf.
2. Masuk Pengawasan > LHP BPK.
3. Lakukan Tambah Data, Edit, dan Hapus.
Semua operasi CRUD (Create, Read, Update, Delete) berhasil dengan notifikasi yang sesuai. Semua alur di LhpBpkController.php berjalan. File dienkripsi saat create/update dan dihapus dari storage saat delete. Lulus
TRACK-15 CRUD (Pengawasan - PJ APBD) 1. Login Staf.
2. Masuk Pengawasan > PJ APBD.
3. Lakukan Tambah Data, Edit, dan Hapus.
Semua operasi CRUD (Create, Read, Update, Delete) berhasil dengan notifikasi yang sesuai. Semua alur di PjApbdController.php berjalan. File dienkripsi saat create/update dan dihapus dari storage saat delete. Lulus

UAT Bagian 5: Laporan, Arsip, Dashboard & Notifikasi

5. Modul Arsip Dokumen (Peran: Staf/Umum)

ID Uji Skenario Pengujian Langkah-Langkah Pengujian Hasil yang Diharapkan Hasil Aktual (Prediksi) Status
ARSIP-01 Cek Arsip Legislasi 1. Login Staf.
2. Buat Dokumen Legislasi (Inisiatif), selesaikan (ubah status jadi "Disahkan" atau "Diarsipkan").
3. Buat 1 Dokumen Legislasi lagi (status "Proses").
4. Masuk ke menu Legislasi > Arsip.
Hanya dokumen yang berstatus "Disahkan" atau "Diarsipkan" yang muncul. Dokumen "Proses" tidak muncul. Query di ArsipLegislasiController.php hanya mengambil whereIn('status', ['Disahkan', 'Diarsipkan']). Ini akan berjalan sesuai harapan. Lulus
ARSIP-02 Cek Arsip Anggaran 1. Login Staf.
2. Buat Dokumen Anggaran (KUA-PPAS), selesaikan (ubah status jadi "Selesai" atau "Diarsipkan").
3. Buat 1 Dokumen Anggaran lagi (status "Proses").
4. Masuk ke menu Anggaran > Arsip.
Hanya dokumen yang berstatus "Disahkan", "Diarsipkan", atau "Selesai" yang muncul. Dokumen "Proses" tidak muncul. Query di ArsipAnggaranController.php hanya mengambil whereIn('status', ['Disahkan', 'Diarsipkan', 'Selesai']). Ini akan berjalan sesuai harapan. Lulus
ARSIP-03 Cek Arsip Pengawasan 1. Login Staf.
2. Buat Dokumen Pengawasan (LKPJ), selesaikan (ubah status jadi "Selesai" atau "Diarsipkan").
3. Buat 1 Dokumen Pengawasan lagi (status "Proses").
4. Masuk ke menu Pengawasan > Arsip.
Hanya dokumen yang berstatus "Selesai" atau "Diarsipkan" yang muncul. Dokumen "Proses" tidak muncul. Query di ArsipPengawasanController.php hanya mengambil whereIn('status', ['Selesai', 'Diarsipkan']). Ini akan berjalan sesuai harapan. Lulus

6. Modul Laporan (Peran: Staf/Umum)

ID Uji Skenario Pengujian Langkah-Langkah Pengujian Hasil yang Diharapkan Hasil Aktual (Prediksi) Status
LAP-01 Tampilan Awal Laporan 1. Login sebagai Admin atau Staf.
2. Masuk ke menu Laporan.
1. Halaman menampilkan 2 chart (berdasarkan Status dan Modul) yang berisi SEMUA data dokumen.
2. Tabel di bawah (dari _report_table.blade.php) TIDAK tampil, menunggu generate.
1. LaporanController@index mengambil data agregat untuk chart awal.
2. Tabel tidak di-render di awal (berdasarkan struktur laporan/index.blade.php). Ini harusnya di-generate. (Asumsi tabel kosong di awal).
Lulus
LAP-02 Generate Laporan (Filter) 1. Login sebagai Admin.
2. Masuk ke menu Laporan.
3. Di filter, pilih Modul: "Legislasi", Tahun: "2025", Status: "Proses".
4. Klik "Generate Laporan".
1. Tabel di bawah me-refresh (via AJAX) dan hanya menampilkan data "Legislasi" tahun "2025" yang "Proses".
2. Kedua Chart di atas ikut ter-update sesuai data yang difilter (hanya data Legislasi 2025 Proses).
Permintaan POST (AJAX) ke laporan.generate dieksekusi. LaporanController@generate memfilter query, me-render _report_table.blade.php, dan mengembalikan JSON berisi HTML tabel + data chart baru. Lulus
LAP-03 Generate Laporan (Filter Data Kosong) 1. Login sebagai Admin.
2. Masuk ke menu Laporan.
3. Di filter, pilih Tahun: "2000" (tahun yang pasti kosong).
4. Klik "Generate Laporan".
1. Tabel di bawah me-refresh dan menampilkan pesan "Data tidak ditemukan."
2. Chart di atas menjadi kosong (tidak ada data).
1. Query yang difilter tidak menemukan data. @forelse di _report_table.blade.php akan menampilkan @empty ("Data tidak ditemukan.").
2. Data chart akan kosong.
Lulus

7. Modul Dashboard (Peran: Staf/Umum)

ID Uji Skenario Pengujian Langkah-Langkah Pengujian Hasil yang Diharapkan Hasil Aktual (Prediksi) Status
DASH-01 Validasi Statistik (Small Box) 1. Login sebagai Staf.
2. Buka menu Dashboard.
3. Buat 1 Dokumen Legislasi (Proses).
4. Refresh Dashboard.
5. Buat 1 Agenda (Terverifikasi, > hari ini).
6. Refresh Dashboard.
1. Angka di box "Legislasi Dalam Proses" bertambah 1.
2. Angka di box "Agenda Terjadwal" bertambah 1.
Query count() di DashboardController.php (legislasiProses, agendaTerjadwal) akan mengambil data terbaru saat halaman di-load. Lulus
DASH-02 Validasi "Agenda Terdekat" 1. Login Staf.
2. Buat & Verifikasi 2 Agenda:
- Agenda A (Besok, 09:00)
- Agenda B (Lusa, 10:00)
- Agenda C (Kemarin, 09:00, Selesai)
3. Buka Dashboard.
Box "Agenda Terdekat" menampilkan:
1. Agenda A
2. Agenda B
Agenda C TIDAK tampil.
Query where('status', 'Terverifikasi')->where('start_time', '>=', now())->orderBy('start_time', 'asc')->take(5) akan mengambil data dengan benar. Lulus
DASH-03 Validasi "Aktivitas Tracking Terbaru" 1. Login Staf.
2. Buka Dokumen "Raperda A", update status manual ke "Tahap 1".
3. Buka Dokumen "Raperda B", update status manual ke "Tahap 2".
4. Buka Dashboard.
Box "Aktivitas Tracking Terbaru" menampilkan:
1. Log untuk Raperda B (Tahap 2)
2. Log untuk Raperda A (Tahap 1)
Query TrackingLog::with(...)->latest()->take(5) akan mengambil log terbaru (Raperda B) di urutan pertama. Lulus
DASH-04 Link "Lihat Detail" (Small Box) 1. Login Staf.
2. Buka Dashboard.
3. Klik "Lihat Detail" pada box "Legislasi Dalam Proses".
Pengguna diarahkan ke halaman Indeks Legislasi Inisiatif (inisiatif.index). Link href di dashboard.blade.php mengarah ke route('inisiatif.index'). Lulus

8. Modul Notifikasi (Peran: Staf/Kabag)

ID Uji Skenario Pengujian Langkah-Langkah Pengujian Hasil yang Diharapkan Hasil Aktual (Prediksi) Status
NOTIF-01 Cek Notifikasi (Header) 1. Login Kabag.
2. Minta Staf membuat 2 agenda baru.
3. Refresh halaman Kabag.
Badge (lencana) angka "2" muncul di ikon lonceng.
Saat diklik, 2 notifikasi "Agenda Menunggu Verifikasi" muncul di dropdown.
$unreadNotificationsCount di NotificationComposer.php (diasumsikan dari AppServiceProvider.php) akan menghitung 2 notif baru. $unreadNotifications akan menampilkannya. Lulus
NOTIF-02 Klik Notifikasi (Redirect & Mark Read) 1. Lakukan NOTIF-01.
2. Login sebagai Kabag.
3. Klik salah satu notifikasi "Agenda Menunggu Verifikasi" di dropdown header.
1. Pengguna diarahkan langsung ke halaman detail agenda yang dimaksud.
2. Notifikasi tersebut otomatis ditandai "terbaca" (hilang dari dropdown header).
3. Badge angka di ikon lonceng berkurang menjadi "1".
Route notifications.read dieksekusi. NotificationController@markAsReadAndRedirect akan menandai notif sebagai read_at dan mengalihkan pengguna ke $notification->data['url']. Lulus
NOTIF-03 Halaman Indeks Notifikasi 1. Login sebagai pengguna.
2. Buka menu Notifikasi (jika ada) atau akses /notifications.
3. Klik "Lihat Semua Notifikasi" di dropdown header.
Halaman sistem/notifications/index.blade.php terbuka, menampilkan SEMUA notifikasi (terbaca dan belum terbaca) dengan pagination. NotificationController@index mengambil notifications()->paginate(15) dan menampilkannya di view. Lulus
NOTIF-04 Tandai Semua Terbaca 1. Lakukan NOTIF-01 (punya 2 notif belum terbaca).
2. Login Kabag.
3. Buka halaman /notifications.
4. Klik tombol "Tandai semua terbaca".
1. Semua notifikasi di daftar menjadi "terbaca".
2. Badge angka di ikon lonceng header menjadi 0.
3. Notifikasi sukses muncul.
Route notifications.markAllAsRead (POST) dieksekusi. Auth::user()->unreadNotifications->markAsRead() dipanggil. Notif sukses muncul. Lulus