308 lines
9.1 KiB
Markdown
308 lines
9.1 KiB
Markdown
# DOKUMENTASI PENGEMBANGAN FITUR PEMBAYARAN SPP
|
|
|
|
## 📋 Overview
|
|
Fitur Pembayaran SPP telah dikembangkan dengan sistem tab yang memisahkan antara santri yang sudah bayar dan belum bayar, dilengkapi dengan sistem filter yang komprehensif dan badge status yang jelas.
|
|
|
|
## ✨ Fitur yang Dikembangkan
|
|
|
|
### 1. **Sistem Tab "Sudah Bayar" & "Belum Bayar"**
|
|
- **Tab Sudah Bayar**: Menampilkan daftar santri yang telah melunasi SPP periode tertentu
|
|
- Menampilkan nominal yang dibayarkan
|
|
- Tanggal pembayaran
|
|
- Link ke riwayat pembayaran santri
|
|
- Tombol cetak bukti pembayaran
|
|
|
|
- **Tab Belum Bayar**: Menampilkan daftar santri yang belum melunasi SPP
|
|
- Menampilkan nominal tagihan
|
|
- Batas waktu pembayaran
|
|
- Jumlah hari keterlambatan (jika telat)
|
|
- Link ke halaman tagihan santri
|
|
- Tombol untuk membuat tagihan baru (jika belum ada)
|
|
|
|
### 2. **Status Pembayaran**
|
|
Tiga status utama:
|
|
- ✅ **Sudah Bayar (Lunas)**: Badge hijau dengan gradient
|
|
- ⏰ **Belum Bayar (Belum Lunas)**: Badge warning dengan gradient pink
|
|
- 🚨 **Terlambat**: Badge merah dengan animasi pulse dan highlight baris
|
|
|
|
### 3. **Filter Data**
|
|
- **Filter Bulan**: Dropdown untuk memilih bulan (1-12)
|
|
- **Filter Tahun**: Dropdown tahun berdasarkan data yang ada
|
|
- **Filter Status** (hanya di tab Belum Bayar):
|
|
- Semua Status
|
|
- Belum Lunas
|
|
- Terlambat
|
|
- Belum Ada Tagihan
|
|
- **Search**: Pencarian berdasarkan nama santri, NIS, atau ID Santri
|
|
- **Default Filter**: Otomatis menampilkan bulan dan tahun saat ini
|
|
|
|
### 4. **Badge & Penanda Khusus**
|
|
- Badge "TERLAMBAT" berwarna merah terang dengan animasi pulse
|
|
- Highlight baris dengan background merah muda untuk santri yang terlambat
|
|
- Informasi jumlah hari keterlambatan
|
|
- Badge dengan gradient yang menarik untuk setiap status
|
|
|
|
### 5. **Statistik Dashboard**
|
|
Empat card statistik dengan gradient:
|
|
- 👥 **Total Santri**: Jumlah total santri aktif
|
|
- ✅ **Sudah Bayar**: Jumlah santri yang sudah bayar + total nominal
|
|
- ❌ **Belum Bayar**: Jumlah santri yang belum bayar + total tunggakan
|
|
- ⏰ **Terlambat**: Jumlah santri yang melewati batas waktu
|
|
|
|
### 6. **Navigasi & UX**
|
|
- Tab navigation dengan counter badge
|
|
- Informasi periode yang sedang ditampilkan
|
|
- Tombol reset filter
|
|
- Pagination manual dengan info halaman
|
|
- Hover effects pada tombol dan baris tabel
|
|
- Responsive design
|
|
|
|
### 7. **Integrasi Form Create**
|
|
- Pre-fill form dengan parameter dari URL
|
|
- Otomatis memilih santri, bulan, dan tahun dari link "Buat Tagihan"
|
|
|
|
## 🗂️ File yang Dimodifikasi
|
|
|
|
### 1. **Controller** - `PembayaranSppController.php`
|
|
```php
|
|
// Method index() - Complete rewrite
|
|
- Menambahkan sistem tab (sudah-bayar / belum-bayar)
|
|
- Grouping data per santri (bukan per transaksi)
|
|
- Filter berdasarkan bulan, tahun, search, dan status
|
|
- Perhitungan statistik real-time
|
|
- Manual pagination
|
|
- Default filter ke bulan/tahun saat ini
|
|
```
|
|
|
|
**Fitur Utama:**
|
|
- Eager loading untuk optimasi query
|
|
- Collection mapping untuk data transformation
|
|
- Filter dinamis berdasarkan tab
|
|
- Statistik agregasi (count & sum)
|
|
|
|
### 2. **View** - `index.blade.php`
|
|
**Struktur Baru:**
|
|
```php
|
|
1. Alert messages (success/error)
|
|
2. Filter section dengan label dan icon
|
|
3. Statistics cards (4 cards dengan gradient)
|
|
4. Tab navigation (Belum Bayar & Sudah Bayar)
|
|
5. Action buttons (Generate, Tambah, Laporan)
|
|
6. Periode info
|
|
7. Data table dengan kolom dinamis
|
|
8. Manual pagination
|
|
9. Custom CSS untuk badge dan animasi
|
|
```
|
|
|
|
**Styling:**
|
|
- Gradient backgrounds untuk cards
|
|
- Badge dengan animasi pulse untuk status terlambat
|
|
- Hover effects
|
|
- Highlight baris untuk santri terlambat
|
|
- Responsive grid layout
|
|
|
|
### 3. **View** - `create.blade.php`
|
|
**Modifikasi:**
|
|
- Pre-fill `id_santri` dari request parameter
|
|
- Pre-fill `bulan` dari request parameter
|
|
- Pre-fill `tahun` dari request parameter
|
|
- Fallback ke nilai default jika parameter tidak ada
|
|
|
|
## 📊 Flow Data
|
|
|
|
### Tab "Belum Bayar"
|
|
```
|
|
1. Query santri aktif dengan eager load pembayaran
|
|
2. Filter by bulan & tahun
|
|
3. Filter santri yang belum lunas atau belum ada tagihan
|
|
4. Apply search filter
|
|
5. Apply status filter (Belum Lunas/Telat/Belum Ada Tagihan)
|
|
6. Hitung statistik
|
|
7. Manual pagination
|
|
8. Return view dengan data
|
|
```
|
|
|
|
### Tab "Sudah Bayar"
|
|
```
|
|
1. Query santri aktif dengan eager load pembayaran
|
|
2. Filter by bulan & tahun
|
|
3. Filter santri yang status = Lunas
|
|
4. Apply search filter
|
|
5. Hitung statistik
|
|
6. Manual pagination
|
|
7. Return view dengan data
|
|
```
|
|
|
|
## 🎨 Design Decisions
|
|
|
|
### 1. **Grouping per Santri (bukan per transaksi)**
|
|
**Alasan:**
|
|
- Lebih intuitif untuk monitoring pembayaran
|
|
- Mudah melihat siapa yang sudah/belum bayar
|
|
- Menghindari duplikasi data santri
|
|
|
|
### 2. **Default Filter ke Bulan/Tahun Saat Ini**
|
|
**Alasan:**
|
|
- Fokus pada periode aktif
|
|
- Mengurangi clutter data
|
|
- Admin biasanya ingin cek bulan berjalan
|
|
|
|
### 3. **Manual Pagination**
|
|
**Alasan:**
|
|
- Data sudah difilter di collection
|
|
- Built-in paginator tidak cocok untuk collection hasil transform
|
|
- Lebih fleksibel untuk custom logic
|
|
|
|
### 4. **Badge dengan Animasi Pulse**
|
|
**Alasan:**
|
|
- Menarik perhatian untuk santri yang telat
|
|
- Visual feedback yang jelas
|
|
- Meningkatkan UX
|
|
|
|
### 5. **Tab System**
|
|
**Alasan:**
|
|
- Pemisahan yang jelas antara lunas dan belum lunas
|
|
- Mengurangi cognitive load
|
|
- Mudah fokus pada salah satu kelompok
|
|
|
|
## 🔍 Query Optimization
|
|
|
|
### Eager Loading
|
|
```php
|
|
Santri::where('status', 'Aktif')
|
|
->with(['pembayaranSpp' => function($q) use ($bulan, $tahun) {
|
|
$q->where('bulan', $bulan)->where('tahun', $tahun);
|
|
}])
|
|
```
|
|
**Benefit:**
|
|
- Menghindari N+1 query problem
|
|
- Load hanya data pembayaran yang relevan
|
|
- Performa lebih cepat
|
|
|
|
### Collection Filtering vs Query Filtering
|
|
- Query filtering untuk periode (bulan/tahun)
|
|
- Collection filtering untuk status dan search
|
|
- Lebih fleksibel untuk logic complex
|
|
|
|
## 🎯 Key Features Breakdown
|
|
|
|
### Penanda Telat
|
|
```php
|
|
// Check telat di Model
|
|
public function isTelat() {
|
|
if ($this->status === 'Lunas') return false;
|
|
return Carbon::now()->isAfter($this->batas_bayar);
|
|
}
|
|
|
|
// Highlight visual
|
|
- Background baris: #fff5f5 (pink muda)
|
|
- Badge: Gradient merah dengan animasi
|
|
- Info: Jumlah hari keterlambatan
|
|
```
|
|
|
|
### Filter yang Sedang Aktif
|
|
```php
|
|
// Preserve filter saat pindah tab
|
|
array_merge(request()->except('tab'), ['tab' => 'sudah-bayar'])
|
|
|
|
// Show reset button jika ada filter
|
|
@if(request()->hasAny(['search', 'filter_status']) || $bulan != date('n') || $tahun != date('Y'))
|
|
```
|
|
|
|
### Link ke Riwayat/Tagihan
|
|
```php
|
|
// Riwayat pembayaran per santri
|
|
route('admin.pembayaran-spp.riwayat', $item['id_santri'])
|
|
|
|
// Create dengan pre-fill
|
|
route('admin.pembayaran-spp.create', [
|
|
'id_santri' => $item['id_santri'],
|
|
'bulan' => $bulan,
|
|
'tahun' => $tahun
|
|
])
|
|
```
|
|
|
|
## 📱 Responsive Design
|
|
|
|
### Grid Layout
|
|
```css
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
```
|
|
**Benefit:**
|
|
- Auto-responsive tanpa media queries manual
|
|
- Kartu statistik menyesuaikan lebar layar
|
|
|
|
### Form Filter
|
|
```css
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
```
|
|
**Benefit:**
|
|
- Input fields wrap ke baris baru di layar kecil
|
|
- Tetap horizontal di layar besar
|
|
|
|
## ⚡ Performance Considerations
|
|
|
|
1. **Pagination**: 20 items per page - balance antara UX dan performa
|
|
2. **Eager Loading**: Hindari N+1 queries
|
|
3. **Collection Operations**: Lebih cepat daripada multiple queries
|
|
4. **CSS Animations**: Hardware-accelerated (opacity, transform)
|
|
|
|
## 🚀 Testing Checklist
|
|
|
|
- [ ] Tab switching preserve filter
|
|
- [ ] Filter bulan & tahun berfungsi
|
|
- [ ] Search santri berfungsi
|
|
- [ ] Filter status di tab Belum Bayar
|
|
- [ ] Badge terlambat muncul untuk santri telat
|
|
- [ ] Statistik terupdate sesuai filter
|
|
- [ ] Pagination berfungsi
|
|
- [ ] Link riwayat pembayaran
|
|
- [ ] Link buat tagihan dengan pre-fill
|
|
- [ ] Tombol reset filter
|
|
- [ ] Cetak bukti di tab Sudah Bayar
|
|
- [ ] Responsive di mobile
|
|
|
|
## 📝 Notes untuk Developer
|
|
|
|
### Jangan Ubah:
|
|
- ❌ Struktur database
|
|
- ❌ Alur bisnis (create, update, delete)
|
|
- ❌ Routes yang sudah ada
|
|
- ❌ Model relationships
|
|
|
|
### Boleh Dikustomisasi:
|
|
- ✅ Warna gradient badge
|
|
- ✅ Jumlah item per page
|
|
- ✅ Default filter (jika tidak ingin ke bulan saat ini)
|
|
- ✅ Kolom tambahan di tabel
|
|
- ✅ Statistik tambahan
|
|
|
|
### Tips Maintenance:
|
|
1. Gunakan Collection operations untuk filtering complex
|
|
2. Keep controller logic readable dengan method extract jika perlu
|
|
3. Cache tahunList jika data besar
|
|
4. Monitor query performance dengan Laravel Debugbar
|
|
|
|
## 🐛 Known Limitations
|
|
|
|
1. **Manual Pagination**: Tidak kompatibel dengan Laravel Pagination Links bawaan
|
|
2. **Collection Filtering**: Semua data santri di-load dulu sebelum filter - bisa lambat jika santri > 1000
|
|
3. **Real-time Stats**: Dihitung setiap request - pertimbangkan caching untuk production
|
|
|
|
## 💡 Future Enhancements
|
|
|
|
1. **Export Excel**: Export data berdasarkan filter
|
|
2. **Bulk Actions**: Tandai lunas multiple santri sekaligus
|
|
3. **Notifications**: Email/SMS reminder untuk yang telat
|
|
4. **Dashboard Chart**: Visualisasi trend pembayaran
|
|
5. **Auto Reminder**: Cron job untuk reminder otomatis
|
|
6. **Payment Gateway**: Integrasi pembayaran online
|
|
|
|
---
|
|
|
|
**Last Updated**: February 6, 2026
|
|
**Version**: 1.0
|
|
**Developer**: GitHub Copilot Assistant
|