# PLAN - GOV Satu Mimpi / Disnaker Feature

Tanggal checkpoint: 2026-06-20

Dokumen ini menjadi checklist kerja untuk pengembangan fitur GOV berikutnya. Fokus saat ini adalah UI-first, lalu dilanjutkan wiring backend, database, permission, dan integrasi file/storage.

Update fokus 2026-06-22: sisa pengerjaan LOKET/public form diparkir dulu karena flow LOKET akan dikerjakan di aplikasi/area lain. Fokus berikutnya adalah **Portal Pegawai untuk Scope Feature Disnaker**.

---

## Prinsip Build

- [x] Pakai Laravel Blade + Tailwind CSS + Alpine.js.
- [x] UI kit GOV menjadi patokan visual utama.
- [x] Admin portal memakai layout navbar, sidebar, footer/content shell yang konsisten.
- [x] Untuk modul approval layanan: tidak perlu create/edit manual di admin.
- [x] Alur admin layanan cukup daftar pengajuan, detail, preview lampiran, approve/reject dengan alasan.
- [ ] Setiap modul baru harus punya daftar route, data model, permission, view, dan verifikasi build.
- [ ] Semua upload dokumen/foto perlu validasi format, ukuran, dan lokasi penyimpanan.

---

## Checkpoint Yang Sudah Dikerjakan

### UI Kit dan Fondasi Tampilan

- [x] Membuat halaman `/dev/uikit`.
- [x] Menambahkan referensi UI kit dari `uikit/base.html`.
- [x] Menambahkan referensi UI kit dari `uikit/base2.html`.
- [x] Menambahkan referensi sidebar dari `uikit/sidebar.html`.
- [x] Menambahkan referensi table/detail/modal/button ke UI kit master.
- [x] Menambahkan menu `Dev UI Kit` di sidebar admin.
- [x] Menambahkan icon pendukung pada komponen icon.

### Dashboard GOV

- [x] Membuat dashboard statistik statis untuk `/portal/dashboard`.
- [x] Dashboard tidak lagi bergantung pada tabel yang belum tersedia.
- [x] Layout dashboard memakai pola navbar/sidebar/content.
- [x] Komponen statistik, chart visual, activity, dan daftar layanan sudah disiapkan.

### Portal Layanan Admin

- [x] Memperbaiki mapping model/tabel untuk family card, event permit, land certificate, dan house purchase.
- [x] Route portal layanan diverifikasi.
- [x] Index KTP dibuat mengikuti UI kit table.
- [x] Filter/search/date pada index KTP disiapkan.
- [x] Detail KTP dibuat mengikuti `uikit/detail.html`.
- [x] Modal preview lampiran KTP dibuat.
- [x] Preview lampiran memakai fallback JavaScript agar tombol preview bisa diklik.
- [x] Semua 8 layanan punya route `index`, `show`, dan `update`.
- [x] Semua layanan tidak lagi butuh create/store/edit/destroy di admin.
- [x] Semua detail non-KTP memakai komponen master `x-gov.review-detail-page`.
- [x] Detail non-KTP mendukung data pemohon, detail pengajuan, lampiran, timeline, dan approve/reject.
- [x] Route resource layanan dibatasi hanya `index`, `show`, dan `update`.

### Verifikasi Teknis Terakhir

- [x] `php artisan view:cache` berhasil.
- [x] `npm run build` berhasil.
- [x] `php artisan route:list --path=portal` berhasil.
- [x] Route create/store/edit/destroy untuk layanan admin sudah tidak terdaftar.

---

## Verifikasi Form Pelayanan Publik / LOKET

Status ini membandingkan kebutuhan form publik dengan struktur yang sudah ada di repo GOV. Catatan penting: di repo GOV saat ini yang sudah kuat adalah sisi admin review. Public submission form LOKET belum terlihat sebagai halaman create/store di GOV, jadi bagian ini menjadi kontrak field untuk aplikasi/form LOKET.

Catatan 2026-06-22: pekerjaan lanjutan LOKET task 5-8 tidak menjadi prioritas web GOV saat ini. Task tersisa di bagian ini dipertahankan sebagai referensi kontrak data, namun implementasi berikutnya diarahkan ke Portal Pegawai Disnaker.

### Status Umum

