MIF_E31230892/DOKUMENTASI_PERBAIKAN_CAPAI...

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

  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
// ✅ 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 Semester scope aktif() digunakan dengan benar
  • API endpoint capaian/overview mengembalikan response 200
  • Struktur JSON response sesuai dengan model Flutter
  • Data testing ditambahkan dengan progress > 0%
  • 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! 🚀