id())->firstOrFail(); return $guru->id; } public function index() { $guruId = $this->getGuruId(); // Ambil tugas yang materinya dibuat oleh guru yang sedang login $tugasList = Tugas::with('materi', 'kelas') ->whereHas('materi', function($query) use ($guruId) { $query->where('guru_id', $guruId); }) ->get(); return view('guru.tugas.index', compact('tugasList')); } public function show($id) { $guruId = $this->getGuruId(); $tugas = Tugas::with('materi') ->where('id', $id) ->whereHas('materi', function($query) use ($guruId) { $query->where('guru_id', $guruId); }) ->firstOrFail(); return view('guru.tugas.show', compact('tugas')); } public function create() { $guruId = $this->getGuruId(); $materiList = Materi::where('guru_id', $guruId)->get(); $kelasList = Kelas::all(); return view('guru.tugas.create', compact('materiList', 'kelasList')); } public function store(Request $request) { $request->validate([ 'materi_id' => 'required|exists:materi,id', 'judul' => 'required|string|max:255', 'deskripsi' => 'nullable|string', 'file' => 'nullable|file|mimes:pdf,docx,jpg,png,mp4,mov|max:20480', 'kelas_ids' => 'required|array|min:1', 'kelas_ids.*' => 'exists:kelas,id', 'deadlines' => 'required|array', ]); // Cek apakah sudah ada tugas untuk materi ini if (Tugas::where('materi_id', $request->materi_id)->exists()) { return back()->withInput()->withErrors(['materi_id' => 'Tugas untuk materi ini sudah dibuat.']); } $filePath = null; if ($request->hasFile('file')) { $filePath = $request->file('file')->store('tugas', 'public'); } DB::beginTransaction(); try { $tugas = Tugas::create([ 'materi_id' => $request->materi_id, 'judul' => $request->judul, 'deskripsi' => $request->deskripsi, 'file' => $filePath, 'deadline' => null, ]); foreach ($request->kelas_ids as $kelas_id) { $deadline = $request->deadlines[$kelas_id] ?? null; DB::table('tugas_kelas')->insert([ 'tugas_id' => $tugas->id, 'kelas_id' => $kelas_id, 'deadline' => $deadline, 'created_at' => now(), 'updated_at' => now(), ]); } DB::commit(); return redirect()->route('guru.tugas.index')->with('success', 'Tugas berhasil ditambahkan.'); } catch (\Exception $e) { DB::rollBack(); return back()->withInput()->withErrors(['error' => 'Terjadi kesalahan: ' . $e->getMessage()]); } } public function edit($id) { $guruId = $this->getGuruId(); $tugas = Tugas::with('kelas') ->where('id', $id) ->whereHas('materi', function($query) use ($guruId) { $query->where('guru_id', $guruId); }) ->firstOrFail(); $materiList = Materi::all(); $kelasList = Kelas::all(); $tugasKelas = DB::table('tugas_kelas')->where('tugas_id', $tugas->id)->get()->keyBy('kelas_id'); return view('guru.tugas.edit', compact('tugas', 'materiList', 'kelasList', 'tugasKelas')); } public function update(Request $request, $id) { $request->validate([ 'materi_id' => 'required|exists:materi,id', 'judul' => 'required|string|max:255', 'deskripsi' => 'nullable|string', 'file' => 'nullable|file|mimes:pdf,docx,jpg,png,mp4,mov|max:20480', 'kelas_ids' => 'required|array|min:1', 'kelas_ids.*' => 'exists:kelas,id', 'deadlines' => 'required|array', ]); $tugas = Tugas::findOrFail($id); // Cek apakah materi sudah digunakan di tugas lain if (Tugas::where('materi_id', $request->materi_id)->where('id', '!=', $id)->exists()) { return back()->withInput()->withErrors(['materi_id' => 'Tugas untuk materi ini sudah ada.']); } if ($request->hasFile('file')) { if ($tugas->file && Storage::disk('public')->exists($tugas->file)) { Storage::disk('public')->delete($tugas->file); } $filePath = $request->file('file')->store('tugas', 'public'); $tugas->file = $filePath; } $tugas->materi_id = $request->materi_id; $tugas->judul = $request->judul; $tugas->deskripsi = $request->deskripsi; $tugas->deadline = null; $tugas->save(); DB::beginTransaction(); try { DB::table('tugas_kelas')->where('tugas_id', $tugas->id)->delete(); foreach ($request->kelas_ids as $kelas_id) { $deadline = $request->deadlines[$kelas_id] ?? null; DB::table('tugas_kelas')->insert([ 'tugas_id' => $tugas->id, 'kelas_id' => $kelas_id, 'deadline' => $deadline, 'created_at' => now(), 'updated_at' => now(), ]); } DB::commit(); return redirect()->route('guru.tugas.index')->with('success', 'Tugas berhasil diperbarui.'); } catch (\Exception $e) { DB::rollBack(); return back()->withInput()->withErrors(['error' => 'Terjadi kesalahan: ' . $e->getMessage()]); } } public function destroy($id) { $guruId = $this->getGuruId(); $tugas = Tugas::where('id', $id) ->whereHas('materi', function($query) use ($guruId) { $query->where('guru_id', $guruId); }) ->firstOrFail(); if ($tugas->file && Storage::disk('public')->exists($tugas->file)) { Storage::disk('public')->delete($tugas->file); } DB::table('tugas_kelas')->where('tugas_id', $tugas->id)->delete(); $tugas->delete(); return redirect()->route('guru.tugas.index')->with('success', 'Tugas berhasil dihapus.'); } public function daftarPenilaian(Request $request) { $guruId = $this->getGuruId(); // ambil id guru yang login $kelas_id = $request->kelas_id; // Ambil semua kelas yang pernah diberikan tugas oleh guru ini $kelasList = DB::table('tugas_kelas') ->join('tugas', 'tugas_kelas.tugas_id', '=', 'tugas.id') ->join('kelas', 'tugas_kelas.kelas_id', '=', 'kelas.id') ->join('materi', 'tugas.materi_id', '=', 'materi.id') ->where('materi.guru_id', $guruId) ->select('kelas.id', 'kelas.nama_kelas','tingkat') ->distinct() ->get(); // Ambil tugas yang memiliki pengumpulan dan sesuai guru $tugasQuery = Tugas::withCount(['pengumpulan']) ->with('materi') ->whereHas('materi', function ($query) use ($guruId) { $query->where('guru_id', $guruId); }); // Jika ada filter kelas, hanya ambil tugas yang terkait dengan kelas itu if ($kelas_id) { $tugasQuery->whereHas('tugasKelas', function ($query) use ($kelas_id) { $query->where('kelas_id', $kelas_id); }); } $tugasList = $tugasQuery->get(); return view('guru.tugas.daftar-nilai', compact('tugasList', 'kelasList', 'kelas_id')); } public function penilaian(Request $request, $tugas_id) { $guruId = $this->getGuruId(); $kelas_id = $request->query('kelas_id'); // ambil kelas_id dari query param, bisa null // Pastikan tugas milik guru $tugasQuery = Tugas::with(['pengumpulan.siswa']) ->where('id', $tugas_id) ->whereHas('materi', function($q) use ($guruId) { $q->where('guru_id', $guruId); }); $tugas = $tugasQuery->firstOrFail(); if ($kelas_id) { // Filter pengumpulan hanya siswa yang ada di kelas tersebut $tugas->pengumpulan = $tugas->pengumpulan->filter(function ($pengumpulan) use ($kelas_id) { return $pengumpulan->siswa->kelas_id == $kelas_id; }); } // Untuk dropdown kelas di view, ambil kelas-kelas yang terkait dengan tugas ini $kelasList = DB::table('tugas_kelas') ->join('kelas', 'tugas_kelas.kelas_id', '=', 'kelas.id') ->where('tugas_kelas.tugas_id', $tugas->id) ->select('kelas.id', 'nama_kelas','tingkat') ->get(); return view('guru.tugas.penilaian', compact('tugas', 'kelasList', 'kelas_id')); } public function updateNilai(Request $request, $id) { $guruId = $this->getGuruId(); $tugasSiswa = TugasSiswa::findOrFail($id); // Pastikan tugas siswa ini milik guru yang sedang login $tugas = Tugas::where('id', $tugasSiswa->tugas_id) ->whereHas('materi', function($query) use ($guruId) { $query->where('guru_id', $guruId); }) ->firstOrFail(); $request->validate([ 'nilai' => 'nullable|numeric|min:0|max:100', 'catatan' => 'nullable|string', ]); $tugasSiswa->nilai = $request->input('nilai'); $tugasSiswa->catatan = $request->input('catatan'); $tugasSiswa->save(); return redirect()->route('guru.tugas.penilaian', $tugasSiswa->tugas_id) ->with('success', 'Nilai berhasil diperbarui.'); } public function grafik(Request $request) { $kelasId = $request->kelas_id; if (!$kelasId) { return redirect()->route('guru.tugas.index')->with('error', 'Silakan pilih kelas terlebih dahulu.'); } $kelas = Kelas::findOrFail($kelasId); $guruId = $this->getGuruId(); $data = DB::table('tugas_siswa') ->join('tugas', 'tugas_siswa.tugas_id', '=', 'tugas.id') ->join('materi', 'tugas.materi_id', '=', 'materi.id') ->join('siswa', 'tugas_siswa.siswa_id', '=', 'siswa.id') ->select('tugas.id as tugas_id', 'tugas.judul', DB::raw('AVG(nilai) as rata_rata')) ->where('siswa.kelas_id', $kelasId) ->where('materi.guru_id', $guruId) ->whereNotNull('tugas_siswa.nilai') ->groupBy('tugas.id', 'tugas.judul') ->get(); $labels = $data->pluck('judul'); $values = $data->pluck('rata_rata')->map(fn($v) => round($v, 2)); return view('guru.tugas.grafik', compact('labels', 'values', 'kelas', 'kelasId')); } }