6.3 KiB
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:
// ❌ 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
// ❌ SEBELUM
$semesterAktif = Semester::where('status', 'aktif')->first();
// ✅ SESUDAH
$semesterAktif = Semester::aktif()->first();
🧪 Testing
1. Test Database Query
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
php test_capaian_endpoint.php
Endpoint: GET /api/v1/capaian/overview
Response (200 OK):
{
"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
- ✅
GET /api/v1/capaian/overview- Overview capaian dengan statistik - ✅
GET /api/v1/capaian/kategori/{kategori}- List materi per kategori - ✅
GET /api/v1/capaian/detail/{idCapaian}- Detail capaian per materi - ✅
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
// ✅ 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:
$capaiansBerisi = $capaians->where('persentase', '>', 0);
Ini berarti capaian dengan 0 halaman selesai tidak akan muncul di statistik.
🔍 Checklist Verifikasi
- Semester query diperbaiki di
ApiCapaianController - Semester query diperbaiki di
DashboardController - Model
Semesterscopeaktif()digunakan dengan benar - API endpoint
capaian/overviewmengembalikan response 200 - Struktur JSON response sesuai dengan model Flutter
- Data testing ditambahkan dengan progress > 0%
- Field
is_aktifdalam 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! 🚀