# MIKRO-FASE 3.3 — PENGAJUAN TIKET DAN FOTO KERUSAKAN

Anda bertindak sebagai senior PHP developer dan mengerjakan repository yang sudah tersedia.

## Konteks Aplikasi yang Wajib Dipahami

Aplikasi ini merupakan sistem web internal untuk mendigitalisasi proses usulan dan penanganan perbaikan inventaris di Perwakilan BKKBN Provinsi Sumatera Utara.

Identitas penelitian:

- Peneliti: Renanda Nauval
- NIM: 2112000080
- Program Studi: Informatika
- Judul: Rancang Bangun Aplikasi Usulan Perbaikan Inventaris Kementerian Kependudukan dan Pembangunan Keluarga/Perwakilan BKKBN Provinsi Sumatera Utara

Alur bisnis utama:

```text
Pegawai
→ Bagian Tata Usaha memeriksa tiket
→ Pimpinan menyetujui atau menolak
→ Bagian Tata Usaha menetapkan SLA dan menugaskan teknisi
→ Teknisi mengerjakan dan mengunggah bukti penyelesaian
→ Tiket selesai dan seluruh riwayat tersimpan
```

Empat role resmi sistem:

```text
PEGAWAI
TU
PIMPINAN
TEKNISI
```

Jangan membuat role `ADMIN` karena role tersebut tidak terdapat pada perancangan skripsi.

Fitur utama yang harus tercapai secara bertahap:

- autentikasi dan profil;
- tiket perbaikan oleh Pegawai;
- foto kerusakan wajib;
- pemeriksaan dan permintaan revisi oleh TU;
- pengajuan tiket valid kepada Pimpinan;
- persetujuan atau penolakan oleh Pimpinan;
- penetapan SLA dan penugasan Teknisi oleh TU;
- progres dan tindakan perbaikan oleh Teknisi;
- foto bukti penyelesaian wajib;
- notifikasi otomatis pada perubahan tahap;
- pemantauan SLA dan keterlambatan;
- laporan, riwayat aset, dan audit trail.

## Kondisi Teknis Proyek

Gunakan proyek yang sudah tersedia dengan folder lokal:

```text
bkkbn_eticketing
```

URL pengembangan:

```text
http://localhost/bkkbn_eticketing/public
```

Teknologi wajib:

- PHP Native 8.2 atau lebih baru;
- MySQL atau MariaDB;
- PDO;
- Composer dan autoload PSR-4;
- HTML5, CSS3, dan JavaScript sederhana;
- Bootstrap 5 melalui CDN;
- Apache melalui XAMPP atau Laragon;
- arsitektur MVC sederhana.

Jangan menggunakan:

- Laravel;
- CodeIgniter;
- Symfony;
- Node.js;
- npm;
- framework frontend;
- proses build frontend.

Arsitektur yang harus dipertahankan:

```text
Request
→ public/index.php
→ Router
→ Middleware
→ Controller
→ Service
→ Model/Repository
→ PDO/MySQL
```

Controller harus tipis. Aturan bisnis, transaksi, perubahan status, notifikasi, dan audit ditempatkan pada service. View tidak boleh menjalankan query.

## Sistem Desain UI

Pertahankan sistem desain yang sudah dibuat pada Fase 1:

- warna utama hijau tua;
- permukaan putih;
- kanvas abu-abu muda;
- sidebar responsif;
- topbar;
- kartu putih dengan radius lembut;
- status selalu memakai teks, tidak hanya warna;
- tampilan mendukung lebar minimum 360 piksel.

Baca dan patuhi:

```text
docs/09-UI-DESIGN-SYSTEM.md
```

Jangan mengganti identitas visual utama tanpa instruksi eksplisit.

## Dokumen yang Harus Dibaca Sebelum Coding

Baca terlebih dahulu:

```text
AGENTS.md
docs/00-PROJECT-CONTEXT.md
docs/01-PRD-LENGKAP.md
docs/02-ARCHITECTURE.md
docs/05-CODING-STANDARDS.md
docs/06-STATUS-PROJECT.md
docs/09-UI-DESIGN-SYSTEM.md
docs/12-APPLICATION-CONTEXT-FOR-AGENTS.md
docs/13-SKRIPSI-ALIGNMENT-MATRIX.md
docs/14-MICRO-PHASE-ROADMAP.md
docs/18-DATABASE-CONSISTENCY-RULES.md
docs/19-ROUTE-AND-ROLE-MATRIX.md
```

Periksa juga implementasi fase sebelumnya. Jangan mengasumsikan sebuah class, helper, service, route, atau tabel tersedia sebelum memeriksanya.

## Aturan Eksekusi Global

1. Kerjakan hanya mikro-fase yang tertulis dalam prompt ini.
2. Jangan melanjutkan ke mikro-fase berikutnya.
3. Jangan membuat fitur yang belum diminta.
4. Jangan melakukan refactor besar terhadap fondasi yang sudah stabil.
5. Jangan menghapus file lama tanpa alasan yang terdokumentasi.
6. Jangan mengganti nama tabel atau kolom inti skripsi tanpa keputusan eksplisit.
7. Gunakan prepared statement dan transaksi database untuk perubahan multi-tabel.
8. Terapkan middleware role dan pemeriksaan kepemilikan data pada backend.
9. Semua output dinamis pada view harus di-escape.
10. Semua form perubahan data harus menggunakan CSRF.
11. File unggahan harus disimpan di luar direktori publik dan diakses melalui controller berizin.
12. Setiap perubahan status tiket harus dicatat pada `ticket_logs`.
13. Setiap tahap yang menurut skripsi menghasilkan notifikasi harus membuat record notifikasi.
14. Jangan membuat testing otomatis dan jangan menjalankan rangkaian testing besar pada mikro-fase ini.
15. Lakukan hanya pemeriksaan seperlunya saat coding, tanpa laporan testing panjang.
16. Setelah selesai, perbarui `docs/06-STATUS-PROJECT.md` dan isi ringkasan handoff.