- [x] Semua tabel layanan memakai `user_id` yang terhubung ke `users_loket`.
- [x] Admin GOV sudah bisa review, preview lampiran, approve, dan reject dengan alasan.
- [x] Enum pekerjaan `users_loket.job` sudah ditambah `ems` dan `swasta`.
- [x] Perlu memastikan tabel `users_loket` punya field dasar: nama, tanggal lahir, pekerjaan, jenis kelamin, NIK, negara, telepon, alamat/at.
- [x] Perlu public/LOKET create form untuk submit layanan.
- [x] Perlu validasi upload untuk foto IC/KTP, lampiran PDF/gambar, dan multi-lampiran.

### 1. KTP - Pembuatan / Perpanjang / Hilang

Kebutuhan:

- [x] Nama diambil/diubah dari `users_loket`.
- [x] Tanggal lahir diambil/diubah dari `users_loket`.
- [x] Pekerjaan diambil/diubah dari `users_loket`.
- [x] Jenis kelamin dipastikan ada di `users_loket`.
- [x] Keterangan mendukung `Pembuatan`, `Perpanjang`, `Hilang`.
- [x] Foto IC didukung kolom `foto_ic`.
- [x] Lampiran lebih dari satu didukung kolom JSON `lampiran`, nullable.
- [x] Public form LOKET KTP tersedia di `/layanan/ktp`.

Tabel terkait:

- [x] `gov_ktp_requests`
- [x] `users_loket`

### 2. KIA - Pembuatan / Perpanjang

Kebutuhan:

- [x] Nama bapak didukung `nama_bapak`.
- [x] No. telepon bapak didukung `no_tlp_bapak`.
- [x] Nama ibu didukung `nama_ibu`.
- [x] No. telepon ibu didukung `no_tlp_ibu`.
- [x] Nama wali didukung `nama_wali`.
- [x] No. telepon wali didukung `no_tlp_wali`.
- [x] Nama anak didukung `nama_anak`.
- [x] Lokasi/AT didukung `at`.
- [x] Lampiran surat vaksinasi didukung `lampiran_vaksinasi`.
- [x] Lampiran KTP aktif orang tua/wali didukung `lampiran_ktp_ortu`.
- [x] Perlu field jenis pengajuan jika benar-benar membedakan pembuatan/perpanjang KIA.
- [x] Public form LOKET KIA tersedia di `/layanan/kia`.

Tabel terkait:

- [x] `gov_kia_requests`

### 3. Pernikahan

Kebutuhan:

- [x] Tanggal pernikahan didukung `tanggal_pernikahan`.
- [x] NIK suami didukung `suami_nik`.
- [x] NIK istri didukung `istri_nik`.
- [x] Auto isi data suami dari NIK tersedia di form GOV.
- [x] Auto isi data istri dari NIK tersedia di form GOV.
- [x] Status suami/istri `MENIKAH` menjadi field eksplisit.
- [x] Nama suami/istri hasil snapshot menjadi field eksplisit.
- [x] Tanggal kelahiran suami/istri hasil snapshot menjadi field eksplisit.
- [x] Jenis kelamin suami/istri hasil snapshot menjadi field eksplisit.
- [x] Pekerjaan suami/istri hasil snapshot menjadi field eksplisit.
- [x] Nama saksi didukung `saksi_nama`.
- [x] Hubungan saksi didukung `saksi_hubungan`.
- [x] Dinikahkan oleh didukung `dinikahkan_oleh`.
- [x] AT saat ini didukung `at_saat_ini`.
- [x] Lampiran umum didukung JSON `lampiran`.
- [x] Lampiran surat izin kegiatan dipisah sebagai field khusus.
- [x] Lampiran akta nikah dipisah sebagai field khusus.
- [x] Lampiran kartu keluarga dipisah sebagai field khusus.
- [x] Lampiran KTP aktif kedua mempelai dipisah sebagai field khusus.
- [x] Bukti buku nikah luar negeri dipisah sebagai field khusus.
- [x] Public form LOKET pernikahan tersedia di `/layanan/marriage`.

Tabel terkait:

- [x] `gov_marriage_requests`

### 4. Pergantian Nama

Kebutuhan:

