MIF_E31221225/app/Http/Controllers/Guru/TugasController.php

330 lines
11 KiB
PHP

<?php
namespace App\Http\Controllers\Guru;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Tugas;
use App\Models\TugasSiswa;
use App\Models\Materi;
use App\Models\Guru;
use App\Models\Kelas;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class TugasController extends Controller
{
protected function getGuruId()
{
$guru = Guru::where('user_id', auth()->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'));
}
}