# Changelog - Perbaikan Project Laravel PO

## Versi Terbaru (April 2026)

### 🔴 Bug Fix Kritis

**`routes/web.php`**
- Hapus route duplikat `/po/create` dan `/po/store` yang menyebabkan routing conflict
- Semua route PO kini menggunakan prefix `po.` dengan named routes
- Tambah constraint `where('id', '[0-9]+')` agar route `{id}` tidak bentrok dengan `/po/create`

**`PoController.php` — fungsi `print()`**
- Sebelumnya selalu render `npo-pdf` meski jenis_form = "Form Proforma PO"
- Sekarang otomatis pilih template: `ppo-pdf` untuk PPO, `npo-pdf` untuk NPO
- PDF di-*stream* (preview di browser) bukan langsung download, lebih user-friendly

### 🟡 Perbaikan Template Cetak

**`npo-pdf.blade.php`** (baru, menggantikan versi lama)
- Judul diperbaiki: "PURCHASE ORDER" (bukan "PROFORMA PURCHASE ORDER")
- Layout 3-kolom header: Purchase From | Deliver To | PO Info Box dengan border
- Tabel item sesuai format Excel: kolom No, Description, Part Number, Qty, UM, Unit Price, Amount
- Baris kosong padding minimal 10 baris agar tampilan penuh
- Comments dan Summary (Sub Total, PPN 11%, Balance Due) sejajar dalam satu baris

**`ppo-pdf.blade.php`** (baru, menggantikan `po-ppo.blade.php`)
- Layout identik dengan NPO tapi judul "Proforma Purchase Order"
- Note disclaimer PPO ditambahkan di bagian Comments

### 🔵 Keamanan & Efisiensi

**`PoController.php`**
- Validasi lengkap di `store()` dan `update()`: semua field wajib, tipe data, enum `jenis_form`
- Race condition `no_po` diatasi dengan `DB::transaction` + `lockForUpdate()`
- Gunakan `filled()` bukan `if($desc)` untuk cek string kosong yang lebih aman

**`Po.php` & `PoDetail.php`**
- Tambah `$casts` untuk konversi tipe otomatis (`date`, `integer`, `decimal`)
- Accessor `getSubtotalAttribute()` di PoDetail untuk kemudahan kalkulasi

### 🟢 UI/UX Improvement

**`basic-tables-three.blade.php`**
- Tambah kolom "Jenis" dengan badge berwarna (kuning=PPO, hijau=NPO)
- Tombol "Cetak" langsung dari list dengan ikon printer, buka di tab baru
- Flash message sukses/gagal setelah operasi CRUD
- Empty state yang lebih informatif dengan ikon dan link ke form tambah

**`form-elements/default-inputs.blade.php`** (form create)
- Label lebih deskriptif, tanda `*` untuk field wajib
- Error message per field dari server-side validation
- Info panel: panduan jenis form NPO vs PPO
- Nomor urut baris item diperbarui otomatis saat baris dihapus

**`edit-po.blade.php`**
- Gunakan named routes `route('po.update', $id)` bukan hardcode URL
- Old input tersimpan jika validasi gagal
- Tombol "Batal" kembali ke detail, bukan ke list

**`detail-po.blade.php`**
- Layout grid info header lebih rapi
- Summary lengkap: Sub Total, PPN 11%, Total
- Label tombol Cetak menampilkan jenis form (NPO/PPO)

### ⚠️ Catatan untuk Developer

1. Pastikan `APP_KEY` sudah di-generate: `php artisan key:generate`
2. Jalankan migrasi: `php artisan migrate`
3. Install DomPDF jika belum: `composer require barryvdh/laravel-dompdf`
4. Untuk produksi: aktifkan middleware auth pada route group PO