- [x] Nama lama bisa diambil dari `users_loket`.
- [x] Nama baru didukung `nama_baru`.
- [x] Tanggal lahir bisa diambil/diubah dari `users_loket`.
- [x] Pekerjaan bisa diambil/diubah dari `users_loket`.
- [x] AT/lokasi dipastikan ada di `users_loket`.
- [x] NIK bisa diambil dari `users_loket`.
- [x] Negara dipastikan ada di `users_loket`.
- [x] Telepon bisa diambil dari `users_loket`.
- [x] Lampiran KTP aktif didukung `lampiran_ktp`.
- [x] Lampiran Expungement DOJ didukung `lampiran_expungement`.
- [x] Public form LOKET pergantian nama tersedia di `/layanan/name-change`.

Tabel terkait:

- [x] `gov_name_change_requests`
- [x] `users_loket`

### 5. Kartu Keluarga

Kebutuhan:

- [x] Jumlah anggota keluarga didukung `jumlah_anggota`.
- [x] Biaya tambahan didukung `biaya_tambahan`.
- [ ] Aturan gratis/normal sampai 4 anggota perlu diterapkan di form/service.
- [ ] Auto hitung tambahan 100.000 per anggota di atas 4 perlu diterapkan di form/service.
- [ ] Lampiran pendukung KK belum tersedia sebagai field khusus.
- [ ] Public form LOKET Kartu Keluarga belum diverifikasi/terlihat di GOV.

Tabel terkait:

- [x] `gov_family_cards`

### 6. Surat Izin Kegiatan

Kebutuhan:

- [x] Nama penanggung jawab dapat diambil dari `users_loket`.
- [x] No. telepon dapat diambil dari `users_loket`.
- [x] Nama kegiatan didukung `nama_kegiatan`.
- [x] AT acara didukung `at_acara`.
- [x] Tanggal dan jam didukung `tanggal_jam_acara`.
- [ ] Lampiran pendukung kegiatan belum tersedia sebagai field khusus.
- [ ] Public form LOKET Surat Izin Kegiatan belum diverifikasi/terlihat di GOV.

Tabel terkait:

- [x] `gov_event_permits`
- [x] `users_loket`

### 7. Surat Tanah dan Sertifikat Rumah

Kebutuhan:

- [x] Nama dapat diambil dari `users_loket`.
- [x] Pekerjaan dapat diambil dari `users_loket`.
- [x] AT kantor didukung `at_kantor`.
- [x] NIK dapat diambil dari `users_loket`.
- [x] Telepon dapat diambil dari `users_loket`.
- [x] Foto KTP didukung `foto_ktp`.
- [x] Kategori `HIGH END HOUSE` didukung.
- [x] Kategori `MID END HOUSE` didukung.
- [x] Kategori `LOW END HOUSE` didukung.
- [ ] Kategori `SURAT TANAH` belum masuk enum `kategori_rumah`.
- [ ] Perlu diputuskan apakah `SURAT TANAH` menjadi kategori yang sama atau layanan/tipe terpisah.
- [ ] Public form LOKET Surat Tanah/Sertifikat Rumah belum diverifikasi/terlihat di GOV.

Tabel terkait:

- [x] `gov_land_certificates`

### 8. Administrasi Pembelian Rumah

Kebutuhan:

- [x] NIK dapat diambil dari `users_loket`.
- [x] Nama dapat diambil dari `users_loket`.
- [ ] Umur dipastikan tersedia atau dihitung dari tanggal lahir `users_loket`.
- [x] Pekerjaan dapat diambil dari `users_loket`.
- [x] AT didukung `at`.
- [x] Telepon dapat diambil dari `users_loket`.
- [x] Type rumah didukung `type_rumah`.
- [ ] Public form LOKET Administrasi Pembelian Rumah belum diverifikasi/terlihat di GOV.

Tabel terkait:

- [x] `gov_house_purchases`

### Rekomendasi Migration/Form Lanjutan

- [x] Tambah/pastikan field `gender`, `country`, `at/current_location`, `phone`, dan `nik` pada `users_loket` bila belum ada.
- [x] Tambah `jenis_pengajuan` untuk KIA jika status pembuatan/perpanjang perlu dicatat.
- [x] Tambah snapshot data suami/istri pada `gov_marriage_requests` agar data saat pengajuan tidak berubah jika data penduduk berubah.
- [x] Tambah field lampiran khusus pernikahan: surat izin kegiatan, akta nikah, kartu keluarga, KTP suami, KTP istri, buku nikah luar negeri.
- [x] Tambah lampiran pendukung untuk Kartu Keluarga bila dibutuhkan.
- [x] Tambah lampiran pendukung untuk Surat Izin Kegiatan bila dibutuhkan.
- [ ] Tambah enum/kategori `SURAT TANAH` pada `gov_land_certificates` atau pisahkan menjadi `jenis_layanan`.
- [x] Buat public/LOKET form submission untuk 8 layanan.
- [x] Buat validasi request untuk setiap form publik.
- [ ] Buat seeder/sample request lengkap untuk QA admin detail.

