to('targetemail@example.com') ->subject('Tes Email SendGrid'); }); return 'Email terkirim (jika konfigurasi benar).'; }); Route::get('/', function () { return redirect()->route('login'); }); Route::get('/dashboard', function () { return redirect()->route('redirect-dashboard'); }); // Group middleware untuk semua route yang membutuhkan autentikasi Route::middleware('auth')->group(function () { // Profile management routes Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update'); Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); // Route redirect berdasarkan role login Route::get('/redirect-dashboard', function () { $user = auth()->user(); if (!$user) { return redirect('/login')->withErrors(['email' => 'Anda harus login terlebih dahulu.']); } if (!$user->is_active) { auth()->logout(); return redirect('/login')->withErrors(['email' => 'Akun belum diaktifkan admin.']); } switch ($user->role) { case 'admin': return redirect()->route('admin.dashboard'); case 'guru': return redirect()->route('guru.dashboard'); case 'siswa': return redirect()->route('siswa.dashboard'); default: return abort(403); } })->name('redirect-dashboard'); // Group route untuk admin Route::middleware(['role:admin'])->prefix('admin')->name('admin.')->group(function () { Route::get('/dashboard', [App\Http\Controllers\Admin\DashboardController::class, 'index'])->name('dashboard'); Route::get('profile', [AdminProfileController::class, 'edit'])->name('profile.edit'); Route::put('profile', [AdminProfileController::class, 'update'])->name('profile.update'); Route::resource('guru', GuruController::class)->except(['show']); Route::resource('mapel', MapelController::class); Route::resource('kelas', KelasController::class); Route::resource('tahun_ajaran', TahunAjaranController::class); Route::resource('guru-mapel', GuruMapelController::class); // Siswa Route::get('/siswa/lulus', [SiswaController::class, 'siswaLulus'])->name('siswa.lulus'); Route::get('/siswa/create/{kelas_id?}', [SiswaController::class, 'create'])->name('siswa.create'); Route::post('/siswa/store', [SiswaController::class, 'store'])->name('siswa.store'); Route::get('/siswa', [SiswaController::class, 'index'])->name('siswa.index'); // Route dinamis yang bisa menangkap parameter apapun harus di bawah Route::get('/siswa/{id}/edit', [SiswaController::class, 'edit'])->name('siswa.edit'); Route::put('/siswa/{id}', [SiswaController::class, 'update'])->name('siswa.update'); Route::delete('/siswa/{id}', [SiswaController::class, 'destroy'])->name('siswa.destroy'); Route::resource('/paket-mapel', \App\Http\Controllers\Admin\PaketMapelController::class)->names('paket-mapel'); // Route index Route::get('/users', [UserManagementController::class, 'index'])->name('users.index'); // Edit user Route::get('/users/{id}/edit', [UserManagementController::class, 'edit'])->name('users.edit'); // Update user Route::put('/users/{id}', [UserManagementController::class, 'update'])->name('users.update'); // Delete user Route::delete('/users/{id}', [UserManagementController::class, 'destroy'])->name('users.destroy'); // Toggle aktif user Route::patch('/users/{id}/toggle', [UserManagementController::class, 'toggleAktif'])->name('users.toggle'); Route::resource('kelas_mapel', KelasMapelController::class); //angket Route::get('/angket', [HasilAngketController::class, 'index'])->name('angket.index'); // CRUD Info Route::resource('info', InfoAngketController::class)->except(['show']); // CRUD Prodi Lanjutan Route::resource('prodi-lanjutan', ProdiLanjutanController::class)->except(['show']); // Edit hasil pemilihan siswa Route::get('hasil-pemilihan', [HasilAngketController::class, 'index'])->name('hasil.index'); Route::get('hasil-pemilihan/{siswa}/edit', [HasilAngketController::class, 'edit'])->name('hasil.edit'); Route::put('hasil-pemilihan/{siswa}', [HasilAngketController::class, 'update'])->name('hasil.update'); Route::delete('hasil-pemilihan/{siswa}', [HasilAngketController::class, 'destroy'])->name('hasil.destroy'); Route::get('/hasil-angket/hitung', [HasilAngketController::class, 'hitung'])->name('h'); Route::post('/siswa/import', [SiswaController::class, 'import'])->name('siswa.import'); Route::get('/siswa/export', [SiswaController::class, 'export'])->name('siswa.export'); Route::get('guru/export', [GuruController::class, 'export'])->name('guru.export'); Route::post('guru/import', [GuruController::class, 'import'])->name('guru.import'); }); // Dashboard Guru Route::middleware(['auth', 'role:guru'])->prefix('guru')->name('guru.')->group(function () { //dashboard Route::get('/dashboard', [App\Http\Controllers\Guru\DashboardGuruController::class, 'index'])->name('dashboard'); //profile Route::get('/profile', [GuruProfileController::class, 'index'])->name('profile.index'); Route::get('/profile/edit', [GuruProfileController::class, 'edit'])->name('profile.edit'); Route::post('/profile', [GuruProfileController::class, 'update'])->name('profile.update'); Route::resource('materi', MateriController::class); // Route tugas tanpa nested materi (akses tugas langsung via /guru/tugas) Route::prefix('tugas')->name('tugas.')->group(function () { Route::get('/grafik', [\App\Http\Controllers\Guru\TugasController::class, 'grafik'])->name('grafik'); Route::get('/', [TugasController::class, 'index'])->name('index'); // GET /guru/tugas Route::get('create', [TugasController::class, 'create'])->name('create'); // GET /guru/tugas/create Route::post('/', [TugasController::class, 'store'])->name('store'); // POST /guru/tugas Route::get('{tugas}', [TugasController::class, 'show'])->name('show'); // GET /guru/tugas/{tugas} Route::get('{tugas}/edit', [TugasController::class, 'edit'])->name('edit'); // GET /guru/tugas/{tugas}/edit Route::put('{tugas}', [TugasController::class, 'update'])->name('update'); // PUT /guru/tugas/{tugas} Route::delete('{tugas}', [TugasController::class, 'destroy'])->name('destroy'); // DELETE /guru/tugas/{tugas} Route::get('show/{id}', [TugasController::class, 'show'])->name('guru.tugas.show'); // Penilaian tugas Route::get('{tugas}/penilaian', [TugasController::class, 'penilaian'])->name('penilaian'); Route::put('penilaian/update-nilai/{id}', [TugasController::class, 'updateNilai'])->name('nilai.update'); }); // Route pelajaran dan materi (sesuai contoh) Route::get('/pelajaran', [PelajaranController::class, 'index'])->name('pelajaran.index'); Route::get('materi/{id}/preview', [MateriController::class, 'preview'])->name('materi.preview'); Route::get('materi/{id}/edit-isi', [MateriController::class, 'editIsi'])->name('materi.editIsi'); Route::put('materi/{id}/update-isi', [MateriController::class, 'updateIsi'])->name('materi.updateIsi'); Route::post('materi/upload', [MateriController::class, 'upload'])->name('materi.upload'); //ujian Route::resource('ujian', UjianController::class)->except(['show']); Route::get('ujian/{ujian}/preview', [UjianController::class, 'preview'])->name('ujian.preview'); Route::patch('ujian/{ujian}/status', [UjianController::class, 'updateStatus'])->name('ujian.updateStatus'); Route::get('ujian/hasil', [UjianController::class, 'daftarHasil'])->name('ujian.hasil.index'); Route::get('ujian/{ujian}/hasil', [UjianController::class, 'hasil'])->name('ujian.hasil'); Route::get('ujian/{ujian}/detail', [UjianController::class, 'detail']) ->name('ujian.detail'); // Soal Essay Route::prefix('ujian/{ujian}')->name('ujian.')->group(function () { Route::get('soal-essay', [SoalEssayController::class, 'index'])->name('soal_essay'); Route::get('soal-essay/create', [SoalEssayController::class, 'create'])->name('soal_essay.create'); Route::post('soal-essay', [SoalEssayController::class, 'store'])->name('soal_essay.store'); Route::get('soal-essay/{soal}/edit', [SoalEssayController::class, 'edit'])->name('soal_essay.edit'); Route::put('soal-essay/{soal}', [SoalEssayController::class, 'update'])->name('soal_essay.update'); Route::delete('soal-essay/{soal}', [SoalEssayController::class, 'destroy'])->name('soal_essay.destroy'); }); Route::prefix('ujian/{ujian_id}/soal_pilgan')->name('ujian.soal_pg.')->group(function () { Route::get('/export', [SoalPilganController::class, 'exportExcel'])->name('export'); Route::post('/import', [SoalPilganController::class, 'importExcel'])->name('import'); }); // Soal Pilihan Ganda Route::prefix('ujian/{ujian}')->name('ujian.')->group(function () { Route::get('soal-pg', [SoalPilganController::class, 'index'])->name('soal_pg'); Route::get('soal-pg/create', [SoalPilganController::class, 'create'])->name('soal_pg.create'); Route::post('soal-pg', [SoalPilganController::class, 'store'])->name('soal_pg.store'); Route::get('soal-pg/{soal}/edit', [SoalPilganController::class, 'edit'])->name('soal_pg.edit'); Route::put('soal-pg/{soal}', [SoalPilganController::class, 'update'])->name('soal_pg.update'); Route::delete('soal-pg/{soal}', [SoalPilganController::class, 'destroy'])->name('soal_pg.destroy'); }); Route::get('/hasil/{id}/nilai-essay', [NilaiEssayController::class, 'edit'])->name('nilai_essay.edit'); Route::put('/hasil/{id}/nilai-essay', [NilaiEssayController::class, 'update'])->name('nilai_essay.update'); Route::get('/ujian/grafik', [\App\Http\Controllers\Guru\UjianController::class, 'grafik'])->name('ujian.grafik'); Route::get('/penilaian', [App\Http\Controllers\Guru\TugasController::class, 'daftarPenilaian']) ->name('penilaian.index'); Route::get('tugas/{tugas}/penilaian', [TugasController::class, 'penilaian'])->name('tugas.penilaian'); Route::put('tugas/penilaian/update-nilai/{id}', [TugasController::class, 'updateNilai'])->name('tugas.nilai.update'); //evaluasi Route::prefix('evaluasi')->middleware(['auth', 'role:guru'])->group(function () { Route::get('/', [EvaluasiController::class, 'index'])->name('evaluasi.index'); Route::post('/simpan-bobot', [EvaluasiController::class, 'simpanBobot'])->name('evaluasi.simpanBobot'); Route::post('/hitung-nilai', [EvaluasiController::class, 'hitungNilaiTotal'])->name('evaluasi.hitungNilaiTotal'); // Tambahkan ini: Route::post('/simpan-nilai-sikap', [EvaluasiController::class, 'simpanNilaiSikap'])->name('evaluasi.simpanNilaiSikap'); }); }); // Dashboard Siswa Route::middleware(['role:siswa'])->group(function () { //dashboard Route::get('/siswa/dashboard', [DashboardSiswaController::class, 'index'])->name('siswa.dashboard'); //profile Route::get('/siswa/profile', [ProfileSiswaController::class, 'index'])->name('siswa.profile.show'); Route::get('/siswa/profile/edit', [ProfileSiswaController::class, 'edit'])->name('siswa.profile.edit'); Route::put('/siswa/profile', [ProfileSiswaController::class, 'update'])->name('siswa.profile.update'); //pelajaran Route::get('/siswa/pelajaran', [ModulController::class, 'index'])->name('siswa.pelajaran.index'); Route::get('/siswa/materi', [SubjekController::class, 'index'])->name('siswa.materi.index'); Route::get('/siswa/materi/{id}', [SubjekController::class, 'show'])->name('siswa.materi.show'); Route::get('/siswa/materi/{materi}/tugas', [TugasSiswaController::class, 'index'])->name('siswa.materi.tugas.index'); // Detail tugas di materi tertentu Route::get('siswa/materi/{id}', [SubjekController::class, 'show'])->name('siswa.materi.show'); Route::post('siswa/materi/{materi}/tugas/{tugas}/jawaban', [TugasSiswaController::class, 'store'])->name('siswa.tugas.store'); // Kirim jawaban tugas Route::post('siswa/materi/{materi}/tugas/{tugas}', [TugasSiswaController::class, 'store'])->name('siswa.materi.tugas.store'); //ujian Route::prefix('siswa/ujian')->middleware(['auth'])->name('siswa.ujian.')->group(function () { Route::get('/', [UjianSiswaController::class, 'index'])->name('index'); Route::get('/{id}/kerjakan', [UjianSiswaController::class, 'kerjakan'])->name('kerjakan'); Route::post('/{id}/submit', [UjianSiswaController::class, 'submit'])->name('submit'); Route::get('/{id}/hasil', [UjianSiswaController::class, 'hasil'])->name('hasil'); Route::get('/{id}', [UjianSiswaController::class, 'show'])->name('show'); // <-- paling bawah }); Route::get('/nilai/tugas', [TugasSiswaController::class, 'nilaiTugas'])->name('siswa.nilai.tugas'); Route::get('siswa/nilai', [UjianSiswaController::class, 'evaluasi'])->name('siswa.nilai'); //angket Route::prefix('siswa')->name('siswa.')->group(function () { Route::get('/angket', [AngketController::class, 'index'])->name('angket.index'); Route::get('/angket/info', [AngketController::class, 'info'])->name('angket.info'); Route::get('/angket/pilih', [AngketController::class, 'create'])->name('angket.create'); Route::post('/angket', [AngketController::class, 'store'])->name('angket.store'); Route::get('/angket/hasil', [AngketController::class, 'hasil'])->name('angket.hasil'); }); //evaluasi Route::get('siswa/evaluasi/mapel', [EvaluasiSiswaController::class, 'mapel'])->name('siswa.evaluasi.mapel'); Route::get('evaluasi/mapel/pdf', [EvaluasiSiswaController::class, 'exportPdf'])->name('evaluasi.mapel.pdf'); // ✅ ini penting Route::get('siswa/evaluasi/mapel/{mapel}', [EvaluasiSiswaController::class, 'detailEvaluasi'])->name('siswa.evaluasi.detail'); }); }); // << Penutup group middleware(auth) — penting! // Route auth bawaan Laravel Breeze/Fortify/etc. require __DIR__.'/auth.php';