## Format Laporan Akhir Agent

Berikan laporan singkat dengan struktur:

### Mikro-Fase Selesai

Tuliskan nomor dan nama mikro-fase.

### File Dibuat

Tuliskan file baru.

### File Diubah

Tuliskan file lama yang diubah.

### Perubahan Database

Tuliskan migration, tabel, kolom, indeks, dan data awal yang ditambahkan.

### Route dan Hak Akses

Tuliskan route baru serta role yang dapat mengaksesnya.

### Keputusan Teknis

Tuliskan keputusan yang dapat memengaruhi agent berikutnya.

### Belum Dikerjakan

Tegaskan fitur fase berikutnya yang sengaja belum dibuat.

Jangan melanjutkan ke prompt berikutnya.

## Prasyarat

Mikro-fase 3.1 dan 3.2 selesai. Pegawai dapat login, melihat dashboard, dan melihat daftar tiket.

## Tujuan Mikro-Fase

Membangun formulir pengajuan tiket resmi oleh Pegawai, memilih aset, mengisi kerusakan, mengunggah minimal satu foto kerusakan, membuat nomor tiket unik, menyimpan status `DIAJUKAN`, mencatat audit, dan memberi notifikasi kepada TU.

## Dasar Perancangan Skripsi

Activity Diagram Buat Tiket menyatakan Pegawai mengisi tiket dan mengunggah foto kerusakan. Setelah lengkap, sistem membuat nomor tiket, menetapkan status Diajukan, dan mengirim notifikasi otomatis kepada TU.

## Ruang Lingkup Implementasi

- Form pengajuan tiket.
- Pilihan aset dari tabel `assets`.
- Input judul opsional, deskripsi, detail lokasi, kategori kerusakan, dan prioritas.
- Upload minimal satu foto kerusakan.
- Nomor tiket otomatis dengan format konsisten, misalnya `TK-YYYY-XXXX`.
- Penyimpanan transaksi tiket + file + ticket log + notifikasi TU.
- Redirect ke detail tiket setelah berhasil.
- Flash message keberhasilan.

## Perubahan Database

Tidak membuat tabel baru kecuali tabel `notifications` belum tersedia. Bila belum, buat sesuai desain skripsi.

Pastikan pembuatan tiket dilakukan dalam satu transaksi:

```text
insert tickets
insert ticket_files BUKTI_KERUSAKAN
insert ticket_logs status kosong → DIAJUKAN
insert notifications untuk pengguna role TU
commit
```

Nomor tiket harus unik dan aman dari collision.

## Route dan Hak Akses

```text
GET  /pegawai/tiket/buat
POST /pegawai/tiket
GET  /files/ticket/{file_id}
```

Dua route pertama hanya `PEGAWAI`. Route file memeriksa role dan hubungan pengguna dengan tiket.

## Struktur Backend yang Diharapkan

Rekomendasi:

```text
TicketController
TicketService
TicketNumberService
FileStorageService
NotificationService
TicketPolicy
```

Controller menerima request dan menyerahkan proses ke service. Service memakai transaksi PDO.

## Antarmuka yang Diharapkan

- Form terstruktur sesuai desain halaman pembuatan tiket.
- Preview foto sebelum kirim menggunakan JavaScript sederhana.
- Tampilkan aturan tipe dan ukuran file.
- Tampilkan validasi dekat input.
- Tombol utama “Kirim Tiket”.
- Tidak perlu fitur draf karena tidak tercantum pada rancangan skripsi.

## Aturan Bisnis dan Keamanan

- Aset wajib valid.
- Deskripsi wajib.
- Lokasi detail wajib.
- Kategori kerusakan wajib.
- Prioritas wajib dari daftar yang disepakati.
- Minimal satu foto `BUKTI_KERUSAKAN`.
- Validasi ekstensi, MIME, dan ukuran file.
- Simpan nama file acak di luar `public`.
- Notifikasi dibuat untuk seluruh akun TU aktif.
- Ticket hanya dibuat satu kali meskipun upload atau notifikasi gagal; gunakan rollback untuk kegagalan transaksi inti.

## Dilarang pada Mikro-Fase Ini

- Edit tiket setelah dikirim;
- draf tiket;
- verifikasi TU;
- revisi;
- persetujuan;
- SLA;
- teknisi.

## Acceptance Criteria

- [ ] Pegawai dapat mengirim tiket lengkap.
- [ ] Nomor tiket unik dibuat.
- [ ] Status awal `DIAJUKAN`.
- [ ] Foto kerusakan tersimpan privat.
- [ ] Ticket log tercatat.
- [ ] Notifikasi TU tercatat.
- [ ] Pegawai tidak dapat mengajukan tanpa foto.

## Penutup

Perbarui status proyek dan berikan laporan akhir sesuai format global. Berhenti setelah mikro-fase ini selesai.