---

## Fokus Aktif - Portal Pegawai Disnaker

Target awal: membangun tampilan admin/staff Disnaker secara statis dan konsisten dengan UI kit GOV sebelum masuk ke migration, model, permission, dan API.

Prioritas portal pegawai:

- [x] Sidebar/menu Disnaker di portal pegawai.
- [x] Dashboard Disnaker statis.
- [x] Katalog Barang dan Gudang statis.
- [x] Arus Barang masuk/keluar statis.
- [x] Kas Disnaker statis.
- [x] Informasi Disnaker CRUD UI untuk staff.
- [x] Kalender Kegiatan CRUD UI untuk staff.
- [x] Repositori Dokumen UI uploader + privacy toggle untuk staff.
- [ ] Portal Layanan Disnaker admin review.
- [ ] Pusat Pengaduan admin dashboard tiket/chat.
- [ ] Setelah UI stabil: migration, model, controller, permission, dan integrasi data.

---

## Scope Feature Disnaker

### 1. Modul Informasi Disnaker

Tujuan: Menyajikan berita, regulasi, dan pengumuman resmi seputar industri, perdagangan, dan tenaga kerja.

Hak akses:

- [ ] Warga dapat melihat berita terbaru yang dibuat staff Disnaker.
- [x] Admin/staff Disnaker dapat membuat artikel.
- [x] Admin/staff Disnaker dapat mengubah artikel.
- [x] Admin/staff Disnaker dapat menghapus artikel.
- [x] Admin/staff Disnaker dapat publish/unpublish artikel.

UI:

- [ ] Public list berita.
- [ ] Public detail berita.
- [x] Admin list artikel.
- [x] Admin form create/edit artikel.
- [x] Admin preview artikel.
- [x] Status draft/published/archived.

Data awal:

- [x] `gov_disnaker_articles`
- [x] `gov_disnaker_article_categories`
- [ ] Cover image.
- [ ] Slug.
- [ ] Author/staff.
- [ ] Published at.

Catatan:

- [ ] Bisa digabung dengan kementerian lain jika nanti dibutuhkan sebagai modul informasi umum.

---

### 2. Katalog Harga Disnaker

Tujuan: Transparansi harga komoditas dan daftar kebutuhan logistik pemerintah.

Hak akses:

- [ ] Warga dapat melihat rincian barang yang dibutuhkan pemerintah.
- [ ] Warga dapat melihat harga pembelian dari warga ke pemerintah.
- [ ] Warga dapat melihat harga penjualan pemerintah ke warga.
- [ ] Warga dapat melihat harga penjualan pemerintah ke instansi.
- [x] Admin/staff dapat CRUD barang.
- [x] Admin/staff dapat menetapkan indikator penerimaan barang.
- [x] Admin/staff dapat mengatur jumlah barang yang bisa diterima.
- [x] Admin/staff dapat mengatur maksimum penjualan barang.
- [x] Admin/staff dapat mengatur minimum dan maksimum stok gudang.

UI:

- [ ] Public katalog harga.
- [ ] Public detail barang.
- [ ] Admin tabel barang.
- [x] Admin form barang.
- [ ] Badge indikator penerimaan.
- [ ] Panel aturan stok dan harga.

Data awal:

- [x] `gov_disnaker_items`
- [ ] `gov_disnaker_item_prices`
- [x] `min_stock`
- [x] `max_stock`
- [x] `max_sale_quantity`
- [x] `accepted_quantity_limit`
- [x] `acceptance_indicator`

---

### 3. Arus Barang

Tujuan: Menyajikan arus masuk dan keluar barang. Modul ini pemerintah only.

Hak akses:

- [ ] Hanya admin/staff internal yang dapat mengakses.

Arus masuk:

- [x] Input data warga.
- [x] Upload/foto KTP warga.
- [x] Pilih barang yang dijual warga ke pemerintah.
- [x] Input jumlah barang.
- [x] Hitung total uang keluar.
- [x] Update stok gudang secara real-time.
- [x] Update kas Disnaker sebagai uang keluar.
- [ ] Simpan bukti transaksi.

