330 lines
11 KiB
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'));
|
|
}
|
|
|
|
}
|