validate([ 'siswa_id' => 'required', 'semester' => 'required|string', 'tahun_ajaran' => 'required|string', 'nilai_aik' => 'required|string', 'nilai_budi_pekerti' => 'required|string', 'nilai_jati_diri' => 'required|string', 'nilai_literasi_steam' => 'required|string', 'nilai_kokurikuler' => 'required|string', // 'catatan_guru' => 'nullable|string', // Admin Rapot model does not have catatan_guru 'tinggi_badan' => 'required|numeric', 'berat_badan' => 'required|numeric', 'lingkar_kepala' => 'required|numeric', 'sakit' => 'required|numeric', 'izin' => 'required|numeric', 'alpha' => 'required|numeric', ]); try { // Gunakan Model Rapot (sesuai Web Admin) $rapot = new \App\Models\Rapot(); $rapot->siswa_id = $request->siswa_id; $rapot->semester = $request->semester; $rapot->tahun_ajaran = $request->tahun_ajaran; $rapot->tanggal_rapot = now()->format('Y-m-d'); // Map ke kolom Model Rapot $rapot->narasi_agama = $request->nilai_aik; $rapot->narasi_budi_pekerti = $request->nilai_budi_pekerti; $rapot->narasi_jati_diri = $request->nilai_jati_diri; $rapot->narasi_literasi = $request->nilai_literasi_steam; $rapot->narasi_kokurikuler = $request->nilai_kokurikuler; $rapot->tinggi_badan = $request->tinggi_badan; $rapot->berat_badan = $request->berat_badan; $rapot->lingkar_kepala = $request->lingkar_kepala; $rapot->sakit = $request->sakit; $rapot->izin = $request->izin; $rapot->alpha = $request->alpha; // Default Guru name from logged in user if available $rapot->nama_guru = auth()->user()->name ?? 'Guru PAUD'; $rapot->save(); return response()->json([ 'success' => true, 'message' => 'Data Rapot berhasil disimpan', 'data' => $rapot ], 201); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Gagal menyimpan rapot: ' . $e->getMessage() ], 500); } } // 1. Input Catatan Anekdot public function storeAnekdot(Request $request) { $request->validate([ 'siswa_id' => 'required', 'tanggal' => 'required|date', 'kejadian_teramati' => 'required', 'analisis_capaian' => 'required', ]); // Otomatis isi guru_id dari user yang login $data = $request->all(); $data['guru_id'] = $request->user()->id; Anekdot::create($data); return response()->json(['success' => true, 'message' => 'Anekdot berhasil disimpan']); } // Ambil Riwayat Anekdot yang dibuat oleh Guru yang login public function getAnekdot(Request $request) { $data = Anekdot::with('siswa')->where('guru_id', $request->user()->id)->latest()->get(); return response()->json(['success' => true, 'data' => $data]); } // Ambil Riwayat Hasil Karya yang dibuat oleh Guru yang login public function getKarya(Request $request) { $data = HasilKarya::with('siswa')->where('guru_id', $request->user()->id)->latest()->get(); $data->transform(function ($item) { $item->foto_url = $item->foto ? asset('storage/' . $item->foto) : null; return $item; }); return response()->json(['success' => true, 'data' => $data]); } // Ambil Riwayat Ceklis yang dibuat oleh Guru yang login public function getCeklis(Request $request) { $data = PenilaianCeklis::with('siswa')->where('guru_id', $request->user()->id)->latest()->get(); return response()->json(['success' => true, 'data' => $data]); } // 2. Input Hasil Karya (Upload Foto) public function storeKarya(Request $request) { $request->validate([ 'siswa_id' => 'required', 'tanggal' => 'required|date', 'foto' => 'required|image|max:5120', // Max 5MB 'analisis_capaian' => 'required', ]); // Upload Foto $path = null; if ($request->hasFile('foto')) { $path = $request->file('foto')->store('karya', 'public'); } HasilKarya::create([ 'siswa_id' => $request->siswa_id, 'guru_id' => $request->user()->id, 'tanggal' => $request->tanggal, 'foto' => $path, 'deskripsi_foto' => $request->deskripsi_foto, 'analisis_capaian' => $request->analisis_capaian, ]); return response()->json(['success' => true, 'message' => 'Karya berhasil disimpan']); } public function storeCeklis(Request $request) { // Validasi disesuaikan dengan struktur tabel penilaian_ceklis kamu $request->validate([ 'siswa_id' => 'required|exists:siswas,id', 'tanggal' => 'required|date', 'aspek_perkembangan' => 'required|string', 'indikator' => 'required|string', 'hasil' => 'required|in:BB,MB,BSH,BSB', // Validasi skala PAUD 'keterangan' => 'nullable|string', ]); // Simpan data ke database $ceklis = PenilaianCeklis::create([ 'siswa_id' => $request->siswa_id, 'guru_id' => $request->user()->id, // Ambil ID dari Guru yang login 'tanggal' => $request->tanggal, 'aspek_perkembangan' => $request->aspek_perkembangan, 'indikator' => $request->indikator, 'hasil' => $request->hasil, 'keterangan' => $request->keterangan, ]); return response()->json([ 'success' => true, 'message' => 'Penilaian Ceklis berhasil disimpan', 'data' => $ceklis ], 201); } // 3. Input Penjemputan (Scan QR) public function storePenjemputan(Request $request) { $request->validate([ 'siswa_id' => 'required', 'nama_penjemput' => 'required', 'status_hubungan' => 'required', 'foto' => 'nullable|image', ]); $pathFoto = null; if ($request->hasFile('foto')) { $pathFoto = $request->file('foto')->store('penjemputan', 'public'); } Penjemputan::create([ 'siswa_id' => $request->siswa_id, 'nama_penjemput' => $request->nama_penjemput, 'status_hubungan' => $request->status_hubungan, 'foto_bukti' => $pathFoto, 'waktu_jemput' => now(), ]); return response()->json(['success' => true, 'message' => 'Data penjemputan tercatat']); } // 4. Scan QR Penjemputan public function scanJemput(Request $request) { $request->validate([ 'qr_code' => 'required', ]); $qrCodeData = $request->qr_code; $parts = explode('_', $qrCodeData); $idSiswa = $parts[0]; if (count($parts) > 1) { $qrDate = $parts[1]; if ($qrDate !== date('Y-m-d')) { return response()->json([ 'success' => false, 'message' => 'QR Code Kadaluarsa! Harap gunakan QR hari ini.' ], 400); } } else { return response()->json([ 'success' => false, 'message' => 'Format QR Code tidak valid atau Kadaluarsa!' ], 400); } // Cari siswa berdasarkan qr_code (Biasanya NIS atau ID Siswa) $siswa = Siswa::where('nis', $idSiswa) ->orWhere('id', $idSiswa) ->first(); if (!$siswa) { return response()->json([ 'success' => false, 'message' => 'QR Code tidak valid! Data siswa tidak ditemukan.' ], 404); } // Cek request untuk nama penjemput dan status $statusPenjemput = $request->status_penjemput ?? 'Orang Tua / Wali'; Penjemputan::create([ 'siswa_id' => $siswa->id, 'nama_penjemput' => $statusPenjemput, 'status_hubungan' => $statusPenjemput == 'Orang Tua' ? 'Orang Tua' : 'Diwakilkan', 'waktu_jemput' => now(), ]); // --- TRIGGER FCM NOTIFICATION KE WALI MURID --- if ($siswa->waliMurid && $siswa->waliMurid->user && $siswa->waliMurid->user->fcm_token) { $token = $siswa->waliMurid->user->fcm_token; $namaAnak = $siswa->nama_siswa ?? $siswa->nama_lengkap ?? 'Ananda'; $this->sendFCMNotification( "Penjemputan Berhasil", "Ananda {$namaAnak} telah berhasil dijemput dan diverifikasi oleh Guru.", [$token] ); } return response()->json([ 'success' => true, 'message' => 'Berhasil mencatat penjemputan untuk ' . ($siswa->nama_siswa ?? $siswa->nama_lengkap) ]); } }