Arus keluar:

- [x] Input data warga pembeli.
- [x] Upload/foto KTP warga pembeli.
- [x] Input data instansi pembeli.
- [x] Upload dokumen pemesanan instansi.
- [x] Pilih barang yang dibeli.
- [x] Input jumlah barang.
- [x] Hitung total uang masuk.
- [x] Update stok gudang secara real-time.
- [x] Update kas Disnaker sebagai uang masuk.
- [ ] Simpan bukti transaksi.

UI:

- [x] Admin list transaksi barang.
- [x] Form transaksi masuk.
- [x] Form transaksi keluar.
- [x] Detail transaksi.
- [x] Ringkasan stok sebelum/sesudah.
- [x] Ringkasan kas sebelum/sesudah.

Data awal:

- [x] `gov_disnaker_stock_movements`
- [x] `movement_type`: in/out.
- [x] `party_type`: citizen/agency.
- [x] `citizen_name`, `citizen_nik`, `citizen_ktp_file`.
- [x] `agency_name`, `agency_order_document`.
- [x] `item_id`, `quantity`, `unit_price`, `total_amount`.
- [x] `cash_account_id`.

Integrasi:

- [x] Arus Barang terhubung ke Gudang.
- [x] Arus Barang terhubung ke Kas Disnaker.
- [x] Transaksi harus atomic agar stok dan kas tidak berbeda.

---

### 4. Gudang

Tujuan: Menampilkan jumlah barang Disnaker yang tersedia di gudang. Modul ini pemerintah only.

Hak akses:

- [ ] Hanya admin/staff internal yang dapat mengakses.

Fitur:

- [ ] Daftar nama barang.
- [ ] Jumlah stok tersedia.
- [ ] Indikator barang: kurang, cukup, hampir penuh.
- [ ] Stok minimum.
- [ ] Stok maksimum.
- [ ] Riwayat perubahan stok.

UI:

- [ ] Admin dashboard gudang.
- [ ] Table stok.
- [ ] Filter indikator stok.
- [ ] Detail barang dan riwayat stok.

Data awal:

- [ ] Stok dihitung dari item + transaksi arus barang.
- [ ] Indikator dihitung dari `current_stock`, `min_stock`, dan `max_stock`.

---

### 5. Kas Disnaker

Tujuan: Menampilkan jumlah keuangan Disnaker. Modul ini pemerintah only.

Hak akses:

- [ ] Hanya admin/staff internal yang dapat mengakses.

Fitur:

- [x] Kas Disnaker utama.
- [x] Kas Disnaker bersama.
- [x] Pencatatan uang masuk dari arus keluar barang.
- [x] Pencatatan uang keluar dari arus masuk barang.
- [x] Pelaporan penggunaan uang keluar untuk kerja sama, MBG, atau kebutuhan lain.
- [x] Riwayat transaksi kas.

UI:

- [x] Dashboard kas.
- [x] Kartu saldo per jenis kas.
- [x] Tabel transaksi kas.
- [x] Form pengeluaran manual.
- [x] Detail transaksi kas.

Data awal:

- [x] `gov_disnaker_cash_accounts`
- [x] `gov_disnaker_cash_transactions`
- [x] `account_type`: utama/bersama.
- [x] `transaction_type`: income/expense.
- [x] `category`: arus_barang/kerjasama/mbg/lainnya.

---

### 6. Kalender Kegiatan

Tujuan: Menampilkan jadwal program kerja, sosialisasi, rapat dinas, atau acara publik.

Hak akses:

- [ ] Warga dapat melihat kalender agenda.
- [x] Admin Disnaker dapat menambah agenda.
- [x] Admin Disnaker dapat menjadwalkan ulang agenda.
- [x] Admin Disnaker dapat membatalkan agenda.

UI:

- [ ] Public kalender agenda.
- [x] Admin kalender agenda.
- [x] Modal/form tambah agenda.
- [x] Detail agenda.
- [x] Status scheduled/rescheduled/cancelled/done.

Data awal:

- [x] `gov_disnaker_events`
- [ ] Judul agenda.
- [ ] Deskripsi.
- [ ] Lokasi.
- [ ] Tanggal dan jam mulai.
- [ ] Tanggal dan jam selesai.
- [ ] Status.

Catatan:

