232 lines
6.3 KiB
Markdown
232 lines
6.3 KiB
Markdown
# PERBAIKAN FITUR CAPAIAN SANTRI - MOBILE APP
|
|
|
|
**Tanggal:** 10 Februari 2026
|
|
**Status:** ✅ **SELESAI**
|
|
|
|
## 🐛 Masalah yang Ditemukan
|
|
|
|
Fitur Capaian Santri di aplikasi mobile gagal mengambil data dari API, meskipun route API sudah terdaftar dengan benar.
|
|
|
|
### Root Cause
|
|
|
|
Kesalahan query database pada model **Semester**:
|
|
- Migrasi database menggunakan kolom: `is_active` (boolean)
|
|
- Kode controller menggunakan: `where('status', 'Aktif')` ❌
|
|
- Error: `SQLSTATE[42S22]: Column not found: 1054 Unknown column 'status' in 'where clause'`
|
|
|
|
## ✅ Perbaikan yang Dilakukan
|
|
|
|
### 1. File: `ApiCapaianController.php`
|
|
|
|
**Lokasi:** `sim-pkpps/app/Http/Controllers/Api/ApiCapaianController.php`
|
|
|
|
#### Perubahan:
|
|
|
|
| Baris | Sebelum | Sesudah |
|
|
|-------|---------|---------|
|
|
| 57 | `Semester::where('status', 'Aktif')->first()` | `Semester::aktif()->first()` |
|
|
| 115 | `$s->status === 'Aktif'` | `$s->is_active == 1` |
|
|
| 115 | `'status'` dalam select | `'is_active'` dalam select |
|
|
| 192 | `Semester::where('status', 'Aktif')->first()` | `Semester::aktif()->first()` |
|
|
|
|
**Detail Perubahan:**
|
|
|
|
```php
|
|
// ❌ SEBELUM
|
|
$semesterAktif = Semester::where('status', 'Aktif')->first();
|
|
|
|
$semesters = Semester::select('id_semester', 'nama_semester', 'tahun_ajaran', 'periode', 'status')
|
|
->get()
|
|
->map(function($s) {
|
|
return [
|
|
'id_semester' => $s->id_semester,
|
|
'nama_semester' => $s->nama_semester,
|
|
'is_aktif' => $s->status === 'Aktif',
|
|
];
|
|
});
|
|
|
|
// ✅ SESUDAH
|
|
$semesterAktif = Semester::aktif()->first();
|
|
|
|
$semesters = Semester::select('id_semester', 'nama_semester', 'tahun_ajaran', 'periode', 'is_active')
|
|
->get()
|
|
->map(function($s) {
|
|
return [
|
|
'id_semester' => $s->id_semester,
|
|
'nama_semester' => $s->nama_semester,
|
|
'is_aktif' => $s->is_active == 1,
|
|
];
|
|
});
|
|
```
|
|
|
|
### 2. File: `DashboardController.php`
|
|
|
|
**Lokasi:** `sim-pkpps/app/Http/Controllers/DashboardController.php`
|
|
|
|
**Baris 77:** Diperbaiki query semester
|
|
|
|
```php
|
|
// ❌ SEBELUM
|
|
$semesterAktif = Semester::where('status', 'aktif')->first();
|
|
|
|
// ✅ SESUDAH
|
|
$semesterAktif = Semester::aktif()->first();
|
|
```
|
|
|
|
## 🧪 Testing
|
|
|
|
### 1. Test Database Query
|
|
|
|
```bash
|
|
php test_capaian_api.php
|
|
```
|
|
|
|
**Hasil:**
|
|
```
|
|
✅ Santri: HELGA FAISA (ID: S001, Kelas: Lambatan)
|
|
✅ Semester Aktif: Semester 1 2024/2025 (ID: SEM001)
|
|
📚 Materi untuk kelas Lambatan: 1 materi
|
|
📊 Capaian Santri: 1 capaian
|
|
```
|
|
|
|
### 2. Test API Endpoint
|
|
|
|
```bash
|
|
php test_capaian_endpoint.php
|
|
```
|
|
|
|
**Endpoint:** `GET /api/v1/capaian/overview`
|
|
|
|
**Response (200 OK):**
|
|
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"santri": {
|
|
"id_santri": "S001",
|
|
"nama_lengkap": "HELGA FAISA",
|
|
"kelas": "Lambatan"
|
|
},
|
|
"semester": {
|
|
"id_semester": "SEM001",
|
|
"nama_semester": "Semester 1 2024/2025",
|
|
"list_semester": [
|
|
{
|
|
"id_semester": "SEM002",
|
|
"nama_semester": "Semester 2 2025/2026",
|
|
"is_aktif": false
|
|
},
|
|
{
|
|
"id_semester": "SEM001",
|
|
"nama_semester": "Semester 1 2024/2025",
|
|
"is_aktif": true
|
|
}
|
|
]
|
|
},
|
|
"statistik_umum": {
|
|
"total_materi": 1,
|
|
"rata_rata_progress": 6,
|
|
"materi_selesai": 0
|
|
},
|
|
"per_kategori": [
|
|
{
|
|
"kategori": "Al-Qur'an",
|
|
"icon": "book_quran",
|
|
"color": "#6FBAA5",
|
|
"total_materi": 1,
|
|
"rata_rata_progress": 6,
|
|
"materi_selesai": 0
|
|
},
|
|
{
|
|
"kategori": "Hadist",
|
|
"icon": "scroll",
|
|
"color": "#81C6E8",
|
|
"total_materi": 0,
|
|
"rata_rata_progress": 0,
|
|
"materi_selesai": 0
|
|
},
|
|
{
|
|
"kategori": "Materi Tambahan",
|
|
"icon": "book",
|
|
"color": "#FFD56B",
|
|
"total_materi": 0,
|
|
"rata_rata_progress": 0,
|
|
"materi_selesai": 0
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
**Validasi Struktur Data:**
|
|
- ✅ Santri data exists
|
|
- ✅ Semester data exists
|
|
- ✅ Statistik umum exists
|
|
- ✅ Per kategori exists
|
|
- ✅ List semester: 2 items
|
|
- ✅ Categories: 3 items
|
|
|
|
## 📱 Verifikasi Mobile App
|
|
|
|
### API Endpoints yang Diperbaiki
|
|
|
|
1. ✅ `GET /api/v1/capaian/overview` - Overview capaian dengan statistik
|
|
2. ✅ `GET /api/v1/capaian/kategori/{kategori}` - List materi per kategori
|
|
3. ✅ `GET /api/v1/capaian/detail/{idCapaian}` - Detail capaian per materi
|
|
4. ✅ `GET /api/v1/capaian/grafik-progress` - Grafik progress historis
|
|
|
|
### Model Semester (Referensi)
|
|
|
|
**File:** `app/Models/Semester.php`
|
|
|
|
**Kolom Database:**
|
|
- `is_active` (boolean) - Status aktif semester
|
|
- Scope helper: `scopeAktif()` untuk query semester aktif
|
|
|
|
```php
|
|
// ✅ CARA YANG BENAR
|
|
Semester::aktif()->first()
|
|
Semester::where('is_active', 1)->first()
|
|
|
|
// ❌ CARA YANG SALAH (kolom tidak ada)
|
|
Semester::where('status', 'Aktif')->first()
|
|
```
|
|
|
|
## 📝 Catatan Tambahan
|
|
|
|
### Data Testing
|
|
|
|
File `add_capaian_test_data.php` ditambahkan untuk membuat data testing dengan progress 6%.
|
|
|
|
### Logika Filtering
|
|
|
|
API hanya menghitung capaian dengan `persentase > 0` dalam statistik:
|
|
```php
|
|
$capaiansBerisi = $capaians->where('persentase', '>', 0);
|
|
```
|
|
|
|
Ini berarti capaian dengan 0 halaman selesai tidak akan muncul di statistik.
|
|
|
|
## 🔍 Checklist Verifikasi
|
|
|
|
- [x] Semester query diperbaiki di `ApiCapaianController`
|
|
- [x] Semester query diperbaiki di `DashboardController`
|
|
- [x] Model `Semester` scope `aktif()` digunakan dengan benar
|
|
- [x] API endpoint `capaian/overview` mengembalikan response 200
|
|
- [x] Struktur JSON response sesuai dengan model Flutter
|
|
- [x] Data testing ditambahkan dengan progress > 0%
|
|
- [x] Field `is_aktif` dalam list_semester bernilai boolean
|
|
|
|
## ✨ Kesimpulan
|
|
|
|
Masalah **berhasil diperbaiki** dengan mengubah query dari kolom `status` yang tidak ada menjadi `is_active` yang sesuai dengan struktur database.
|
|
|
|
Mobile app sekarang dapat:
|
|
- ✅ Mengambil overview capaian santri
|
|
- ✅ Melihat statistik per kategori
|
|
- ✅ Filter berdasarkan semester
|
|
- ✅ Menampilkan progress capaian
|
|
|
|
**Status:** Siap untuk testing di aplikasi mobile Flutter! 🚀
|