id)->first(); if (!$wali) { return response()->json([ 'success' => false, 'message' => 'Profil Wali Murid tidak ditemukan', ], 404); } // 2. Dapatkan Data Siswa (Asumsi: 1 Wali -> 1 Siswa utama) $siswa = Siswa::with('kelompok') ->where('wali_murid_id', $wali->id) ->first(); if (!$siswa) { return response()->json([ 'success' => false, 'message' => 'Data Anak tidak ditemukan untuk wali ini', ], 404); } // 3. Pengumuman Aktif Terbaru $pengumuman = Pengumuman::where('status', true) ->where(function ($query) { $query->whereNull('tanggal_mulai') ->orWhereDate('tanggal_mulai', '<=', now()); }) ->where(function ($query) { $query->whereNull('tanggal_selesai') ->orWhereDate('tanggal_selesai', '>=', now()); }) ->latest() ->first(); // 4. Hitung Rekapan 6 Aspek Perkembangan dari Ceklis $ceklis = PenilaianCeklis::where('siswa_id', $siswa->id)->get(); $aspekList = [ 'Nilai Agama & Moral', 'Fisik Motorik', 'Kognitif', 'Bahasa', 'Sosial Emosional', 'Seni', ]; $progressPerkembangan = []; foreach ($aspekList as $aspek) { // Murni kalkulasi berdasarkan data riil yang match aspeknya $ceklisAspek = $ceklis->where('aspek_perkembangan', $aspek); $totalScore = 0; $count = 0; foreach ($ceklisAspek as $c) { if ($c->hasil == 'BM') $totalScore += 25; elseif ($c->hasil == 'MB') $totalScore += 50; elseif ($c->hasil == 'BSH') $totalScore += 75; elseif ($c->hasil == 'BSB') $totalScore += 100; $count++; } // Murni kalkulasi berdasarkan data riil, 0 jika kosong $percentage = $count > 0 ? round($totalScore / $count) : 0; $predikat = "Perlu Bimbingan"; if ($percentage >= 76) $predikat = "Sangat Baik"; elseif ($percentage >= 51) $predikat = "Baik"; elseif ($percentage >= 26) $predikat = "Cukup"; $narasi = null; if ($count > 0) { $namaAnak = $siswa->nama_siswa ?? $siswa->nama_lengkap ?? 'Ananda'; $narasi = "Ananda {$namaAnak} telah menunjukkan perkembangan yang {$predikat} pada aspek {$aspek} dengan capaian {$percentage}%."; } $progressPerkembangan[] = [ 'aspek' => $aspek, 'nilai' => $percentage, 'narasi' => $narasi ]; } // 5. Relasi data penjemputan terakhir $penjemputanTerakhir = \App\Models\Penjemputan::where('siswa_id', $siswa->id) ->latest() ->first(); // Return Data return response()->json([ 'success' => true, 'data' => [ 'siswa' => [ 'id' => $siswa->id, 'nis' => $siswa->nis, 'nama' => $siswa->nama_siswa, 'kelas' => $siswa->kelompok->nama_kelompok ?? '-', 'foto' => $siswa->foto ?? null, ], 'pengumuman' => $pengumuman, 'progress' => $progressPerkembangan, 'penjemputan_terakhir' => $penjemputanTerakhir ] ], 200); } // --- KHUSUS WALI MURID: Riwayat Penilaian Anak Spesifik (PRIVASI) --- public function getRiwayatAnak($id) { $user = Auth::user(); // 1. Dapatkan Profil Wali $wali = WaliMurid::where('user_id', $user->id)->first(); if (!$wali) { return response()->json(['success' => false, 'message' => 'Profil Wali Murid tidak ditemukan'], 404); } // 2. Pastikan Siswa yang diminta benar-benar anak dari wali ini (Keamanan Privasi) $siswa = Siswa::where('id', $id)->where('wali_murid_id', $wali->id)->first(); if (!$siswa) { return response()->json(['success' => false, 'message' => 'Anda tidak memiliki akses ke data siswa ini'], 403); } // 3. Ambil Semua Data Riwayat Khusus Anak Ini Saja $anekdot = \App\Models\Anekdot::with('siswa') ->where('siswa_id', $siswa->id) ->latest() ->get(); $ceklis = PenilaianCeklis::with('siswa') ->where('siswa_id', $siswa->id) ->latest() ->get(); $karya = \App\Models\HasilKarya::with('siswa') ->where('siswa_id', $siswa->id) ->latest() ->get() ->map(function ($item) { if ($item->foto) { $item->foto_url = url('storage/' . $item->foto); } return $item; }); return response()->json([ 'status' => 'success', 'data' => [ 'anekdot' => $anekdot, 'ceklis' => $ceklis, 'karya' => $karya ] ], 200); } // --- KHUSUS WALI MURID: Rapot Penilaian Anak (Semester) --- public function getRapotAnak($id) { $user = Auth::user(); $wali = WaliMurid::where('user_id', $user->id)->first(); if (!$wali) { return response()->json(['success' => false, 'message' => 'Profil Wali Murid tidak ditemukan'], 404); } $siswa = Siswa::where('id', $id)->where('wali_murid_id', $wali->id)->first(); if (!$siswa) { return response()->json(['success' => false, 'message' => 'Anda tidak memiliki akses ke data siswa ini'], 403); } // Ambil SEMUA riwayat rapot untuk siswa ini $rapots = \App\Models\Rapot::with('siswa') ->where('siswa_id', $siswa->id) ->orderBy('created_at', 'desc') ->get(); if ($rapots->isEmpty()) { return response()->json(['status' => 'error', 'message' => 'Rapot belum tersedia'], 404); } return response()->json([ 'status' => 'success', 'data' => $rapots ], 200); } }