- [ ] Bisa digabung dengan kementerian lain jika nanti dibutuhkan sebagai kalender pemerintah umum.

---

### 7. Repositori Dokumen

Tujuan: Pengarsipan digital dokumen resmi, MoU, dan surat kerja sama internal maupun eksternal.

Hak akses:

- [ ] Public hanya dapat mengunduh dokumen yang ditandai publik.
- [x] Internal Disnaker dapat melihat dokumen publik dan privat.
- [x] Admin/staff dapat upload dokumen.
- [x] Admin/staff dapat mengubah metadata dokumen.
- [x] Admin/staff dapat menghapus/arsip dokumen.

Fitur:

- [x] File uploader menerima PDF.
- [x] File uploader menerima DOCX.
- [x] File uploader menerima gambar.
- [x] Batas ukuran file maksimal 10MB.
- [x] Privacy toggle: publik/privat.
- [x] Kategori dokumen.
- [x] Search dokumen.

UI:

- [ ] Public list dokumen publik.
- [x] Admin repository dokumen.
- [x] Uploader drag/drop.
- [x] Preview metadata dokumen.
- [x] Toggle publik/privat.

Data awal:

- [x] `gov_disnaker_documents`
- [ ] `file_url`
- [ ] `file_type`
- [ ] `file_size`
- [ ] `visibility`: public/private.
- [ ] `uploaded_by`

---

### 8. Portal Layanan Disnaker

Tujuan: Menangani administrasi legalitas pekerja, pengajuan kerja sama korporasi, dan administrasi ketenagakerjaan lainnya.

Hak akses:

- [ ] Warga dapat mengirim pengajuan layanan.
- [ ] Warga dapat mengunggah syarat berkas.
- [ ] Warga mendapatkan ID tiket.
- [ ] Warga dapat tracking status tiket.
- [ ] Admin/staff dapat review pengajuan.
- [ ] Admin/staff dapat approve/reject dengan alasan.

Fitur:

- [ ] Multi-step form submission.
- [ ] Kategori pengajuan: Legalitas.
- [ ] Kategori pengajuan: Kerja Sama.
- [ ] Kategori lain dapat ditambahkan.
- [ ] Unggah KTP/ID.
- [ ] Unggah berkas perusahaan.
- [ ] Unggah sertifikat terkait.
- [ ] Tracking status: pending.
- [ ] Tracking status: diproses.
- [ ] Tracking status: disetujui.
- [ ] Tracking status: ditolak.

UI:

- [ ] Public form multi-step.
- [ ] Public tracking tiket.
- [ ] Admin list pengajuan.
- [ ] Admin detail pengajuan.
- [ ] Admin preview lampiran.
- [ ] Admin approve/reject.

Data awal:

- [ ] `gov_disnaker_service_requests`
- [ ] `ticket_code`
- [ ] `request_category`
- [ ] `status`
- [ ] `attachments`
- [ ] `review_note`
- [ ] `reviewed_by`

Catatan:

- [ ] Pola UI dapat meniru detail portal layanan GOV yang sudah dibuat.

---

### 9. Pusat Pengaduan dan Aspirasi

Tujuan: Wadah masyarakat untuk mengirim keluhan, laporan pelanggaran kerja, atau saran interaktif.

Hak akses:

- [ ] Warga dapat membuat pengaduan.
- [ ] Warga dapat memilih anonim.
- [ ] Staff Disnaker dapat melihat dashboard tiket.
- [ ] Staff Disnaker dapat membalas aduan.
- [ ] Staff Disnaker dapat mengubah status aduan.

Fitur:

- [ ] Form pengaduan anonim.
- [ ] Checkbox sembunyikan identitas.
- [ ] Dashboard penanganan tiket internal.
- [ ] Kolom chat/balasan di dalam tiket.
- [ ] Status open.
- [ ] Status in progress.
- [ ] Status resolved.
- [ ] Lampiran opsional untuk bukti laporan.

UI:

- [ ] Public form aduan.
- [ ] Public tracking aduan.
- [ ] Admin list tiket aduan.
- [ ] Admin detail tiket aduan.
- [ ] Thread chat/balasan.
- [ ] Badge status aduan.

Data awal:

- [ ] `gov_disnaker_complaints`
- [ ] `gov_disnaker_complaint_replies`
- [ ] `is_anonymous`
- [ ] `status`
- [ ] `attachments`

Catatan:

- [ ] Bisa digabung dengan kementerian lain jika nanti dibutuhkan sebagai pusat pengaduan umum.

---

## Permission Draft

- [ ] `public`: melihat informasi publik, katalog publik, agenda publik, dokumen publik, tracking tiket.
- [ ] `disnaker_staff`: mengelola operasional Disnaker sesuai modul.
- [ ] `disnaker_admin`: akses penuh Disnaker termasuk konfigurasi, delete/archive, dan laporan.
- [ ] `super_admin`: akses lintas kementerian/modul.

---

## Route Draft

Public:

- [ ] `GET /disnaker`
- [ ] `GET /disnaker/news`
- [ ] `GET /disnaker/news/{slug}`
- [ ] `GET /disnaker/catalog`
- [ ] `GET /disnaker/catalog/{item}`
- [ ] `GET /disnaker/calendar`
- [ ] `GET /disnaker/documents`
- [ ] `GET /disnaker/services`
- [ ] `POST /disnaker/services`
- [ ] `GET /disnaker/services/tracking`
- [ ] `GET /disnaker/complaints`
- [ ] `POST /disnaker/complaints`
- [ ] `GET /disnaker/complaints/tracking`

Admin:

- [x] `GET /portal/disnaker/dashboard`
- [x] `GET /portal/disnaker/catalog`
- [x] `resource /portal/disnaker/articles`
- [x] `resource /portal/disnaker/items`
- [x] `GET /portal/disnaker/stock`
- [ ] `GET /portal/disnaker/stock/{item}`
- [x] `GET /portal/disnaker/stock-movements`
- [x] `GET /portal/disnaker/cash`
- [x] `resource /portal/disnaker/cash-transactions`
- [x] `resource /portal/disnaker/events`
- [x] `resource /portal/disnaker/documents`
- [ ] `GET /portal/disnaker/service-requests`
- [ ] `GET /portal/disnaker/service-requests/{id}`
- [ ] `PUT /portal/disnaker/service-requests/{id}`
- [ ] `GET /portal/disnaker/complaints`
- [ ] `GET /portal/disnaker/complaints/{id}`
- [ ] `POST /portal/disnaker/complaints/{id}/replies`
- [ ] `PUT /portal/disnaker/complaints/{id}`

---

## Urutan Pengerjaan Disarankan

- [x] F1 - Sidebar dan dashboard Disnaker statis.
- [x] F2 - Katalog Barang + Gudang statis.
- [x] F3 - Arus Barang masuk/keluar statis.
- [x] F4 - Kas Disnaker statis.
- [x] F5 - Informasi Disnaker CRUD UI.
- [x] F6 - Kalender Kegiatan CRUD UI.
- [x] F7 - Repositori Dokumen UI uploader + privacy toggle.
- [ ] F8 - Portal Layanan Disnaker multi-step + admin review.
- [ ] F9 - Pusat Pengaduan + dashboard tiket/chat.
- [x] F10 - Database migration/model/controller.
- [x] F11 - Integrasi stok real-time dan kas.
- [ ] F12 - Public pages Disnaker.
- [ ] F13 - Test, build, view cache, dan QA responsive.

---

## Definition of Done Per Modul

- [x] Route tersedia.
- [ ] Sidebar/menu tersedia.
- [ ] View index tersedia.
- [x] View create/edit tersedia jika modul memang CRUD.
- [x] View detail tersedia.
- [ ] Empty state tersedia.
- [ ] Loading/error state tersedia bila memakai data async.
- [ ] Permission dicek.
- [x] Validasi request tersedia.
- [x] Migration dan model tersedia.
- [x] Seeder/sample data tersedia untuk testing UI.
- [x] `php artisan view:cache` berhasil.
- [x] `npm run build` berhasil.
- [x] Smoke test route utama berhasil.

---

## Catatan Integrasi Penting

- [x] Arus Barang, Gudang, dan Kas harus dibuat sebagai satu kelompok logika.
- [x] Transaksi arus barang harus memakai database transaction.
- [x] Pengurangan stok tidak boleh membuat stok negatif.
- [x] Kas tidak boleh berubah jika update stok gagal.
- [ ] Dokumen privat tidak boleh bisa diakses public.
- [ ] Ticket code harus unik dan mudah dilacak.
- [ ] Semua aksi approve/reject perlu menyimpan staff reviewer dan waktu review.
- [ ] Semua aksi penting idealnya masuk audit log.
